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