diff options
| author | Agrawal Ashish <ashishka@codeaurora.org> | 2016-08-18 16:44:48 +0530 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-10-06 04:08:57 -0700 |
| commit | 06e76d29092b3d38221da27f067f1d4ccf87e9b2 (patch) | |
| tree | 0f0b318e4555001493df43cda79c0cd410b46c50 | |
| parent | b2d1a45a783034beddc500b30ee0f23e507b3bad (diff) | |
qcacld-3.0: Populate correct supported rates from hostapd.conf file
qcacld-2.0 to qcacld-3.0 propagation
Currently driver populates default supported and extended supported
rates in beacons even if hostapd.conf file wants to change
supported and extended supported rates.
Fix this by parsing beacon head and tail to get supported
and extended rates and populate them in sap config.
If Driver force acs is enabled, driver acs will get priority.
In case of driver based acs, driver should
ignore basic and extended rates from hostapd.conf and should
populate default rates.
Change-Id: I3226438b908a96f1b1bd3c2968a0c20eef81a799
CRs-Fixed: 1035768
| -rw-r--r-- | core/hdd/src/wlan_hdd_hostapd.c | 34 | ||||
| -rw-r--r-- | core/sap/inc/sap_api.h | 4 | ||||
| -rw-r--r-- | core/sap/src/sap_fsm.c | 16 | ||||
| -rw-r--r-- | core/sme/inc/csr_api.h | 5 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 186 |
5 files changed, 186 insertions, 59 deletions
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 3f20e4e160af..94af9c09e7cf 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -7250,6 +7250,40 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, acl_entry++; } } + if (!pHddCtx->config->force_sap_acs) { + pIe = wlan_hdd_cfg80211_get_ie_ptr( + &pMgmt_frame->u.beacon.variable[0], + pBeacon->head_len, WLAN_EID_SUPP_RATES); + + if (pIe != NULL) { + pIe++; + pConfig->supported_rates.numRates = pIe[0]; + pIe++; + for (i = 0; + i < pConfig->supported_rates.numRates; i++) { + if (pIe[i]) { + pConfig->supported_rates.rate[i] = pIe[i]; + hdd_info("Configured Supported rate is %2x", + pConfig->supported_rates.rate[i]); + } + } + } + pIe = wlan_hdd_cfg80211_get_ie_ptr(pBeacon->tail, + pBeacon->tail_len, + WLAN_EID_EXT_SUPP_RATES); + if (pIe != NULL) { + pIe++; + pConfig->extended_rates.numRates = pIe[0]; + pIe++; + for (i = 0; i < pConfig->extended_rates.numRates; i++) { + if (pIe[i]) { + pConfig->extended_rates.rate[i] = pIe[i]; + hdd_info("Configured ext Supported rate is %2x", + pConfig->extended_rates.rate[i]); + } + } + } + } wlan_hdd_set_sap_hwmode(pHostapdAdapter); qdf_mem_zero(&sme_config, sizeof(tSmeConfigParams)); diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index d9f06b8bf7c3..1087fe2c44e0 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -589,8 +589,8 @@ typedef struct sap_Config { uint8_t short_retry_limit; uint8_t long_retry_limit; uint8_t ampdu_size; - tSirMacRateSet supp_rate_set; - tSirMacRateSet extended_rate_set; + tSirMacRateSet supported_rates; + tSirMacRateSet extended_rates; enum sap_acs_dfs_mode acs_dfs_mode; } tsap_Config_t; diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 8eef7af80814..1ed36bbdef35 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -4199,6 +4199,22 @@ sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType } profile->sap_dot11mc = pconfig_params->sap_dot11mc; + if (pconfig_params->supported_rates.numRates) { + qdf_mem_copy(profile->supported_rates.rate, + pconfig_params->supported_rates.rate, + pconfig_params->supported_rates.numRates); + profile->supported_rates.numRates = + pconfig_params->supported_rates.numRates; + } + + if (pconfig_params->extended_rates.numRates) { + qdf_mem_copy(profile->extended_rates.rate, + pconfig_params->extended_rates.rate, + pconfig_params->extended_rates.numRates); + profile->extended_rates.numRates = + pconfig_params->extended_rates.numRates; + } + return eSAP_STATUS_SUCCESS; /* Success. */ } diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 07e9874784d9..47d654b8d06c 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -965,9 +965,10 @@ typedef struct tagCsrRoamProfile { tSirAddIeParams addIeParams; uint8_t sap_dot11mc; uint8_t beacon_tx_rate; - tSirMacRateSet supp_rate_set; - tSirMacRateSet extended_rate_set; + tSirMacRateSet supported_rates; + tSirMacRateSet extended_rates; bool do_not_roam; + } tCsrRoamProfile; #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index ad3768c3b13e..74a0f586f26d 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -7315,6 +7315,20 @@ QDF_STATUS csr_roam_copy_profile(tpAniSirGlobal pMac, } qdf_mem_copy(&pDstProfile->addIeParams, &pSrcProfile->addIeParams, sizeof(tSirAddIeParams)); + if (pSrcProfile->supported_rates.numRates) { + qdf_mem_copy(pDstProfile->supported_rates.rate, + pSrcProfile->supported_rates.rate, + pSrcProfile->supported_rates.numRates); + pDstProfile->supported_rates.numRates = + pSrcProfile->supported_rates.numRates; + } + if (pSrcProfile->extended_rates.numRates) { + qdf_mem_copy(pDstProfile->extended_rates.rate, + pSrcProfile->extended_rates.rate, + pSrcProfile->extended_rates.numRates); + pDstProfile->extended_rates.numRates = + pSrcProfile->extended_rates.numRates; + } end: if (!QDF_IS_STATUS_SUCCESS(status)) { csr_release_profile(pMac, pDstProfile); @@ -12517,12 +12531,11 @@ uint8_t csr_roam_get_ibss_start_channel_number24(tpAniSirGlobal pMac) return channel; } - /** * csr_populate_basic_rates() - populates OFDM or CCK rates * @rates: rate struct to populate - * @type: true: ofdm rates, false: cck rates - * @masked: indicates if rates are to be masked with + * @is_ofdm_rates: true: ofdm rates, false: cck rates + * @is_basic_rates: indicates if rates are to be masked with * CSR_DOT11_BASIC_RATE_MASK * * This function will populate OFDM or CCK rates @@ -12530,8 +12543,10 @@ uint8_t csr_roam_get_ibss_start_channel_number24(tpAniSirGlobal pMac) * Return: void */ static void -csr_populate_basic_rates(tSirMacRateSet *rate_set, bool type, bool masked) +csr_populate_basic_rates(tSirMacRateSet *rate_set, bool is_ofdm_rates, + bool is_basic_rates) { + int i = 0; uint8_t ofdm_rates[8] = { SIR_MAC_RATE_6, SIR_MAC_RATE_9, @@ -12549,23 +12564,30 @@ csr_populate_basic_rates(tSirMacRateSet *rate_set, bool type, bool masked) SIR_MAC_RATE_11 }; - if (type == true) { + if (is_ofdm_rates == true) { rate_set->numRates = 8; qdf_mem_copy(rate_set->rate, ofdm_rates, sizeof(ofdm_rates)); - if (masked) { + if (is_basic_rates) { rate_set->rate[0] |= CSR_DOT11_BASIC_RATE_MASK; rate_set->rate[2] |= CSR_DOT11_BASIC_RATE_MASK; rate_set->rate[4] |= CSR_DOT11_BASIC_RATE_MASK; } + for (i = 0; i < rate_set->numRates; i++) + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, + FL("Default OFDM rate is %2x"), rate_set->rate[i]); } else { rate_set->numRates = 4; qdf_mem_copy(rate_set->rate, cck_rates, sizeof(cck_rates)); - if (masked) { + if (is_basic_rates) { rate_set->rate[0] |= CSR_DOT11_BASIC_RATE_MASK; rate_set->rate[1] |= CSR_DOT11_BASIC_RATE_MASK; rate_set->rate[2] |= CSR_DOT11_BASIC_RATE_MASK; rate_set->rate[3] |= CSR_DOT11_BASIC_RATE_MASK; } + for (i = 0; i < rate_set->numRates; i++) + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, + FL("Default CCK rate is %2x"), rate_set->rate[i]); + } } @@ -12601,6 +12623,41 @@ csr_convert_mode_to_nw_type(eCsrCfgDot11Mode dot11_mode, eCsrBand band) } /** + * csr_populate_supported_rates_from_hostapd() - populates operational + * and extended rates. + * from hostapd.conf file + * @opr_rates: rate struct to populate operational rates + * @ext_rates: rate struct to populate extended rates + * @profile: bss profile + * + * Return: void + */ +static void csr_populate_supported_rates_from_hostapd(tSirMacRateSet *opr_rates, + tSirMacRateSet *ext_rates, + tCsrRoamProfile *pProfile) +{ + int i = 0; + if (pProfile->supported_rates.numRates) { + opr_rates->numRates = pProfile->supported_rates.numRates; + qdf_mem_copy(opr_rates->rate, + pProfile->supported_rates.rate, + pProfile->supported_rates.numRates); + for (i = 0; i < opr_rates->numRates; i++) + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, + FL("Supported Rate is %2x"), opr_rates->rate[i]); + } + if (pProfile->extended_rates.numRates) { + ext_rates->numRates = + pProfile->extended_rates.numRates; + qdf_mem_copy(ext_rates->rate, + pProfile->extended_rates.rate, + pProfile->extended_rates.numRates); + for (i = 0; i < ext_rates->numRates; i++) + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, + FL("Extended Rate is %2x"), ext_rates->rate[i]); + } +} +/** * csr_roam_get_bss_start_parms() - get bss start param from profile * @pMac: mac global context * @pProfile: roam profile @@ -12642,58 +12699,77 @@ csr_roam_get_bss_start_parms(tpAniSirGlobal pMac, nw_type = csr_convert_mode_to_nw_type(pParam->uCfgDot11Mode, band); ext_rates->numRates = 0; - - switch (nw_type) { - default: - sms_log(pMac, LOGE, FL("sees an unknown pSirNwType (%d)"), - nw_type); - case eSIR_11A_NW_TYPE: - csr_populate_basic_rates(opr_rates, true, true); - if (eCSR_OPERATING_CHANNEL_ANY != tmp_opr_ch) { - opr_ch = tmp_opr_ch; - break; - } - opr_ch = csr_roam_get_ibss_start_channel_number50(pMac); - if (0 == opr_ch && - CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) && - CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)) { - /* - * We could not find a 5G channel by auto pick, let's - * try 2.4G channels. We only do this here because - * csr_roam_get_phy_mode_band_for_bss always picks 11a - * for AUTO - */ - nw_type = eSIR_11B_NW_TYPE; - opr_ch = csr_roam_get_ibss_start_channel_number24(pMac); - csr_populate_basic_rates(opr_rates, false, true); - } - break; - case eSIR_11B_NW_TYPE: - csr_populate_basic_rates(opr_rates, false, true); - if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch) - opr_ch = csr_roam_get_ibss_start_channel_number24(pMac); - else - opr_ch = tmp_opr_ch; - break; - case eSIR_11G_NW_TYPE: - /* For P2P Client and P2P GO, disable 11b rates */ - if ((pProfile->csrPersona == QDF_P2P_CLIENT_MODE) - || (pProfile->csrPersona == QDF_P2P_GO_MODE) - || (eCSR_CFG_DOT11_MODE_11G_ONLY == - pParam->uCfgDot11Mode)) { + /* + * hostapd.conf will populate its basic and extended rates + * as per hw_mode but if acs in ini is enabled, driver should + * ignore basic and extended rates from hostapd.conf and should + * populate default rates. + */ + if (pProfile->supported_rates.numRates || + pProfile->extended_rates.numRates) { + csr_populate_supported_rates_from_hostapd(opr_rates, + ext_rates, pProfile); + pParam->operationChn = tmp_opr_ch; + } else { + switch (nw_type) { + default: + sms_log(pMac, LOGE, + FL("sees an unknown pSirNwType (%d)"), + nw_type); + case eSIR_11A_NW_TYPE: csr_populate_basic_rates(opr_rates, true, true); - } else { + if (eCSR_OPERATING_CHANNEL_ANY != tmp_opr_ch) { + opr_ch = tmp_opr_ch; + break; + } + opr_ch = csr_roam_get_ibss_start_channel_number50(pMac); + if (0 == opr_ch && + CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) && + CSR_IS_PHY_MODE_DUAL_BAND( + pMac->roam.configParam.phyMode)) { + /* + * We could not find a 5G channel by auto pick, + * let's try 2.4G channels. We only do this here + * because csr_roam_get_phy_mode_band_for_bss + * always picks 11a for AUTO + */ + nw_type = eSIR_11B_NW_TYPE; + opr_ch = + csr_roam_get_ibss_start_channel_number24(pMac); + csr_populate_basic_rates(opr_rates, false, + true); + } + break; + case eSIR_11B_NW_TYPE: csr_populate_basic_rates(opr_rates, false, true); - csr_populate_basic_rates(ext_rates, true, false); + if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch) + opr_ch = + csr_roam_get_ibss_start_channel_number24(pMac); + else + opr_ch = tmp_opr_ch; + break; + case eSIR_11G_NW_TYPE: + /* For P2P Client and P2P GO, disable 11b rates */ + if ((pProfile->csrPersona == QDF_P2P_CLIENT_MODE) || + (pProfile->csrPersona == QDF_P2P_GO_MODE) || + (eCSR_CFG_DOT11_MODE_11G_ONLY == + pParam->uCfgDot11Mode)) { + csr_populate_basic_rates(opr_rates, true, true); + } else { + csr_populate_basic_rates(opr_rates, false, + true); + csr_populate_basic_rates(ext_rates, true, + false); + } + if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch) + opr_ch = + csr_roam_get_ibss_start_channel_number24(pMac); + else + opr_ch = tmp_opr_ch; + break; } - - if (eCSR_OPERATING_CHANNEL_ANY == tmp_opr_ch) - opr_ch = csr_roam_get_ibss_start_channel_number24(pMac); - else - opr_ch = tmp_opr_ch; - break; + pParam->operationChn = opr_ch; } - pParam->operationChn = opr_ch; pParam->sirNwType = nw_type; pParam->ch_params.ch_width = pProfile->ch_params.ch_width; pParam->ch_params.center_freq_seg0 = |
