xref: /aosp_15_r20/external/tcpdump/send-ack.awk (revision 05b00f6010a2396e3db2409989fc67270046269f)
1*05b00f60SXin LiBEGIN	{
2*05b00f60SXin Li	# we need the number of bytes in a packet to do the output
3*05b00f60SXin Li	# in packet numbers rather than byte numbers.
4*05b00f60SXin Li	if (packetsize <= 0)
5*05b00f60SXin Li		packetsize = 512
6*05b00f60SXin Li	expectNext = 1
7*05b00f60SXin Li	lastwin = -1
8*05b00f60SXin Li	}
9*05b00f60SXin Li	{
10*05b00f60SXin Li	# convert tcp trace to send/ack form.
11*05b00f60SXin Li	n = split ($1,t,":")
12*05b00f60SXin Li	tim = t[1]*3600 + t[2]*60 + t[3]
13*05b00f60SXin Li	if (NR <= 1) {
14*05b00f60SXin Li		tzero = tim
15*05b00f60SXin Li		ltim = tim
16*05b00f60SXin Li		OFS = "\t"
17*05b00f60SXin Li	}
18*05b00f60SXin Li	if ($6 != "ack") {
19*05b00f60SXin Li		# we have a data packet record:
20*05b00f60SXin Li		# ignore guys with syn, fin or reset 'cause we
21*05b00f60SXin Li		# can't handle their sequence numbers.  Try to
22*05b00f60SXin Li		# detect and add a flag character for 'anomalies':
23*05b00f60SXin Li		#   * -> re-sent packet
24*05b00f60SXin Li		#   - -> packet after hole (missing packet(s))
25*05b00f60SXin Li		#   # -> odd size packet
26*05b00f60SXin Li		if ($5 !~ /[SFR]/) {
27*05b00f60SXin Li			i = index($6,":")
28*05b00f60SXin Li			j = index($6,"(")
29*05b00f60SXin Li			strtSeq = substr($6,1,i-1)
30*05b00f60SXin Li			endSeq = substr($6,i+1,j-i-1)
31*05b00f60SXin Li			len = endSeq - strtSeq
32*05b00f60SXin Li			id = endSeq
33*05b00f60SXin Li			if (! timeOf[id])
34*05b00f60SXin Li				timeOf[id] = tim
35*05b00f60SXin Li			if (endSeq - expectNext < 0)
36*05b00f60SXin Li				flag = "*"
37*05b00f60SXin Li			else {
38*05b00f60SXin Li				if (strtSeq - expectNext > 0)
39*05b00f60SXin Li					flag = "-"
40*05b00f60SXin Li				else if (len != packetsize)
41*05b00f60SXin Li					flag = "#"
42*05b00f60SXin Li				else
43*05b00f60SXin Li					flag = " "
44*05b00f60SXin Li				expectNext = endSeq
45*05b00f60SXin Li			}
46*05b00f60SXin Li			printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\
47*05b00f60SXin Li				flag, $5, strtSeq
48*05b00f60SXin Li			if (++timesSent[id] > 1)
49*05b00f60SXin Li				printf "  (%.2f) [%d]", tim - timeOf[id], timesSent[id]
50*05b00f60SXin Li			if (len != packetsize)
51*05b00f60SXin Li				printf " <%d>", len
52*05b00f60SXin Li		}
53*05b00f60SXin Li	} else {
54*05b00f60SXin Li		id = $7
55*05b00f60SXin Li
56*05b00f60SXin Li		printf "%7.2f\t%7.2f\t%s  ack %s %d", tim-tzero, tim-ltim,\
57*05b00f60SXin Li			flag, $5, id
58*05b00f60SXin Li		if ($9 != lastwin) {
59*05b00f60SXin Li			printf "  win %d", $9
60*05b00f60SXin Li			lastwin = $9
61*05b00f60SXin Li		}
62*05b00f60SXin Li		printf "  (%.2f)", tim - timeOf[id]
63*05b00f60SXin Li		if (++timesAcked[id] > 1)
64*05b00f60SXin Li			printf " [%d]", timesAcked[id]
65*05b00f60SXin Li	}
66*05b00f60SXin Li	printf "\n"
67*05b00f60SXin Li	ltim = tim
68*05b00f60SXin Li	}
69