On 2013-07-24, Rolf Sommerhalder <[email protected]> wrote: > The v6 default route now persists once I killed dhclient, which was > renewing the v4 address every 54 seconds or so due to a short lease > time!
OK, I can confirm this reliably: $ sudo /sbin/route add -inet6 default -gateway 2001:41D0:1:XX:ff:ff:ff:ff $ route -n show -inet6 | grep default default 2001:41d0:1:XX:ff:ff:ff:ff UGS 0 0 - 8 sis0 $ sudo pkill dhclient && sudo dhclient sis0 DHCPREQUEST on sis0 to 255.255.255.255 port 67 DHCPACK from 91.121.XX.XX (00:30:48:XX:XX:XX) Unexpected DHCPACK from 91.121.XX.XX (00:04:4d:XX:XX:XX). State #4 bound to 91.121.XX.XX -- renewal in 300 seconds. $ route -n show -inet6 | grep default $ > I am unsure why dhclient touches the v6 routing table. Is this an > unwanted side effect when it eventually refreshes the v4 default > gateway, e.g. a bug? Same here. This is odd. Maybe the IPv6 default route gets overwritten at the same time as the IPv4 one. I wonder if the very last change to dhclient in CURRENT (1.260 [0]) wouldn't actually fix the problem, at least as a side effect in this case: it only apply changes when the lease differs from the previously obtained one. Prior to this change, bind_lease() unconditionally called flush_routes(). However, flush_routes() in [1] is documented to be equivalent to `route -q $rdomain -n flush -inet -iface $interface` (note the -inet), which might contradict my understanding of the cause. Anyway, I build dhclient from current today, and tried running it. This time, I don't seem to lose my route! $ sudo /sbin/route add -inet6 default -gateway 2001:41D0:1:XX:ff:ff:ff:ff add net default: gateway 2001:41D0:1:XX:ff:ff:ff:ff $ route -n show -inet6 | grep default default 2001:41d0:1:XX:ff:ff:ff:ff UGS 0 0 - 8 sis0 $ sudo pkill dhclient && sudo ./dhclient sis0 DHCPREQUEST on sis0 to 255.255.255.255 port 67 DHCPACK from 91.121.XX.XX (00:30:48:XX:XX:XX) bound to 91.121.XX.XX -- renewal in 300 seconds. $ route -n show -inet6 | grep default default 2001:41d0:1:XX:ff:ff:ff:ff UGS 0 0 - 8 sis0 $ What's better, it doesn't seem to go away anymore: $ while : ; do sudo /sbin/route add -inet6 default -gateway 2001:41D0:1:XX:ff:ff:ff:ff -expire 0; time while route show -inet6 | grep -q default; do sleep 1; echo -n .; done; done | tee routelog 2>&1 route: writing to routing socket: File exists add net default: gateway 2001:41D0:1:XX:ff:ff:ff:ff: File exists ............... (It keeps going, rather than failing every 5 minutes). Running dhclient from CURRENT therefore seems to be a good workaround, but I doubt the lease management is the cause of the problem. Rather, I still suspect that flush_routes() is closer to the culprit. I'll file a bug. [0] http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/dhclient/dhclient.c?rev=1.260 [1] http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/dhclient/kroute.c?rev=1.55 -- Olivier Mehani <[email protected]> PGP fingerprint: 4435 CF6A 7C8D DD9B E2DE F5F9 F012 A6E2 98C6 6655
