From a39fe3a8b1506c5126ae7ac3007d4621898d05d8 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 19 Nov 2024 13:56:22 +0100 Subject: [PATCH] wireless: add support for adding a list of devices for a wifi-iface Simplifies handling of a single SSID on multiple radios. Signed-off-by: Felix Fietkau --- config.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/config.c b/config.c index b38f04f..5530050 100644 --- a/config.c +++ b/config.c @@ -585,7 +585,7 @@ config_parse_wireless_station(struct wireless_interface *vif, struct uci_section } static void -config_parse_wireless_interface(struct wireless_device *wdev, struct uci_section *s) +config_wdev_parse_wireless_interface(struct wireless_device *wdev, struct uci_section *s) { struct wireless_interface *vif; struct uci_element *f; @@ -701,12 +701,25 @@ config_procd_wireless_interface_cb(struct blob_attr *data) tb[UDATA_ATTR_STATIONS]); } +static void +config_parse_wireless_interface(const char *dev_name, struct uci_section *s) +{ + struct wireless_device *wdev; + + wdev = vlist_find(&wireless_devices, dev_name, wdev, node); + if (!wdev) { + D(WIRELESS, "device %s not found!", dev_name); + return; + } + + config_wdev_parse_wireless_interface(wdev, s); +} + static void config_init_wireless(void) { struct wireless_device *wdev; struct uci_element *e; - const char *dev_name; if (!uci_wireless) { D(WIRELESS, "No wireless configuration found"); @@ -732,21 +745,23 @@ config_init_wireless(void) uci_foreach_element(&uci_wireless->sections, e) { struct uci_section *s = uci_to_section(e); + struct uci_element *val; + struct uci_option *o; if (strcmp(s->type, "wifi-iface") != 0) continue; - dev_name = uci_lookup_option_string(uci_ctx, s, "device"); - if (!dev_name) + o = uci_lookup_option(uci_ctx, s, "device"); + if (!o) continue; - wdev = vlist_find(&wireless_devices, dev_name, wdev, node); - if (!wdev) { - D(WIRELESS, "device %s not found!", dev_name); + if (o->type == UCI_TYPE_STRING) { + config_parse_wireless_interface(o->v.string, s); continue; } - config_parse_wireless_interface(wdev, s); + uci_foreach_element(&o->v.list, val) + config_parse_wireless_interface(val->name, s); } netifd_ubus_get_procd_data("wifi-iface", config_procd_wireless_interface_cb); -- 2.30.2