qcacmn: Support adaptive 11R BSS in scan
Adaptive 11r is a feature by which the network supports 11r even though the bss doesn't advertise 11r. This is done with the help of advertising vendor specific adaptive 11r IE and MD IE in the beacon/probe. When vendor specific adaptive 11r IE (oui 0x00 40 96 type 0x2C) is present in the beacon/probe, and 1st bit of the IE data is set to 1, then the BSS supports adaptive 11r. The BSS advertises, non-11r akm in RSN IE and user space will send the 11r akm in the connect start. So the scan module shouldn't filter out the candidate adaptive 11r supported BSS with AKM mismatch reason. Add changes in scan module to parse the Vendor specific adaptive 11r IE and copy it to the scan_entry ie_list. Check if negotiated akm is non-11r akm, and the filter akm sent from csr is a 11r akm (which is received from user space), then mark the bss as matching. Change-Id: I65f32c67016ad634f1592a7453e77aaf0c5a327c CRs-Fixed: 2431074
This commit is contained in:
@@ -158,6 +158,7 @@ struct element_info {
|
||||
* @fils_indication: pointer to FILS indication ie
|
||||
* @esp: pointer to ESP indication ie
|
||||
* @mbo_oce: pointer to mbo/oce indication ie
|
||||
* @adaptive_11r: pointer to adaptive 11r IE
|
||||
*/
|
||||
struct ie_list {
|
||||
uint8_t *tim;
|
||||
@@ -206,6 +207,7 @@ struct ie_list {
|
||||
uint8_t *mbo_oce;
|
||||
uint8_t *muedca;
|
||||
uint8_t *extender;
|
||||
uint8_t *adaptive_11r;
|
||||
};
|
||||
|
||||
enum scan_entry_connection_state {
|
||||
@@ -299,6 +301,7 @@ struct scan_mbssid_info {
|
||||
* @qbss_chan_load: Qbss channel load
|
||||
* @nss: supported NSS information
|
||||
* @is_p2p_ssid: is P2P entry
|
||||
* @adaptive_11r_ap: flag to check if AP supports adaptive 11r
|
||||
* @scan_entry_time: boottime in microsec when last beacon/probe is received
|
||||
* @rssi_timestamp: boottime in microsec when RSSI was updated
|
||||
* @hidden_ssid_timestamp: boottime in microsec when hidden
|
||||
@@ -340,6 +343,7 @@ struct scan_cache_entry {
|
||||
uint8_t qbss_chan_load;
|
||||
uint8_t nss;
|
||||
bool is_p2p;
|
||||
bool adaptive_11r_ap;
|
||||
qdf_time_t scan_entry_time;
|
||||
qdf_time_t rssi_timestamp;
|
||||
qdf_time_t hidden_ssid_timestamp;
|
||||
@@ -523,6 +527,7 @@ struct fils_filter_info {
|
||||
|
||||
/**
|
||||
* @bss_scoring_required :- flag to bypass scoring filtered results
|
||||
* @enable_adaptive_11r: flag to check if adaptive 11r ini is enabled
|
||||
* @age_threshold: If set return entry which are newer than the age_threshold
|
||||
* @p2p_results: If only p2p entries is required
|
||||
* @rrm_measurement_filter: For measurement reports.if set, only SSID, BSSID
|
||||
@@ -560,6 +565,7 @@ struct fils_filter_info {
|
||||
*/
|
||||
struct scan_filter {
|
||||
bool bss_scoring_required;
|
||||
bool enable_adaptive_11r;
|
||||
uint32_t age_threshold;
|
||||
uint32_t p2p_results;
|
||||
uint32_t rrm_measurement_filter;
|
||||
|
@@ -673,6 +673,7 @@ util_scan_copy_beacon_data(struct scan_cache_entry *new_entry,
|
||||
ie_lst->esp = conv_ptr(ie_lst->esp, old_ptr, new_ptr);
|
||||
ie_lst->mbo_oce = conv_ptr(ie_lst->mbo_oce, old_ptr, new_ptr);
|
||||
ie_lst->extender = conv_ptr(ie_lst->extender, old_ptr, new_ptr);
|
||||
ie_lst->adaptive_11r = conv_ptr(ie_lst->adaptive_11r, old_ptr, new_ptr);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -809,6 +810,20 @@ util_scan_entry_rsn(struct scan_cache_entry *scan_entry)
|
||||
return scan_entry->ie_list.rsn;
|
||||
}
|
||||
|
||||
/**
|
||||
* util_scan_entry_adaptive_11r()- function to read adaptive 11r Vendor IE
|
||||
* @scan_entry: scan entry
|
||||
*
|
||||
* API, function to read adaptive 11r IE
|
||||
*
|
||||
* Return: apaptive 11r ie or NULL if ie is not present
|
||||
*/
|
||||
static inline uint8_t*
|
||||
util_scan_entry_adaptive_11r(struct scan_cache_entry *scan_entry)
|
||||
{
|
||||
return scan_entry->ie_list.adaptive_11r;
|
||||
}
|
||||
|
||||
/**
|
||||
* util_scan_get_rsn_len()- function to read rsn IE length if present
|
||||
* @scan_entry: scan entry
|
||||
|
@@ -471,6 +471,13 @@ util_scan_parse_vendor_ie(struct scan_cache_entry *scan_params,
|
||||
scan_params->ie_list.mbo_oce = (uint8_t *)ie;
|
||||
} else if (is_extender_oui((uint8_t *)ie)) {
|
||||
scan_params->ie_list.extender = (uint8_t *)ie;
|
||||
} else if (is_adaptive_11r_oui((uint8_t *)ie)) {
|
||||
if ((ie->ie_len < OUI_LENGTH) ||
|
||||
(ie->ie_len > MAX_ADAPTIVE_11R_IE_LEN))
|
||||
return QDF_STATUS_E_INVAL;
|
||||
|
||||
scan_params->ie_list.adaptive_11r = (uint8_t *)ie +
|
||||
sizeof(struct ie_header);
|
||||
}
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -977,6 +984,36 @@ util_scan_add_hidden_ssid(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t bcnbuf)
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif /* WLAN_DFS_CHAN_HIDDEN_SSID */
|
||||
|
||||
#ifdef WLAN_ADAPTIVE_11R
|
||||
/**
|
||||
* scm_fill_adaptive_11r_cap() - Check if the AP supports adaptive 11r
|
||||
* @scan_entry: Pointer to the scan entry
|
||||
*
|
||||
* Return: true if adaptive 11r is advertised else false
|
||||
*/
|
||||
static void scm_fill_adaptive_11r_cap(struct scan_cache_entry *scan_entry)
|
||||
{
|
||||
uint8_t *ie;
|
||||
uint8_t data;
|
||||
bool adaptive_11r;
|
||||
|
||||
ie = util_scan_entry_adaptive_11r(scan_entry);
|
||||
if (!ie)
|
||||
return;
|
||||
|
||||
data = *(ie + OUI_LENGTH);
|
||||
adaptive_11r = (data & 0x1) ? true : false;
|
||||
|
||||
scan_entry->adaptive_11r_ap = adaptive_11r;
|
||||
}
|
||||
#else
|
||||
static void scm_fill_adaptive_11r_cap(struct scan_cache_entry *scan_entry)
|
||||
{
|
||||
scan_entry->adaptive_11r_ap = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static QDF_STATUS
|
||||
util_scan_gen_scan_entry(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t *frame, qdf_size_t frame_len,
|
||||
@@ -1114,6 +1151,8 @@ util_scan_gen_scan_entry(struct wlan_objmgr_pdev *pdev,
|
||||
scan_entry->phy_mode = util_scan_get_phymode_2g(scan_entry);
|
||||
|
||||
scan_entry->nss = util_scan_scm_calc_nss_supported_by_ap(scan_entry);
|
||||
scm_fill_adaptive_11r_cap(scan_entry);
|
||||
|
||||
util_scan_scm_update_bss_with_esp_data(scan_entry);
|
||||
qbss_load = (struct qbss_load_ie *)
|
||||
util_scan_entry_qbssload(scan_entry);
|
||||
|
Reference in New Issue
Block a user