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