diff options
author | Felix Fietkau <nbd@nbd.name> | 2021-06-04 09:05:31 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-06-04 09:05:33 +0200 |
commit | 50381d0a2998f6c0fc4823f0c2aa4206063d549e (patch) | |
tree | e22f15cc925923c12a741a41e4fa289270c3a547 /vlan.c | |
parent | 7f199050f395d5295a3f665bcd2eb8cc755d08aa (diff) | |
download | netifd-50381d0a2998f6c0fc4823f0c2aa4206063d549e.tar.gz |
bridge: allow adding/removing VLANs to configured member ports via hotplug
This is useful for a dynamic VLAN setup, where extra tags need to be created
on the trunking port on demand
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'vlan.c')
-rw-r--r-- | vlan.c | 21 |
1 files changed, 12 insertions, 9 deletions
@@ -39,7 +39,7 @@ static void free_vlan_if(struct device *iface) } static int -vlan_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan) +__vlan_hotplug_op(struct device *dev, struct device *member, struct blob_attr *vlan, bool add) { struct vlan_device *vldev = container_of(dev, struct vlan_device, dev); void *a; @@ -53,19 +53,22 @@ vlan_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vl blobmsg_printf(&b, NULL, "%d", vldev->id); blobmsg_close_array(&b, a); - return dev->hotplug_ops->add(dev, member, blobmsg_data(b.head)); + if (add) + return dev->hotplug_ops->add(dev, member, blobmsg_data(b.head)); + else + return dev->hotplug_ops->del(dev, member, blobmsg_data(b.head)); } static int -vlan_hotplug_del(struct device *dev, struct device *member) +vlan_hotplug_add(struct device *dev, struct device *member, struct blob_attr *vlan) { - struct vlan_device *vldev = container_of(dev, struct vlan_device, dev); - - dev = vldev->dep.dev; - if (!dev || !dev->hotplug_ops) - return UBUS_STATUS_NOT_SUPPORTED; + return __vlan_hotplug_op(dev, member, vlan, true); +} - return dev->hotplug_ops->del(dev, member); +static int +vlan_hotplug_del(struct device *dev, struct device *member, struct blob_attr *vlan) +{ + return __vlan_hotplug_op(dev, member, vlan, false); } static int |