Main use-case is to renew/restart DHCP if a bridge member is added/removed.

Signed-off-by: Helmut Schaa <helmut.sc...@googlemail.com>
---

Maybe it is worth to add another PROTO_CMD_RENEW or something that is more
lightweight instead of running a full setup again?

 bridge.c    | 4 ++++
 device.h    | 3 +++
 interface.c | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/bridge.c b/bridge.c
index 4ef0d7e..db403c5 100644
--- a/bridge.c
+++ b/bridge.c
@@ -140,6 +140,8 @@ bridge_disable_member(struct bridge_member *bm)
        system_bridge_delif(&bst->dev, bm->dev.dev);
        device_release(&bm->dev);
 
+       device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
+
        return 0;
 }
 
@@ -162,6 +164,8 @@ bridge_enable_member(struct bridge_member *bm)
                goto error;
        }
 
+       device_broadcast_event(&bst->dev, DEV_EVENT_TOPO_CHANGE);
+
        return 0;
 
 error:
diff --git a/device.h b/device.h
index 8d3efa3..e96a4c4 100644
--- a/device.h
+++ b/device.h
@@ -77,6 +77,9 @@ enum device_event {
        DEV_EVENT_LINK_UP,
        DEV_EVENT_LINK_DOWN,
 
+       /* Topology changed (i.e. bridge member added) */
+       DEV_EVENT_TOPO_CHANGE, 
+
        __DEV_EVENT_MAX
 };
 
diff --git a/interface.c b/interface.c
index b2c8baf..7fcc8a0 100644
--- a/interface.c
+++ b/interface.c
@@ -248,6 +248,9 @@ interface_cb(struct device_user *dep, enum device_event ev)
        case DEV_EVENT_REMOVE:
                new_state = false;
                break;
+       case DEV_EVENT_TOPO_CHANGE:
+               interface_proto_event(iface->proto, PROTO_CMD_SETUP, false);
+               return;
        default:
                return;
        }
-- 
1.8.1.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to