@ -2803,6 +2803,54 @@ int wpa_is_fils_sk_pfs_supported(struct wpa_supplicant *wpa_s)
# endif /* CONFIG_FILS */
# endif /* CONFIG_FILS */
static int wpas_populate_wfa_capa ( struct wpa_supplicant * wpa_s ,
struct wpa_bss * bss ,
u8 * wpa_ie , size_t wpa_ie_len ,
size_t max_wpa_ie_len )
{
struct wpabuf * wfa_ie = NULL ;
u8 wfa_capa [ 1 ] ;
size_t wfa_ie_len , buf_len ;
os_memset ( wfa_capa , 0 , sizeof ( wfa_capa ) ) ;
if ( wpa_s - > enable_dscp_policy_capa )
wfa_capa [ 0 ] | = WFA_CAPA_QM_DSCP_POLICY ;
if ( ! wfa_capa [ 0 ] )
return wpa_ie_len ;
/* Wi-Fi Alliance element */
buf_len = 1 + /* Element ID */
1 + /* Length */
3 + /* OUI */
1 + /* OUI Type */
1 + /* Capabilities Length */
sizeof ( wfa_capa ) ; /* Capabilities */
wfa_ie = wpabuf_alloc ( buf_len ) ;
if ( ! wfa_ie )
return wpa_ie_len ;
wpabuf_put_u8 ( wfa_ie , WLAN_EID_VENDOR_SPECIFIC ) ;
wpabuf_put_u8 ( wfa_ie , buf_len - 2 ) ;
wpabuf_put_be24 ( wfa_ie , OUI_WFA ) ;
wpabuf_put_u8 ( wfa_ie , WFA_CAPA_OUI_TYPE ) ;
wpabuf_put_u8 ( wfa_ie , sizeof ( wfa_capa ) ) ;
wpabuf_put_data ( wfa_ie , wfa_capa , sizeof ( wfa_capa ) ) ;
wfa_ie_len = wpabuf_len ( wfa_ie ) ;
if ( wpa_ie_len + wfa_ie_len < = max_wpa_ie_len ) {
wpa_hexdump_buf ( MSG_MSGDUMP , " WFA Capabilities element " ,
wfa_ie ) ;
os_memcpy ( wpa_ie + wpa_ie_len , wpabuf_head ( wfa_ie ) ,
wfa_ie_len ) ;
wpa_ie_len + = wfa_ie_len ;
}
wpabuf_free ( wfa_ie ) ;
return wpa_ie_len ;
}
static u8 * wpas_populate_assoc_ies (
static u8 * wpas_populate_assoc_ies (
struct wpa_supplicant * wpa_s ,
struct wpa_supplicant * wpa_s ,
struct wpa_bss * bss , struct wpa_ssid * ssid ,
struct wpa_bss * bss , struct wpa_ssid * ssid ,
@ -3280,6 +3328,9 @@ pfs_fail:
}
}
mscs_end :
mscs_end :
wpa_ie_len = wpas_populate_wfa_capa ( wpa_s , bss , wpa_ie , wpa_ie_len ,
max_wpa_ie_len ) ;
if ( ssid - > multi_ap_backhaul_sta ) {
if ( ssid - > multi_ap_backhaul_sta ) {
size_t multi_ap_ie_len ;
size_t multi_ap_ie_len ;