BsAtHome writes in Bug 433:
authorMike Frysinger <vapier@gentoo.org>
Thu, 15 Sep 2005 01:32:48 +0000 (01:32 -0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 15 Sep 2005 01:32:48 +0000 (01:32 -0000)
Ping packets sent by busybox have wrong endian on f.x. mips32 (openwrt). Attatched is a patch that
uses htons() and ntohs() to be platform independent.

networking/ping.c

index bba37a0253c247e7a750dd9e505ebb518971b3cc..b36ab1881c8e326307383ec2227f72e2e025a417 100644 (file)
@@ -226,9 +226,9 @@ static void sendping(int junk)
        pkt->icmp_type = ICMP_ECHO;
        pkt->icmp_code = 0;
        pkt->icmp_cksum = 0;
-       pkt->icmp_seq = ntransmitted++;
+       pkt->icmp_seq = htons(ntransmitted++);
        pkt->icmp_id = myid;
-       CLR(pkt->icmp_seq % MAX_DUP_CHK);
+       CLR(ntohs(pkt->icmp_seq) % MAX_DUP_CHK);
 
        gettimeofday((struct timeval *) &packet[8], NULL);
        pkt->icmp_cksum = in_cksum((unsigned short *) pkt, sizeof(packet));
@@ -296,6 +296,7 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from)
            return;                             /* not our ping */
 
        if (icmppkt->icmp_type == ICMP_ECHOREPLY) {
+               u_int16_t recv_seq = ntohs(icmppkt->icmp_seq);
            ++nreceived;
                tp = (struct timeval *) icmppkt->icmp_data;
 
@@ -312,12 +313,12 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from)
                if (triptime > tmax)
                        tmax = triptime;
 
-               if (TST(icmppkt->icmp_seq % MAX_DUP_CHK)) {
+               if (TST(recv_seq % MAX_DUP_CHK)) {
                        ++nrepeats;
                        --nreceived;
                        dupflag = 1;
                } else {
-                       SET(icmppkt->icmp_seq % MAX_DUP_CHK);
+                       SET(recv_seq % MAX_DUP_CHK);
                        dupflag = 0;
                }
 
@@ -326,7 +327,7 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from)
 
                printf("%d bytes from %s: icmp_seq=%u", sz,
                           inet_ntoa(*(struct in_addr *) &from->sin_addr.s_addr),
-                          icmppkt->icmp_seq);
+                          recv_seq);
                printf(" ttl=%d", iphdr->ttl);
                printf(" time=%lu.%lu ms", triptime / 10, triptime % 10);
                if (dupflag)