[Bug 257499] IPv6 link routes are not removed from routing table when interface goes down
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 257499] IPv6 link routes are not removed from routing table when interface goes down"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 257499] IPv6 link routes are not removed from routing table when interface goes down"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 30 Jul 2021 08:45:01 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=257499 Bug ID: 257499 Summary: IPv6 link routes are not removed from routing table when interface goes down Product: Base System Version: 13.0-STABLE Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: alexis.savin@efficientip.com Hello FreeBSD community, I'm facing some kind of inconsistent behavior with the kernel's IPv6 implementation. Directly Connected routes (link routes) are consistently created at startup or when an network interface is created. However, these routes remain in the routing table when associated network interface goes down. If then deleted (manually or by a specific process such as quagga), these routes are not restored in the routing table when the interface goes back up, leading to unexpected behavior. Tested on 11.4-STABLE and 13.0-STABLE. Step to Reproduce: 1. Configure an additional network interface on a FreeBSD device with IPv6 and get it up and running (connected + up) ``` ifconfig_em1="up media autoselect -txcsum" ifconfig_em1_alias0="inet 10.10.10.24 netmask 255.255.255.0" ifconfig_em1_ipv6="inet6 2607:5300:203:2e61::2 prefixlen 64" ``` 2. Observe that interface is up and that link routes are pushed into the routing table (both IPv4 and IPv6) ``` # ifconfig em1 em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=98<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> ether 08:00:27:57:85:9f hwaddr 08:00:27:57:85:9f inet6 fe80::a00:27ff:fe57:859f%em1 prefixlen 64 scopeid 0x2 inet6 2607:5300:203:2e61::2 prefixlen 64 inet 10.10.10.24 netmask 0xffffff00 broadcast 10.10.10.255 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: Ethernet autoselect (1000baseT <full-duplex>) status: active # netstat -rn4 Routing tables Internet: Destination Gateway Flags Netif Expire default 192.168.1.254 UGS em0 10.10.10.0/24 link#2 U em1 10.10.10.24 link#2 UHS lo0 127.0.0.1 link#3 UH lo0 192.168.1.0/24 link#1 U em0 192.168.1.18 link#1 UHS lo0 # netstat -rn6 Routing tables Internet6: Destination Gateway Flags Netif Expire ::/96 ::1 UGRS lo0 ::1 link#3 UHS lo0 ::ffff:0.0.0.0/96 ::1 UGRS lo0 2607:5300:203:2e61::/64 link#2 U em1 2607:5300:203:2e61::2 link#2 UHS lo0 fe80::/10 ::1 UGRS lo0 fe80::%em1/64 link#2 U em1 fe80::a00:27ff:fe57:859f%em1 link#2 UHS lo0 fe80::%lo0/64 link#3 U lo0 fe80::1%lo0 link#3 UHS lo0 ff02::/16 ::1 UGRS lo0 ``` 3. Take down the interface em1 and observe that IPv4 link routes (10.10.10.0/24) are removed from the routing table while IPv6 link routes (2607:5300:203:2e61::/64, 2607:5300:203:2e61::2 and fe80::%em1/64) remain. ``` # ifconfig em1 down # ifconfig em1 em1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=98<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> ether 08:00:27:57:85:9f hwaddr 08:00:27:57:85:9f inet6 fe80::a00:27ff:fe57:859f%em1 prefixlen 64 tentative scopeid 0x2 inet6 2607:5300:203:2e61::2 prefixlen 64 tentative inet 10.10.10.24 netmask 0xffffff00 broadcast 10.10.10.255 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: Ethernet autoselect (1000baseT <full-duplex>) status: active # netstat -rn4 Routing tables Internet: Destination Gateway Flags Netif Expire default 192.168.1.254 UGS em0 10.10.10.24 link#2 UHS lo0 127.0.0.1 link#3 UH lo0 192.168.1.0/24 link#1 U em0 192.168.1.18 link#1 UHS lo0 # netstat -rn6 Routing tables Internet6: Destination Gateway Flags Netif Expire ::/96 ::1 UGRS lo0 ::1 link#3 UHS lo0 ::ffff:0.0.0.0/96 ::1 UGRS lo0 2607:5300:203:2e61::/64 link#2 U em1 2607:5300:203:2e61::2 link#2 UHS lo0 fe80::/10 ::1 UGRS lo0 fe80::%em1/64 link#2 U em1 fe80::a00:27ff:fe57:859f%em1 link#2 UHS lo0 fe80::%lo0/64 link#3 U lo0 fe80::1%lo0 link#3 UHS lo0 ff02::/16 ::1 UGRS lo0 ``` 4. Delete remaining routes ``` route delete -inet6 fe80::%em1/64 route delete -inet6 2607:5300:203:2e61::2 route delete -inet6 2607:5300:203:2e61::/64 # netstat -rn6 Routing tables Internet6: Destination Gateway Flags Netif Expire ::/96 ::1 UGRS lo0 ::1 link#3 UHS lo0 ::ffff:0.0.0.0/96 ::1 UGRS lo0 fe80::/10 ::1 UGRS lo0 fe80::a00:27ff:fe57:859f%em1 link#2 UHS lo0 fe80::%lo0/64 link#3 U lo0 fe80::1%lo0 link#3 UHS lo0 ff02::/16 ::1 UGRS lo0 ``` # Bring the interface back up, observer that link routes are not restored ``` # ifconfig em1 up # ifconfig em1 em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=98<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> ether 08:00:27:57:85:9f hwaddr 08:00:27:57:85:9f inet6 fe80::a00:27ff:fe57:859f%em1 prefixlen 64 scopeid 0x2 inet6 2607:5300:203:2e61::2 prefixlen 64 inet 10.10.10.24 netmask 0xffffff00 broadcast 10.10.10.255 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: Ethernet autoselect (1000baseT <full-duplex>) status: active # netstat -rn6 Routing tables Internet6: Destination Gateway Flags Netif Expire ::/96 ::1 UGRS lo0 ::1 link#3 UHS lo0 ::ffff:0.0.0.0/96 ::1 UGRS lo0 fe80::/10 ::1 UGRS lo0 fe80::a00:27ff:fe57:859f%em1 link#2 UHS lo0 fe80::%lo0/64 link#3 U lo0 fe80::1%lo0 link#3 UHS lo0 ff02::/16 ::1 UGRS lo0 ``` From my understanding, this is definitely not the expected behavior. It's not consistent regarding FreeBSD IPv4 implementation, nor consistant regarding other kernel implementation. On Linux for instance, these link routes are taken down when network interface goes down and brough back once back up. So unless I'm missing some specific configuration setting, I suspect an issue with the IPv6 network stack. I guess this doesn't affect everybody, we figured it out while using dynamic routing (Quagga/FRR +BGP). Thank in advance for your feedback Kind regards -- You are receiving this mail because: You are the assignee for the bug.