From 93124d96594415563f68bda0ca24c3307e014efd Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 8 Dec 2013 18:57:40 +0100 Subject: [PATCH] wireless: add back support for multiple networks per interface Signed-off-by: Felix Fietkau --- wireless.c | 49 +++++++++++++++++++++++++++++++++---------------- wireless.h | 2 +- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/wireless.c b/wireless.c index 508d35e..1f7fc5d 100644 --- a/wireless.c +++ b/wireless.c @@ -40,7 +40,7 @@ enum { static const struct blobmsg_policy vif_policy[__VIF_ATTR_MAX] = { [VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL }, - [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_STRING }, + [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY }, }; static const struct uci_blob_param_list vif_param = { @@ -57,23 +57,33 @@ put_container(struct blob_buf *buf, struct blob_attr *attr, const char *name) } static void -vif_config_add_bridge(struct blob_buf *buf, const char *network, bool prepare) +vif_config_add_bridge(struct blob_buf *buf, struct blob_attr *networks, bool prepare) { struct interface *iface; - struct device *dev; + struct device *dev = NULL; + struct blob_attr *cur; + const char *network; + int rem; - if (!network) + if (!networks) return; - iface = vlist_find(&interfaces, network, iface, node); - if (!iface) - return; + blobmsg_for_each_attr(cur, networks, rem) { + network = blobmsg_data(cur); - dev = iface->main_dev.dev; - if (!dev) - return; + iface = vlist_find(&interfaces, network, iface, node); + if (!iface) + continue; + + dev = iface->main_dev.dev; + if (!dev) + return; + + if (dev->type != &bridge_device_type) + return; + } - if (dev->type != &bridge_device_type) + if (!dev) return; if (dev->hotplug_ops && dev->hotplug_ops->prepare) @@ -184,15 +194,22 @@ wireless_device_free_state(struct wireless_device *wdev) static void wireless_interface_handle_link(struct wireless_interface *vif, bool up) { struct interface *iface; + struct blob_attr *cur; + const char *network; + int rem; if (!vif->network || !vif->ifname) return; - iface = vlist_find(&interfaces, vif->network, iface, node); - if (!iface) - return; + blobmsg_for_each_attr(cur, vif->network, rem) { + network = blobmsg_data(cur); + + iface = vlist_find(&interfaces, network, iface, node); + if (!iface) + continue; - interface_handle_link(iface, vif->ifname, up); + interface_handle_link(iface, vif->ifname, up); + } } static void @@ -494,7 +511,7 @@ wireless_interface_init_config(struct wireless_interface *vif) blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(vif->config), blob_len(vif->config)); if ((cur = tb[VIF_ATTR_NETWORK])) - vif->network = blobmsg_data(cur); + vif->network = cur; } static void diff --git a/wireless.h b/wireless.h index 4a98c77..a3eadc1 100644 --- a/wireless.h +++ b/wireless.h @@ -74,7 +74,7 @@ struct wireless_interface { struct blob_attr *data; const char *ifname; - const char *network; + struct blob_attr *network; }; struct wireless_process { -- 2.11.0