Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Interface routes time out too soon



I’m using -current built a few days ago, and the included dhcpcd 6.5.0.

I’m using DHCPv6 to get a prefix delegation from my provider’s cable modem. This works, right up until the delegation’s lifetime expires. And then the link route disappears.

It took me a while to figure out what was going on, here. When dhcpcd first acquires the PD lease, it adds an inet6 address for each interface for which I’ve told it to do so.

dhcpcd.conf (excerpts):
  ipv6only
  noipv6rs

  interface wm0
  ia_pd 1 wm1/2

'ifconfig -L wm1' shows reasonable values for pltime and vltime. A /64 route is also added to the routing table for the link:

  aaaa:bbbb:cccc:ddf2::/64               link#2                         UC          -        -      -  wm1

After 1/4 of the delegation lifetime, dhcpcd renews the lease, and updates the vltime and pltime of the inet6 address on the interface appropriately. However, after the initial lease timeout, the link#2 route will disappear (and the similar routes for the other interfaces that I’m delegating a /64 to also disappear; I omitted all but one in the config excerpt above). At this point, the interface is unable to speak IPv6 to the local network. It’s as if the link route is given the initial expiration time, but never updated.

However, 'netstat -r' shows 0 for the expiration time!

  aaaa:bbbb:cccc:ddf2::/64               link#2                         UC          -        -      -  wm1
  	expire            0   recvpipe          0   sendpipe          0
  	ssthresh          0L  rtt               0L  rttvar            0L
  	hopcount          0L

This behavior is the same whether or not I set ipv6ra_own on the interfaces in question in dhcpcd.conf. The only way that I’ve been able to keep my nets up is to hack dhcpcd to set the vltime to infinity on the delegated-address interfaces:

Index: external/bsd/dhcpcd/dist/if-bsd.c
===================================================================
RCS file: /cvsroot/src/external/bsd/dhcpcd/dist/if-bsd.c,v
retrieving revision 1.11
diff -u -r1.11 if-bsd.c
--- external/bsd/dhcpcd/dist/if-bsd.c	6 Oct 2014 18:22:29 -0000	1.11
+++ external/bsd/dhcpcd/dist/if-bsd.c	28 Oct 2014 01:49:35 -0000
@@ -616,6 +618,7 @@
 	ADDADDR(&ifa.ifra_prefixmask, &mask);
 	ifa.ifra_lifetime.ia6t_vltime = a->prefix_vltime;
 	ifa.ifra_lifetime.ia6t_pltime = a->prefix_pltime;
+	ifa.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME;
 #undef ADDADDR

 	r = ioctl(s, action < 0 ? SIOCDIFADDR_IN6 : SIOCAIFADDR_IN6, &ifa);

While this is obviously pretty bogus, setting the interface vltime to infinite does cause the route to stick around in the routing table, so things generally work. So what’s going wrong? Is this the kernel’s fault for not continuing to propagate expiration time from the interface to the route—and not showing it at all in netstat -r? Or is dhcpcd not setting something correctly?

Thanks,
- Geoff



Home | Main Index | Thread Index | Old Index