summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bridge.c10
-rw-r--r--config.c22
2 files changed, 23 insertions, 9 deletions
diff --git a/bridge.c b/bridge.c
index eebd8e9..3f8f9a8 100644
--- a/bridge.c
+++ b/bridge.c
@@ -39,6 +39,7 @@ enum {
BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL,
BRIDGE_ATTR_LAST_MEMBER_INTERVAL,
BRIDGE_ATTR_VLAN_FILTERING,
+ BRIDGE_ATTR_HAS_VLANS,
__BRIDGE_ATTR_MAX
};
@@ -59,6 +60,7 @@ static const struct blobmsg_policy bridge_attrs[__BRIDGE_ATTR_MAX] = {
[BRIDGE_ATTR_QUERY_RESPONSE_INTERVAL] = { "query_response_interval", BLOBMSG_TYPE_INT32 },
[BRIDGE_ATTR_LAST_MEMBER_INTERVAL] = { "last_member_interval", BLOBMSG_TYPE_INT32 },
[BRIDGE_ATTR_VLAN_FILTERING] = { "vlan_filtering", BLOBMSG_TYPE_BOOL },
+ [BRIDGE_ATTR_HAS_VLANS] = { "__has_vlans", BLOBMSG_TYPE_BOOL }, /* internal */
};
static const struct uci_blob_param_info bridge_attr_info[__BRIDGE_ATTR_MAX] = {
@@ -105,6 +107,7 @@ struct bridge_state {
struct blob_attr *ifnames;
bool active;
bool force_active;
+ bool has_vlans;
struct uloop_timeout retry;
struct bridge_member *primary_port;
@@ -327,7 +330,7 @@ bridge_enable_interface(struct bridge_state *bst)
if (ret < 0)
return ret;
- if (bst->config.vlan_filtering) {
+ if (bst->has_vlans) {
/* delete default VLAN 1 */
system_bridge_vlan(bst->dev.ifname, 1, false, BRVLAN_F_SELF);
@@ -378,7 +381,7 @@ bridge_enable_member(struct bridge_member *bm)
goto error;
}
- if (bst->config.vlan_filtering) {
+ if (bst->has_vlans) {
/* delete default VLAN 1 */
system_bridge_vlan(bm->dev.dev->ifname, 1, false, 0);
@@ -539,6 +542,7 @@ bridge_set_up(struct bridge_state *bst)
struct bridge_member *bm;
int ret;
+ bst->has_vlans = !avl_is_empty(&bst->dev.vlans.avl);
if (!bst->n_present) {
if (!bst->force_active)
return -ENOENT;
@@ -1056,7 +1060,7 @@ 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;
- if (!bst->config.vlan_filtering || !bst->active)
+ if (!bst->has_vlans || !bst->active)
goto out;
if (node_old)
diff --git a/config.c b/config.c
index 3546787..8122a95 100644
--- a/config.c
+++ b/config.c
@@ -76,18 +76,15 @@ config_bridge_has_vlans(const char *br_name)
}
static void
-config_fixup_bridge_vlan_filtering(struct uci_section *s, const char *name)
+config_fixup_bridge_var(struct uci_section *s, const char *name, const char *val)
{
struct uci_ptr ptr = {
.p = s->package,
.s = s,
- .option = "vlan_filtering",
- .value = "1",
+ .option = name,
+ .value = val,
};
- if (!config_bridge_has_vlans(name))
- return;
-
uci_lookup_ptr(uci_ctx, &ptr, NULL, false);
if (ptr.o)
return;
@@ -95,6 +92,19 @@ config_fixup_bridge_vlan_filtering(struct uci_section *s, const char *name)
uci_set(uci_ctx, &ptr);
}
+static void
+config_fixup_bridge_vlan_filtering(struct uci_section *s, const char *name)
+{
+ bool has_vlans = config_bridge_has_vlans(name);
+
+ config_fixup_bridge_var(s, "__has_vlans", has_vlans ? "1" : "0");
+
+ if (!has_vlans)
+ return;
+
+ config_fixup_bridge_var(s, "vlan_filtering", "1");
+}
+
static int
config_parse_bridge_interface(struct uci_section *s, struct device_type *devtype)
{