[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: Ping issue in 1.20+
From:       Ralf Friedl <Ralf.Friedl () online ! de>
Date:       2013-06-30 23:42:49
Message-ID: 51D0C279.3090804 () online ! de
[Download RAW message or body]

Giovanni Vallesi - TeeBX schrieb:
> Il 28/06/2013 1.04, Denys Vlasenko ha scritto:
> > > Please add debugging prints to inet_cksum() function - for one,
> > > > let's find out the value of nleft, addr[0], and the return value.
> > > > (IOW, let's find out whether we checksum over the correct buffer,
> > > > and whether we produce the same xsum we see in tcpdump.)
> > For example, this way:
> > 
> > 
> > uint16_t FAST_FUNC inet_cksum(uint16_t *addr, int nleft)
> > {
> > /*
> > * Our algorithm is simple, using a 32 bit accumulator,
> > * we add sequential 16 bit words to it, and at the end, fold
> > * back all the carry bits from the top 16 bits into the lower
> > * 16 bits.
> > */
> > unsigned sum = 0;
> > char string[nleft*2 + 2];
> > int z = nleft;
> > bin2hex(string, (void*)addr, nleft)[0] = 0;
> > while (nleft>  1) {
> > sum += *addr++;
> > nleft -= 2;
> > }
> > 
> > /* Mop up an odd byte, if necessary */
> > if (nleft == 1) {
> > if (BB_LITTLE_ENDIAN)
> > sum += *(uint8_t*)addr;
> > else
> > sum += *(uint8_t*)addr<<  8;
> > }
> > 
> > /* Add back carry outs from top 16 bits to low 16 bits */
> > sum = (sum>>  16) + (sum&  0xffff);     /* add hi 16 to low 
> > 16 */
> > sum += (sum>>  16);                     /* add carry */
> > 
> > bb_error_msg("inet_cksum(%s,%d)=0x%x", string, z, 
> > (unsigned)(uint16_t)~sum);
> > return (uint16_t)~sum;
> > }
> > 
> > When I run it, I see:
> > 
> > # ./busybox ping -c2 10.0.0.138
> > PING 10.0.0.138 (10.0.0.138): 56 data bytes
> > ping: 
> > inet_cksum(080000001f29000038717f2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,64)=0x4021
> >  64 bytes from 10.0.0.138: seq=0 ttl=254 time=3.116 ms
> > ping: 
> > inet_cksum(080000001f29000117b48e2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,64)=0xfc32
> >  64 bytes from 10.0.0.138: seq=1 ttl=254 time=2.747 ms
> 
> Thanks Denys,
> I patched ping.c source according to your suggestion... but I think 
> the output is of little use because the (I guess) contains non 
> printable chars so the terminals strips them:
> 
> ~ # ping -c3 172.31.255.1
> PING 172.31.255.1 (172.31.255.1): 56 data bytes
> ping: inet_cksum(,64)=0xa786
> 64 bytes from 172.31.255.1: seq=0 ttl=62 time=1.097 ms
> ping: inet_cksum(,64)=0xb851
> ping: inet_cksum,64)=0x603c
You can send the output to a file to check for non printable characters. 
But the output in the case should result from bin2hex and therefor be 
printable, as you can see in the example.
So I guess you also have a problem with bin2hex. So you should check 
your compiler and build environment.
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic