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 = {
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;
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;
/* 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;
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];
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);
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;