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