diff mbox

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

Message ID 1477386514-3336-1-git-send-email-dedeckeh@gmail.com
State Changes Requested
Delegated to: John Crispin
Headers show

Commit Message

Hans Dedecker Oct. 25, 2016, 9:08 a.m. UTC
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@gmail.com>
---
 bridge.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)
diff mbox

Patch

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);
 }