On 28/06/20(Sun) 20:41, YASUOKA Masahiko wrote:
> Hi,
>
> When "::/0" is used as "default",
>
> # route add ::/0 fe80::1%em0
> add net ::/0: gateway fe80::1%em0: Invalid argument
>
> route command trims the sockaddr to { .len = 2, .family = AF_INET6 }
> for "::/0", but rtable_satoplen() refuses it. I think it should be
> accepted.
rtable_satoplen() is used in many places, not just in the socket parsing
code used by route(8). I don't know what side effects can be introduced
by this change.
Why is IPv6 different from IPv4 when it comes to the default route?
Shouldn't we change route(8) to have a `sa_len' of 0? That would make
the following true:
mlen = mask->sa_len;
/* Default route */
if (mlen == 0)
return (0)
> Allow sockaddr for prefix length be trimmed before the key(address)
> field. Actually "route" command trims at the address family field for
> "::/0"
>
> Index: sys/net/rtable.c
> ===================================================================
> RCS file: /cvs/src/sys/net/rtable.c,v
> retrieving revision 1.69
> diff -u -p -r1.69 rtable.c
> --- sys/net/rtable.c 21 Jun 2019 17:11:42 -0000 1.69
> +++ sys/net/rtable.c 28 Jun 2020 11:30:54 -0000
> @@ -887,8 +887,8 @@ rtable_satoplen(sa_family_t af, struct s
>
> ap = (uint8_t *)((uint8_t *)mask) + dp->dom_rtoffset;
> ep = (uint8_t *)((uint8_t *)mask) + mlen;
> - if (ap > ep)
> - return (-1);
> + if (ap >= ep)
> + return (0);
That means the kernel now silently ignore sockaddr short `sa_len'. Are
they supposed to be supported or are they symptoms of bugs?
> /* Trim trailing zeroes. */
> while (ap < ep && ep[-1] == 0)