From e0c838bd06a626cc20404ffac4d32facfa6c1d07 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 26 Nov 2020 10:23:01 +0100 Subject: vlandev: support bridge-vlan aliases in the vid config parameter This can be used to generate default network configurations that define the lan/wan interfaces as vlandevs with custom names and specify the actual VLAN ID only in the bridge-vlan section without repeating it elsewhere Signed-off-by: Felix Fietkau --- vlandev.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) (limited to 'vlandev.c') diff --git a/vlandev.c b/vlandev.c index 595c461..2f86192 100644 --- a/vlandev.c +++ b/vlandev.c @@ -31,7 +31,7 @@ enum { static const struct blobmsg_policy vlandev_attrs[__VLANDEV_ATTR_MAX] = { [VLANDEV_ATTR_IFNAME] = { "ifname", BLOBMSG_TYPE_STRING }, - [VLANDEV_ATTR_VID] = { "vid", BLOBMSG_TYPE_INT32 }, + [VLANDEV_ATTR_VID] = { "vid", BLOBMSG_TYPE_STRING }, [VLANDEV_ATTR_INGRESS_QOS_MAPPING] = { "ingress_qos_mapping", BLOBMSG_TYPE_ARRAY }, [VLANDEV_ATTR_EGRESS_QOS_MAPPING] = { "egress_qos_mapping", BLOBMSG_TYPE_ARRAY }, }; @@ -55,6 +55,8 @@ struct vlandev_device { struct blob_attr *config_data; struct blob_attr *ifname; + struct blob_attr *vid; + struct vlandev_config config; }; @@ -234,6 +236,28 @@ vlandev_dump_info(struct device *dev, struct blob_buf *b) vlandev_qos_mapping_dump(b, "egress_qos_mapping", &mvdev->config.egress_qos_mapping_list); } +static uint16_t +vlandev_get_vid(struct device *dev, const char *id_str) +{ + unsigned long id; + uint16_t *alias_id; + char *err; + + id = strtoul(id_str, &err, 10); + if (err && *err) { + if (!dev) + return 1; + + alias_id = kvlist_get(&dev->vlan_aliases, id_str); + if (!alias_id) + return 1; + + id = *alias_id; + } + + return (uint16_t)id; +} + static void vlandev_config_init(struct device *dev) { @@ -244,6 +268,11 @@ vlandev_config_init(struct device *dev) if (mvdev->ifname) basedev = device_get(blobmsg_data(mvdev->ifname), true); + if (mvdev->vid) + mvdev->config.vid = vlandev_get_vid(basedev, blobmsg_get_string(mvdev->vid)); + else + mvdev->config.vid = 1; + device_add_user(&mvdev->parent, basedev); vlandev_hotplug_check(mvdev); } @@ -282,14 +311,10 @@ vlandev_apply_settings(struct vlandev_device *mvdev, struct blob_attr **tb) cfg->proto = (mvdev->dev.type == &vlan8021q_device_type) ? VLAN_PROTO_8021Q : VLAN_PROTO_8021AD; - cfg->vid = 1; vlist_simple_update(&cfg->ingress_qos_mapping_list); vlist_simple_update(&cfg->egress_qos_mapping_list); - if ((cur = tb[VLANDEV_ATTR_VID])) - cfg->vid = (uint16_t) blobmsg_get_u32(cur); - if ((cur = tb[VLANDEV_ATTR_INGRESS_QOS_MAPPING])) vlandev_qos_mapping_list_apply(&cfg->ingress_qos_mapping_list, cur); @@ -319,6 +344,7 @@ vlandev_reload(struct device *dev, struct blob_attr *attr) device_init_settings(dev, tb_dev); vlandev_apply_settings(mvdev, tb_mv); mvdev->ifname = tb_mv[VLANDEV_ATTR_IFNAME]; + mvdev->vid = tb_mv[VLANDEV_ATTR_VID]; if (mvdev->config_data) { struct blob_attr *otb_dev[__DEV_ATTR_MAX]; -- cgit v1.2.1