hostapd: use phy name for hostapd interfaces instead of first-bss ifname
authorFelix Fietkau <nbd@nbd.name>
Tue, 19 Sep 2023 09:02:54 +0000 (11:02 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 19 Sep 2023 09:57:18 +0000 (11:57 +0200)
Improves reliability in error handling

Signed-off-by: Felix Fietkau <nbd@nbd.name>
(cherry picked from commit a511480368a03f754aa6ce7887633247a07ea166)

package/network/services/hostapd/files/hostapd.uc
package/network/services/hostapd/patches/601-ucode_support.patch
package/network/services/hostapd/patches/991-Fix-OpenWrt-13156.patch

index ebf732bea51e2c27a03aeb71cd4a09aa5510648e..5cddb9c268bb69ea27dbe7d1a140126bd823216b 100644 (file)
@@ -26,7 +26,6 @@ function iface_remove(cfg)
        if (!cfg || !cfg.bss || !cfg.bss[0] || !cfg.bss[0].ifname)
                return;
 
-       hostapd.remove_iface(cfg.bss[0].ifname);
        for (let bss in cfg.bss)
                wdev_remove(bss.ifname);
 }
@@ -95,14 +94,14 @@ function iface_add(phy, config, phy_status)
        let config_inline = iface_gen_config(phy, config, !!phy_status);
 
        let bss = config.bss[0];
-       let ret = hostapd.add_iface(`bss_config=${bss.ifname}:${config_inline}`);
+       let ret = hostapd.add_iface(`bss_config=${phy}:${config_inline}`);
        if (ret < 0)
                return false;
 
        if (!phy_status)
                return true;
 
-       let iface = hostapd.interfaces[bss.ifname];
+       let iface = hostapd.interfaces[phy];
        if (!iface)
                return false;
 
@@ -127,6 +126,7 @@ function iface_restart(phydev, config, old_config)
 {
        let phy = phydev.name;
 
+       hostapd.remove_iface(phy);
        iface_remove(old_config);
        iface_remove(config);
 
@@ -267,13 +267,13 @@ function iface_reload_config(phydev, config, old_config)
        if (!old_config.bss || !old_config.bss[0])
                return false;
 
-       let iface_name = old_config.bss[0].ifname;
-       let iface = hostapd.interfaces[iface_name];
+       let iface = hostapd.interfaces[phy];
        if (!iface) {
                hostapd.printf(`Could not find previous interface ${iface_name}`);
                return false;
        }
 
+       let iface_name = old_config.bss[0].ifname;
        let first_bss = hostapd.bss[iface_name];
        if (!first_bss) {
                hostapd.printf(`Could not find bss of previous interface ${iface_name}`);
@@ -512,8 +512,10 @@ function iface_set_config(phy, config)
 
        hostapd.data.config[phy] = config;
 
-       if (!config)
+       if (!config) {
+               hostapd.remove_iface(phy);
                return iface_remove(old_config);
+       }
 
        let phydev = phy_open(phy);
        if (!phydev) {
@@ -667,7 +669,7 @@ let main_obj = {
                        if (!config || !config.bss || !config.bss[0] || !config.bss[0].ifname)
                                return 0;
 
-                       let iface = hostapd.interfaces[config.bss[0].ifname];
+                       let iface = hostapd.interfaces[phy];
                        if (!iface)
                                return 0;
 
index c8bbfd43d8337074cb6bee8b80d4df0cf2f96f23..858dc52a9882b7ec54a12b9a645607e95b82b29d 100644 (file)
  {
        if (!hapd)
                return;
+@@ -3491,7 +3495,8 @@ int hostapd_remove_iface(struct hapd_int
+               hapd_iface = interfaces->iface[i];
+               if (hapd_iface == NULL)
+                       return -1;
+-              if (!os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) {
++              if (!os_strcmp(hapd_iface->phy, buf) ||
++                  !os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) {
+                       wpa_printf(MSG_INFO, "Remove interface '%s'", buf);
+                       hapd_iface->driver_ap_teardown =
+                               !!(hapd_iface->drv_flags &
 --- a/wpa_supplicant/Makefile
 +++ b/wpa_supplicant/Makefile
 @@ -195,8 +195,20 @@ endif
index 3f10fb1eef7602928dab5caaf9107d6723cc0ae7..097d62abc0116d540f997599cad5bd4628fa4eb5 100644 (file)
@@ -20,7 +20,7 @@ Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
 
 --- a/src/ap/hostapd.c
 +++ b/src/ap/hostapd.c
-@@ -3563,6 +3563,8 @@ int hostapd_remove_iface(struct hapd_int
+@@ -3564,6 +3564,8 @@ int hostapd_remove_iface(struct hapd_int
  void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
                           int reassoc)
  {
@@ -29,7 +29,7 @@ Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
        if (hapd->tkip_countermeasures) {
                hostapd_drv_sta_deauth(hapd, sta->addr,
                                       WLAN_REASON_MICHAEL_MIC_FAILURE);
-@@ -3570,10 +3572,16 @@ void hostapd_new_assoc_sta(struct hostap
+@@ -3571,10 +3573,16 @@ void hostapd_new_assoc_sta(struct hostap
        }
  
  #ifdef CONFIG_IEEE80211BE