diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 5e562b6dc1cb..4dda1d250020 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -69,7 +69,7 @@ #ifdef WLAN_FEATURE_ROAM_OFFLOAD #define WMI_BTK_KEY_LEN 32 #define WMI_ROAM_R0KH_ID_MAX_LEN 48 -#define WMI_ROAM_SCAN_PSK_SIZE 32 +#define WMI_ROAM_SCAN_PSK_SIZE 48 #endif #define WMI_NOISE_FLOOR_DBM_DEFAULT (-96) #define WMI_EXTSCAN_MAX_HOTLIST_SSIDS 8 @@ -1899,6 +1899,7 @@ typedef struct { #define WMI_FILS_MAX_RIK_LENGTH WMI_FILS_MAX_RRK_LENGTH #define WMI_FILS_MAX_REALM_LENGTH 256 #define WMI_FILS_MAX_USERNAME_LENGTH 16 +#define WMI_FILS_FT_MAX_LEN 48 /** * struct roam_fils_params - Roam FILS params @@ -1911,6 +1912,8 @@ typedef struct { * @rik_length: length of @rik * @realm: realm * @realm_len: length of @realm + * @fils_ft: xx_key for FT-FILS connection + * @fils_ft_len: length of FT-FILS */ struct roam_fils_params { uint8_t username[WMI_FILS_MAX_USERNAME_LENGTH]; @@ -1922,6 +1925,8 @@ struct roam_fils_params { uint32_t rik_length; uint8_t realm[WMI_FILS_MAX_REALM_LENGTH]; uint32_t realm_len; + uint8_t fils_ft[WMI_FILS_FT_MAX_LEN]; + uint8_t fils_ft_len; }; /* struct roam_offload_scan_params - structure @@ -5307,6 +5312,9 @@ typedef enum { wmi_service_ul_ru26_allowed, wmi_service_cfr_capture_support, wmi_service_bcast_twt_support, + wmi_service_wpa3_ft_sae_support, + wmi_service_wpa3_ft_suite_b_support, + wmi_service_ft_fils, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF diff --git a/wmi/src/wmi_unified_roam_tlv.c b/wmi/src/wmi_unified_roam_tlv.c index e519baae30da..01192d734b90 100644 --- a/wmi/src/wmi_unified_roam_tlv.c +++ b/wmi/src/wmi_unified_roam_tlv.c @@ -997,6 +997,50 @@ static inline uint8_t *wmi_add_fils_tlv(wmi_unified_t wmi_handle, } #endif +#ifdef WLAN_FEATURE_ROAM_OFFLOAD +/** + * fill_roam_offload_11r_params() - Fill roam scan params to send it to fw + * @auth_mode: Authentication mode + * @roam_offload_11r: TLV to be filled with 11r params + * @roam_req: roam request param + */ +static void +fill_roam_offload_11r_params(uint32_t auth_mode, + wmi_roam_11r_offload_tlv_param *roam_offload_11r, + struct roam_offload_scan_params *roam_req) +{ + uint8_t *psk_msk, len; + + if (auth_mode == WMI_AUTH_FT_RSNA_FILS_SHA256 || + auth_mode == WMI_AUTH_FT_RSNA_FILS_SHA384) { + psk_msk = roam_req->roam_fils_params.fils_ft; + len = roam_req->roam_fils_params.fils_ft_len; + } else { + psk_msk = roam_req->psk_pmk; + len = roam_req->pmk_len; + } + + /* + * For SHA384 based akm, the pmk length is 48 bytes. So fill + * first 32 bytes in roam_offload_11r->psk_msk and the remaining + * bytes in roam_offload_11r->psk_msk_ext buffer + */ + roam_offload_11r->psk_msk_len = len > ROAM_OFFLOAD_PSK_MSK_BYTES ? + ROAM_OFFLOAD_PSK_MSK_BYTES : len; + qdf_mem_copy(roam_offload_11r->psk_msk, psk_msk, + roam_offload_11r->psk_msk_len); + roam_offload_11r->psk_msk_ext_len = 0; + + if (len > ROAM_OFFLOAD_PSK_MSK_BYTES) { + roam_offload_11r->psk_msk_ext_len = + len - roam_offload_11r->psk_msk_len; + qdf_mem_copy(roam_offload_11r->psk_msk_ext, + &psk_msk[roam_offload_11r->psk_msk_len], + roam_offload_11r->psk_msk_ext_len); + } +} +#endif + /** * send_roam_scan_offload_mode_cmd_tlv() - send roam scan mode request to fw * @wmi_handle: wmi handle @@ -1008,10 +1052,10 @@ static inline uint8_t *wmi_add_fils_tlv(wmi_unified_t wmi_handle, * * Return: QDF status */ -static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, - wmi_start_scan_cmd_fixed_param * - scan_cmd_fp, - struct roam_offload_scan_params *roam_req) +static QDF_STATUS +send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, + wmi_start_scan_cmd_fixed_param *scan_cmd_fp, + struct roam_offload_scan_params *roam_req) { wmi_buf_t buf = NULL; QDF_STATUS status; @@ -1039,74 +1083,72 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, sizeof(wmi_start_scan_cmd_fixed_param); #ifdef WLAN_FEATURE_ROAM_OFFLOAD WMI_LOGD("auth_mode = %d", auth_mode); - if (roam_req->is_roam_req_valid && - roam_req->roam_offload_enabled) { - len += sizeof(wmi_roam_offload_tlv_param); + if (roam_req->is_roam_req_valid && + roam_req->roam_offload_enabled) { + len += sizeof(wmi_roam_offload_tlv_param); + len += WMI_TLV_HDR_SIZE; + if ((auth_mode != WMI_AUTH_NONE) && + ((auth_mode != WMI_AUTH_OPEN) || + (auth_mode == WMI_AUTH_OPEN && + roam_req->mdid.mdie_present && + roam_req->is_11r_assoc) || + roam_req->is_ese_assoc)) { len += WMI_TLV_HDR_SIZE; - if ((auth_mode != WMI_AUTH_NONE) && - ((auth_mode != WMI_AUTH_OPEN) || + if (roam_req->is_ese_assoc) + len += sizeof(wmi_roam_ese_offload_tlv_param); + else if ((auth_mode == WMI_AUTH_FT_RSNA) || + (auth_mode == WMI_AUTH_FT_RSNA_PSK) || + (auth_mode == WMI_AUTH_FT_RSNA_SAE) || + (auth_mode == + WMI_AUTH_FT_RSNA_SUITE_B_8021X_SHA384) || + (auth_mode == + WMI_AUTH_FT_RSNA_FILS_SHA256) || + (auth_mode == + WMI_AUTH_FT_RSNA_FILS_SHA384) || (auth_mode == WMI_AUTH_OPEN && roam_req->mdid.mdie_present && - roam_req->is_11r_assoc) || - roam_req->is_ese_assoc)) { - len += WMI_TLV_HDR_SIZE; - if (roam_req->is_ese_assoc) - len += - sizeof(wmi_roam_ese_offload_tlv_param); - else if (auth_mode == WMI_AUTH_FT_RSNA || - auth_mode == WMI_AUTH_FT_RSNA_PSK || - (auth_mode == WMI_AUTH_OPEN && - roam_req->mdid.mdie_present && - roam_req->is_11r_assoc)) - len += - sizeof(wmi_roam_11r_offload_tlv_param); - else - len += - sizeof(wmi_roam_11i_offload_tlv_param); - } else { - len += WMI_TLV_HDR_SIZE; - } - - len += (sizeof(*assoc_ies) + (2*WMI_TLV_HDR_SIZE) - + roundup(roam_req->assoc_ie_length, - sizeof(uint32_t))); - - if (roam_req->add_fils_tlv) { - fils_tlv_len = sizeof( - wmi_roam_fils_offload_tlv_param); - len += WMI_TLV_HDR_SIZE + fils_tlv_len; - } - } else { - if (roam_req->is_roam_req_valid) - WMI_LOGD("%s : roam offload = %d", - __func__, - roam_req->roam_offload_enabled); + roam_req->is_11r_assoc)) + len += sizeof(wmi_roam_11r_offload_tlv_param); else - WMI_LOGD("%s : roam_req is NULL", __func__); - len += (4 * WMI_TLV_HDR_SIZE); + len += sizeof(wmi_roam_11i_offload_tlv_param); + } else { + len += WMI_TLV_HDR_SIZE; } - if (roam_req->is_roam_req_valid && - roam_req->roam_offload_enabled) { - roam_req->mode = roam_req->mode | - WMI_ROAM_SCAN_MODE_ROAMOFFLOAD; + + len += (sizeof(*assoc_ies) + (2*WMI_TLV_HDR_SIZE) + + roundup(roam_req->assoc_ie_length, sizeof(uint32_t))); + + if (roam_req->add_fils_tlv) { + fils_tlv_len = sizeof(wmi_roam_fils_offload_tlv_param); + len += WMI_TLV_HDR_SIZE + fils_tlv_len; } + } else { + if (roam_req->is_roam_req_valid) + WMI_LOGD("%s : roam offload = %d", __func__, + roam_req->roam_offload_enabled); + else + WMI_LOGD("%s : roam_req is NULL", __func__); + + len += (4 * WMI_TLV_HDR_SIZE); + } + + if (roam_req->is_roam_req_valid && roam_req->roam_offload_enabled) + roam_req->mode |= WMI_ROAM_SCAN_MODE_ROAMOFFLOAD; #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ - if (roam_req->mode == (WMI_ROAM_SCAN_MODE_NONE - |WMI_ROAM_SCAN_MODE_ROAMOFFLOAD)) + if (roam_req->mode == + (WMI_ROAM_SCAN_MODE_NONE | WMI_ROAM_SCAN_MODE_ROAMOFFLOAD)) len = sizeof(wmi_roam_scan_mode_fixed_param); buf = wmi_buf_alloc(wmi_handle, len); - if (!buf) { + if (!buf) return QDF_STATUS_E_NOMEM; - } buf_ptr = (uint8_t *) wmi_buf_data(buf); roam_scan_mode_fp = (wmi_roam_scan_mode_fixed_param *) buf_ptr; WMITLV_SET_HDR(&roam_scan_mode_fp->tlv_header, WMITLV_TAG_STRUC_wmi_roam_scan_mode_fixed_param, - WMITLV_GET_STRUCT_TLVLEN - (wmi_roam_scan_mode_fixed_param)); + WMITLV_GET_STRUCT_TLVLEN(wmi_roam_scan_mode_fixed_param)); roam_scan_mode_fp->min_delay_roam_trigger_reason_bitmask = roam_req->roam_trigger_reason_bitmask; @@ -1114,8 +1156,8 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, WMI_SEC_TO_MSEC(roam_req->min_delay_btw_roam_scans); roam_scan_mode_fp->roam_scan_mode = roam_req->mode; roam_scan_mode_fp->vdev_id = roam_req->vdev_id; - if (roam_req->mode == (WMI_ROAM_SCAN_MODE_NONE | - WMI_ROAM_SCAN_MODE_ROAMOFFLOAD)) { + if (roam_req->mode == + (WMI_ROAM_SCAN_MODE_NONE | WMI_ROAM_SCAN_MODE_ROAMOFFLOAD)) { roam_scan_mode_fp->flags |= WMI_ROAM_SCAN_MODE_FLAG_REPORT_STATUS; goto send_roam_scan_mode_cmd; @@ -1130,8 +1172,7 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, scan_cmd_fp->ie_len = 0; WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_STRUC_wmi_start_scan_cmd_fixed_param, - WMITLV_GET_STRUCT_TLVLEN - (wmi_start_scan_cmd_fixed_param)); + WMITLV_GET_STRUCT_TLVLEN(wmi_start_scan_cmd_fixed_param)); #ifdef WLAN_FEATURE_ROAM_OFFLOAD buf_ptr += sizeof(wmi_start_scan_cmd_fixed_param); if (roam_req->is_roam_req_valid && roam_req->roam_offload_enabled) { @@ -1212,11 +1253,18 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, (wmi_roam_ese_offload_tlv_param)); buf_ptr += sizeof(wmi_roam_ese_offload_tlv_param); - } else if (auth_mode == WMI_AUTH_FT_RSNA - || auth_mode == WMI_AUTH_FT_RSNA_PSK - || (auth_mode == WMI_AUTH_OPEN - && roam_req->mdid.mdie_present && - roam_req->is_11r_assoc)) { + } else if (auth_mode == WMI_AUTH_FT_RSNA || + auth_mode == WMI_AUTH_FT_RSNA_PSK || + auth_mode == WMI_AUTH_FT_RSNA_SAE || + (auth_mode == + WMI_AUTH_FT_RSNA_SUITE_B_8021X_SHA384) || + (auth_mode == + WMI_AUTH_FT_RSNA_FILS_SHA256) || + (auth_mode == + WMI_AUTH_FT_RSNA_FILS_SHA384) || + (auth_mode == WMI_AUTH_OPEN + && roam_req->mdid.mdie_present && + roam_req->is_11r_assoc)) { WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0); buf_ptr += WMI_TLV_HDR_SIZE; @@ -1230,11 +1278,9 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, qdf_mem_copy(roam_offload_11r->r0kh_id, roam_req->rokh_id, roam_offload_11r->r0kh_id_len); - qdf_mem_copy(roam_offload_11r->psk_msk, - roam_req->psk_pmk, - sizeof(roam_req->psk_pmk)); - roam_offload_11r->psk_msk_len = - roam_req->pmk_len; + fill_roam_offload_11r_params(auth_mode, + roam_offload_11r, + roam_req); roam_offload_11r->mdie_present = roam_req->mdid.mdie_present; roam_offload_11r->mdid = @@ -1254,8 +1300,9 @@ static QDF_STATUS send_roam_scan_offload_mode_cmd_tlv(wmi_unified_t wmi_handle, WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, WMITLV_GET_STRUCT_TLVLEN(0)); buf_ptr += WMI_TLV_HDR_SIZE; - WMI_LOGD("psk_msk_len = %d", - roam_offload_11r->psk_msk_len); + WMI_LOGD("psk_msk_len = %d psk_msk_ext:%d", + roam_offload_11r->psk_msk_len, + roam_offload_11r->psk_msk_ext_len); if (roam_offload_11r->psk_msk_len) QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG, @@ -1373,12 +1420,8 @@ send_roam_scan_mode_cmd: wmi_mtrace(WMI_ROAM_SCAN_MODE, NO_SESSION, 0); status = wmi_unified_cmd_send(wmi_handle, buf, len, WMI_ROAM_SCAN_MODE); - if (QDF_IS_STATUS_ERROR(status)) { - WMI_LOGE( - "wmi_unified_cmd_send WMI_ROAM_SCAN_MODE returned Error %d", - status); + if (QDF_IS_STATUS_ERROR(status)) wmi_buf_free(buf); - } return status; } diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index c953076bb9ab..1fda17d2492a 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -12133,6 +12133,12 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_CFR_CAPTURE_SUPPORT; wmi_service[wmi_service_bcast_twt_support] = WMI_SERVICE_BROADCAST_TWT; + wmi_service[wmi_service_wpa3_ft_sae_support] = + WMI_SERVICE_WPA3_FT_SAE_SUPPORT; + wmi_service[wmi_service_wpa3_ft_suite_b_support] = + WMI_SERVICE_WPA3_FT_SUITE_B_SUPPORT; + wmi_service[wmi_service_ft_fils] = + WMI_SERVICE_WPA3_FT_FILS; } /**