projects
/
project
/
netifd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
interface: fix regression on adding hotplug devices to interfaces
[project/netifd.git]
/
bridge.c
diff --git
a/bridge.c
b/bridge.c
index dd4d2c1c896e989faf90f759a9a71d6cdad84b12..2128ec75a0fb9bcb47b502a11973734523531517 100644
(file)
--- a/
bridge.c
+++ b/
bridge.c
@@
-223,7
+223,9
@@
bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan, bool
if (!port)
return;
if (!port)
return;
- if (bridge_member_vlan_is_pvid(bm, port))
+ if (!add && bm->pvid == vlan->vid)
+ bm->pvid = 0;
+ else if (add && bridge_member_vlan_is_pvid(bm, port))
bm->pvid = vlan->vid;
__bridge_set_member_vlan(bm, vlan, port, add);
bm->pvid = vlan->vid;
__bridge_set_member_vlan(bm, vlan, port, add);
@@
-275,12
+277,12
@@
bridge_set_vlan_state(struct bridge_state *bst, struct bridge_vlan *vlan, bool a
{
struct bridge_member *bm;
struct bridge_vlan *vlan2;
{
struct bridge_member *bm;
struct bridge_vlan *vlan2;
+ bool clear_pvid = false;
bridge_set_local_vlan(bst, vlan, add);
vlist_for_each_element(&bst->members, bm, node) {
struct bridge_vlan_port *port;
bridge_set_local_vlan(bst, vlan, add);
vlist_for_each_element(&bst->members, bm, node) {
struct bridge_vlan_port *port;
- int new_pvid = -1;
port = bridge_find_vlan_member_port(bm, vlan);
if (!port)
port = bridge_find_vlan_member_port(bm, vlan);
if (!port)
@@
-293,17
+295,18
@@
bridge_set_vlan_state(struct bridge_state *bst, struct bridge_vlan *vlan, bool a
vlan2 = bridge_recalc_member_pvid(bm);
if (vlan2 && vlan2->vid != vlan->vid) {
bridge_set_member_vlan(bm, vlan2, false);
vlan2 = bridge_recalc_member_pvid(bm);
if (vlan2 && vlan2->vid != vlan->vid) {
bridge_set_member_vlan(bm, vlan2, false);
+ bm->pvid = vlan2->vid;
bridge_set_member_vlan(bm, vlan2, true);
bridge_set_member_vlan(bm, vlan2, true);
+ } else if (!vlan2) {
+ clear_pvid = true;
}
}
- new_pvid = vlan2 ? vlan2->vid : 0;
}
}
- if (
!
bm->present)
-
continue
;
+ if (bm->present)
+
__bridge_set_member_vlan(bm, vlan, port, add)
;
- __bridge_set_member_vlan(bm, vlan, port, add);
- if (new_pvid >= 0)
- bm->pvid = new_pvid;
+ if (clear_pvid)
+ bm->pvid = 0;
}
}
}
}
@@
-617,7
+620,7
@@
bridge_enable_member(struct bridge_member *bm)
if (!bm->active) {
ret = system_bridge_addif(&bst->dev, bm->dev.dev);
if (ret < 0) {
if (!bm->active) {
ret = system_bridge_addif(&bst->dev, bm->dev.dev);
if (ret < 0) {
- D(DEVICE, "Bridge device %s could not be added
\n
", bm->dev.dev->ifname);
+ D(DEVICE, "Bridge device %s could not be added", bm->dev.dev->ifname);
goto error;
}
goto error;
}
@@
-1282,7
+1285,7
@@
bridge_reload(struct device *dev, struct blob_attr *attr)
uci_blob_diff(tb_dev, otb_dev, &device_attr_list, diff);
if (diff[0] | diff[1]) {
ret = DEV_CONFIG_RESTART;
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=[%lx %lx]
\n
",
+ D(DEVICE, "Bridge %s device attributes have changed, diff=[%lx %lx]",
dev->ifname, diff[1], diff[0]);
}
dev->ifname, diff[1], diff[0]);
}
@@
-1293,7
+1296,7
@@
bridge_reload(struct device *dev, struct blob_attr *attr)
uci_blob_diff(tb_br, otb_br, &bridge_attr_list, diff);
if (diff[0] & ~(1 << BRIDGE_ATTR_PORTS)) {
ret = DEV_CONFIG_RESTART;
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=[%lx %lx]
\n
",
+ D(DEVICE, "Bridge %s attributes have changed, diff=[%lx %lx]",
dev->ifname, diff[1], diff[0]);
}
dev->ifname, diff[1], diff[0]);
}
@@
-1369,14
+1372,14
@@
bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
struct bridge_state *bst = container_of(tree, struct bridge_state, dev.vlans);
struct bridge_vlan *vlan_new = NULL, *vlan_old = NULL;
- if (!bst->has_vlans || !bst->active)
- goto out;
-
if (node_old)
vlan_old = container_of(node_old, struct bridge_vlan, node);
if (node_new)
vlan_new = container_of(node_new, struct bridge_vlan, node);
if (node_old)
vlan_old = container_of(node_old, struct bridge_vlan, node);
if (node_new)
vlan_new = container_of(node_new, struct bridge_vlan, node);
+ if (!bst->has_vlans || !bst->active)
+ goto out;
+
if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
goto out;
if (node_new && node_old && bridge_vlan_equal(vlan_old, vlan_new)) {
list_splice_init(&vlan_old->hotplug_ports, &vlan_new->hotplug_ports);
goto out;
@@
-1391,9
+1394,8
@@
bridge_vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
if (node_new)
vlan_new->pending = true;
if (node_new)
vlan_new->pending = true;
- bst->dev.config_pending = true;
-
out:
out:
+ bst->dev.config_pending = true;
bridge_vlan_free(vlan_old);
}
bridge_vlan_free(vlan_old);
}