qcacld-3.0: Add new vendor command to get link properties

qcacld-2.0 to qcacld-3.0 propagation

Add support in driver for a new vendor command to get
the link properties nss, rate flags and operating
frequency.

Change-Id: Ie3b8d5b2c3886055d303441c5d8b2f2a0a2719bd
CRs-Fixed: 834199
This commit is contained in:
Kanchanapally, Vidyullatha
2015-05-22 17:28:57 +05:30
committed by Satish Singh
vanhempi a9185266f0
commit 0809047cdf
17 muutettua tiedostoa jossa 386 lisäystä ja 15 poistoa

Näytä tiedosto

@@ -108,6 +108,8 @@ typedef enum {
* @proxyARPService: proxy arp service * @proxyARPService: proxy arp service
* @ptk_installed: ptk installed state * @ptk_installed: ptk installed state
* @gtk_installed: gtk installed state * @gtk_installed: gtk installed state
* @nss: number of spatial streams negotiated
* @rate_flags: rate flags for current connection
*/ */
typedef struct connection_info_s { typedef struct connection_info_s {
eConnectionState connState; eConnectionState connState;
@@ -126,6 +128,8 @@ typedef struct connection_info_s {
uint8_t proxyARPService; uint8_t proxyARPService;
bool ptk_installed; bool ptk_installed;
bool gtk_installed; bool gtk_installed;
uint8_t nss;
uint32_t rate_flags;
} connection_info_t; } connection_info_t;
/* Forward declarations */ /* Forward declarations */

Näytä tiedosto

@@ -704,6 +704,12 @@ typedef struct {
/** The station entry for which Deauth is in progress */ /** The station entry for which Deauth is in progress */
bool isDeauthInProgress; bool isDeauthInProgress;
/** Number of spatial streams supported */
uint8_t nss;
/** Rate Flags for this connection */
uint32_t rate_flags;
} hdd_station_info_t; } hdd_station_info_t;
struct hdd_ap_ctx_s { struct hdd_ap_ctx_s {

Näytä tiedosto

@@ -388,6 +388,11 @@ hdd_conn_save_connect_info(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo,
pHddStaCtx->conn_info.proxyARPService = pHddStaCtx->conn_info.proxyARPService =
pRoamInfo->u.pConnectedProfile->proxyARPService; pRoamInfo->u.pConnectedProfile->proxyARPService;
pHddStaCtx->conn_info.nss = pRoamInfo->chan_info.nss;
pHddStaCtx->conn_info.rate_flags =
pRoamInfo->chan_info.rate_flags;
} }
} }
/* save the connected BssType */ /* save the connected BssType */

Näytä tiedosto

@@ -4250,6 +4250,197 @@ static int wlan_hdd_cfg80211_set_probable_oper_channel(struct wiphy *wiphy,
return ret; return ret;
} }
static const struct
nla_policy
qca_wlan_vendor_attr_policy[QCA_WLAN_VENDOR_ATTR_MAX+1] = {
[QCA_WLAN_VENDOR_ATTR_MAC_ADDR] = { .type = NLA_UNSPEC },
};
/**
* __wlan_hdd_cfg80211_get_link_properties() - Get link properties
* @wiphy: WIPHY structure pointer
* @wdev: Wireless device structure pointer
* @data: Pointer to the data received
* @data_len: Length of the data received
*
* This function is used to get link properties like nss, rate flags and
* operating frequency for the active connection with the given peer.
*
* Return: 0 on success and errno on failure
*/
static int __wlan_hdd_cfg80211_get_link_properties(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len)
{
hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
struct net_device *dev = wdev->netdev;
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_station_ctx_t *hdd_sta_ctx;
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX+1];
uint8_t peer_mac[CDF_MAC_ADDR_SIZE];
uint32_t sta_id;
struct sk_buff *reply_skb;
uint32_t rate_flags = 0;
uint8_t nss;
uint8_t final_rate_flags = 0;
uint32_t freq;
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
if (0 != wlan_hdd_validate_context(hdd_ctx))
return -EINVAL;
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len,
qca_wlan_vendor_attr_policy)) {
hddLog(CDF_TRACE_LEVEL_ERROR, FL("Invalid attribute"));
return -EINVAL;
}
if (!tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]) {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("Attribute peerMac not provided for mode=%d"),
adapter->device_mode);
return -EINVAL;
}
cdf_mem_copy(peer_mac, nla_data(tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]),
CDF_MAC_ADDR_SIZE);
hddLog(CDF_TRACE_LEVEL_INFO,
FL("peerMac="MAC_ADDRESS_STR" for device_mode:%d"),
MAC_ADDR_ARRAY(peer_mac), adapter->device_mode);
if (adapter->device_mode == WLAN_HDD_INFRA_STATION ||
adapter->device_mode == WLAN_HDD_P2P_CLIENT) {
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
if ((hdd_sta_ctx->conn_info.connState !=
eConnectionState_Associated) ||
!cdf_mem_compare(hdd_sta_ctx->conn_info.bssId.bytes,
peer_mac, CDF_MAC_ADDR_SIZE)) {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("Not Associated to mac "MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(peer_mac));
return -EINVAL;
}
nss = hdd_sta_ctx->conn_info.nss;
freq = cds_chan_to_freq(
hdd_sta_ctx->conn_info.operationChannel);
rate_flags = hdd_sta_ctx->conn_info.rate_flags;
} else if (adapter->device_mode == WLAN_HDD_P2P_GO ||
adapter->device_mode == WLAN_HDD_SOFTAP) {
for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) {
if (adapter->aStaInfo[sta_id].isUsed &&
!cdf_is_macaddr_broadcast(
&adapter->aStaInfo[sta_id].macAddrSTA) &&
cdf_mem_compare(
&adapter->aStaInfo[sta_id].macAddrSTA.bytes,
peer_mac, CDF_MAC_ADDR_SIZE))
break;
}
if (WLAN_MAX_STA_COUNT == sta_id) {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("No active peer with mac="MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(peer_mac));
return -EINVAL;
}
nss = adapter->aStaInfo[sta_id].nss;
freq = cds_chan_to_freq(
(WLAN_HDD_GET_AP_CTX_PTR(adapter))->operatingChannel);
rate_flags = adapter->aStaInfo[sta_id].rate_flags;
} else {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("Not Associated! with mac "MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(peer_mac));
return -EINVAL;
}
if (!(rate_flags & eHAL_TX_RATE_LEGACY)) {
if (rate_flags & eHAL_TX_RATE_VHT80) {
final_rate_flags |= RATE_INFO_FLAGS_VHT_MCS;
final_rate_flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
} else if (rate_flags & eHAL_TX_RATE_VHT40) {
final_rate_flags |= RATE_INFO_FLAGS_VHT_MCS;
final_rate_flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
} else if (rate_flags & eHAL_TX_RATE_VHT20) {
final_rate_flags |= RATE_INFO_FLAGS_VHT_MCS;
} else if (rate_flags &
(eHAL_TX_RATE_HT20 | eHAL_TX_RATE_HT40)) {
final_rate_flags |= RATE_INFO_FLAGS_MCS;
if (rate_flags & eHAL_TX_RATE_HT40)
final_rate_flags |=
RATE_INFO_FLAGS_40_MHZ_WIDTH;
}
if (rate_flags & eHAL_TX_RATE_SGI) {
if (!(final_rate_flags & RATE_INFO_FLAGS_VHT_MCS))
final_rate_flags |= RATE_INFO_FLAGS_MCS;
final_rate_flags |= RATE_INFO_FLAGS_SHORT_GI;
}
}
reply_skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
sizeof(u8) + sizeof(u8) + sizeof(u32) + NLMSG_HDRLEN);
if (NULL == reply_skb) {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("getLinkProperties: skb alloc failed"));
return -EINVAL;
}
if (nla_put_u8(reply_skb,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_NSS,
nss) ||
nla_put_u8(reply_skb,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS,
final_rate_flags) ||
nla_put_u32(reply_skb,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ,
freq)) {
hddLog(CDF_TRACE_LEVEL_ERROR, FL("nla_put failed"));
kfree_skb(reply_skb);
return -EINVAL;
}
return cfg80211_vendor_cmd_reply(reply_skb);
}
/**
* wlan_hdd_cfg80211_get_link_properties() - Wrapper function to get link
* properties.
* @wiphy: WIPHY structure pointer
* @wdev: Wireless device structure pointer
* @data: Pointer to the data received
* @data_len: Length of the data received
*
* This function is used to get link properties like nss, rate flags and
* operating frequency for the active connection with the given peer.
*
* Return: 0 on success and errno on failure
*/
static int wlan_hdd_cfg80211_get_link_properties(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len)
{
int ret = 0;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_get_link_properties(wiphy,
wdev, data, data_len);
cds_ssr_unprotect(__func__);
return ret;
}
const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
{ {
.info.vendor_id = QCA_NL80211_VENDOR_ID, .info.vendor_id = QCA_NL80211_VENDOR_ID,
@@ -4663,6 +4854,14 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
WIPHY_VENDOR_CMD_NEED_RUNNING, WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_dcc_update_ndl .doit = wlan_hdd_cfg80211_dcc_update_ndl
}, },
{
.info.vendor_id = QCA_NL80211_VENDOR_ID,
.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES,
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
WIPHY_VENDOR_CMD_NEED_NETDEV |
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_get_link_properties
},
}; };
/* /*

Näytä tiedosto

@@ -245,6 +245,7 @@ typedef enum {
* @QCA_NL80211_VENDOR_SUBCMD_SET_WIFI_CONFIGURATION: set wifi config * @QCA_NL80211_VENDOR_SUBCMD_SET_WIFI_CONFIGURATION: set wifi config
* @QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION: get wifi config * @QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION: get wifi config
* @QCA_NL80211_VENDOR_SUBCMD_GET_LOGGER_FEATURE_SET: get logging features * @QCA_NL80211_VENDOR_SUBCMD_GET_LOGGER_FEATURE_SET: get logging features
* @QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES: get link properties
* @QCA_NL80211_VENDOR_SUBCMD_TRIGGER_SCAN: venodr scan command * @QCA_NL80211_VENDOR_SUBCMD_TRIGGER_SCAN: venodr scan command
* @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE: vendor scan complete * @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE: vendor scan complete
*/ */
@@ -346,6 +347,9 @@ enum qca_nl80211_vendor_subcmds {
QCA_NL80211_VENDOR_SUBCMD_DCC_UPDATE_NDL = 99, QCA_NL80211_VENDOR_SUBCMD_DCC_UPDATE_NDL = 99,
QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT = 100, QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT = 100,
/* subcommand to get link properties */
QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES = 101,
/* DBS subcommands */ /* DBS subcommands */
QCA_NL80211_VENDOR_SUBCMD_GET_PREFERRED_FREQ_LIST = 103, QCA_NL80211_VENDOR_SUBCMD_GET_PREFERRED_FREQ_LIST = 103,
QCA_NL80211_VENDOR_SUBCMD_SET_PROBABLE_OPER_CHANNEL = 104, QCA_NL80211_VENDOR_SUBCMD_SET_PROBABLE_OPER_CHANNEL = 104,
@@ -604,6 +608,8 @@ enum qca_wlan_vendor_attr_get_tdls_capabilities {
* @QCA_WLAN_VENDOR_ATTR_STATS_EXT: Ext stats attribute which is used by * @QCA_WLAN_VENDOR_ATTR_STATS_EXT: Ext stats attribute which is used by
* QCA_NL80211_VENDOR_SUBCMD_STATS_EXT * QCA_NL80211_VENDOR_SUBCMD_STATS_EXT
* @QCA_WLAN_VENDOR_ATTR_IFINDEX: After IFINDEX * @QCA_WLAN_VENDOR_ATTR_IFINDEX: After IFINDEX
* @QCA_WLAN_VENDOR_ATTR_MAC_ADDR: MAC Address attribute which is used by
* QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES
* @QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS: Supported Features * @QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS: Supported Features
* @QCA_WLAN_VENDOR_ATTR_AFTER_LAST: After last * @QCA_WLAN_VENDOR_ATTR_AFTER_LAST: After last
* @QCA_WLAN_VENDOR_ATTR_MAX: Max value * @QCA_WLAN_VENDOR_ATTR_MAX: Max value
@@ -614,6 +620,7 @@ enum qca_wlan_vendor_attr {
QCA_WLAN_VENDOR_ATTR_NAN = 2, QCA_WLAN_VENDOR_ATTR_NAN = 2,
QCA_WLAN_VENDOR_ATTR_STATS_EXT = 3, QCA_WLAN_VENDOR_ATTR_STATS_EXT = 3,
QCA_WLAN_VENDOR_ATTR_IFINDEX = 4, QCA_WLAN_VENDOR_ATTR_IFINDEX = 4,
QCA_WLAN_VENDOR_ATTR_MAC_ADDR = 6,
QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS = 7, QCA_WLAN_VENDOR_ATTR_FEATURE_FLAGS = 7,
QCA_WLAN_VENDOR_ATTR_CONCURRENCY_CAPA = 9, QCA_WLAN_VENDOR_ATTR_CONCURRENCY_CAPA = 9,
QCA_WLAN_VENDOR_ATTR_MAX_CONCURRENT_CHANNELS_2_4_BAND = 10, QCA_WLAN_VENDOR_ATTR_MAX_CONCURRENT_CHANNELS_2_4_BAND = 10,
@@ -1804,6 +1811,31 @@ enum qca_wlan_vendor_attr_get_logger_features {
QCA_WLAN_VENDOR_ATTR_LOGGER_AFTER_LAST - 1, QCA_WLAN_VENDOR_ATTR_LOGGER_AFTER_LAST - 1,
}; };
/**
* enum qca_wlan_vendor_attr_link_properties - link properties
*
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_INVALID: Invalid initial value
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_NSS: Unsigned 8-bit value to
* specify the number of spatial streams negotiated
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS: Unsigned 8-bit value
* to specify negotiated rate flags i.e. ht, vht and channel width
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ: Unsigned 32bit value to
* specify the operating frequency
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST: after last
* @QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAX: max value
*/
enum qca_wlan_vendor_attr_link_properties {
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_INVALID = 0,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_NSS = 1,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_RATE_FLAGS = 2,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_FREQ = 3,
/* KEEP LAST */
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_MAX =
QCA_WLAN_VENDOR_ATTR_LINK_PROPERTIES_AFTER_LAST - 1,
};
/** /**
* enum qca_wlan_vendor_features - vendor device/driver features * enum qca_wlan_vendor_features - vendor device/driver features
* @QCA_WLAN_VENDOR_FEATURE_KEY_MGMT_OFFLOAD: Device supports key * @QCA_WLAN_VENDOR_FEATURE_KEY_MGMT_OFFLOAD: Device supports key

Näytä tiedosto

@@ -1232,6 +1232,19 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
MAC_ADDR_ARRAY(wrqu.addr.sa_data)); MAC_ADDR_ARRAY(wrqu.addr.sa_data));
} }
staId =
pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staId;
if (CDF_IS_STATUS_SUCCESS(cdf_status)) {
pHostapdAdapter->aStaInfo[staId].nss =
pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.
chan_info.nss;
pHostapdAdapter->aStaInfo[staId].rate_flags =
pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.
chan_info.rate_flags;
}
if (hdd_ipa_is_enabled(pHddCtx)) { if (hdd_ipa_is_enabled(pHddCtx)) {
status = hdd_ipa_wlan_evt(pHostapdAdapter, status = hdd_ipa_wlan_evt(pHostapdAdapter,
pSapEvent->sapevt. pSapEvent->sapevt.

Näytä tiedosto

@@ -1034,6 +1034,9 @@ typedef struct sSirSmeJoinRsp {
bool tdls_prohibited; bool tdls_prohibited;
bool tdls_chan_swit_prohibited; bool tdls_chan_swit_prohibited;
#endif #endif
uint8_t nss;
uint32_t max_rate_flags;
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
tSirSmeHTProfile HTProfile; tSirSmeHTProfile HTProfile;
#endif #endif
@@ -1057,7 +1060,10 @@ typedef struct sSirSmeChanInfo {
uint32_t info; uint32_t info;
uint32_t reg_info_1; uint32_t reg_info_1;
uint32_t reg_info_2; uint32_t reg_info_2;
uint8_t nss;
uint32_t rate_flags;
} tSirSmeChanInfo, *tpSirSmeChanInfo; } tSirSmeChanInfo, *tpSirSmeChanInfo;
/* / Definition for Association indication from peer */ /* / Definition for Association indication from peer */
/* / MAC ---> */ /* / MAC ---> */
typedef struct sSirSmeAssocInd { typedef struct sSirSmeAssocInd {

Näytä tiedosto

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* *
* Previously licensed under the ISC license by Qualcomm Atheros, Inc. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -238,6 +238,8 @@ typedef struct sDphHashNode {
/* key installed for this STA or not in the firmware */ /* key installed for this STA or not in the firmware */
uint8_t is_key_installed; uint8_t is_key_installed;
uint8_t is_disassoc_deauth_in_progress; uint8_t is_disassoc_deauth_in_progress;
uint8_t nss;
/* /*
* When a station with already an existing dph entry tries to * When a station with already an existing dph entry tries to
* associate again, the old dph entry will be zeroed out except * associate again, the old dph entry will be zeroed out except

Näytä tiedosto

@@ -1929,6 +1929,9 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx,
(session_entry->maxTxPower << 16); (session_entry->maxTxPower << 16);
assoc_ind->chan_info.reg_info_2 = assoc_ind->chan_info.reg_info_2 =
(session_entry->maxTxPower << 8); (session_entry->maxTxPower << 8);
assoc_ind->chan_info.nss = sta_ds->nss;
assoc_ind->chan_info.rate_flags =
lim_get_max_rate_flags(mac_ctx, sta_ds);
/* updates VHT information in assoc indication */ /* updates VHT information in assoc indication */
lim_fill_assoc_ind_vht_info(mac_ctx, session_entry, assoc_req, lim_fill_assoc_ind_vht_info(mac_ctx, session_entry, assoc_req,
assoc_ind); assoc_ind);

Näytä tiedosto

@@ -61,6 +61,7 @@ extern tSirRetStatus sch_beacon_edca_process(tpAniSirGlobal pMac,
* @mac_ctx: Pointer to Global MAC structure * @mac_ctx: Pointer to Global MAC structure
* @sta_ds: Station Descriptor in DPH * @sta_ds: Station Descriptor in DPH
* @assoc_rsp: Pointer to Association Response Structure * @assoc_rsp: Pointer to Association Response Structure
* @session_entry : PE session Entry
* *
* This function is called to Update the HT capabilities in * This function is called to Update the HT capabilities in
* Station Descriptor (dph) Details from * Station Descriptor (dph) Details from
@@ -69,20 +70,27 @@ extern tSirRetStatus sch_beacon_edca_process(tpAniSirGlobal pMac,
* Return: None * Return: None
*/ */
static void lim_update_stads_htcap(tpAniSirGlobal mac_ctx, static void lim_update_stads_htcap(tpAniSirGlobal mac_ctx,
tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp) tpDphHashNode sta_ds, tpSirAssocRsp assoc_rsp,
tpPESession session_entry)
{ {
uint16_t highest_rxrate = 0; uint16_t highest_rxrate = 0;
tDot11fIEHTCaps *ht_caps; tDot11fIEHTCaps *ht_caps;
uint32_t shortgi_20mhz_support;
uint32_t shortgi_40mhz_support;
ht_caps = &assoc_rsp->HTCaps; ht_caps = &assoc_rsp->HTCaps;
sta_ds->mlmStaContext.htCapability = assoc_rsp->HTCaps.present; sta_ds->mlmStaContext.htCapability = assoc_rsp->HTCaps.present;
if (assoc_rsp->HTCaps.present) { if (assoc_rsp->HTCaps.present) {
sta_ds->htGreenfield = sta_ds->htGreenfield =
(uint8_t) ht_caps->greenField; (uint8_t) ht_caps->greenField;
sta_ds->htSupportedChannelWidthSet = if (session_entry->htSupportedChannelWidthSet) {
(uint8_t) (ht_caps->supportedChannelWidthSet ? sta_ds->htSupportedChannelWidthSet =
assoc_rsp->HTInfo.recommendedTxWidthSet : (uint8_t) (ht_caps->supportedChannelWidthSet ?
ht_caps->supportedChannelWidthSet); assoc_rsp->HTInfo.recommendedTxWidthSet :
ht_caps->supportedChannelWidthSet);
} else
sta_ds->htSupportedChannelWidthSet =
eHT_CHANNEL_WIDTH_20MHZ;
sta_ds->htLsigTXOPProtection = sta_ds->htLsigTXOPProtection =
(uint8_t) ht_caps->lsigTXOPProtection; (uint8_t) ht_caps->lsigTXOPProtection;
sta_ds->htMIMOPSState = sta_ds->htMIMOPSState =
@@ -92,10 +100,6 @@ static void lim_update_stads_htcap(tpAniSirGlobal mac_ctx,
sta_ds->htAMpduDensity = ht_caps->mpduDensity; sta_ds->htAMpduDensity = ht_caps->mpduDensity;
sta_ds->htDsssCckRate40MHzSupport = sta_ds->htDsssCckRate40MHzSupport =
(uint8_t) ht_caps->dsssCckMode40MHz; (uint8_t) ht_caps->dsssCckMode40MHz;
sta_ds->htShortGI20Mhz =
(uint8_t) ht_caps->shortGI20MHz;
sta_ds->htShortGI40Mhz =
(uint8_t) ht_caps->shortGI40MHz;
sta_ds->htMaxRxAMpduFactor = sta_ds->htMaxRxAMpduFactor =
ht_caps->maxRxAMPDUFactor; ht_caps->maxRxAMPDUFactor;
lim_fill_rx_highest_supported_rate(mac_ctx, &highest_rxrate, lim_fill_rx_highest_supported_rate(mac_ctx, &highest_rxrate,
@@ -115,6 +119,39 @@ static void lim_update_stads_htcap(tpAniSirGlobal mac_ctx,
* For now, it is IMMEDIATE BA only on ALL TID's * For now, it is IMMEDIATE BA only on ALL TID's
*/ */
sta_ds->baPolicyFlag = 0xFF; sta_ds->baPolicyFlag = 0xFF;
/* Check if we have support for gShortGI20Mhz and
* gShortGI40Mhz from ini file
*/
if (eSIR_SUCCESS == wlan_cfg_get_int(mac_ctx,
WNI_CFG_SHORT_GI_20MHZ,
&shortgi_20mhz_support)) {
if (true == shortgi_20mhz_support)
sta_ds->htShortGI20Mhz =
(uint8_t)assoc_rsp->HTCaps.shortGI20MHz;
else
sta_ds->htShortGI20Mhz = false;
} else {
lim_log(mac_ctx, LOGE,
FL("could not retrieve shortGI 20Mhz CFG, setting value to default"));
sta_ds->htShortGI20Mhz =
WNI_CFG_SHORT_GI_20MHZ_STADEF;
}
if (eSIR_SUCCESS == wlan_cfg_get_int(mac_ctx,
WNI_CFG_SHORT_GI_40MHZ,
&shortgi_40mhz_support)) {
if (true == shortgi_40mhz_support)
sta_ds->htShortGI40Mhz =
(uint8_t)assoc_rsp->HTCaps.shortGI40MHz;
else
sta_ds->htShortGI40Mhz = false;
} else {
lim_log(mac_ctx, LOGE,
FL("could not retrieve shortGI 40Mhz CFG,setting value to default"));
sta_ds->htShortGI40Mhz =
WNI_CFG_SHORT_GI_40MHZ_STADEF;
}
} }
} }
@@ -150,7 +187,8 @@ void lim_update_assoc_sta_datas(tpAniSirGlobal mac_ctx,
/* Update HT Capabilites only when the self mode supports HT */ /* Update HT Capabilites only when the self mode supports HT */
if (IS_DOT11_MODE_HT(session_entry->dot11mode)) if (IS_DOT11_MODE_HT(session_entry->dot11mode))
lim_update_stads_htcap(mac_ctx, sta_ds, assoc_rsp); lim_update_stads_htcap(mac_ctx, sta_ds, assoc_rsp,
session_entry);
#ifdef WLAN_FEATURE_11AC #ifdef WLAN_FEATURE_11AC
if (assoc_rsp->VHTCaps.present) if (assoc_rsp->VHTCaps.present)

Näytä tiedosto

@@ -1762,9 +1762,11 @@ void lim_process_sta_mlm_add_sta_rsp(tpAniSirGlobal mac_ctx,
sta_ds = sta_ds =
dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER, dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER,
&session_entry->dph.dphHashTable); &session_entry->dph.dphHashTable);
if (NULL != sta_ds) if (NULL != sta_ds) {
sta_ds->mlmStaContext.mlmState = sta_ds->mlmStaContext.mlmState =
eLIM_MLM_LINK_ESTABLISHED_STATE; eLIM_MLM_LINK_ESTABLISHED_STATE;
sta_ds->nss = add_sta_params->nss;
}
else else
lim_log(mac_ctx, LOGW, lim_log(mac_ctx, LOGW,
FL("Fail to get DPH Hash Entry for AID - %d"), FL("Fail to get DPH Hash Entry for AID - %d"),
@@ -2258,6 +2260,7 @@ void lim_process_ap_mlm_add_sta_rsp(tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,
} }
pStaDs->bssId = pAddStaParams->bssIdx; pStaDs->bssId = pAddStaParams->bssIdx;
pStaDs->staIndex = pAddStaParams->staIdx; pStaDs->staIndex = pAddStaParams->staIdx;
pStaDs->nss = pAddStaParams->nss;
/* if the AssocRsp frame is not acknowledged, then keep alive timer will take care of the state */ /* if the AssocRsp frame is not acknowledged, then keep alive timer will take care of the state */
pStaDs->valid = 1; pStaDs->valid = 1;
pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_ASSOC_CNF_STATE; pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_ASSOC_CNF_STATE;

Näytä tiedosto

@@ -167,6 +167,55 @@ lim_send_sme_roc_rsp(tpAniSirGlobal mac_ctx, uint16_t msg_type,
} }
/**
* lim_get_max_rate_flags() - Get rate flags
* @mac_ctx: Pointer to global MAC structure
* @sta_ds: Pointer to station ds structure
*
* This function is called to get the rate flags for a connection
* from the station ds structure depending on the ht and the vht
* channel width supported.
*
* Return: Returns the populated rate_flags
*/
uint32_t lim_get_max_rate_flags(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds)
{
uint32_t rate_flags = 0;
if (sta_ds == NULL) {
lim_log(mac_ctx, LOGE, FL("sta_ds is NULL"));
return rate_flags;
}
if (!sta_ds->mlmStaContext.htCapability &&
!sta_ds->mlmStaContext.vhtCapability) {
rate_flags |= eHAL_TX_RATE_LEGACY;
} else {
if (sta_ds->mlmStaContext.vhtCapability) {
if (WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ ==
sta_ds->vhtSupportedChannelWidthSet) {
rate_flags |= eHAL_TX_RATE_VHT80;
} else if (WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ ==
sta_ds->vhtSupportedChannelWidthSet) {
if (sta_ds->htSupportedChannelWidthSet)
rate_flags |= eHAL_TX_RATE_VHT40;
else
rate_flags |= eHAL_TX_RATE_VHT20;
}
} else if (sta_ds->mlmStaContext.htCapability) {
if (sta_ds->htSupportedChannelWidthSet)
rate_flags |= eHAL_TX_RATE_HT40;
else
rate_flags |= eHAL_TX_RATE_HT20;
}
}
if (sta_ds->htShortGI20Mhz || sta_ds->htShortGI40Mhz)
rate_flags |= eHAL_TX_RATE_SGI;
return rate_flags;
}
/** /**
* lim_send_sme_join_reassoc_rsp_after_resume() - Send Response to SME * lim_send_sme_join_reassoc_rsp_after_resume() - Send Response to SME
* @mac_ctx Pointer to Global MAC structure * @mac_ctx Pointer to Global MAC structure
@@ -430,6 +479,9 @@ lim_send_sme_join_reassoc_rsp(tpAniSirGlobal mac_ctx, uint16_t msg_type,
sme_join_rsp->tdls_chan_swit_prohibited = sme_join_rsp->tdls_chan_swit_prohibited =
session_entry->tdls_chan_swit_prohibited; session_entry->tdls_chan_swit_prohibited;
#endif #endif
sme_join_rsp->nss = sta_ds->nss;
sme_join_rsp->max_rate_flags =
lim_get_max_rate_flags(mac_ctx, sta_ds);
} }
} }
sme_join_rsp->beaconLength = 0; sme_join_rsp->beaconLength = 0;

Näytä tiedosto

@@ -444,6 +444,7 @@ uint8_t lim_build_p2p_ie(tpAniSirGlobal pMac, uint8_t *ie, uint8_t *data,
bool lim_is_noa_insert_reqd(tpAniSirGlobal pMac); bool lim_is_noa_insert_reqd(tpAniSirGlobal pMac);
bool lim_isconnected_on_dfs_channel(uint8_t currentChannel); bool lim_isconnected_on_dfs_channel(uint8_t currentChannel);
uint8_t lim_get_current_operating_channel(tpAniSirGlobal pMac); uint8_t lim_get_current_operating_channel(tpAniSirGlobal pMac);
uint32_t lim_get_max_rate_flags(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds);
#ifdef WLAN_FEATURE_11AC #ifdef WLAN_FEATURE_11AC
bool lim_check_vht_op_mode_change(tpAniSirGlobal pMac, bool lim_check_vht_op_mode_change(tpAniSirGlobal pMac,

Näytä tiedosto

@@ -2665,6 +2665,8 @@ CDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
csr_roaminfo->chan_info.reg_info_1; csr_roaminfo->chan_info.reg_info_1;
chaninfo->reg_info_2 = chaninfo->reg_info_2 =
csr_roaminfo->chan_info.reg_info_2; csr_roaminfo->chan_info.reg_info_2;
chaninfo->nss = csr_roaminfo->chan_info.nss;
chaninfo->rate_flags = csr_roaminfo->chan_info.rate_flags;
reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta; reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta;
reassoc_complete->status = (eSapStatus) context; reassoc_complete->status = (eSapStatus) context;

Näytä tiedosto

@@ -6398,6 +6398,9 @@ static void csr_roam_process_join_res(tpAniSirGlobal mac_ctx,
roam_info.ucastSig = (uint8_t) join_rsp->ucastSig; roam_info.ucastSig = (uint8_t) join_rsp->ucastSig;
roam_info.bcastSig = (uint8_t) join_rsp->bcastSig; roam_info.bcastSig = (uint8_t) join_rsp->bcastSig;
roam_info.timingMeasCap = join_rsp->timingMeasCap; roam_info.timingMeasCap = join_rsp->timingMeasCap;
roam_info.chan_info.nss = join_rsp->nss;
roam_info.chan_info.rate_flags =
join_rsp->max_rate_flags;
#ifdef FEATURE_WLAN_TDLS #ifdef FEATURE_WLAN_TDLS
roam_info.tdls_prohibited = join_rsp->tdls_prohibited; roam_info.tdls_prohibited = join_rsp->tdls_prohibited;
roam_info.tdls_chan_swit_prohibited = roam_info.tdls_chan_swit_prohibited =

Näytä tiedosto

@@ -224,6 +224,7 @@ typedef struct sAniProbeRspStruct {
* @maxTxPower: max tx power * @maxTxPower: max tx power
* @atimIePresent: Peer Atim Info * @atimIePresent: Peer Atim Info
* @peerAtimWindowLength: peer ATIM Window length * @peerAtimWindowLength: peer ATIM Window length
* @nss: Return the number of spatial streams supported
* *
* This structure contains parameter required for * This structure contains parameter required for
* add sta request of upper layer. * add sta request of upper layer.
@@ -320,6 +321,7 @@ typedef struct {
uint8_t atimIePresent; uint8_t atimIePresent;
uint32_t peerAtimWindowLength; uint32_t peerAtimWindowLength;
uint8_t nonRoamReassoc; uint8_t nonRoamReassoc;
uint32_t nss;
} tAddStaParams, *tpAddStaParams; } tAddStaParams, *tpAddStaParams;
/** /**

Näytä tiedosto

@@ -3502,9 +3502,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
uint8_t peer_id; uint8_t peer_id;
CDF_STATUS status; CDF_STATUS status;
int32_t ret; int32_t ret;
#ifdef WLAN_FEATURE_11W
struct wma_txrx_node *iface = NULL; struct wma_txrx_node *iface = NULL;
#endif /* WLAN_FEATURE_11W */
struct wma_target_req *msg; struct wma_target_req *msg;
bool peer_assoc_cnf = false; bool peer_assoc_cnf = false;
@@ -3535,6 +3533,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
goto send_rsp; goto send_rsp;
} }
iface = &wma->interfaces[vdev->vdev_id];
peer = ol_txrx_find_peer_by_addr_and_vdev(pdev, peer = ol_txrx_find_peer_by_addr_and_vdev(pdev,
vdev, vdev,
add_sta->staMac, &peer_id); add_sta->staMac, &peer_id);
@@ -3633,7 +3632,6 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
* per STA for SAP case * per STA for SAP case
* We will isolate the ifaces based on vdevid * We will isolate the ifaces based on vdevid
*/ */
iface = &wma->interfaces[vdev->vdev_id];
iface->rmfEnabled = add_sta->rmfEnabled; iface->rmfEnabled = add_sta->rmfEnabled;
/* /*
* when 802.11w PMF is enabled for hw encr/decr * when 802.11w PMF is enabled for hw encr/decr
@@ -3669,6 +3667,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
ol_txrx_peer_state_update(pdev, add_sta->staMac, state); ol_txrx_peer_state_update(pdev, add_sta->staMac, state);
add_sta->staIdx = ol_txrx_local_peer_id(peer); add_sta->staIdx = ol_txrx_local_peer_id(peer);
add_sta->nss = iface->nss;
add_sta->status = CDF_STATUS_SUCCESS; add_sta->status = CDF_STATUS_SUCCESS;
send_rsp: send_rsp:
/* Do not send add stat resp when peer assoc cnf is enabled */ /* Do not send add stat resp when peer assoc cnf is enabled */
@@ -4042,6 +4041,7 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
wma_set_ppsconfig(params->smesessionId, wma_set_ppsconfig(params->smesessionId,
WMA_VHT_PPS_DELIM_CRC_FAIL, 1); WMA_VHT_PPS_DELIM_CRC_FAIL, 1);
iface->aid = params->assocId; iface->aid = params->assocId;
params->nss = iface->nss;
out: out:
/* Do not send add stat resp when peer assoc cnf is enabled */ /* Do not send add stat resp when peer assoc cnf is enabled */
if (peer_assoc_cnf) if (peer_assoc_cnf)