From 18e3e9c6e0e4a2ea648d5f34104c7c900e5c5ce8 Mon Sep 17 00:00:00 2001 From: Ashok Ponnaiah <aponnaia@codeaurora.org> Date: Tue, 16 Jan 2018 14:33:14 +0530 Subject: [PATCH] OWE: Transition mode with non-AP-MLME Add OWE Transition IE in build_ap_extra() ies to support drivers that do not use hostapd MLME. Signed-off-by: Ashok Ponnaiah <aponnaia@codeaurora.org> --- src/ap/ap_drv_ops.c | 7 +++++ src/ap/beacon.c | 61 -------------------------------------- src/ap/ieee802_11.h | 3 ++ src/ap/ieee802_11_shared.c | 61 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 61 deletions(-) diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 8beea3f2e..728d7f098 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -185,6 +185,13 @@ int hostapd_build_ap_extra_ies(struct hostapd_data *hapd, } #endif /* CONFIG_MBO */ +#ifdef CONFIG_OWE + pos = hostapd_eid_owe_trans(hapd, buf, sizeof(buf)); + if (add_buf_data(&beacon, buf, pos - buf) < 0 || + add_buf_data(&proberesp, buf, pos - buf) < 0) + goto fail; +#endif /* CONFIG_OWE */ + add_buf(&beacon, hapd->conf->vendor_elements); add_buf(&proberesp, hapd->conf->vendor_elements); add_buf(&assocresp, hapd->conf->assocresp_elements); diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 2606cc16d..711464977 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -364,67 +364,6 @@ static u8 * hostapd_eid_supported_op_classes(struct hostapd_data *hapd, u8 *eid) } -#ifdef CONFIG_OWE -static int hostapd_eid_owe_trans_enabled(struct hostapd_data *hapd) -{ - return hapd->conf->owe_transition_ssid_len > 0 && - !is_zero_ether_addr(hapd->conf->owe_transition_bssid); -} -#endif /* CONFIG_OWE */ - - -static size_t hostapd_eid_owe_trans_len(struct hostapd_data *hapd) -{ -#ifdef CONFIG_OWE - if (!hostapd_eid_owe_trans_enabled(hapd)) - return 0; - return 6 + ETH_ALEN + 1 + hapd->conf->owe_transition_ssid_len; -#else /* CONFIG_OWE */ - return 0; -#endif /* CONFIG_OWE */ -} - - -static u8 * hostapd_eid_owe_trans(struct hostapd_data *hapd, u8 *eid, - size_t len) -{ -#ifdef CONFIG_OWE - u8 *pos = eid; - size_t elen; - - if (hapd->conf->owe_transition_ifname[0] && - !hostapd_eid_owe_trans_enabled(hapd)) - hostapd_owe_trans_get_info(hapd); - - if (!hostapd_eid_owe_trans_enabled(hapd)) - return pos; - - elen = hostapd_eid_owe_trans_len(hapd); - if (len < elen) { - wpa_printf(MSG_DEBUG, - "OWE: Not enough room in the buffer for OWE IE"); - return pos; - } - - *pos++ = WLAN_EID_VENDOR_SPECIFIC; - *pos++ = elen - 2; - WPA_PUT_BE24(pos, OUI_WFA); - pos += 3; - *pos++ = OWE_OUI_TYPE; - os_memcpy(pos, hapd->conf->owe_transition_bssid, ETH_ALEN); - pos += ETH_ALEN; - *pos++ = hapd->conf->owe_transition_ssid_len; - os_memcpy(pos, hapd->conf->owe_transition_ssid, - hapd->conf->owe_transition_ssid_len); - pos += hapd->conf->owe_transition_ssid_len; - - return pos; -#else /* CONFIG_OWE */ - return eid; -#endif /* CONFIG_OWE */ -} - - static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, const struct ieee80211_mgmt *req, int is_p2p, size_t *resp_len) diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h index 47b28e2ae..1624dc5af 100644 --- a/src/ap/ieee802_11.h +++ b/src/ap/ieee802_11.h @@ -154,4 +154,7 @@ void handle_auth_fils(struct hostapd_data *hapd, struct sta_info *sta, struct sta_info *sta, u16 resp, struct wpabuf *data, int pub)); +size_t hostapd_eid_owe_trans_len(struct hostapd_data *hapd); +u8 * hostapd_eid_owe_trans(struct hostapd_data *hapd, u8 *eid, size_t len); + #endif /* IEEE802_11_H */ diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c index d9d8161ad..d3733c8eb 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -608,6 +608,67 @@ u8 hostapd_mbo_ie_len(struct hostapd_data *hapd) #endif /* CONFIG_MBO */ +#ifdef CONFIG_OWE +static int hostapd_eid_owe_trans_enabled(struct hostapd_data *hapd) +{ + return hapd->conf->owe_transition_ssid_len > 0 && + !is_zero_ether_addr(hapd->conf->owe_transition_bssid); +} +#endif /* CONFIG_OWE */ + + +size_t hostapd_eid_owe_trans_len(struct hostapd_data *hapd) +{ +#ifdef CONFIG_OWE + if (!hostapd_eid_owe_trans_enabled(hapd)) + return 0; + return 6 + ETH_ALEN + 1 + hapd->conf->owe_transition_ssid_len; +#else /* CONFIG_OWE */ + return 0; +#endif /* CONFIG_OWE */ +} + + +u8 * hostapd_eid_owe_trans(struct hostapd_data *hapd, u8 *eid, + size_t len) +{ +#ifdef CONFIG_OWE + u8 *pos = eid; + size_t elen; + + if (hapd->conf->owe_transition_ifname[0] && + !hostapd_eid_owe_trans_enabled(hapd)) + hostapd_owe_trans_get_info(hapd); + + if (!hostapd_eid_owe_trans_enabled(hapd)) + return pos; + + elen = hostapd_eid_owe_trans_len(hapd); + if (len < elen) { + wpa_printf(MSG_DEBUG, + "OWE: Not enough room in the buffer for OWE IE"); + return pos; + } + + *pos++ = WLAN_EID_VENDOR_SPECIFIC; + *pos++ = elen - 2; + WPA_PUT_BE24(pos, OUI_WFA); + pos += 3; + *pos++ = OWE_OUI_TYPE; + os_memcpy(pos, hapd->conf->owe_transition_bssid, ETH_ALEN); + pos += ETH_ALEN; + *pos++ = hapd->conf->owe_transition_ssid_len; + os_memcpy(pos, hapd->conf->owe_transition_ssid, + hapd->conf->owe_transition_ssid_len); + pos += hapd->conf->owe_transition_ssid_len; + + return pos; +#else /* CONFIG_OWE */ + return eid; +#endif /* CONFIG_OWE */ +} + + void ap_copy_sta_supp_op_classes(struct sta_info *sta, const u8 *supp_op_classes, size_t supp_op_classes_len)