qcacmn: Send pmk keys over psk_msk_ext during in 11r offload tlv

Host driver sends pmk key over psk_msk buffer on the
wmi_roam_11r_offload_tlv_param fixed param.
For SHA 384 based FT AKMs, the xx_key length will be higher than
32 bytes. So new psk_msk_ext array is introduced at interface
to sent the remaining 16 bytes.

Fill the last 16 bytes of xx_key to psk_msk_ext for FT
sha384 based AKMs.
Also add support for FT-SAE, FT-SuiteB and FT-FILS firmware
service capability also. If the firmware doesn't advertise
support for FT-SAE or FT-SuiteB or FT-FILS, firmware roaming to
that AP will not be enabled.

Change-Id: Ibe64fb346a24962e59ca461c3099270d8766adc5
CRs-Fixed: 2400773
This commit is contained in:
Pragaspathi Thilagaraj 2019-03-16 18:06:22 +05:30 • committed by nshrivas
commit 69e39d9aa8
3 changed files with 134 additions and 77 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}
/**