summaryrefslogtreecommitdiff
path: root/bridge.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2020-10-28 18:54:39 +0100
committerFelix Fietkau <nbd@nbd.name>2020-10-28 18:54:44 +0100
commitdd5e611536362f3017e1344aebb5891321326413 (patch)
tree30b7f95cc67cb7d497d8f1e410f389dec418a1ab /bridge.c
parentd59f3ddcbaf0784a01aa8534cdcb20554748e6e5 (diff)
downloadnetifd-dd5e611536362f3017e1344aebb5891321326413.tar.gz
bridge: show vlans in device status
List vlans with member ports, VLAN IDs and flags Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'bridge.c')
-rw-r--r--bridge.c54
1 files changed, 51 insertions, 3 deletions
diff --git a/bridge.c b/bridge.c
index 92eea9f..cf87408 100644
--- a/bridge.c
+++ b/bridge.c
@@ -218,7 +218,7 @@ bridge_set_member_vlan(struct bridge_member *bm, struct bridge_vlan *vlan, bool
}
static void
-brigde_set_local_vlan(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
+bridge_set_local_vlan(struct bridge_state *bst, struct bridge_vlan *vlan, bool add)
{
if (!vlan->local && add)
return;
@@ -232,7 +232,7 @@ bridge_set_local_vlans(struct bridge_state *bst, bool add)
struct bridge_vlan *vlan;
vlist_for_each_element(&bst->dev.vlans, vlan, node)
- brigde_set_local_vlan(bst, vlan, add);
+ bridge_set_local_vlan(bst, vlan, add);
}
static struct bridge_vlan *
@@ -264,7 +264,7 @@ bridge_set_vlan_state(struct bridge_state *bst, struct bridge_vlan *vlan, bool a
struct bridge_member *bm;
struct bridge_vlan *vlan2;
- brigde_set_local_vlan(bst, vlan, add);
+ bridge_set_local_vlan(bst, vlan, add);
vlist_for_each_element(&bst->members, bm, node) {
struct bridge_vlan_port *port;
@@ -755,10 +755,48 @@ bridge_free(struct device *dev)
}
static void
+bridge_dump_port(struct blob_buf *b, struct bridge_vlan_port *port)
+{
+ bool tagged = !(port->flags & BRVLAN_F_UNTAGGED);
+ bool pvid = (port->flags & BRVLAN_F_PVID);
+
+ blobmsg_printf(b, "%s%s%s%s\n", port->ifname,
+ tagged || pvid ? ":" : "",
+ tagged ? "t" : "",
+ pvid ? "*" : "");
+}
+
+static void
+bridge_dump_vlan(struct blob_buf *b, struct bridge_vlan *vlan)
+{
+ struct bridge_vlan_hotplug_port *port;
+ void *c, *p;
+ int i;
+
+ c = blobmsg_open_table(b, NULL);
+
+ blobmsg_add_u32(b, "id", vlan->vid);
+ blobmsg_add_u8(b, "local", vlan->local);
+
+ p = blobmsg_open_array(b, "ports");
+
+ for (i = 0; i < vlan->n_ports; i++)
+ bridge_dump_port(b, &vlan->ports[i]);
+
+ list_for_each_entry(port, &vlan->hotplug_ports, list)
+ bridge_dump_port(b, &port->port);
+
+ blobmsg_close_array(b, p);
+
+ blobmsg_close_table(b, c);
+}
+
+static void
bridge_dump_info(struct device *dev, struct blob_buf *b)
{
struct bridge_state *bst;
struct bridge_member *bm;
+ struct bridge_vlan *vlan;
void *list;
bst = container_of(dev, struct bridge_state, dev);
@@ -774,6 +812,16 @@ bridge_dump_info(struct device *dev, struct blob_buf *b)
}
blobmsg_close_array(b, list);
+
+ if (avl_is_empty(&dev->vlans.avl))
+ return;
+
+ list = blobmsg_open_array(b, "bridge-vlans");
+
+ vlist_for_each_element(&bst->dev.vlans, vlan, node)
+ bridge_dump_vlan(b, vlan);
+
+ blobmsg_close_array(b, list);
}
static void