Restore disable_ipv6 sysctl after removing a device from bridge or bond
authorFabian Bläse <fabian@blaese.de>
Fri, 15 Nov 2024 21:12:36 +0000 (22:12 +0100)
committerRobert Marko <robimarko@gmail.com>
Sat, 17 May 2025 09:35:54 +0000 (11:35 +0200)
If a device is added to a bond or bridge, the disable_ipv6 sysctl is
set, so that no link local addresses are present on the slave devices.

However, the disable_ipv6 sysctl is not restored after removing the
device from the bridge or bond. Therefore, no IPv6 link local addresses
are added and autoconfiguration does not work.

Set the disable_ipv6 to '0' on device removal from bridge or bond.

Signed-off-by: Fabian Bläse <fabian@blaese.de>
Link: https://github.com/openwrt/netifd/pull/40
Signed-off-by: Robert Marko <robimarko@gmail.com>
bonding.c
bridge.c

index 00a7b28320ace64c2a894d39d86625111d05dd0c..fef18f3c7954b36cbc31e5f93ff0630300bb94ad 100644 (file)
--- a/bonding.c
+++ b/bonding.c
@@ -171,6 +171,11 @@ bonding_disable_port(struct bonding_port *bp, bool keep_dev)
        if (!keep_dev)
                device_release(&bp->dev);
 
+       if (bp->dev.dev->settings.flags & DEV_OPT_IPV6) {
+               bp->dev.dev->settings.ipv6 = 1;
+               bp->dev.dev->settings.flags &= ~DEV_OPT_IPV6;
+       }
+
        return 0;
 }
 
index 2128ec75a0fb9bcb47b502a11973734523531517..70ece78180cd62e6f4ad99df24e7c13d138bee7c 100644 (file)
--- a/bridge.c
+++ b/bridge.c
@@ -327,6 +327,11 @@ bridge_disable_member(struct bridge_member *bm, bool keep_dev)
        if (!keep_dev)
                device_release(&bm->dev);
 
+       if (bm->dev.dev->settings.flags & DEV_OPT_IPV6) {
+               bm->dev.dev->settings.ipv6 = 1;
+               bm->dev.dev->settings.flags &= ~DEV_OPT_IPV6;
+       }
+
        device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
 
        return 0;