1*4edb46e9SPaul TrainaBEGIN { 2*4edb46e9SPaul Traina # we need the number of bytes in a packet to do the output 3*4edb46e9SPaul Traina # in packet numbers rather than byte numbers. 4*4edb46e9SPaul Traina if (packetsize <= 0) 5*4edb46e9SPaul Traina packetsize = 512 6*4edb46e9SPaul Traina expectNext = 1 7*4edb46e9SPaul Traina lastwin = -1 8*4edb46e9SPaul Traina } 9*4edb46e9SPaul Traina { 10*4edb46e9SPaul Traina # convert tcp trace to send/ack form. 11*4edb46e9SPaul Traina n = split ($1,t,":") 12*4edb46e9SPaul Traina tim = t[1]*3600 + t[2]*60 + t[3] 13*4edb46e9SPaul Traina if (NR <= 1) { 14*4edb46e9SPaul Traina tzero = tim 15*4edb46e9SPaul Traina ltim = tim 16*4edb46e9SPaul Traina OFS = "\t" 17*4edb46e9SPaul Traina } 18*4edb46e9SPaul Traina if ($6 != "ack") { 19*4edb46e9SPaul Traina # we have a data packet record: 20*4edb46e9SPaul Traina # ignore guys with syn, fin or reset 'cause we 21*4edb46e9SPaul Traina # can't handle their sequence numbers. Try to 22*4edb46e9SPaul Traina # detect and add a flag character for 'anomalies': 23*4edb46e9SPaul Traina # * -> re-sent packet 24*4edb46e9SPaul Traina # - -> packet after hole (missing packet(s)) 25*4edb46e9SPaul Traina # # -> odd size packet 26*4edb46e9SPaul Traina if ($5 !~ /[SFR]/) { 27*4edb46e9SPaul Traina i = index($6,":") 28*4edb46e9SPaul Traina j = index($6,"(") 29*4edb46e9SPaul Traina strtSeq = substr($6,1,i-1) 30*4edb46e9SPaul Traina endSeq = substr($6,i+1,j-i-1) 31*4edb46e9SPaul Traina len = endSeq - strtSeq 32*4edb46e9SPaul Traina id = endSeq 33*4edb46e9SPaul Traina if (! timeOf[id]) 34*4edb46e9SPaul Traina timeOf[id] = tim 35*4edb46e9SPaul Traina if (endSeq - expectNext < 0) 36*4edb46e9SPaul Traina flag = "*" 37*4edb46e9SPaul Traina else { 38*4edb46e9SPaul Traina if (strtSeq - expectNext > 0) 39*4edb46e9SPaul Traina flag = "-" 40*4edb46e9SPaul Traina else if (len != packetsize) 41*4edb46e9SPaul Traina flag = "#" 42*4edb46e9SPaul Traina else 43*4edb46e9SPaul Traina flag = " " 44*4edb46e9SPaul Traina expectNext = endSeq 45*4edb46e9SPaul Traina } 46*4edb46e9SPaul Traina printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\ 47*4edb46e9SPaul Traina flag, $5, strtSeq 48*4edb46e9SPaul Traina if (++timesSent[id] > 1) 49*4edb46e9SPaul Traina printf " (%.2f) [%d]", tim - timeOf[id], timesSent[id] 50*4edb46e9SPaul Traina if (len != packetsize) 51*4edb46e9SPaul Traina printf " <%d>", len 52*4edb46e9SPaul Traina } 53*4edb46e9SPaul Traina } else { 54*4edb46e9SPaul Traina id = $7 55*4edb46e9SPaul Traina 56*4edb46e9SPaul Traina printf "%7.2f\t%7.2f\t%s ack %s %d", tim-tzero, tim-ltim,\ 57*4edb46e9SPaul Traina flag, $5, id 58*4edb46e9SPaul Traina if ($9 != lastwin) { 59*4edb46e9SPaul Traina printf " win %d", $9 60*4edb46e9SPaul Traina lastwin = $9 61*4edb46e9SPaul Traina } 62*4edb46e9SPaul Traina printf " (%.2f)", tim - timeOf[id] 63*4edb46e9SPaul Traina if (++timesAcked[id] > 1) 64*4edb46e9SPaul Traina printf " [%d]", timesAcked[id] 65*4edb46e9SPaul Traina } 66*4edb46e9SPaul Traina printf "\n" 67*4edb46e9SPaul Traina ltim = tim 68*4edb46e9SPaul Traina } 69