driver: Extend send_mlme() with wait option
PASN authentication can be performed while a station interface is connected to an AP. To allow sending PASN frames while connected, extend the send_mlme() driver callback to also allow a wait option. Update the relevant drivers and wpa_supplicant accordingly. hostapd calls for send_mlme() are left unchanged, since the wait option is not required there. Signed-off-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
		
							parent
							
								
									d046f2a9f9
								
							
						
					
					
						commit
						c4988e73c0
					
				
					 9 changed files with 18 additions and 16 deletions
				
			
		|  | @ -714,7 +714,7 @@ int hostapd_drv_send_mlme(struct hostapd_data *hapd, | ||||||
| 	if (!hapd->driver || !hapd->driver->send_mlme || !hapd->drv_priv) | 	if (!hapd->driver || !hapd->driver->send_mlme || !hapd->drv_priv) | ||||||
| 		return 0; | 		return 0; | ||||||
| 	return hapd->driver->send_mlme(hapd->drv_priv, msg, len, noack, 0, | 	return hapd->driver->send_mlme(hapd->drv_priv, msg, len, noack, 0, | ||||||
| 				       csa_offs, csa_offs_len, no_encrypt); | 				       csa_offs, csa_offs_len, no_encrypt, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2715,11 +2715,13 @@ struct wpa_driver_ops { | ||||||
| 	 * @csa_offs_len: Number of elements in csa_offs | 	 * @csa_offs_len: Number of elements in csa_offs | ||||||
| 	 * @no_encrypt: Do not encrypt frame even if appropriate key exists | 	 * @no_encrypt: Do not encrypt frame even if appropriate key exists | ||||||
| 	 *	(used only for testing purposes) | 	 *	(used only for testing purposes) | ||||||
|  | 	 * @wait: Time to wait off-channel for a response (in ms), or zero | ||||||
| 	 * Returns: 0 on success, -1 on failure | 	 * Returns: 0 on success, -1 on failure | ||||||
| 	 */ | 	 */ | ||||||
| 	int (*send_mlme)(void *priv, const u8 *data, size_t data_len, | 	int (*send_mlme)(void *priv, const u8 *data, size_t data_len, | ||||||
| 			 int noack, unsigned int freq, const u16 *csa_offs, | 			 int noack, unsigned int freq, const u16 *csa_offs, | ||||||
| 			 size_t csa_offs_len, int no_encrypt); | 			 size_t csa_offs_len, int no_encrypt, | ||||||
|  | 			 unsigned int wait); | ||||||
| 
 | 
 | ||||||
| 	/**
 | 	/**
 | ||||||
| 	 * update_ft_ies - Update FT (IEEE 802.11r) IEs | 	 * update_ft_ies - Update FT (IEEE 802.11r) IEs | ||||||
|  |  | ||||||
|  | @ -1965,7 +1965,7 @@ static int atheros_set_ap(void *priv, struct wpa_driver_ap_params *params) | ||||||
| static int atheros_send_mgmt(void *priv, const u8 *frm, size_t data_len, | static int atheros_send_mgmt(void *priv, const u8 *frm, size_t data_len, | ||||||
| 			     int noack, unsigned int freq, | 			     int noack, unsigned int freq, | ||||||
| 			     const u16 *csa_offs, size_t csa_offs_len, | 			     const u16 *csa_offs, size_t csa_offs_len, | ||||||
| 			     int no_encrypt) | 			     int no_encrypt, unsigned int wait) | ||||||
| { | { | ||||||
| 	struct atheros_driver_data *drv = priv; | 	struct atheros_driver_data *drv = priv; | ||||||
| 	u8 buf[1510]; | 	u8 buf[1510]; | ||||||
|  |  | ||||||
|  | @ -264,7 +264,7 @@ static int hostap_init_sockets(struct hostap_driver_data *drv, u8 *own_addr) | ||||||
| static int hostap_send_mlme(void *priv, const u8 *msg, size_t len, int noack, | static int hostap_send_mlme(void *priv, const u8 *msg, size_t len, int noack, | ||||||
| 			    unsigned int freq, | 			    unsigned int freq, | ||||||
| 			    const u16 *csa_offs, size_t csa_offs_len, | 			    const u16 *csa_offs, size_t csa_offs_len, | ||||||
| 			    int no_encrypt) | 			    int no_encrypt, unsigned int wait) | ||||||
| { | { | ||||||
| 	struct hostap_driver_data *drv = priv; | 	struct hostap_driver_data *drv = priv; | ||||||
| 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) msg; | 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) msg; | ||||||
|  | @ -313,7 +313,7 @@ static int hostap_send_eapol(void *priv, const u8 *addr, const u8 *data, | ||||||
| 	pos += 2; | 	pos += 2; | ||||||
| 	memcpy(pos, data, data_len); | 	memcpy(pos, data, data_len); | ||||||
| 
 | 
 | ||||||
| 	res = hostap_send_mlme(drv, (u8 *) hdr, len, 0, 0, NULL, 0, 0); | 	res = hostap_send_mlme(drv, (u8 *) hdr, len, 0, 0, NULL, 0, 0, 0); | ||||||
| 	if (res < 0) { | 	if (res < 0) { | ||||||
| 		wpa_printf(MSG_ERROR, "hostap_send_eapol - packet len: %lu - " | 		wpa_printf(MSG_ERROR, "hostap_send_eapol - packet len: %lu - " | ||||||
| 			   "failed: %d (%s)", | 			   "failed: %d (%s)", | ||||||
|  | @ -1055,7 +1055,7 @@ static int hostap_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, | ||||||
| 	memcpy(mgmt.bssid, own_addr, ETH_ALEN); | 	memcpy(mgmt.bssid, own_addr, ETH_ALEN); | ||||||
| 	mgmt.u.deauth.reason_code = host_to_le16(reason); | 	mgmt.u.deauth.reason_code = host_to_le16(reason); | ||||||
| 	return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN + | 	return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN + | ||||||
| 				sizeof(mgmt.u.deauth), 0, 0, NULL, 0, 0); | 				sizeof(mgmt.u.deauth), 0, 0, NULL, 0, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1093,7 +1093,7 @@ static int hostap_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr, | ||||||
| 	memcpy(mgmt.bssid, own_addr, ETH_ALEN); | 	memcpy(mgmt.bssid, own_addr, ETH_ALEN); | ||||||
| 	mgmt.u.disassoc.reason_code = host_to_le16(reason); | 	mgmt.u.disassoc.reason_code = host_to_le16(reason); | ||||||
| 	return  hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN + | 	return  hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN + | ||||||
| 				 sizeof(mgmt.u.disassoc), 0, 0, NULL, 0, 0); | 				 sizeof(mgmt.u.disassoc), 0, 0, NULL, 0, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1173,7 +1173,7 @@ static void wpa_driver_hostap_poll_client(void *priv, const u8 *own_addr, | ||||||
| 	os_memcpy(hdr.IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN); | 	os_memcpy(hdr.IEEE80211_BSSID_FROMDS, own_addr, ETH_ALEN); | ||||||
| 	os_memcpy(hdr.IEEE80211_SA_FROMDS, own_addr, ETH_ALEN); | 	os_memcpy(hdr.IEEE80211_SA_FROMDS, own_addr, ETH_ALEN); | ||||||
| 
 | 
 | ||||||
| 	hostap_send_mlme(priv, (u8 *) &hdr, sizeof(hdr), 0, 0, NULL, 0, 0); | 	hostap_send_mlme(priv, (u8 *)&hdr, sizeof(hdr), 0, 0, NULL, 0, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8846,11 +8846,11 @@ static int driver_nl80211_send_mlme(void *priv, const u8 *data, | ||||||
| 				    size_t data_len, int noack, | 				    size_t data_len, int noack, | ||||||
| 				    unsigned int freq, | 				    unsigned int freq, | ||||||
| 				    const u16 *csa_offs, size_t csa_offs_len, | 				    const u16 *csa_offs, size_t csa_offs_len, | ||||||
| 				    int no_encrypt) | 				    int no_encrypt, unsigned int wait) | ||||||
| { | { | ||||||
| 	struct i802_bss *bss = priv; | 	struct i802_bss *bss = priv; | ||||||
| 	return wpa_driver_nl80211_send_mlme(bss, data, data_len, noack, | 	return wpa_driver_nl80211_send_mlme(bss, data, data_len, noack, | ||||||
| 					    freq, 0, 0, 0, csa_offs, | 					    freq, 0, 0, wait, csa_offs, | ||||||
| 					    csa_offs_len, no_encrypt); | 					    csa_offs_len, no_encrypt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -312,12 +312,12 @@ static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s, | ||||||
| 
 | 
 | ||||||
| static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s, | static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s, | ||||||
| 				    const u8 *data, size_t data_len, int noack, | 				    const u8 *data, size_t data_len, int noack, | ||||||
| 				    unsigned int freq) | 				    unsigned int freq, unsigned int wait) | ||||||
| { | { | ||||||
| 	if (wpa_s->driver->send_mlme) | 	if (wpa_s->driver->send_mlme) | ||||||
| 		return wpa_s->driver->send_mlme(wpa_s->drv_priv, | 		return wpa_s->driver->send_mlme(wpa_s->drv_priv, | ||||||
| 						data, data_len, noack, | 						data, data_len, noack, | ||||||
| 						freq, NULL, 0, 0); | 						freq, NULL, 0, 0, wait); | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -520,7 +520,7 @@ static int ibss_rsn_send_auth(struct ibss_rsn *ibss_rsn, const u8 *da, int seq) | ||||||
| 	wpa_printf(MSG_DEBUG, "RSN: IBSS TX Auth frame (SEQ %d) to " MACSTR, | 	wpa_printf(MSG_DEBUG, "RSN: IBSS TX Auth frame (SEQ %d) to " MACSTR, | ||||||
| 		   seq, MAC2STR(da)); | 		   seq, MAC2STR(da)); | ||||||
| 
 | 
 | ||||||
| 	return wpa_drv_send_mlme(wpa_s, (u8 *) &auth, auth_length, 0, 0); | 	return wpa_drv_send_mlme(wpa_s, (u8 *) &auth, auth_length, 0, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2691,7 +2691,7 @@ static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf, | ||||||
| { | { | ||||||
| 	struct wpa_supplicant *wpa_s = ctx; | 	struct wpa_supplicant *wpa_s = ctx; | ||||||
| 	return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, | 	return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, | ||||||
| 				 freq); | 				 freq, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1021,7 +1021,7 @@ static int sme_external_auth_send_sae_commit(struct wpa_supplicant *wpa_s, | ||||||
| 				    bssid, 1, wpa_s->sme.seq_num, | 				    bssid, 1, wpa_s->sme.seq_num, | ||||||
| 				    use_pt ? WLAN_STATUS_SAE_HASH_TO_ELEMENT : | 				    use_pt ? WLAN_STATUS_SAE_HASH_TO_ELEMENT : | ||||||
| 				    WLAN_STATUS_SUCCESS); | 				    WLAN_STATUS_SUCCESS); | ||||||
| 	wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0); | 	wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0, 0); | ||||||
| 	wpabuf_free(resp); | 	wpabuf_free(resp); | ||||||
| 	wpabuf_free(buf); | 	wpabuf_free(buf); | ||||||
| 
 | 
 | ||||||
|  | @ -1091,7 +1091,7 @@ static void sme_external_auth_send_sae_confirm(struct wpa_supplicant *wpa_s, | ||||||
| 	sme_external_auth_build_buf(buf, resp, wpa_s->own_addr, | 	sme_external_auth_build_buf(buf, resp, wpa_s->own_addr, | ||||||
| 				    da, 2, wpa_s->sme.seq_num, | 				    da, 2, wpa_s->sme.seq_num, | ||||||
| 				    WLAN_STATUS_SUCCESS); | 				    WLAN_STATUS_SUCCESS); | ||||||
| 	wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0); | 	wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1, 0, 0); | ||||||
| 	wpabuf_free(resp); | 	wpabuf_free(resp); | ||||||
| 	wpabuf_free(buf); | 	wpabuf_free(buf); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ilan Peer
						Ilan Peer