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