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