RSNO: Update RSN overriding capability indication to the driver
Modify wpa_supplicant code based on the updated driver interface for RSN overriding capability indication. Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
This commit is contained in:
parent
5fd3d05a40
commit
70b8f64faf
5 changed files with 67 additions and 32 deletions
|
@ -1384,6 +1384,12 @@ struct wpa_driver_associate_params {
|
||||||
* mld_params - MLD association parameters
|
* mld_params - MLD association parameters
|
||||||
*/
|
*/
|
||||||
struct wpa_driver_mld_params mld_params;
|
struct wpa_driver_mld_params mld_params;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rsn_overriding - wpa_supplicant RSN overriding support
|
||||||
|
*/
|
||||||
|
bool rsn_overriding;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum hide_ssid {
|
enum hide_ssid {
|
||||||
|
|
|
@ -7134,6 +7134,60 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_DRIVER_NL80211_QCA
|
||||||
|
static void connect_ext_feature_set(u8 *features,
|
||||||
|
enum qca_wlan_connect_ext_features idx)
|
||||||
|
{
|
||||||
|
u8 *idx_byte = &features[idx / 8];
|
||||||
|
|
||||||
|
*idx_byte |= BIT(idx % 8);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
||||||
|
|
||||||
|
|
||||||
|
static int nl80211_connect_ext(struct wpa_driver_nl80211_data *drv,
|
||||||
|
struct wpa_driver_associate_params *params)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DRIVER_NL80211_QCA
|
||||||
|
struct nl_msg *msg;
|
||||||
|
struct nlattr *attr;
|
||||||
|
u8 features[(NUM_QCA_CONNECT_EXT_FEATURES + 7) / 8] = {};
|
||||||
|
|
||||||
|
if (!drv->connect_ext_vendor_cmd_avail)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "nl80211: Connect_ext (ifindex=%d)",
|
||||||
|
drv->ifindex);
|
||||||
|
|
||||||
|
if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR)) ||
|
||||||
|
nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) ||
|
||||||
|
nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
|
||||||
|
QCA_NL80211_VENDOR_SUBCMD_CONNECT_EXT))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
attr = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA);
|
||||||
|
if (!attr)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (params->rsn_overriding) {
|
||||||
|
wpa_printf(MSG_DEBUG, "- RSN overriding");
|
||||||
|
connect_ext_feature_set(features, QCA_CONNECT_EXT_FEATURE_RSNO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nla_put(msg, QCA_WLAN_VENDOR_ATTR_CONNECT_EXT_FEATURES,
|
||||||
|
sizeof(features), features))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
nla_nest_end(msg, attr);
|
||||||
|
|
||||||
|
return send_and_recv_cmd(drv, msg);
|
||||||
|
fail:
|
||||||
|
nlmsg_free(msg);
|
||||||
|
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int wpa_driver_nl80211_try_connect(
|
static int wpa_driver_nl80211_try_connect(
|
||||||
struct wpa_driver_nl80211_data *drv,
|
struct wpa_driver_nl80211_data *drv,
|
||||||
struct wpa_driver_associate_params *params,
|
struct wpa_driver_associate_params *params,
|
||||||
|
@ -7155,6 +7209,7 @@ static int wpa_driver_nl80211_try_connect(
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
||||||
|
|
||||||
|
nl80211_connect_ext(drv, params);
|
||||||
wpa_printf(MSG_DEBUG, "nl80211: Connect (ifindex=%d)", drv->ifindex);
|
wpa_printf(MSG_DEBUG, "nl80211: Connect (ifindex=%d)", drv->ifindex);
|
||||||
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_CONNECT);
|
msg = nl80211_drv_msg(drv, 0, NL80211_CMD_CONNECT);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
|
|
|
@ -200,6 +200,7 @@ struct wpa_driver_nl80211_data {
|
||||||
unsigned int secure_ranging_ctx_vendor_cmd_avail:1;
|
unsigned int secure_ranging_ctx_vendor_cmd_avail:1;
|
||||||
unsigned int puncturing:1;
|
unsigned int puncturing:1;
|
||||||
unsigned int qca_ap_allowed_freqs:1;
|
unsigned int qca_ap_allowed_freqs:1;
|
||||||
|
unsigned int connect_ext_vendor_cmd_avail:1;
|
||||||
|
|
||||||
u32 ignore_next_local_disconnect;
|
u32 ignore_next_local_disconnect;
|
||||||
u32 ignore_next_local_deauth;
|
u32 ignore_next_local_deauth;
|
||||||
|
|
|
@ -1120,6 +1120,9 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
|
||||||
case QCA_NL80211_VENDOR_SUBCMD_SECURE_RANGING_CONTEXT:
|
case QCA_NL80211_VENDOR_SUBCMD_SECURE_RANGING_CONTEXT:
|
||||||
drv->secure_ranging_ctx_vendor_cmd_avail = 1;
|
drv->secure_ranging_ctx_vendor_cmd_avail = 1;
|
||||||
break;
|
break;
|
||||||
|
case QCA_NL80211_VENDOR_SUBCMD_CONNECT_EXT:
|
||||||
|
drv->connect_ext_vendor_cmd_avail = 1;
|
||||||
|
break;
|
||||||
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
#endif /* CONFIG_DRIVER_NL80211_QCA */
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_DRIVER_NL80211_BRCM
|
#ifdef CONFIG_DRIVER_NL80211_BRCM
|
||||||
|
|
|
@ -3967,8 +3967,7 @@ mscs_end:
|
||||||
|
|
||||||
wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_OVERRIDE,
|
wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_RSN_OVERRIDE,
|
||||||
RSN_OVERRIDE_NOT_USED);
|
RSN_OVERRIDE_NOT_USED);
|
||||||
if (!wpas_driver_bss_selection(wpa_s) &&
|
if (wpas_rsn_overriding(wpa_s) &&
|
||||||
wpas_rsn_overriding(wpa_s) &&
|
|
||||||
wpas_ap_supports_rsn_overriding(wpa_s, bss) &&
|
wpas_ap_supports_rsn_overriding(wpa_s, bss) &&
|
||||||
wpa_ie_len + 2 + 4 + 1 <= max_wpa_ie_len) {
|
wpa_ie_len + 2 + 4 + 1 <= max_wpa_ie_len) {
|
||||||
u8 *pos = wpa_ie + wpa_ie_len, *start = pos;
|
u8 *pos = wpa_ie + wpa_ie_len, *start = pos;
|
||||||
|
@ -4005,36 +4004,7 @@ mscs_end:
|
||||||
wpa_ie_len += pos - start;
|
wpa_ie_len += pos - start;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wpas_driver_bss_selection(wpa_s) &&
|
params->rsn_overriding = wpas_rsn_overriding(wpa_s);
|
||||||
wpas_rsn_overriding(wpa_s)) {
|
|
||||||
/* TODO: Replace this indication of support for RSN overriding
|
|
||||||
* to the driver in driver-based BSS selection cases with
|
|
||||||
* something cleaner. */
|
|
||||||
if (wpa_ie_len + 2 + 4 <= max_wpa_ie_len) {
|
|
||||||
u8 *pos = wpa_ie + wpa_ie_len;
|
|
||||||
|
|
||||||
*pos++ = WLAN_EID_VENDOR_SPECIFIC;
|
|
||||||
*pos++ = 4;
|
|
||||||
WPA_PUT_BE32(pos, RSNE_OVERRIDE_IE_VENDOR_TYPE);
|
|
||||||
pos += 4;
|
|
||||||
wpa_hexdump(MSG_MSGDUMP, "RSNE Override", wpa_ie,
|
|
||||||
pos - wpa_ie);
|
|
||||||
wpa_ie_len += 2 + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wpa_ie_len + 2 + 4 <= max_wpa_ie_len) {
|
|
||||||
u8 *pos = wpa_ie + wpa_ie_len;
|
|
||||||
|
|
||||||
*pos++ = WLAN_EID_VENDOR_SPECIFIC;
|
|
||||||
*pos++ = 4;
|
|
||||||
WPA_PUT_BE32(pos, RSNE_OVERRIDE_2_IE_VENDOR_TYPE);
|
|
||||||
pos += 4;
|
|
||||||
wpa_hexdump(MSG_MSGDUMP, "RSNE Override 2",
|
|
||||||
wpa_ie, pos - wpa_ie);
|
|
||||||
wpa_ie_len += 2 + 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
params->wpa_ie = wpa_ie;
|
params->wpa_ie = wpa_ie;
|
||||||
params->wpa_ie_len = wpa_ie_len;
|
params->wpa_ie_len = wpa_ie_len;
|
||||||
params->auth_alg = algs;
|
params->auth_alg = algs;
|
||||||
|
|
Loading…
Reference in a new issue