diff options
author | Felix Fietkau <nbd@nbd.name> | 2020-11-18 13:38:17 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2020-11-18 13:38:19 +0100 |
commit | 351d690f1a09e062ef951ac406ee571e1f1fe3e6 (patch) | |
tree | a142451fac10848da5970c65ee3ac9ce92e0f2a9 | |
parent | 4a41135750d97e06d1f6d808a9d24bb4b472aca4 (diff) | |
download | netifd-351d690f1a09e062ef951ac406ee571e1f1fe3e6.tar.gz |
wireless: fix passing bridge name for vlan hotplug pass-through
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>
-rw-r--r-- | bridge.c | 5 | ||||
-rw-r--r-- | device.h | 2 | ||||
-rw-r--r-- | ubus.c | 16 | ||||
-rw-r--r-- | vlan.c | 4 | ||||
-rw-r--r-- | vlandev.c | 4 | ||||
-rw-r--r-- | wireless.c | 7 |
6 files changed, 26 insertions, 12 deletions
@@ -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); @@ -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); }; @@ -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 @@ -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) @@ -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) @@ -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); |