aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2023-08-11 15:45:14 +0200
committerFelix Fietkau <nbd@nbd.name>2023-08-11 23:29:22 +0200
commitc1600df91f459c116e37454d5e983571cb166081 (patch)
tree26afa3b6961eb449496f27bc6dfeaa002e202cc9
parent80edfaf675364835e6d2e17d97ebec6afc6b2103 (diff)
hostapd: shut down client mode on the same phy while restarting AP
An active client mode interface could prevent the AP from claiming its channel and mess up the bringup sequence order Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--package/network/services/hostapd/files/hostapd.uc8
-rw-r--r--package/network/services/hostapd/files/wpa_supplicant.uc27
2 files changed, 31 insertions, 4 deletions
diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc
index 9bb8f8d29d..401f7c9266 100644
--- a/package/network/services/hostapd/files/hostapd.uc
+++ b/package/network/services/hostapd/files/hostapd.uc
@@ -66,10 +66,12 @@ function iface_restart(phy, config, old_config)
if (err)
hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`);
let config_inline = iface_gen_config(phy, config);
- if (hostapd.add_iface(`bss_config=${bss.ifname}:${config_inline}`) < 0) {
+
+ let ubus = hostapd.data.ubus;
+ ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: true });
+ if (hostapd.add_iface(`bss_config=${bss.ifname}:${config_inline}`) < 0)
hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`);
- return;
- }
+ ubus.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false });
}
function array_to_obj(arr, key, start)
diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc
index 412f87b4b1..6308fd54e2 100644
--- a/package/network/services/hostapd/files/wpa_supplicant.uc
+++ b/package/network/services/hostapd/files/wpa_supplicant.uc
@@ -11,6 +11,9 @@ function iface_stop(iface)
{
let ifname = iface.config.iface;
+ if (!iface.running)
+ return;
+
delete wpas.data.iface_phy[ifname];
wpas.remove_iface(ifname);
wdev_remove(ifname);
@@ -40,7 +43,7 @@ function iface_cb(new_if, old_if)
return;
}
- if (old_if && old_if.running)
+ if (old_if)
iface_stop(old_if);
}
@@ -76,6 +79,28 @@ function start_pending(phy_name)
}
let main_obj = {
+ phy_set_state: {
+ args: {
+ phy: "",
+ stop: true,
+ },
+ call: function(req) {
+ if (!req.args.phy || req.args.stop == null)
+ return libubus.STATUS_INVALID_ARGUMENT;
+
+ let phy = wpas.data.config[req.args.phy];
+ if (!phy)
+ return libubus.STATUS_NOT_FOUND;
+
+ if (req.args.stop) {
+ for (let ifname in phy.data)
+ iface_stop(phy.data[ifname]);
+ } else {
+ start_pending(req.args.phy);
+ }
+ return 0;
+ }
+ },
config_set: {
args: {
phy: "",