mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-01-17 18:34:03 -05:00
hostapd: Allow coexistance of HT BSSes with WEP/TKIP BSSes
In multi BSS setups it wasn't possible to set up an HT BSS in conjunction with a WEP/TKIP BSS. HT needed to be turned off entirely to allow WEP/TKIP BSSes to be used. In order to allow HT BSSes to coexist with non-HT WEP/TKIP BSSes add a new BSS conf attribute "disable_11n" which disables HT capabilities on a single BSS by suppressing HT IEs in the beacon and probe response frames. Furthermore, mark all STAs associated to a WEP/TKIP BSS as non-HT STAs. The disable_11n parameter is used internally; no new entry is parsed from hostapd.conf. This allows a non-HT WEP/TKIP BSS to coexist with a HT BSS without having to disable HT mode entirely. Nevertheless, all STAs associated to the WEP/TKIP BSS will only be served as if they were non-HT STAs. Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
This commit is contained in:
parent
16a83d2965
commit
f39b07d7ed
@ -1090,17 +1090,18 @@ static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
|
|||||||
#ifdef CONFIG_IEEE80211N
|
#ifdef CONFIG_IEEE80211N
|
||||||
if (conf->ieee80211n &&
|
if (conf->ieee80211n &&
|
||||||
bss->ssid.security_policy == SECURITY_STATIC_WEP) {
|
bss->ssid.security_policy == SECURITY_STATIC_WEP) {
|
||||||
|
bss->disable_11n = 1;
|
||||||
wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not "
|
wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WEP is not "
|
||||||
"allowed");
|
"allowed, disabling HT capabilities");
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conf->ieee80211n && bss->wpa &&
|
if (conf->ieee80211n && bss->wpa &&
|
||||||
!(bss->wpa_pairwise & WPA_CIPHER_CCMP) &&
|
!(bss->wpa_pairwise & WPA_CIPHER_CCMP) &&
|
||||||
!(bss->rsn_pairwise & WPA_CIPHER_CCMP)) {
|
!(bss->rsn_pairwise & WPA_CIPHER_CCMP)) {
|
||||||
|
bss->disable_11n = 1;
|
||||||
wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 "
|
wpa_printf(MSG_ERROR, "HT (IEEE 802.11n) with WPA/WPA2 "
|
||||||
"requires CCMP to be enabled");
|
"requires CCMP to be enabled, disabling HT "
|
||||||
return -1;
|
"capabilities");
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211N */
|
#endif /* CONFIG_IEEE80211N */
|
||||||
|
|
||||||
|
@ -328,6 +328,7 @@ struct hostapd_bss_config {
|
|||||||
#define TDLS_PROHIBIT BIT(0)
|
#define TDLS_PROHIBIT BIT(0)
|
||||||
#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1)
|
#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1)
|
||||||
int tdls;
|
int tdls;
|
||||||
|
int disable_11n;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -675,7 +675,7 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
|
|||||||
if (resp != WLAN_STATUS_SUCCESS)
|
if (resp != WLAN_STATUS_SUCCESS)
|
||||||
return resp;
|
return resp;
|
||||||
#ifdef CONFIG_IEEE80211N
|
#ifdef CONFIG_IEEE80211N
|
||||||
resp = copy_sta_ht_capab(sta, elems.ht_capabilities,
|
resp = copy_sta_ht_capab(hapd, sta, elems.ht_capabilities,
|
||||||
elems.ht_capabilities_len);
|
elems.ht_capabilities_len);
|
||||||
if (resp != WLAN_STATUS_SUCCESS)
|
if (resp != WLAN_STATUS_SUCCESS)
|
||||||
return resp;
|
return resp;
|
||||||
|
@ -57,8 +57,8 @@ void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
|||||||
void hostapd_get_ht_capab(struct hostapd_data *hapd,
|
void hostapd_get_ht_capab(struct hostapd_data *hapd,
|
||||||
struct ieee80211_ht_capabilities *ht_cap,
|
struct ieee80211_ht_capabilities *ht_cap,
|
||||||
struct ieee80211_ht_capabilities *neg_ht_cap);
|
struct ieee80211_ht_capabilities *neg_ht_cap);
|
||||||
u16 copy_sta_ht_capab(struct sta_info *sta, const u8 *ht_capab,
|
u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
size_t ht_capab_len);
|
const u8 *ht_capab, size_t ht_capab_len);
|
||||||
void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta);
|
void update_ht_state(struct hostapd_data *hapd, struct sta_info *sta);
|
||||||
void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
|
void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
|
||||||
const u8 *buf, size_t len, int ack);
|
const u8 *buf, size_t len, int ack);
|
||||||
|
@ -30,7 +30,8 @@ u8 * hostapd_eid_ht_capabilities(struct hostapd_data *hapd, u8 *eid)
|
|||||||
struct ieee80211_ht_capabilities *cap;
|
struct ieee80211_ht_capabilities *cap;
|
||||||
u8 *pos = eid;
|
u8 *pos = eid;
|
||||||
|
|
||||||
if (!hapd->iconf->ieee80211n || !hapd->iface->current_mode)
|
if (!hapd->iconf->ieee80211n || !hapd->iface->current_mode ||
|
||||||
|
hapd->conf->disable_11n)
|
||||||
return eid;
|
return eid;
|
||||||
|
|
||||||
*pos++ = WLAN_EID_HT_CAP;
|
*pos++ = WLAN_EID_HT_CAP;
|
||||||
@ -58,7 +59,7 @@ u8 * hostapd_eid_ht_operation(struct hostapd_data *hapd, u8 *eid)
|
|||||||
struct ieee80211_ht_operation *oper;
|
struct ieee80211_ht_operation *oper;
|
||||||
u8 *pos = eid;
|
u8 *pos = eid;
|
||||||
|
|
||||||
if (!hapd->iconf->ieee80211n)
|
if (!hapd->iconf->ieee80211n || hapd->conf->disable_11n)
|
||||||
return eid;
|
return eid;
|
||||||
|
|
||||||
*pos++ = WLAN_EID_HT_OPERATION;
|
*pos++ = WLAN_EID_HT_OPERATION;
|
||||||
@ -160,11 +161,13 @@ int hostapd_ht_operation_update(struct hostapd_iface *iface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u16 copy_sta_ht_capab(struct sta_info *sta, const u8 *ht_capab,
|
u16 copy_sta_ht_capab(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
size_t ht_capab_len)
|
const u8 *ht_capab, size_t ht_capab_len)
|
||||||
{
|
{
|
||||||
|
/* Disable HT caps for STAs associated to no-HT BSSes. */
|
||||||
if (!ht_capab ||
|
if (!ht_capab ||
|
||||||
ht_capab_len < sizeof(struct ieee80211_ht_capabilities)) {
|
ht_capab_len < sizeof(struct ieee80211_ht_capabilities) ||
|
||||||
|
hapd->conf->disable_11n) {
|
||||||
sta->flags &= ~WLAN_STA_HT;
|
sta->flags &= ~WLAN_STA_HT;
|
||||||
os_free(sta->ht_capabilities);
|
os_free(sta->ht_capabilities);
|
||||||
sta->ht_capabilities = NULL;
|
sta->ht_capabilities = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user