mirror of https://github.com/hak5/openwrt.git
107 lines
4.1 KiB
Diff
107 lines
4.1 KiB
Diff
|
From 71b061b8a13791a1ed858d924e401541c8584030 Mon Sep 17 00:00:00 2001
|
||
|
From: "Arnout Vandecappelle (Essensium/Mind)" <arnout@mind.be>
|
||
|
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) <arnout@mind.be>
|
||
|
---
|
||
|
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")
|