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:

committed by
Satish Singh

vanhempi
a9185266f0
commit
0809047cdf
@@ -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 */
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 =
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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)
|
||||||
|
Viittaa uudesa ongelmassa
Block a user