[OpenWrt-Devel] [PATCH netifd 1/2] bridge: Don't use device name as bridge member name

Hans Dedecker dedeckeh at gmail.com
Tue Oct 25 05:08:33 EDT 2016


The bridge name is a copy of the device name; but the device name can
change which is the case when an aliased interface is used as bridge member.
This will result into unwanted side effects like bridge reload triggering
a topology change effect after doing network reload; therefore use the
configured ifname as fixed bridge member name.
Also don't display bridge member devices which are hidden

Signed-off-by: Hans Dedecker <dedeckeh at gmail.com>
---
 bridge.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/bridge.c b/bridge.c
index 8e6c9a6..30fd58d 100644
--- a/bridge.c
+++ b/bridge.c
@@ -394,24 +394,25 @@ bridge_set_state(struct device *dev, bool up)
 }
 
 static struct bridge_member *
-bridge_create_member(struct bridge_state *bst, struct device *dev, bool hotplug)
+bridge_create_member(struct bridge_state *bst, const char *name,
+		     struct device *dev, bool hotplug)
 {
 	struct bridge_member *bm;
 
-	bm = calloc(1, sizeof(*bm) + strlen(dev->ifname) + 1);
+	bm = calloc(1, sizeof(*bm) + strlen(name) + 1);
 	if (!bm)
 		return NULL;
 
 	bm->bst = bst;
 	bm->dev.cb = bridge_member_cb;
 	bm->dev.hotplug = hotplug;
-	strcpy(bm->name, dev->ifname);
+	strcpy(bm->name, name);
 	bm->dev.dev = dev;
 	vlist_add(&bst->members, &bm->node, bm->name);
 	// Need to look up the bridge member again as the above
 	// created pointer will be freed in case the bridge member
 	// already existed
-	bm = vlist_find(&bst->members, dev->ifname, bm, node);
+	bm = vlist_find(&bst->members, name, bm, node);
 	if (hotplug && bm)
 		bm->node.version = -1;
 
@@ -455,7 +456,7 @@ bridge_add_member(struct bridge_state *bst, const char *name)
 	if (!dev)
 		return;
 
-	bridge_create_member(bst, dev, false);
+	bridge_create_member(bst, name, dev, false);
 }
 
 static int
@@ -463,7 +464,7 @@ bridge_hotplug_add(struct device *dev, struct device *member)
 {
 	struct bridge_state *bst = container_of(dev, struct bridge_state, dev);
 
-	bridge_create_member(bst, member, true);
+	bridge_create_member(bst, member->ifname, member, true);
 
 	return 0;
 }
@@ -523,8 +524,12 @@ bridge_dump_info(struct device *dev, struct blob_buf *b)
 	system_if_dump_info(dev, b);
 	list = blobmsg_open_array(b, "bridge-members");
 
-	vlist_for_each_element(&bst->members, bm, node)
+	vlist_for_each_element(&bst->members, bm, node) {
+		if (bm->dev.dev->hidden)
+			continue;
+
 		blobmsg_add_string(b, NULL, bm->dev.dev->ifname);
+	}
 
 	blobmsg_close_array(b, list);
 }
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list