On June 14, 2016 8:30:37 AM GMT+02:00, Jonas Danielsson 
<[email protected]> wrote:
>The ICMP RFC says that identifier and sequence number may be zero.
>Having them zero for a Echo message, along with a data of zero:s
>as well will result in a Echo reply message with only zero:s.
>
>Some NAT implementations seem to get the checksum wrong on these
>packages. Setting a checksum of 0x0 instead of 0xffff.

Who does that, for example?
>
>Through NAT:
>  Internet Control Message Protocol
>      Type: 0 (Echo (ping) reply)
>      Code: 0
>      Checksum: 0x0000 [incorrect, should be 0xffff]
>      Identifier (BE): 0 (0x0000)
>      Identifier (LE): 0 (0x0000)
>      Sequence number (BE): 0 (0x0000)
>      Sequence number (LE): 0 (0x0000)
>      Data (56 bytes)
>          Data: 000000000000000000000000000000000000000000000000...
>          [Length: 56]
>
>Without NAT:
>  Internet Control Message Protocol
>      Type: 0 (Echo (ping) reply)
>      Code: 0
>      Checksum: 0xffff [correct]
>      Identifier (BE): 0 (0x0000)
>      Identifier (LE): 0 (0x0000)
>      Sequence number (BE): 0 (0x0000)
>      Sequence number (LE): 0 (0x0000)
>      [Request frame: 189]
>      [Response time: 0.024 ms]
>      Data (56 bytes)
>          Data: 000000000000000000000000000000000000000000000000...
>          [Length: 56]
>
>And this in turn will make some hardware MAC checksum offloading
>engines drop the packet.
>
>This change can be seen as a workaround for bugs in other layers.
>But just setting an identifier for the Echo message packet will
>will avoid prodding the hornets nest.
>
>Signed-off-by: Jonas Danielsson <[email protected]>
>---
> networking/ping.c | 1 +
> 1 file changed, 1 insertion(+)
>
>diff --git a/networking/ping.c b/networking/ping.c
>index 5d71fe8..24fb10a 100644
>--- a/networking/ping.c
>+++ b/networking/ping.c
>@@ -214,6 +214,7 @@ static void ping4(len_and_sockaddr *lsa)
>       pkt = (struct icmp *) G.packet;
>       /*memset(pkt, 0, sizeof(G.packet)); already is */
>       pkt->icmp_type = ICMP_ECHO;
>+      pkt->icmp_id = (uint16_t) getpid();

Why is getpid() superior to 1 or 42 for that matter?

thanks,
>       pkt->icmp_cksum = inet_cksum((uint16_t *) pkt, sizeof(G.packet));
> 
>       xsendto(pingsock, G.packet, DEFDATALEN + ICMP_MINLEN, &lsa->u.sa,
>lsa->len);


_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to