qcacmn: Add support to include selective scan IEs only

qcacld-2.0 to qcacmn propagation

Add support to include only selective IEs in probe requests in
order to improve user's privacy.

Change-Id: I59cf4181f60f5b4cd87a32fbcf29160d87ca59c8
CRs-Fixed: 1105495
This commit is contained in:
Rajeev Kumar Sirasanagandla
2017-06-21 12:01:22 +05:30
committed by snandini
parent da3eae632c
commit 0f8402c0b2

View File

@@ -2176,6 +2176,58 @@ void wmi_copy_scan_random_mac(uint8_t *mac, uint8_t *mask,
WMI_CHAR_ARRAY_TO_MAC_ADDR(mask, mac_mask); WMI_CHAR_ARRAY_TO_MAC_ADDR(mask, mac_mask);
} }
/*
* wmi_fill_vendor_oui() - fill vendor OUIs
* @buf_ptr: pointer to wmi tlv buffer
* @num_vendor_oui: number of vendor OUIs to be filled
* @param_voui: pointer to OUI buffer
*
* This function populates the wmi tlv buffer when vendor specific OUIs are
* present.
*
* Return: None
*/
static inline
void wmi_fill_vendor_oui(uint8_t *buf_ptr, uint32_t num_vendor_oui,
uint32_t *pvoui)
{
wmi_vendor_oui *voui = NULL;
uint32_t i;
voui = (wmi_vendor_oui *)buf_ptr;
for (i = 0; i < num_vendor_oui; i++) {
WMITLV_SET_HDR(&voui[i].tlv_header,
WMITLV_TAG_STRUC_wmi_vendor_oui,
WMITLV_GET_STRUCT_TLVLEN(wmi_vendor_oui));
voui[i].oui_type_subtype = pvoui[i];
}
}
/*
* wmi_fill_ie_whitelist_attrs() - fill IE whitelist attrs
* @ie_bitmap: output pointer to ie bit map in cmd
* @num_vendor_oui: output pointer to num vendor OUIs
* @ie_whitelist: input parameter
*
* This function populates the IE whitelist attrs of scan, pno and
* scan oui commands for ie_whitelist parameter.
*
* Return: None
*/
static inline
void wmi_fill_ie_whitelist_attrs(uint32_t *ie_bitmap,
uint32_t *num_vendor_oui,
struct probe_req_whitelist_attr *ie_whitelist)
{
uint32_t i = 0;
for (i = 0; i < PROBE_REQ_BITMAP_LEN; i++)
ie_bitmap[i] = ie_whitelist->ie_bitmap[i];
*num_vendor_oui = ie_whitelist->num_vendor_oui;
}
/** /**
* send_scan_start_cmd_tlv() - WMI scan start function * send_scan_start_cmd_tlv() - WMI scan start function
* @param wmi_handle : handle to WMI. * @param wmi_handle : handle to WMI.
@@ -2196,6 +2248,7 @@ static QDF_STATUS send_scan_start_cmd_tlv(wmi_unified_t wmi_handle,
wmi_mac_addr *bssid; wmi_mac_addr *bssid;
int len = sizeof(*cmd); int len = sizeof(*cmd);
uint8_t extraie_len_with_pad = 0; uint8_t extraie_len_with_pad = 0;
struct probe_req_whitelist_attr *ie_whitelist = &params->ie_whitelist;
/* Length TLV placeholder for array of uint32_t */ /* Length TLV placeholder for array of uint32_t */
len += WMI_TLV_HDR_SIZE; len += WMI_TLV_HDR_SIZE;
@@ -2220,6 +2273,10 @@ static QDF_STATUS send_scan_start_cmd_tlv(wmi_unified_t wmi_handle,
roundup(params->extraie.len, sizeof(uint32_t)); roundup(params->extraie.len, sizeof(uint32_t));
len += extraie_len_with_pad; len += extraie_len_with_pad;
len += WMI_TLV_HDR_SIZE; /* Length of TLV for array of wmi_vendor_oui */
if (ie_whitelist->num_vendor_oui)
len += ie_whitelist->num_vendor_oui * sizeof(wmi_vendor_oui);
/* Allocate the memory */ /* Allocate the memory */
wmi_buf = wmi_buf_alloc(wmi_handle, len); wmi_buf = wmi_buf_alloc(wmi_handle, len);
if (!wmi_buf) { if (!wmi_buf) {
@@ -2266,6 +2323,11 @@ static QDF_STATUS send_scan_start_cmd_tlv(wmi_unified_t wmi_handle,
&cmd->mac_addr, &cmd->mac_addr,
&cmd->mac_mask); &cmd->mac_mask);
if (ie_whitelist->white_list)
wmi_fill_ie_whitelist_attrs(cmd->ie_bitmap,
&cmd->num_vendor_oui,
ie_whitelist);
buf_ptr += sizeof(*cmd); buf_ptr += sizeof(*cmd);
tmp_ptr = (uint32_t *) (buf_ptr + WMI_TLV_HDR_SIZE); tmp_ptr = (uint32_t *) (buf_ptr + WMI_TLV_HDR_SIZE);
for (i = 0; i < params->num_chan; ++i) for (i = 0; i < params->num_chan; ++i)
@@ -2316,6 +2378,18 @@ static QDF_STATUS send_scan_start_cmd_tlv(wmi_unified_t wmi_handle,
buf_ptr += WMI_TLV_HDR_SIZE + extraie_len_with_pad; buf_ptr += WMI_TLV_HDR_SIZE + extraie_len_with_pad;
/* probe req ie whitelisting */
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
ie_whitelist->num_vendor_oui * sizeof(wmi_vendor_oui));
buf_ptr += WMI_TLV_HDR_SIZE;
if (cmd->num_vendor_oui) {
wmi_fill_vendor_oui(buf_ptr, cmd->num_vendor_oui,
ie_whitelist->voui);
buf_ptr += cmd->num_vendor_oui * sizeof(wmi_vendor_oui);
}
ret = wmi_unified_cmd_send( ret = wmi_unified_cmd_send(
get_pdev_wmi_handle(wmi_handle, cmd->vdev_id), wmi_buf, get_pdev_wmi_handle(wmi_handle, cmd->vdev_id), wmi_buf,
len, WMI_START_SCAN_CMDID); len, WMI_START_SCAN_CMDID);
@@ -5216,8 +5290,11 @@ static QDF_STATUS send_scan_probe_setoui_cmd_tlv(wmi_unified_t wmi_handle,
uint32_t len; uint32_t len;
uint8_t *buf_ptr; uint8_t *buf_ptr;
uint32_t *oui_buf; uint32_t *oui_buf;
struct probe_req_whitelist_attr *ie_whitelist = &psetoui->ie_whitelist;
len = sizeof(*cmd) + WMI_TLV_HDR_SIZE +
ie_whitelist->num_vendor_oui * sizeof(wmi_vendor_oui);
len = sizeof(*cmd);
wmi_buf = wmi_buf_alloc(wmi_handle, len); wmi_buf = wmi_buf_alloc(wmi_handle, len);
if (!wmi_buf) { if (!wmi_buf) {
WMI_LOGE("%s: wmi_buf_alloc failed", __func__); WMI_LOGE("%s: wmi_buf_alloc failed", __func__);
@@ -5242,6 +5319,25 @@ static QDF_STATUS send_scan_probe_setoui_cmd_tlv(wmi_unified_t wmi_handle,
if (psetoui->enb_probe_req_sno_randomization) if (psetoui->enb_probe_req_sno_randomization)
cmd->flags |= WMI_SCAN_PROBE_OUI_RANDOM_SEQ_NO_IN_PROBE_REQ; cmd->flags |= WMI_SCAN_PROBE_OUI_RANDOM_SEQ_NO_IN_PROBE_REQ;
if (ie_whitelist->white_list) {
wmi_fill_ie_whitelist_attrs(cmd->ie_bitmap,
&cmd->num_vendor_oui,
ie_whitelist);
cmd->flags |=
WMI_SCAN_PROBE_OUI_ENABLE_IE_WHITELIST_IN_PROBE_REQ;
}
buf_ptr += sizeof(*cmd);
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
ie_whitelist->num_vendor_oui * sizeof(wmi_vendor_oui));
buf_ptr += WMI_TLV_HDR_SIZE;
if (cmd->num_vendor_oui != 0) {
wmi_fill_vendor_oui(buf_ptr, cmd->num_vendor_oui,
ie_whitelist->voui);
buf_ptr += cmd->num_vendor_oui * sizeof(wmi_vendor_oui);
}
if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len, if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
WMI_SCAN_PROB_REQ_OUI_CMDID)) { WMI_SCAN_PROB_REQ_OUI_CMDID)) {
WMI_LOGE("%s: failed to send command", __func__); WMI_LOGE("%s: failed to send command", __func__);
@@ -7236,20 +7332,25 @@ static QDF_STATUS send_pno_start_cmd_tlv(wmi_unified_t wmi_handle,
uint8_t *buf_ptr; uint8_t *buf_ptr;
uint8_t i; uint8_t i;
int ret; int ret;
struct probe_req_whitelist_attr *ie_whitelist = &pno->ie_whitelist;
/* /*
* TLV place holder for array nlo_configured_parameters(nlo_list) * TLV place holder for array nlo_configured_parameters(nlo_list)
* TLV place holder for array of uint32_t channel_list * TLV place holder for array of uint32_t channel_list
* TLV place holder for chnnl prediction cfg * TLV place holder for chnnl prediction cfg
* TLV place holder for array of wmi_vendor_oui
*/ */
len = sizeof(*cmd) + len = sizeof(*cmd) +
WMI_TLV_HDR_SIZE + WMI_TLV_HDR_SIZE + WMI_TLV_HDR_SIZE; WMI_TLV_HDR_SIZE + WMI_TLV_HDR_SIZE + WMI_TLV_HDR_SIZE +
WMI_TLV_HDR_SIZE;
len += sizeof(uint32_t) * QDF_MIN(pno->networks_list[0].channel_cnt, len += sizeof(uint32_t) * QDF_MIN(pno->networks_list[0].channel_cnt,
WMI_NLO_MAX_CHAN); WMI_NLO_MAX_CHAN);
len += sizeof(nlo_configured_parameters) * len += sizeof(nlo_configured_parameters) *
QDF_MIN(pno->networks_cnt, WMI_NLO_MAX_SSIDS); QDF_MIN(pno->networks_cnt, WMI_NLO_MAX_SSIDS);
len += sizeof(nlo_channel_prediction_cfg); len += sizeof(nlo_channel_prediction_cfg);
len += sizeof(enlo_candidate_score_params);
len += sizeof(wmi_vendor_oui) * ie_whitelist->num_vendor_oui;
buf = wmi_buf_alloc(wmi_handle, len); buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) { if (!buf) {
@@ -7363,10 +7464,31 @@ static QDF_STATUS send_pno_start_cmd_tlv(wmi_unified_t wmi_handle,
sizeof(nlo_channel_prediction_cfg)); sizeof(nlo_channel_prediction_cfg));
buf_ptr += WMI_TLV_HDR_SIZE; buf_ptr += WMI_TLV_HDR_SIZE;
wmi_set_pno_channel_prediction(buf_ptr, pno); wmi_set_pno_channel_prediction(buf_ptr, pno);
buf_ptr += WMI_TLV_HDR_SIZE; buf_ptr += sizeof(nlo_channel_prediction_cfg);
/** TODO: Discrete firmware doesn't have command/option to configure /** TODO: Discrete firmware doesn't have command/option to configure
* App IE which comes from wpa_supplicant as of part PNO start request. * App IE which comes from wpa_supplicant as of part PNO start request.
*/ */
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_STRUC_enlo_candidate_score_param,
WMITLV_GET_STRUCT_TLVLEN(enlo_candidate_score_params));
buf_ptr += sizeof(enlo_candidate_score_params);
if (ie_whitelist->white_list) {
cmd->flags |= WMI_NLO_CONFIG_ENABLE_IE_WHITELIST_IN_PROBE_REQ;
wmi_fill_ie_whitelist_attrs(cmd->ie_bitmap,
&cmd->num_vendor_oui,
ie_whitelist);
}
/* ie white list */
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
ie_whitelist->num_vendor_oui * sizeof(wmi_vendor_oui));
buf_ptr += WMI_TLV_HDR_SIZE;
if (cmd->num_vendor_oui != 0) {
wmi_fill_vendor_oui(buf_ptr, cmd->num_vendor_oui,
ie_whitelist->voui);
buf_ptr += cmd->num_vendor_oui * sizeof(wmi_vendor_oui);
}
ret = wmi_unified_cmd_send(wmi_handle, buf, len, ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID); WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID);
if (ret) { if (ret) {