WPS: Add support for 60 GHz band
Handling of WPS RF band for 60 GHz was missing. Add it in all relevant places and also map "AES" as the cipher to GCMP instead of CCMP when operating on the 60 GHz band. Signed-off-by: Hamad Kadmany <qca_hkadmany@qca.qualcomm.com>
This commit is contained in:
parent
0ef1e290ab
commit
01a025937c
10 changed files with 44 additions and 13 deletions
|
@ -2545,7 +2545,9 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else if (os_strcmp(buf, "wps_rf_bands") == 0) {
|
} else if (os_strcmp(buf, "wps_rf_bands") == 0) {
|
||||||
if (os_strcmp(pos, "a") == 0)
|
if (os_strcmp(pos, "ad") == 0)
|
||||||
|
bss->wps_rf_bands = WPS_RF_60GHZ;
|
||||||
|
else if (os_strcmp(pos, "a") == 0)
|
||||||
bss->wps_rf_bands = WPS_RF_50GHZ;
|
bss->wps_rf_bands = WPS_RF_50GHZ;
|
||||||
else if (os_strcmp(pos, "g") == 0 ||
|
else if (os_strcmp(pos, "g") == 0 ||
|
||||||
os_strcmp(pos, "b") == 0)
|
os_strcmp(pos, "b") == 0)
|
||||||
|
|
|
@ -1433,7 +1433,7 @@ own_ip_addr=127.0.0.1
|
||||||
# 12-digit, all-numeric code that identifies the consumer package.
|
# 12-digit, all-numeric code that identifies the consumer package.
|
||||||
#upc=123456789012
|
#upc=123456789012
|
||||||
|
|
||||||
# WPS RF Bands (a = 5G, b = 2.4G, g = 2.4G, ag = dual band)
|
# WPS RF Bands (a = 5G, b = 2.4G, g = 2.4G, ag = dual band, ad = 60 GHz)
|
||||||
# This value should be set according to RF band(s) supported by the AP if
|
# This value should be set according to RF band(s) supported by the AP if
|
||||||
# hw_mode is not set. For dual band dual concurrent devices, this needs to be
|
# hw_mode is not set. For dual band dual concurrent devices, this needs to be
|
||||||
# set to ag to allow both RF bands to be advertized.
|
# set to ag to allow both RF bands to be advertized.
|
||||||
|
|
|
@ -819,9 +819,9 @@ static int hostapd_config_check_bss(struct hostapd_bss_config *bss,
|
||||||
|
|
||||||
if (full_config && bss->wps_state && bss->wpa &&
|
if (full_config && bss->wps_state && bss->wpa &&
|
||||||
(!(bss->wpa & 2) ||
|
(!(bss->wpa & 2) ||
|
||||||
!(bss->rsn_pairwise & WPA_CIPHER_CCMP))) {
|
!(bss->rsn_pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)))) {
|
||||||
wpa_printf(MSG_INFO, "WPS: WPA/TKIP configuration without "
|
wpa_printf(MSG_INFO, "WPS: WPA/TKIP configuration without "
|
||||||
"WPA2/CCMP forced WPS to be disabled");
|
"WPA2/CCMP/GCMP forced WPS to be disabled");
|
||||||
bss->wps_state = 0;
|
bss->wps_state = 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_WPS */
|
#endif /* CONFIG_WPS */
|
||||||
|
|
|
@ -347,8 +347,12 @@ static int hapd_wps_reconfig_in_memory(struct hostapd_data *hapd,
|
||||||
bss->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
|
bss->wpa_key_mgmt = WPA_KEY_MGMT_PSK;
|
||||||
|
|
||||||
bss->wpa_pairwise = 0;
|
bss->wpa_pairwise = 0;
|
||||||
if (cred->encr_type & WPS_ENCR_AES)
|
if (cred->encr_type & WPS_ENCR_AES) {
|
||||||
bss->wpa_pairwise |= WPA_CIPHER_CCMP;
|
if (hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211AD)
|
||||||
|
bss->wpa_pairwise |= WPA_CIPHER_GCMP;
|
||||||
|
else
|
||||||
|
bss->wpa_pairwise |= WPA_CIPHER_CCMP;
|
||||||
|
}
|
||||||
if (cred->encr_type & WPS_ENCR_TKIP)
|
if (cred->encr_type & WPS_ENCR_TKIP)
|
||||||
bss->wpa_pairwise |= WPA_CIPHER_TKIP;
|
bss->wpa_pairwise |= WPA_CIPHER_TKIP;
|
||||||
bss->rsn_pairwise = bss->wpa_pairwise;
|
bss->rsn_pairwise = bss->wpa_pairwise;
|
||||||
|
@ -530,7 +534,11 @@ static int hapd_wps_cred_cb(struct hostapd_data *hapd, void *ctx)
|
||||||
fprintf(nconf, "wpa_pairwise=");
|
fprintf(nconf, "wpa_pairwise=");
|
||||||
prefix = "";
|
prefix = "";
|
||||||
if (cred->encr_type & WPS_ENCR_AES) {
|
if (cred->encr_type & WPS_ENCR_AES) {
|
||||||
fprintf(nconf, "CCMP");
|
if (hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211AD)
|
||||||
|
fprintf(nconf, "GCMP");
|
||||||
|
else
|
||||||
|
fprintf(nconf, "CCMP");
|
||||||
|
|
||||||
prefix = " ";
|
prefix = " ";
|
||||||
}
|
}
|
||||||
if (cred->encr_type & WPS_ENCR_TKIP) {
|
if (cred->encr_type & WPS_ENCR_TKIP) {
|
||||||
|
@ -844,7 +852,9 @@ static int hostapd_wps_rf_band_cb(void *ctx)
|
||||||
struct hostapd_data *hapd = ctx;
|
struct hostapd_data *hapd = ctx;
|
||||||
|
|
||||||
return hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
|
return hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
|
||||||
WPS_RF_50GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
|
WPS_RF_50GHZ :
|
||||||
|
hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211AD ?
|
||||||
|
WPS_RF_60GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1041,7 +1051,9 @@ int hostapd_init_wps(struct hostapd_data *hapd,
|
||||||
} else {
|
} else {
|
||||||
wps->dev.rf_bands =
|
wps->dev.rf_bands =
|
||||||
hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
|
hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211A ?
|
||||||
WPS_RF_50GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
|
WPS_RF_50GHZ :
|
||||||
|
hapd->iconf->hw_mode == HOSTAPD_MODE_IEEE80211AD ?
|
||||||
|
WPS_RF_60GHZ : WPS_RF_24GHZ; /* FIX: dualband AP */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conf->wpa & WPA_PROTO_RSN) {
|
if (conf->wpa & WPA_PROTO_RSN) {
|
||||||
|
|
|
@ -79,7 +79,7 @@ struct wps_credential {
|
||||||
* @sec_dev_type: Array of secondary device types
|
* @sec_dev_type: Array of secondary device types
|
||||||
* @num_sec_dev_type: Number of secondary device types
|
* @num_sec_dev_type: Number of secondary device types
|
||||||
* @os_version: OS Version
|
* @os_version: OS Version
|
||||||
* @rf_bands: RF bands (WPS_RF_24GHZ, WPS_RF_50GHZ flags)
|
* @rf_bands: RF bands (WPS_RF_24GHZ, WPS_RF_50GHZ, WPS_RF_60GHZ flags)
|
||||||
* @p2p: Whether the device is a P2P device
|
* @p2p: Whether the device is a P2P device
|
||||||
*/
|
*/
|
||||||
struct wps_device_data {
|
struct wps_device_data {
|
||||||
|
|
|
@ -764,6 +764,8 @@ static int wps_build_ap_freq(struct wpabuf *msg, int freq)
|
||||||
rf_band = WPS_RF_24GHZ;
|
rf_band = WPS_RF_24GHZ;
|
||||||
else if (mode == HOSTAPD_MODE_IEEE80211A)
|
else if (mode == HOSTAPD_MODE_IEEE80211A)
|
||||||
rf_band = WPS_RF_50GHZ;
|
rf_band = WPS_RF_50GHZ;
|
||||||
|
else if (mode == HOSTAPD_MODE_IEEE80211AD)
|
||||||
|
rf_band = WPS_RF_60GHZ;
|
||||||
else
|
else
|
||||||
return 0; /* Unknown band */
|
return 0; /* Unknown band */
|
||||||
ap_channel = channel;
|
ap_channel = channel;
|
||||||
|
|
|
@ -237,6 +237,7 @@ enum wps_error_indication {
|
||||||
/* RF Bands */
|
/* RF Bands */
|
||||||
#define WPS_RF_24GHZ 0x01
|
#define WPS_RF_24GHZ 0x01
|
||||||
#define WPS_RF_50GHZ 0x02
|
#define WPS_RF_50GHZ 0x02
|
||||||
|
#define WPS_RF_60GHZ 0x04
|
||||||
|
|
||||||
/* Config Methods */
|
/* Config Methods */
|
||||||
#define WPS_CONFIG_USBA 0x0001
|
#define WPS_CONFIG_USBA 0x0001
|
||||||
|
|
|
@ -3226,8 +3226,13 @@ static enum wps_process_res wps_process_wsc_done(struct wps_data *wps,
|
||||||
os_memset(&cred, 0, sizeof(cred));
|
os_memset(&cred, 0, sizeof(cred));
|
||||||
os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
|
os_memcpy(cred.ssid, wps->wps->ssid, wps->wps->ssid_len);
|
||||||
cred.ssid_len = wps->wps->ssid_len;
|
cred.ssid_len = wps->wps->ssid_len;
|
||||||
cred.auth_type = WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK;
|
if (wps->wps->rf_band_cb(wps->wps->cb_ctx) == WPS_RF_60GHZ) {
|
||||||
cred.encr_type = WPS_ENCR_TKIP | WPS_ENCR_AES;
|
cred.auth_type = WPS_AUTH_WPA2PSK;
|
||||||
|
cred.encr_type = WPS_ENCR_AES;
|
||||||
|
} else {
|
||||||
|
cred.auth_type = WPS_AUTH_WPAPSK | WPS_AUTH_WPA2PSK;
|
||||||
|
cred.encr_type = WPS_ENCR_TKIP | WPS_ENCR_AES;
|
||||||
|
}
|
||||||
os_memcpy(cred.key, wps->new_psk, wps->new_psk_len);
|
os_memcpy(cred.key, wps->new_psk, wps->new_psk_len);
|
||||||
cred.key_len = wps->new_psk_len;
|
cred.key_len = wps->new_psk_len;
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,8 @@ static int wps_validate_rf_bands(const u8 *rf_bands, int mandatory)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (*rf_bands != WPS_RF_24GHZ && *rf_bands != WPS_RF_50GHZ &&
|
if (*rf_bands != WPS_RF_24GHZ && *rf_bands != WPS_RF_50GHZ &&
|
||||||
|
*rf_bands != WPS_RF_60GHZ &&
|
||||||
|
*rf_bands != (WPS_RF_24GHZ | WPS_RF_50GHZ | WPS_RF_60GHZ) &&
|
||||||
*rf_bands != (WPS_RF_24GHZ | WPS_RF_50GHZ)) {
|
*rf_bands != (WPS_RF_24GHZ | WPS_RF_50GHZ)) {
|
||||||
wpa_printf(MSG_INFO, "WPS-STRICT: Invalid Rf Bands "
|
wpa_printf(MSG_INFO, "WPS-STRICT: Invalid Rf Bands "
|
||||||
"attribute value 0x%x", *rf_bands);
|
"attribute value 0x%x", *rf_bands);
|
||||||
|
|
|
@ -888,7 +888,8 @@ static int wpa_supplicant_wps_rf_band(void *ctx)
|
||||||
if (!wpa_s->current_ssid || !wpa_s->assoc_freq)
|
if (!wpa_s->current_ssid || !wpa_s->assoc_freq)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (wpa_s->assoc_freq > 2484) ? WPS_RF_50GHZ : WPS_RF_24GHZ;
|
return (wpa_s->assoc_freq > 50000) ? WPS_RF_60GHZ :
|
||||||
|
(wpa_s->assoc_freq > 2484) ? WPS_RF_50GHZ : WPS_RF_24GHZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1496,6 +1497,8 @@ int wpas_wps_init(struct wpa_supplicant *wpa_s)
|
||||||
wps->dev.rf_bands |= WPS_RF_24GHZ;
|
wps->dev.rf_bands |= WPS_RF_24GHZ;
|
||||||
else if (modes[m].mode == HOSTAPD_MODE_IEEE80211A)
|
else if (modes[m].mode == HOSTAPD_MODE_IEEE80211A)
|
||||||
wps->dev.rf_bands |= WPS_RF_50GHZ;
|
wps->dev.rf_bands |= WPS_RF_50GHZ;
|
||||||
|
else if (modes[m].mode == HOSTAPD_MODE_IEEE80211AD)
|
||||||
|
wps->dev.rf_bands |= WPS_RF_60GHZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (wps->dev.rf_bands == 0) {
|
if (wps->dev.rf_bands == 0) {
|
||||||
|
@ -2597,6 +2600,10 @@ static int wpas_wps_nfc_rx_handover_sel(struct wpa_supplicant *wpa_s,
|
||||||
(attr.rf_bands == NULL ||
|
(attr.rf_bands == NULL ||
|
||||||
*attr.rf_bands & WPS_RF_50GHZ))
|
*attr.rf_bands & WPS_RF_50GHZ))
|
||||||
freq = 5000 + 5 * chan;
|
freq = 5000 + 5 * chan;
|
||||||
|
else if (chan >= 1 && chan <= 4 &&
|
||||||
|
(attr.rf_bands == NULL ||
|
||||||
|
*attr.rf_bands & WPS_RF_60GHZ))
|
||||||
|
freq = 56160 + 2160 * chan;
|
||||||
|
|
||||||
if (freq) {
|
if (freq) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
|
|
Loading…
Reference in a new issue