wireless: fix passing bridge name for vlan hotplug pass-through
authorFelix Fietkau <nbd@nbd.name>
Wed, 18 Nov 2020 12:38:17 +0000 (13:38 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 18 Nov 2020 12:38:19 +0000 (13:38 +0100)
When preparing the interface for hotplug add, pass the bridge
device back to the caller, since it may not match the original device

Signed-off-by: Felix Fietkau <nbd@nbd.name>
bridge.c
device.h
ubus.c
vlan.c
vlandev.c
wireless.c

index 3f8f9a82afb14a18c9daa95c0ede9a4aff1cd4d8..44d6af6b00c3b69ab423e4932bfc44667f2435e8 100644 (file)
--- a/bridge.c
+++ b/bridge.c
@@ -733,10 +733,13 @@ bridge_hotplug_del(struct device *dev, struct device *member)
 }
 
 static int
-bridge_hotplug_prepare(struct device *dev)
+bridge_hotplug_prepare(struct device *dev, struct device **bridge_dev)
 {
        struct bridge_state *bst;
 
+       if (bridge_dev)
+               *bridge_dev = dev;
+
        bst = container_of(dev, struct bridge_state, dev);
        bst->force_active = true;
        device_set_present(&bst->dev, true);
index 617a2724b1fda0f7ae6fc5f98f9bbf64ddbe0274..243fdadd8ac5483f0cd5c4715b2824bfacd57921 100644 (file)
--- a/device.h
+++ b/device.h
@@ -226,7 +226,7 @@ struct device {
 };
 
 struct device_hotplug_ops {
-       int (*prepare)(struct device *dev);
+       int (*prepare)(struct device *dev, struct device **bridge_dev);
        int (*add)(struct device *main, struct device *member, struct blob_attr *vlan);
        int (*del)(struct device *main, struct device *member);
 };
diff --git a/ubus.c b/ubus.c
index 4f167641e3a1c6680aa7f490e956ec7848c3f045..db4b3354e21eb3732279fcbb16500d1f36dfc717 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -986,19 +986,27 @@ netifd_handle_iface_prepare(struct ubus_context *ctx, struct ubus_object *obj,
                            struct blob_attr *msg)
 {
        struct interface *iface;
-       struct device *dev;
+       struct device *dev, *bridge_dev = NULL;
        const struct device_hotplug_ops *ops;
 
        iface = container_of(obj, struct interface, ubus);
        dev = iface->main_dev.dev;
        if (!dev)
-               return 0;
+               goto out;
 
        ops = dev->hotplug_ops;
        if (!ops)
-               return 0;
+               goto out;
+
+       ops->prepare(dev, &bridge_dev);
+
+out:
+       blob_buf_init(&b, 0);
+       if (bridge_dev)
+               blobmsg_add_string(&b, "bridge", bridge_dev->ifname);
+       ubus_send_reply(ctx, req, b.head);
 
-       return ops->prepare(dev);
+       return 0;
 }
 
 static int
diff --git a/vlan.c b/vlan.c
index 647c6b7c5eb0ce7958054634ad49f9eb8456ac3c..e2384612e157564bc6d321e60d916c6e4d4f2ff5 100644 (file)
--- a/vlan.c
+++ b/vlan.c
@@ -69,7 +69,7 @@ vlan_hotplug_del(struct device *dev, struct device *member)
 }
 
 static int
-vlan_hotplug_prepare(struct device *dev)
+vlan_hotplug_prepare(struct device *dev, struct device **bridge_dev)
 {
        struct vlan_device *vldev = container_of(dev, struct vlan_device, dev);
 
@@ -77,7 +77,7 @@ vlan_hotplug_prepare(struct device *dev)
        if (!dev || !dev->hotplug_ops)
                return UBUS_STATUS_NOT_SUPPORTED;
 
-       return dev->hotplug_ops->prepare(dev);
+       return dev->hotplug_ops->prepare(dev, bridge_dev);
 }
 
 static void vlan_hotplug_check(struct vlan_device *vldev, struct device *dev)
index 7efb5f42b5c4d7ebb2beb7a9ffd6faeccdcee283..0c0caab46e083b7395b8147c1c5f3d4c75b53537 100644 (file)
--- a/vlandev.c
+++ b/vlandev.c
@@ -89,7 +89,7 @@ vlandev_hotplug_del(struct device *dev, struct device *member)
 }
 
 static int
-vlandev_hotplug_prepare(struct device *dev)
+vlandev_hotplug_prepare(struct device *dev, struct device **bridge_dev)
 {
        struct vlandev_device *mvdev = container_of(dev, struct vlandev_device, dev);
 
@@ -97,7 +97,7 @@ vlandev_hotplug_prepare(struct device *dev)
        if (!dev || !dev->hotplug_ops)
                return UBUS_STATUS_NOT_SUPPORTED;
 
-       return dev->hotplug_ops->prepare(dev);
+       return dev->hotplug_ops->prepare(dev, bridge_dev);
 }
 
 static void vlandev_hotplug_check(struct vlandev_device *mvdev)
index 6bf6b585bf734ff50b9e84ad844e553324af82b6..a9917a388f79b736c21d342f0c31819b9e18a0af 100644 (file)
@@ -136,7 +136,7 @@ vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool pre
                if (!dev)
                        return;
 
-               if (!dev->type->bridge_capability)
+               if (!dev->hotplug_ops)
                        return;
        }
 
@@ -144,7 +144,10 @@ vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool pre
                return;
 
        if (dev->hotplug_ops && dev->hotplug_ops->prepare)
-               dev->hotplug_ops->prepare(dev);
+               dev->hotplug_ops->prepare(dev, &dev);
+
+       if (!dev || !dev->type->bridge_capability)
+               return;
 
        blobmsg_add_string(buf, "bridge", dev->ifname);