system-linux: switch to new ETHTOOL_xLINKSETTINGS API
[project/netifd.git] / bridge.c
index 2e9cca3bcd84c495de8e48e82043bfb5ead8c24e..dbeea469160c039393b45863c1067dc215925876 100644 (file)
--- a/bridge.c
+++ b/bridge.c
@@ -351,13 +351,14 @@ static void bridge_stp_notify(struct bridge_state *bst)
 static int
 bridge_enable_interface(struct bridge_state *bst)
 {
-       int ret;
+       struct device *dev = &bst->dev;
+       int i, ret;
 
        if (bst->active)
                return 0;
 
        bridge_stp_notify(bst);
-       ret = system_bridge_addbr(&bst->dev, &bst->config);
+       ret = system_bridge_addbr(dev, &bst->config);
        if (ret < 0)
                return ret;
 
@@ -368,6 +369,10 @@ bridge_enable_interface(struct bridge_state *bst)
                bridge_set_local_vlans(bst, true);
        }
 
+       for (i = 0; i < dev->n_extra_vlan; i++)
+               system_bridge_vlan(dev->ifname, dev->extra_vlan[i].start,
+                                  dev->extra_vlan[i].end, true, BRVLAN_F_SELF);
+
        bst->active = true;
        return 0;
 }
@@ -1217,11 +1222,11 @@ bridge_reload(struct device *dev, struct blob_attr *attr)
        struct blob_attr *tb_dev[__DEV_ATTR_MAX];
        struct blob_attr *tb_br[__BRIDGE_ATTR_MAX];
        enum dev_change_type ret = DEV_CONFIG_APPLIED;
-       unsigned long diff;
        struct bridge_state *bst;
+       unsigned long diff[2];
 
-       BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / 8);
-       BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / 8);
+       BUILD_BUG_ON(sizeof(diff) < __BRIDGE_ATTR_MAX / BITS_PER_LONG);
+       BUILD_BUG_ON(sizeof(diff) < __DEV_ATTR_MAX / BITS_PER_LONG);
 
        bst = container_of(dev, struct bridge_state, dev);
        attr = blob_memdup(attr);
@@ -1245,23 +1250,23 @@ bridge_reload(struct device *dev, struct blob_attr *attr)
                blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, otb_dev,
                        blob_data(bst->config_data), blob_len(bst->config_data));
 
-               diff = 0;
-               uci_blob_diff(tb_dev, otb_dev, &device_attr_list, &diff);
-               if (diff) {
+               diff[0] = diff[1] = 0;
+               uci_blob_diff(tb_dev, otb_dev, &device_attr_list, diff);
+               if (diff[0] | diff[1]) {
                        ret = DEV_CONFIG_RESTART;
-                       D(DEVICE, "Bridge %s device attributes have changed, diff=0x%lx\n",
-                         dev->ifname, diff);
+                       D(DEVICE, "Bridge %s device attributes have changed, diff=[%lx %lx]\n",
+                         dev->ifname, diff[1], diff[0]);
                }
 
                blobmsg_parse(bridge_attrs, __BRIDGE_ATTR_MAX, otb_br,
                        blob_data(bst->config_data), blob_len(bst->config_data));
 
-               diff = 0;
-               uci_blob_diff(tb_br, otb_br, &bridge_attr_list, &diff);
-               if (diff & ~(1 << BRIDGE_ATTR_PORTS)) {
+               diff[0] = diff[1] = 0;
+               uci_blob_diff(tb_br, otb_br, &bridge_attr_list, diff);
+               if (diff[0] & ~(1 << BRIDGE_ATTR_PORTS)) {
                        ret = DEV_CONFIG_RESTART;
-                       D(DEVICE, "Bridge %s attributes have changed, diff=0x%lx\n",
-                         dev->ifname, diff);
+                       D(DEVICE, "Bridge %s attributes have changed, diff=[%lx %lx]\n",
+                         dev->ifname, diff[1], diff[0]);
                }
 
                bridge_config_init(dev);