freebsd-nq/contrib/tcpdump/packetdat.awk

62 lines
1.4 KiB
Awk

BEGIN {
# we need to know (usual) packet size to convert byte numbers
# to packet numbers
if (packetsize <= 0)
packetsize = 512
}
$5 !~ /[SR]/ {
# print out per-packet data in the form:
# <packet #>
# <start sequence #>
# <1st send time>
# <last send time>
# <1st ack time>
# <last ack time>
# <# sends>
# <# acks>
n = split ($1,t,":")
tim = t[1]*3600 + t[2]*60 + t[3]
if ($6 != "ack") {
i = index($6,":")
strtSeq = substr($6,1,i-1)
id = 1.5 + (strtSeq - 1) / packetsize
id -= id % 1
if (maxId < id)
maxId = id
if (firstSend[id] == 0) {
firstSend[id] = tim
seqNo[id] = strtSeq
}
lastSend[id] = tim
timesSent[id]++
totalPackets++
} else {
id = 1 + ($7 - 2) / packetsize
id -= id % 1
timesAcked[id]++
if (firstAck[id] == 0)
firstAck[id] = tim
lastAck[id] = tim
totalAcks++
}
}
END {
print "# " maxId " chunks. " totalPackets " packets sent. " \
totalAcks " acks."
# for packets that were implicitly acked, make the ack time
# be the ack time of next explicitly acked packet.
for (i = maxId-1; i > 0; --i)
while (i > 0 && firstAck[i] == 0) {
lastAck[i] = firstAck[i] = firstAck[i+1]
--i
}
tzero = firstSend[1]
for (i = 1; i <= maxId; i++)
printf "%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t%d\n",\
i, seqNo[i], \
firstSend[i] - tzero, lastSend[i] - tzero,\
firstAck[i] - tzero, lastAck[i] - tzero,\
timesSent[i], timesAcked[i]
}