bridge: allow adding/removing VLANs to configured member ports via hotplug
[project/netifd.git] / vlan.c
diff --git a/vlan.c b/vlan.c
index 82b2d66821a2c9800c2a7718bec5dee483ca047b..459c9077a085cf15a73399a3d543674fcc6f7935 100644 (file)
--- 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