summaryrefslogtreecommitdiff
path: root/vlan.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2021-06-04 09:05:31 +0200
committerFelix Fietkau <nbd@nbd.name>2021-06-04 09:05:33 +0200
commit50381d0a2998f6c0fc4823f0c2aa4206063d549e (patch)
treee22f15cc925923c12a741a41e4fa289270c3a547 /vlan.c
parent7f199050f395d5295a3f665bcd2eb8cc755d08aa (diff)
downloadnetifd-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.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/vlan.c b/vlan.c
index 82b2d66..459c907 100644
--- a/vlan.c
+++ b/vlan.c
@@ -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