xref: /freebsd/contrib/tcpdump/packetdat.awk (revision 911f0260390e18cf85f3dbf2c719b593efdc1e3c)
1BEGIN	{
2	# we need to know (usual) packet size to convert byte numbers
3	# to packet numbers
4	if (packetsize <= 0)
5		packetsize = 512
6	}
7$5 !~ /[SR]/	{
8	# print out per-packet data in the form:
9	#  <packet #>
10	#  <start sequence #>
11	#  <1st send time>
12	#  <last send time>
13	#  <1st ack time>
14	#  <last ack time>
15	#  <# sends>
16	#  <# acks>
17
18	n = split ($1,t,":")
19	tim = t[1]*3600 + t[2]*60 + t[3]
20	if ($6 != "ack") {
21		i = index($6,":")
22		strtSeq = substr($6,1,i-1)
23		id = 1.5 + (strtSeq - 1) / packetsize
24		id -= id % 1
25		if (maxId < id)
26			maxId = id
27		if (firstSend[id] == 0) {
28			firstSend[id] = tim
29			seqNo[id] = strtSeq
30		}
31		lastSend[id] = tim
32		timesSent[id]++
33		totalPackets++
34	} else {
35		id = 1 + ($7 - 2) / packetsize
36		id -= id % 1
37		timesAcked[id]++
38		if (firstAck[id] == 0)
39			firstAck[id] = tim
40		lastAck[id] = tim
41		totalAcks++
42	}
43	}
44END	{
45	print "# " maxId " chunks.  " totalPackets " packets sent.  " \
46		totalAcks " acks."
47	# for packets that were implicitly acked, make the ack time
48	# be the ack time of next explicitly acked packet.
49	for (i = maxId-1; i > 0; --i)
50		while (i > 0 && firstAck[i] == 0) {
51			lastAck[i] = firstAck[i] = firstAck[i+1]
52			--i
53		}
54	tzero = firstSend[1]
55	for (i = 1; i <= maxId; i++)
56		printf "%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t%d\n",\
57			i, seqNo[i], \
58			firstSend[i] - tzero, lastSend[i] - tzero,\
59			firstAck[i] - tzero, lastAck[i] - tzero,\
60			timesSent[i], timesAcked[i]
61	}
62