123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- From 71b061b8a13791a1ed858d924e401541c8584030 Mon Sep 17 00:00:00 2001
- From: "Arnout Vandecappelle (Essensium/Mind)" <[email protected]>
- Date: Wed, 9 Jan 2019 19:08:00 +0100
- Subject: [PATCH] multi_ap: don't reject backhaul STA on fronhaul BSS
- The Multi-AP specification only specifies that information elements have
- to be added to the association requests and responses; it doesn't
- specify anything about what should be done in case they are missing.
- Currently, we reject 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 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 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) <[email protected]>
- ---
- v4: new patch
- Cfr. discussion on http://lists.infradead.org/pipermail/hostap/2019-January/039232.html
- and follow-ups.
- ---
- src/ap/ieee802_11.c | 38 +++++++++++++++++++-----------------
- tests/hwsim/test_multi_ap.py | 6 ++----
- 2 files changed, 22 insertions(+), 22 deletions(-)
- --- a/src/ap/ieee802_11.c
- +++ b/src/ap/ieee802_11.c
- @@ -2253,28 +2253,30 @@ static u16 check_multi_ap(struct hostapd
- }
- }
-
- - if (multi_ap_value == MULTI_AP_BACKHAUL_STA)
- - sta->flags |= WLAN_STA_MULTI_AP;
- -
- - if ((hapd->conf->multi_ap & BACKHAUL_BSS) &&
- - multi_ap_value == MULTI_AP_BACKHAUL_STA)
- - 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;
- + 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 (!(multi_ap_value & MULTI_AP_BACKHAUL_STA)) {
- + if (hapd->conf->multi_ap & FRONTHAUL_BSS)
- + 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;
- }
-
-
- --- a/tests/hwsim/test_multi_ap.py
- +++ b/tests/hwsim/test_multi_ap.py
- @@ -59,7 +59,5 @@ def test_multi_ap_fronthaul_on_ap(dev, a
- dev[0].request("DISCONNECT")
- if ev is None:
- raise Exception("Connection result not reported")
- - if "CTRL-EVENT-ASSOC-REJECT" not in ev:
- - raise Exception("Association rejection not reported")
- - if "status_code=12" not in ev:
- - raise Exception("Unexpected association status code: " + ev)
- + if "CTRL-EVENT-DISCONNECTED" not in ev:
- + raise Exception("Unexpected connection result")
|