wlan: Update QOS capability of TDLS station/link with TL
Currently, the QOS capability of the TDLS link is updated
based on the BSS capability. Thus, if the BSS is not QOS
capable, the TDLS link eventually is not considered as QOS capable.
To address this, update the TDLS link with the TL with the
QOS capability based on the TDLS handshake between the peers.
The information of QOS is obtained to the driver through
the change_station callback from the supplicant and thus
the information is updated to the TL accordingly.
Also, this commit advertises that the station is QOS capable
by default in the TDLS setup request /response handshakes.
Conflicts:
CORE/HDD/src/wlan_hdd_cfg80211.c
CRs-Fixed: 776081
Change-Id: I6a36fd77b333e66e8c030f5230b4aaaee6d7a00c
diff --git a/CORE/HDD/inc/wlan_hdd_tdls.h b/CORE/HDD/inc/wlan_hdd_tdls.h
index d402d50..403b3b2 100644
--- a/CORE/HDD/inc/wlan_hdd_tdls.h
+++ b/CORE/HDD/inc/wlan_hdd_tdls.h
@@ -195,6 +195,7 @@
tANI_U16 tx_pkt;
tANI_U16 rx_pkt;
tANI_U8 uapsdQueues;
+ tANI_U8 qos;
tANI_U8 maxSp;
tANI_U8 isBufSta;
tANI_U8 isOffChannelSupported;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index c60b827..9de887c 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -14169,9 +14169,10 @@
VOS_STATUS status;
long ret;
tCsrTdlsLinkEstablishParams tdlsLinkEstablishParams;
+ WLAN_STADescType staDesc;
pTdlsPeer = wlan_hdd_tdls_find_peer(pAdapter, peer, TRUE);
-
+ memset(&staDesc, 0, sizeof(staDesc));
if ( NULL == pTdlsPeer ) {
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: " MAC_ADDRESS_STR
" (oper %d) not exsting. ignored",
@@ -14222,6 +14223,11 @@
wlan_hdd_tdls_set_peer_link_status(pTdlsPeer,
eTDLS_LINK_CONNECTED,
eTDLS_LINK_SUCCESS);
+ staDesc.ucSTAId = pTdlsPeer->staId;
+ staDesc.ucQosEnabled = tdlsLinkEstablishParams.qos;
+ WLANTL_UpdateTdlsSTAClient(pHddCtx->pvosContext,
+ &staDesc);
+
/* Mark TDLS client Authenticated .*/
status = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
pTdlsPeer->staId,
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 22eb036..b802c10 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -1207,6 +1207,7 @@
curr_peer->supported_oper_classes_len =
StaParams->supported_oper_classes_len;
+ curr_peer->qos = StaParams->capability & CAPABILITIES_QOS_OFFSET;
return 0;
}
@@ -1243,6 +1244,8 @@
tdlsLinkEstablishParams->supportedOperClassesLen =
curr_peer->supported_oper_classes_len;
+ tdlsLinkEstablishParams->qos = curr_peer->qos;
+
return 0;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index aaa0e66..88ff275 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -1323,6 +1323,7 @@
void *pPacket;
eHalStatus halstatus;
uint32 selfDot11Mode;
+ tpSirMacCapabilityInfo pCapInfo;
// Placeholder to support different channel bonding mode of TDLS than AP.
// Today, WNI_CFG_CHANNEL_BONDING_MODE will be overwritten when connecting to AP
// To support this feature, we need to introduce WNI_CFG_TDLS_CHANNEL_BONDING_MODE
@@ -1352,6 +1353,11 @@
limLog(pMac, LOGP,
FL("could not retrieve Capabilities value"));
}
+
+ pCapInfo = (tpSirMacCapabilityInfo) ∩︀
+ /* Export QOS capability */
+ pCapInfo->qos = 1;
+
swapBitField16(caps, ( tANI_U16* )&tdlsSetupReq.Capabilities );
/* populate supported rate IE */
@@ -1753,6 +1759,7 @@
void *pPacket;
eHalStatus halstatus;
uint32 selfDot11Mode;
+ tpSirMacCapabilityInfo pCapInfo;
// Placeholder to support different channel bonding mode of TDLS than AP.
// Today, WNI_CFG_CHANNEL_BONDING_MODE will be overwritten when connecting to AP
// To support this feature, we need to introduce WNI_CFG_TDLS_CHANNEL_BONDING_MODE
@@ -1785,6 +1792,11 @@
limLog(pMac, LOGP,
FL("could not retrieve Capabilities value"));
}
+
+ pCapInfo = (tpSirMacCapabilityInfo) ∩︀
+ /* Export QoS capability */
+ pCapInfo->qos = 1;
+
swapBitField16(caps, ( tANI_U16* )&tdlsSetupRsp.Capabilities );
/* ipopulate supported rate IE */
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 165ad30..43a3d30 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1391,6 +1391,7 @@
{
tSirMacAddr peerMac;
tANI_U8 uapsdQueues;
+ tANI_U8 qos;
tANI_U8 maxSp;
tANI_U8 isBufSta;
tANI_U8 isOffChannelSupported;
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index fc597e8..cbb2fa0 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -1151,6 +1151,48 @@
/*===========================================================================
+ FUNCTION WLANTL_UpdateTdlsSTAClient
+
+ DESCRIPTION
+
+ HDD will call this API when ENABLE_LINK happens and HDD want to
+ register QoS or other params for TDLS peers.
+
+ DEPENDENCIES
+
+ A station must have been registered before the WMM/QOS registration is
+ called.
+
+ PARAMETERS
+
+ pvosGCtx: pointer to the global vos context; a handle to TL's
+ control block can be extracted from its context
+ wSTADescType: STA Descriptor, contains information related to the
+ new added STA
+
+ RETURN VALUE
+
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_FAULT: Station ID is outside array boundaries or pointer to
+ TL cb is NULL ; access would cause a page fault
+ VOS_STATUS_E_EXISTS: Station was not registered
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ SIDE EFFECTS
+
+============================================================================*/
+
+VOS_STATUS
+WLANTL_UpdateTdlsSTAClient
+(
+ v_PVOID_t pvosGCtx,
+ WLAN_STADescType* wSTADescType
+);
+
+
+/*===========================================================================
+
FUNCTION WLANTL_ClearSTAClient
DESCRIPTION
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 36ba283..8b7247d 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -1688,6 +1688,75 @@
/*===========================================================================
+ FUNCTION WLANTL_UpdateTdlsSTAClient
+
+ DESCRIPTION
+
+ HDD will call this API when ENABLE_LINK happens and HDD want to
+ register QoS or other params for TDLS peers.
+
+ DEPENDENCIES
+
+ A station must have been registered before the WMM/QOS registration is
+ called.
+
+ PARAMETERS
+
+ pvosGCtx: pointer to the global vos context; a handle to TL's
+ control block can be extracted from its context
+ wSTADescType: STA Descriptor, contains information related to the
+ new added STA
+
+ RETURN VALUE
+
+ The result code associated with performing the operation
+
+ VOS_STATUS_E_FAULT: Station ID is outside array boundaries or pointer to
+ TL cb is NULL ; access would cause a page fault
+ VOS_STATUS_E_EXISTS: Station was not registered
+ VOS_STATUS_SUCCESS: Everything is good :)
+
+ SIDE EFFECTS
+
+============================================================================*/
+
+VOS_STATUS
+WLANTL_UpdateTdlsSTAClient
+(
+ v_PVOID_t pvosGCtx,
+ WLAN_STADescType* pwSTADescType
+)
+{
+ WLANTL_CbType* pTLCb = NULL;
+ WLANTL_STAClientType* pClientSTA = NULL;
+ /*------------------------------------------------------------------------
+ Extract TL control block
+ ------------------------------------------------------------------------*/
+ pTLCb = VOS_GET_TL_CB(pvosGCtx);
+ if ( NULL == pTLCb || ( WLAN_MAX_STA_COUNT <= pwSTADescType->ucSTAId))
+ {
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Invalid TL pointer from pvosGCtx on WLANTL_UpdateTdlsSTAClient"));
+ return VOS_STATUS_E_FAULT;
+ }
+
+ pClientSTA = pTLCb->atlSTAClients[pwSTADescType->ucSTAId];
+ if ((NULL == pClientSTA) || 0 == pClientSTA->ucExists)
+ {
+ TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+ "WLAN TL:Station not exists"));
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ pClientSTA->wSTADesc.ucQosEnabled = pwSTADescType->ucQosEnabled;
+
+ return VOS_STATUS_SUCCESS;
+
+}
+
+
+/*===========================================================================
+
FUNCTION WLANTL_STAPtkInstalled
DESCRIPTION