sm->eapol_2_key_info_set_mask = value;
break;
#endif /* CONFIG_TESTING_OPTIONS */
+ case WPA_PARAM_URNM_MFPR:
+ sm->prot_range_neg = value;
+ break;
+ case WPA_PARAM_URNM_MFPR_X20:
+ sm->prot_range_neg_x20 = value;
+ break;
#ifdef CONFIG_DPP2
case WPA_PARAM_DPP_PFS:
sm->dpp_pfs = value;
WPA_PARAM_RSN_OVERRIDE_SUPPORT,
WPA_PARAM_EAPOL_2_KEY_INFO_SET_MASK,
WPA_PARAM_SPP_AMSDU,
+ WPA_PARAM_URNM_MFPR,
+ WPA_PARAM_URNM_MFPR_X20,
};
enum wpa_rsn_override {
unsigned int secure_ltf:1;
unsigned int secure_rtt:1;
unsigned int prot_range_neg:1;
+ unsigned int prot_range_neg_x20:1;
unsigned int ssid_protection:1;
unsigned int spp_amsdu:1;
capab |= BIT(WLAN_RSNX_CAPAB_SECURE_RTT);
if (sm->prot_range_neg)
capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR);
+ if (sm->prot_range_neg_x20)
+ capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR_X20);
if (sm->ssid_protection)
capab |= BIT(WLAN_RSNX_CAPAB_SSID_PROTECTION);
if (sm->spp_amsdu)
} else if (os_strcasecmp(cmd, "enable_dscp_policy_capa") == 0) {
wpa_s->enable_dscp_policy_capa = !!atoi(value);
#endif /* CONFIG_NO_ROBUST_AV */
+#ifdef CONFIG_PASN
+ } else if (os_strcasecmp(cmd, "urnm_mfpr") == 0) {
+ wpa_s->disable_urnm_mfpr = !atoi(value);
+ } else if (os_strcasecmp(cmd, "urnm_mfpr_x20") == 0) {
+ wpa_s->urnm_mfpr_x20 = !!atoi(value);
+#endif /* CONFIG_PASN */
} else {
value[-1] = '=';
ret = wpa_config_process_global(wpa_s->conf, cmd, -1);
capab |= BIT(WLAN_RSNX_CAPAB_SECURE_LTF);
if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_RTT_STA)
capab |= BIT(WLAN_RSNX_CAPAB_SECURE_RTT);
- if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA)
- capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR);
+ if (wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA) {
+ /*
+ * URNM_MFPR_X20 is a subset of URNM_MFPR which excludes 20 MHz
+ * bandwidth from mandating protected Management frames. Set
+ * URNM_MFPR only when URNM_MFPR_X20 is not set.
+ */
+ if (wpa_s->disable_urnm_mfpr) {
+ wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_URNM_MFPR, 0);
+ } else {
+ capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR);
+ wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_URNM_MFPR, 1);
+ }
+ if (wpa_s->urnm_mfpr_x20) {
+ capab |= BIT(WLAN_RSNX_CAPAB_URNM_MFPR_X20);
+ wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_URNM_MFPR_X20,
+ 1);
+ } else {
+ wpa_sm_set_param(wpa_s->wpa, WPA_PARAM_URNM_MFPR_X20,
+ 0);
+ }
+ }
if ((wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SPP_AMSDU) &&
ieee802_11_rsnx_capab(rsnxe, WLAN_RSNX_CAPAB_SPP_A_MSDU))
capab |= BIT(WLAN_RSNX_CAPAB_SPP_A_MSDU);
struct wpa_radio_work *pasn_auth_work;
unsigned int pasn_count;
struct pasn_auth *pasn_params;
+ bool urnm_mfpr_x20;
+ bool disable_urnm_mfpr;
#ifdef CONFIG_P2P
struct wpa_radio_work *p2p_pasn_auth_work;
#endif /* CONFIG_P2P */