bridge: set the mac address based on the first active member
authorFelix Fietkau <nbd@openwrt.org>
Wed, 23 May 2012 14:09:45 +0000 (16:09 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 23 May 2012 14:09:45 +0000 (16:09 +0200)
bridge.c

index b1b79e8b6848be808780ed2e437917f92f1963c3..1725162a5c62f9d3689898a4105e78aeaaf2aae8 100644 (file)
--- a/bridge.c
+++ b/bridge.c
@@ -84,6 +84,7 @@ struct bridge_state {
        bool active;
        bool force_active;
 
+       struct bridge_member *primary_port;
        struct vlist_tree members;
        int n_present;
 };
@@ -96,6 +97,23 @@ struct bridge_member {
        char name[];
 };
 
+static void
+bridge_reset_primary(struct bridge_state *bst)
+{
+       struct bridge_member *bm;
+
+       bst->primary_port = NULL;
+       vlist_for_each_element(&bst->members, bm, node) {
+               if (!bm->present)
+                       continue;
+
+               bst->primary_port = bm;
+               memcpy(bst->dev.settings.macaddr, bm->dev.dev->settings.macaddr, 6);
+               bst->dev.settings.flags |= DEV_OPT_MACADDR;
+               return;
+       }
+}
+
 static int
 bridge_disable_member(struct bridge_member *bm)
 {
@@ -145,6 +163,9 @@ bridge_remove_member(struct bridge_member *bm)
        if (!bm->present)
                return;
 
+       if (bm == bst->primary_port);
+               bridge_reset_primary(bst);
+
        if (bst->dev.active)
                bridge_disable_member(bm);
 
@@ -228,6 +249,7 @@ bridge_set_up(struct bridge_state *bst)
                return -ENOENT;
        }
 
+       bridge_reset_primary(bst);
        ret = bst->set_state(&bst->dev, true);
        if (ret < 0)
                bridge_set_down(bst);