Fix sequence number byte order mismatch. Reference: /n/sources/patch/applied/ping-byteorder-fix Date: Fri Dec 23 12:21:46 CET 2005 --- /sys/src/cmd/ip/ping.c Fri Dec 23 12:21:25 2005 +++ /sys/src/cmd/ip/ping.c Fri Dec 23 12:21:20 2005 @@ -81,8 +81,6 @@ USED(a); if(strstr(msg, "alarm")) noted(NCONT); - else if(strstr(msg, "die")) - exits("errors"); else noted(NDFLT); } @@ -96,7 +94,7 @@ for(l = &first; *l; ){ r = *l; - if(ip && r->seq == seq){ + if(r->seq == seq){ r->rtt = now-r->time; r->ttl = ip->ttl; reply(r, ip); @@ -105,8 +103,7 @@ if(now-r->time > MINUTE){ *l = r->next; r->rtt = now-r->time; - if(ip) - r->ttl = ip->ttl; + r->ttl = ip->ttl; if(r->replied == 0) lost(r, ip); free(r); @@ -144,8 +141,7 @@ } r = malloc(sizeof *r); if(r != nil){ - ip->seq[0] = seq; - ip->seq[1] = seq>>8; + hnputs(ip->seq, seq); r->seq = seq; r->next = nil; lock(&listlock); @@ -168,7 +164,7 @@ } void -rcvr(int fd, int msglen, int interval, int nmsg) +rcvr(int fd, int msglen, int interval, int nmsg, int senderpid) { uchar buf[64*1024+512]; Icmp *ip; @@ -180,15 +176,14 @@ ip = (Icmp*)buf; sum = 0; - while(lostmsgs+rcvdmsgs < nmsg){ + while(!done || first != nil){ alarm((nmsg-lostmsgs-rcvdmsgs)*interval+5000); n = read(fd, buf, sizeof(buf)); alarm(0); now = nsec(); - if(n <= 0){ /* read interrupted - time to go */ -fprint(2, "clean\n"); - clean(0, now+MINUTE, nil); - continue; + if(n <= 0){ + print("read: %r\n"); + break; } if(n < msglen){ print("bad len %d/%d\n", n, msglen); @@ -200,7 +195,7 @@ munged++; if(munged) print("currupted reply\n"); - x = (ip->seq[1]<<8)|ip->seq[0]; + x = nhgets(ip->seq); if(ip->type != EchoReply || ip->code != 0) { print("bad sequence/code/type %d/%d/%d\n", ip->type, ip->code, x); @@ -217,6 +212,7 @@ if(lostmsgs) print("%d out of %d messages lost\n", lostmsgs, lostmsgs+rcvdmsgs); + postnote(PNPROC, senderpid, "die"); } void @@ -231,6 +227,7 @@ { int fd; int msglen, interval, nmsg; + int pid; nsec(); /* make sure time file is already open */ @@ -284,11 +281,12 @@ print("sending %d %d byte messages %d ms apart\n", nmsg, msglen, interval); + pid = getpid(); switch(rfork(RFPROC|RFMEM|RFFDG)){ case -1: fprint(2, "%s: can't fork: %r\n", argv0); case 0: - rcvr(fd, msglen, interval, nmsg); + rcvr(fd, msglen, interval, nmsg, pid); exits(0); default: sender(fd, msglen, interval, nmsg); @@ -300,10 +298,9 @@ void reply(Req *r, Icmp *ip) { + rcvdmsgs++; r->rtt /= 1000LL; sum += r->rtt; - if(!r->replied) - rcvdmsgs++; if(!quiet && !lostonly){ if(addresses) print("%ud: %V->%V rtt %lld µs, avg rtt %lld µs, ttl = %d\n", @@ -323,11 +320,14 @@ { if(!quiet){ if(addresses) - print("lost %ud: %V->%V\n", r->seq-firstseq, - ip->src, ip->dst); + print("lost %ud: %V->%V avg rtt %lld µs\n", + r->seq-firstseq, + ip->src, ip->dst, + sum/rcvdmsgs); else - print("lost %ud\n", r->seq-firstseq); + print("lost %ud: avg rtt %lld µs\n", + r->seq-firstseq, + sum/rcvdmsgs); } lostmsgs++; } -