]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Multi-AP: Don't reject backhaul STA on fronthaul BSS
authorArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Tue, 12 Feb 2019 14:35:23 +0000 (15:35 +0100)
committerJouni Malinen <j@w1.fi>
Mon, 18 Feb 2019 18:21:01 +0000 (20:21 +0200)
The Multi-AP specification only specifies that information elements have
to be added to the Association Request and Association Response frame;
it doesn't specify anything about what should be done in case they are
missing. Previously, we rejected non-backhaul associations on a
backhaul-only BSS, and non-fronthaul associations on a fronthaul-only
BSS.

However, this makes WPS fail when fronthaul and backhaul are separate
SSIDs. Indeed, WPS for the backhaul link is performed on the *fronthaul*
SSID. Thus, the Association Request frmae used for WPS *will* contain
the Multi-AP IE indicating a backhaul STA. Rejecting that association
makes WPS fail.

Therefore, accept a multi-AP backhaul STA Association Request frame on a
fronthaul-only BSS. Still issue a warning about it, but only at level
DEBUG intead of INFO. Also change the condition checking to make it
clearer.

While we're at it, also fix the handling of unexpected bits in the
Multi-AP IE. 4 bits are reserved in the specification, so these
certainly have to be ignored. The specification also doesn't say that
setting one of the other bits is not allowed. Therefore, only report
unexpected values in the Multi-AP IE, don't reject because of it. Note
that a malformed IE (containing more than one byte) still triggers a
rejection.

Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
src/ap/ieee802_11.c

index bc45cd71f1c91689b33c13cb337e8752ac3db131..80d2d67ea73620fd21e6f6492b8702aeaa668782 100644 (file)
@@ -2297,28 +2297,30 @@ static u16 check_multi_ap(struct hostapd_data *hapd, struct sta_info *sta,
                }
        }
 
-       if (multi_ap_value == MULTI_AP_BACKHAUL_STA)
-               sta->flags |= WLAN_STA_MULTI_AP;
+       if (multi_ap_value && multi_ap_value != MULTI_AP_BACKHAUL_STA)
+               hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
+                              HOSTAPD_LEVEL_INFO,
+                              "Multi-AP IE with unexpected value 0x%02x",
+                              multi_ap_value);
 
-       if ((hapd->conf->multi_ap & BACKHAUL_BSS) &&
-           multi_ap_value == MULTI_AP_BACKHAUL_STA)
-               return WLAN_STATUS_SUCCESS;
+       if (!(multi_ap_value & MULTI_AP_BACKHAUL_STA)) {
+               if (hapd->conf->multi_ap & FRONTHAUL_BSS)
+                       return WLAN_STATUS_SUCCESS;
 
-       if (hapd->conf->multi_ap & FRONTHAUL_BSS) {
-               if (multi_ap_value == MULTI_AP_BACKHAUL_STA) {
-                       hostapd_logger(hapd, sta->addr,
-                                      HOSTAPD_MODULE_IEEE80211,
-                                      HOSTAPD_LEVEL_INFO,
-                                      "Backhaul STA tries to associate with fronthaul-only BSS");
-                       return WLAN_STATUS_ASSOC_DENIED_UNSPEC;
-               }
-               return WLAN_STATUS_SUCCESS;
+               hostapd_logger(hapd, sta->addr,
+                              HOSTAPD_MODULE_IEEE80211,
+                              HOSTAPD_LEVEL_INFO,
+                              "Non-Multi-AP STA tries to associate with backhaul-only BSS");
+               return WLAN_STATUS_ASSOC_DENIED_UNSPEC;
        }
 
-       hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
-                      HOSTAPD_LEVEL_INFO,
-                      "Non-Multi-AP STA tries to associate with backhaul-only BSS");
-       return WLAN_STATUS_ASSOC_DENIED_UNSPEC;
+       if (!(hapd->conf->multi_ap & BACKHAUL_BSS))
+               hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
+                              HOSTAPD_LEVEL_DEBUG,
+                              "Backhaul STA tries to associate with fronthaul-only BSS");
+
+       sta->flags |= WLAN_STA_MULTI_AP;
+       return WLAN_STATUS_SUCCESS;
 }