nl80211: (Re)Association Request frame IEs from association event

Process NL80211_ATTR_REQ_IE from the NL80211_CMD_ASSOCIATE event to
allow request IEs to be made available for the SME-in-wpa_supplicant
case similarly to how this is done with SME-in-driver with
NL80211_CMD_CONNECT.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
Jouni Malinen 2019-02-14 22:01:20 +02:00 committed by Jouni Malinen
parent dd12e58e5f
commit 5d68c0acd2

View file

@ -206,7 +206,8 @@ static void nl80211_parse_wmm_params(struct nlattr *wmm_attr,
static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv, static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
const u8 *frame, size_t len, struct nlattr *wmm) const u8 *frame, size_t len, struct nlattr *wmm,
struct nlattr *req_ie)
{ {
const struct ieee80211_mgmt *mgmt; const struct ieee80211_mgmt *mgmt;
union wpa_event_data event; union wpa_event_data event;
@ -261,6 +262,11 @@ static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv,
len - 24 - sizeof(mgmt->u.assoc_resp); len - 24 - sizeof(mgmt->u.assoc_resp);
} }
if (req_ie) {
event.assoc_info.req_ies = nla_data(req_ie);
event.assoc_info.req_ies_len = nla_len(req_ie);
}
event.assoc_info.freq = drv->assoc_freq; event.assoc_info.freq = drv->assoc_freq;
/* When this association was initiated outside of wpa_supplicant, /* When this association was initiated outside of wpa_supplicant,
@ -868,7 +874,7 @@ static void mlme_event(struct i802_bss *bss,
struct nlattr *addr, struct nlattr *timed_out, struct nlattr *addr, struct nlattr *timed_out,
struct nlattr *freq, struct nlattr *ack, struct nlattr *freq, struct nlattr *ack,
struct nlattr *cookie, struct nlattr *sig, struct nlattr *cookie, struct nlattr *sig,
struct nlattr *wmm) struct nlattr *wmm, struct nlattr *req_ie)
{ {
struct wpa_driver_nl80211_data *drv = bss->drv; struct wpa_driver_nl80211_data *drv = bss->drv;
const u8 *data; const u8 *data;
@ -917,7 +923,8 @@ static void mlme_event(struct i802_bss *bss,
mlme_event_auth(drv, nla_data(frame), nla_len(frame)); mlme_event_auth(drv, nla_data(frame), nla_len(frame));
break; break;
case NL80211_CMD_ASSOCIATE: case NL80211_CMD_ASSOCIATE:
mlme_event_assoc(drv, nla_data(frame), nla_len(frame), wmm); mlme_event_assoc(drv, nla_data(frame), nla_len(frame), wmm,
req_ie);
break; break;
case NL80211_CMD_DEAUTHENTICATE: case NL80211_CMD_DEAUTHENTICATE:
mlme_event_deauth_disassoc(drv, EVENT_DEAUTH, mlme_event_deauth_disassoc(drv, EVENT_DEAUTH,
@ -2475,7 +2482,8 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK], tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
tb[NL80211_ATTR_COOKIE], tb[NL80211_ATTR_COOKIE],
tb[NL80211_ATTR_RX_SIGNAL_DBM], tb[NL80211_ATTR_RX_SIGNAL_DBM],
tb[NL80211_ATTR_STA_WME]); tb[NL80211_ATTR_STA_WME],
tb[NL80211_ATTR_REQ_IE]);
break; break;
case NL80211_CMD_CONNECT: case NL80211_CMD_CONNECT:
case NL80211_CMD_ROAM: case NL80211_CMD_ROAM:
@ -2648,7 +2656,7 @@ int process_bss_event(struct nl_msg *msg, void *arg)
tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK], tb[NL80211_ATTR_WIPHY_FREQ], tb[NL80211_ATTR_ACK],
tb[NL80211_ATTR_COOKIE], tb[NL80211_ATTR_COOKIE],
tb[NL80211_ATTR_RX_SIGNAL_DBM], tb[NL80211_ATTR_RX_SIGNAL_DBM],
tb[NL80211_ATTR_STA_WME]); tb[NL80211_ATTR_STA_WME], NULL);
break; break;
case NL80211_CMD_UNEXPECTED_FRAME: case NL80211_CMD_UNEXPECTED_FRAME:
nl80211_spurious_frame(bss, tb, 0); nl80211_spurious_frame(bss, tb, 0);