packetdat.awk   [plain text]


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]
	}