Revert "interface: warn if ip6hint is truncated"
[project/netifd.git] / bridge.c
index 30fd58d92065cd2516d27450f8dbfdb416fa18bd..c1f4ffa915d3fc5609843a5dfc96e419ff495e52 100644 (file)
--- a/bridge.c
+++ b/bridge.c
@@ -77,7 +77,7 @@ static struct device *bridge_create(const char *name, struct device_type *devtyp
 static void bridge_config_init(struct device *dev);
 static void bridge_free(struct device *dev);
 static void bridge_dump_info(struct device *dev, struct blob_buf *b);
-enum dev_change_type
+static enum dev_change_type
 bridge_reload(struct device *dev, struct blob_attr *attr);
 
 static struct device_type bridge_device_type = {
@@ -240,15 +240,15 @@ 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);
 
        bm->present = false;
        bm->bst->n_present--;
 
+       if (bm == bst->primary_port)
+               bridge_reset_primary(bst);
+
        if (bst->config.bridge_empty)
                return;
 
@@ -409,9 +409,11 @@ bridge_create_member(struct bridge_state *bst, const char *name,
        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
+       /*
+        * 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, name, bm, node);
        if (hotplug && bm)
                bm->node.version = -1;
@@ -568,8 +570,6 @@ bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
        /* defaults */
        cfg->stp = false;
        cfg->forward_delay = 2;
-       cfg->igmp_snoop = true;
-       cfg->multicast_querier = true;
        cfg->robustness = 2;
        cfg->query_interval = 12500;
        cfg->query_response_interval = 1000;
@@ -635,7 +635,7 @@ bridge_apply_settings(struct bridge_state *bst, struct blob_attr **tb)
                cfg->bridge_empty = blobmsg_get_bool(cur);
 }
 
-enum dev_change_type
+static enum dev_change_type
 bridge_reload(struct device *dev, struct blob_attr *attr)
 {
        struct blob_attr *tb_dev[__DEV_ATTR_MAX];
@@ -655,6 +655,9 @@ bridge_reload(struct device *dev, struct blob_attr *attr)
        blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, tb_br,
                blob_data(attr), blob_len(attr));
 
+       if (tb_dev[DEV_ATTR_MACADDR])
+               bst->primary_port = NULL;
+
        bst->ifnames = tb_br[BRIDGE_ATTR_IFNAME];
        device_init_settings(dev, tb_dev);
        bridge_apply_settings(bst, tb_br);
@@ -719,7 +722,13 @@ bridge_create(const char *name, struct device_type *devtype,
                return NULL;
 
        dev = &bst->dev;
-       device_init(dev, devtype, name);
+
+       if (device_init(dev, devtype, name) < 0) {
+               device_cleanup(dev);
+               free(bst);
+               return NULL;
+       }
+
        dev->config_pending = true;
        bst->retry.cb = bridge_retry_members;