On 2016/03/24 20:27, Sebastien Marie wrote:
> Hi,
> 
> I encountered a problem with IPv6 connectivity after upgrade to snapshot
> Mar 23 on my amd64 router.
> 
> The router use a pppoe session to get IPv4 and IPv6. I had to made a
> DHCP-ND request to get routable IPv6, and I use dhcpcd from ports for
> that.
> 
> The IPv4 is ok, but for IPv6, dhcpcd has the following error:
> 
> Mar 24 20:16:33 alf dhcpcd[43667]: DUID 00:01:00:01:1e:40:7c:6c
> Mar 24 20:16:33 alf dhcpcd[43667]: pppoe0: IAID 00:00:00:01
> Mar 24 20:16:33 alf dhcpcd[43667]: pppoe0: IAID 00:00:00:02
> Mar 24 20:16:33 alf dhcpcd[43667]: pppoe0: rebinding prior DHCPv6 lease
> Mar 24 20:16:35 alf dhcpcd[43667]: pppoe0: dhcp6_sendmessage: sendmsg: 
> Invalid argument
> Mar 24 20:17:03 alf dhcpcd[43667]: timed out
> Mar 24 20:17:03 alf dhcpcd[43667]: forked to background, child pid 10317

This is due to the new in6_pcbaddrisavail() check in udp6_output.c
(that is also in the 5.9 errata). This will work-around it for now:

Index: udp6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/udp6_output.c,v
retrieving revision 1.46
diff -u -p -r1.46 udp6_output.c
--- udp6_output.c       23 Mar 2016 15:50:36 -0000      1.46
+++ udp6_output.c       29 Mar 2016 10:24:34 -0000
@@ -175,7 +175,7 @@ udp6_output(struct inpcb *in6p, struct m
                        valid.sin6_len = sizeof(valid);
                        error = in6_pcbaddrisavail(in6p, &valid, 0, p);
                        if (error)
-                               goto release;
+                               printf("udp6_output: in6_pcbaddrisavail\n");
                }
        } else {
                if (IN6_IS_ADDR_UNSPECIFIED(&in6p->inp_faddr6)) {

(or just remove it).

> I had ktraced it for grabing the sendmsg syscall arguments used:
> 
>  43667 dhcpcd   CALL  sendmsg(10,0x1abbb5052020,0)
>  43667 dhcpcd   STRU  struct msghdr { name=0x7f7ffffc5260, namelen=28, 
> iov=0x1abbb5052050, iovlen=1, control=0x1abbb5052070, controllen=40, flags=0 }
>  43667 dhcpcd   STRU  struct iovec { base=0x1abb901b5000, len=167 }
>  43667 dhcpcd   STRU  struct sockaddr { AF_INET6, [ff02::1:2]:547 }
>  43667 dhcpcd   STRU  struct cmsghdr { len=36, level=41<ipv6>, type=46 }
>  43667 dhcpcd   RET   sendmsg -1 errno 22 Invalid argument

With this check disabled/neutered, the packets are sent like so:

11:26:43.567469 PPPoE 
        code Session, version 1, type 1, id 0x02db, length 213
        IPV6: fe80::225:90ff:fec0:77b5.546 > ff02::1:2.547: [udp sum ok]dhcp6 
reconfig [hlim 1] (len 171)
11:26:43.581748 PPPoE 
        code Session, version 1, type 1, id 0x02db, length 155
        IPV6: fe80::d2f0:dbff:fe6c:e000.547 > fe80::225:90ff:fec0:77b5.546: 
[udp sum ok]dhcp6 [class 0xc0] (len 113, hlim 64)

$ fstat | grep 546
root     dhcpcd      1384   10* internet6 dgram udp *:546

As you'd expect, fe80::225:90ff:fec0:77b5 is the link-local address
on the pppoe interface.

Reply via email to