xref: /freebsd/contrib/tcpdump/send-ack.awk (revision 4edb46e9a85ca35d3bed523171d11a748861ce82)
14edb46e9SPaul TrainaBEGIN	{
24edb46e9SPaul Traina	# we need the number of bytes in a packet to do the output
34edb46e9SPaul Traina	# in packet numbers rather than byte numbers.
44edb46e9SPaul Traina	if (packetsize <= 0)
54edb46e9SPaul Traina		packetsize = 512
64edb46e9SPaul Traina	expectNext = 1
74edb46e9SPaul Traina	lastwin = -1
84edb46e9SPaul Traina	}
94edb46e9SPaul Traina	{
104edb46e9SPaul Traina	# convert tcp trace to send/ack form.
114edb46e9SPaul Traina	n = split ($1,t,":")
124edb46e9SPaul Traina	tim = t[1]*3600 + t[2]*60 + t[3]
134edb46e9SPaul Traina	if (NR <= 1) {
144edb46e9SPaul Traina		tzero = tim
154edb46e9SPaul Traina		ltim = tim
164edb46e9SPaul Traina		OFS = "\t"
174edb46e9SPaul Traina	}
184edb46e9SPaul Traina	if ($6 != "ack") {
194edb46e9SPaul Traina		# we have a data packet record:
204edb46e9SPaul Traina		# ignore guys with syn, fin or reset 'cause we
214edb46e9SPaul Traina		# can't handle their sequence numbers.  Try to
224edb46e9SPaul Traina		# detect and add a flag character for 'anomalies':
234edb46e9SPaul Traina		#   * -> re-sent packet
244edb46e9SPaul Traina		#   - -> packet after hole (missing packet(s))
254edb46e9SPaul Traina		#   # -> odd size packet
264edb46e9SPaul Traina		if ($5 !~ /[SFR]/) {
274edb46e9SPaul Traina			i = index($6,":")
284edb46e9SPaul Traina			j = index($6,"(")
294edb46e9SPaul Traina			strtSeq = substr($6,1,i-1)
304edb46e9SPaul Traina			endSeq = substr($6,i+1,j-i-1)
314edb46e9SPaul Traina			len = endSeq - strtSeq
324edb46e9SPaul Traina			id = endSeq
334edb46e9SPaul Traina			if (! timeOf[id])
344edb46e9SPaul Traina				timeOf[id] = tim
354edb46e9SPaul Traina			if (endSeq - expectNext < 0)
364edb46e9SPaul Traina				flag = "*"
374edb46e9SPaul Traina			else {
384edb46e9SPaul Traina				if (strtSeq - expectNext > 0)
394edb46e9SPaul Traina					flag = "-"
404edb46e9SPaul Traina				else if (len != packetsize)
414edb46e9SPaul Traina					flag = "#"
424edb46e9SPaul Traina				else
434edb46e9SPaul Traina					flag = " "
444edb46e9SPaul Traina				expectNext = endSeq
454edb46e9SPaul Traina			}
464edb46e9SPaul Traina			printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\
474edb46e9SPaul Traina				flag, $5, strtSeq
484edb46e9SPaul Traina			if (++timesSent[id] > 1)
494edb46e9SPaul Traina				printf "  (%.2f) [%d]", tim - timeOf[id], timesSent[id]
504edb46e9SPaul Traina			if (len != packetsize)
514edb46e9SPaul Traina				printf " <%d>", len
524edb46e9SPaul Traina		}
534edb46e9SPaul Traina	} else {
544edb46e9SPaul Traina		id = $7
554edb46e9SPaul Traina
564edb46e9SPaul Traina		printf "%7.2f\t%7.2f\t%s  ack %s %d", tim-tzero, tim-ltim,\
574edb46e9SPaul Traina			flag, $5, id
584edb46e9SPaul Traina		if ($9 != lastwin) {
594edb46e9SPaul Traina			printf "  win %d", $9
604edb46e9SPaul Traina			lastwin = $9
614edb46e9SPaul Traina		}
624edb46e9SPaul Traina		printf "  (%.2f)", tim - timeOf[id]
634edb46e9SPaul Traina		if (++timesAcked[id] > 1)
644edb46e9SPaul Traina			printf " [%d]", timesAcked[id]
654edb46e9SPaul Traina	}
664edb46e9SPaul Traina	printf "\n"
674edb46e9SPaul Traina	ltim = tim
684edb46e9SPaul Traina	}
69