[Toybox] [PATCH] ping: fix -q behavior.

Rob Landley rob at landley.net
Mon Jul 9 16:42:19 PDT 2018



On 07/09/2018 04:49 PM, enh wrote:
> On Fri, Jul 6, 2018 at 6:16 PM Rob Landley <rob at landley.net> wrote:
>>
>> On 07/06/2018 03:19 PM, enh wrote:
>>> they said they'd be much more worried about whether we use IP_RECVERR
>>> and parse ICMP errors correctly,
>>
>> I don't think we do but I'll throw it on the todo heap. I'm not 100% sure what
>> "correctly" means here, but I can try to research it.
>>
>>> or do link-local ping correctly...
>>
>> Again, define "correctly"...?
>>
>> (I can ping ::1 and ping 127.0.0.1 but I dunno if it's doing something wrong?)
> 
> https://en.wikipedia.org/wiki/Link-local_address#IPv6

This can of worms?

https://twitter.com/RichFelker/status/982286128593043456

(I've always considered ipv6 a poster child for the second system effect.)

> try `ifconfig -a | grep link`

No output. (Using ubuntu's ifconfig or toybox's.) Ah: case insensitive grep.

> and then compare `ping6 $that_address`
> (which should fail) against `ping6 -I $that_interface $that_address`

Sigh. I had -I working at one point... wait,

  printf("ntop=%s\n", ntop(sa));
  if (TT.I && bind(TT.sock, sa, sizeof(src_addr))) perror_exit("bind");

$ ./ping -I wlan0 fe80::6627:37ff:fe21:64bf
ntop=fe80::6627:37ff:fe21:64bf
Ping fe80::6627:37ff:fe21:64bf (fe80::6627:37ff:fe21:64bf) from wlan0
(fe80::6627:37ff:fe21:64bf): 56(84) bytes.
ping: sendto: Invalid argument

What am I doing wrong? I'm binding to the same IP address I'm trying to ping,
how is sendto() giving me an invalid argument error? strace says:

socket(PF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6) = 3
bind(3, {sa_family=AF_INET6, sin6_port=htons(0), inet_pton(AF_INET6,
"fe80::6627:37ff:fe21:64bf", &sin6_addr), sin6_flowinfo=0,
sin6_scope_id=if_nametoindex("wlan0")}, 28) = 0
sendto(3,
"\200\0002(\236+\1\0000\311\3412\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"...,
64, 0, {sa_family=AF_INET6, sin6_port=htons(0), inet_pton(AF_INET6,
"fe80::6627:37ff:fe21:64bf", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28)
= -1 EINVAL (Invalid argument)

Opened with v6, bound with v6... Sigh, do I have the destination packet
misformatted for v6? If so, why/how does ping ::1 work?

Hmmm... And this is why I have systems built for qemu, so I can STICK PRINTKs
INTO THE KERNEL. Grrr...

> and `ping6 $that_address%$that_interface`.

I'm guessing percent is a synonym for -I so this is basically the same issue,
modulo implementing %?

Rob



More information about the Toybox mailing list