Sfoglia il codice sorgente

qcacld-3.0: Send TDLS Teardown with proper AC

This is qcacld-2.0 to qcacld-3.0 propagation.

Transmit TDLS Teardown frame with VI AC on direct link
if tdls peer supports qos.

CRs-Fixed: 885035
Change-Id: I02cfd29ea1619b12b2ccb130aa7374e19b4f8491
Pradeep Reddy POTTETI 8 anni fa
parent
commit
983107dafb
1 ha cambiato i file con 29 aggiunte e 6 eliminazioni
  1. 29 6
      core/mac/src/pe/lim/lim_process_tdls.c

+ 29 - 6
core/mac/src/pe/lim/lim_process_tdls.c

@@ -252,6 +252,9 @@ static uint32_t lim_prepare_tdls_frame_header(tpAniSirGlobal pMac, uint8_t *pFra
 			   ? link_iden->RespStaAddr : link_iden->InitStaAddr;
 	uint8_t *staMac = (reqType == TDLS_INITIATOR)
 			  ? link_iden->InitStaAddr : link_iden->RespStaAddr;
+	tpDphHashNode sta_ds;
+	uint16_t aid = 0;
+	uint8_t qos_mode = 0;
 
 	pMacHdr = (tpSirMacDataHdr3a) (pFrame);
 
@@ -268,9 +271,17 @@ static uint32_t lim_prepare_tdls_frame_header(tpAniSirGlobal pMac, uint8_t *pFra
 	 */
 	pMacHdr->fc.protVer = SIR_MAC_PROTOCOL_VERSION;
 	pMacHdr->fc.type = SIR_MAC_DATA_FRAME;
+
+	sta_ds = dph_lookup_hash_entry(pMac, peerMac, &aid,
+					&psessionEntry->dph.dphHashTable);
+	if (sta_ds)
+		qos_mode = sta_ds->qosMode;
+
 	pMacHdr->fc.subType =
-		IS_QOS_ENABLED(psessionEntry) ? SIR_MAC_DATA_QOS_DATA :
-		SIR_MAC_DATA_DATA;
+		((IS_QOS_ENABLED(psessionEntry) &&
+		(tdlsLinkType == TDLS_LINK_AP)) ||
+		((tdlsLinkType == TDLS_LINK_DIRECT) && qos_mode))
+		? SIR_MAC_DATA_QOS_DATA : SIR_MAC_DATA_DATA;
 
 	/*
 	 * TL is not setting up below fields, so we are doing it here
@@ -298,7 +309,7 @@ static uint32_t lim_prepare_tdls_frame_header(tpAniSirGlobal pMac, uint8_t *pFra
 		MAC_ADDR_ARRAY(pMacHdr->addr2),
 		MAC_ADDR_ARRAY(pMacHdr->addr3));
 
-	if (IS_QOS_ENABLED(psessionEntry)) {
+	if (pMacHdr->fc.subType == SIR_MAC_DATA_QOS_DATA) {
 		pMacHdr->qosControl.tid = tid;
 		header_offset += sizeof(tSirMacDataHdr3a);
 	} else
@@ -1274,6 +1285,10 @@ tSirRetStatus lim_send_tdls_teardown_frame(tpAniSirGlobal pMac,
 	uint32_t padLen = 0;
 #endif
 	uint8_t smeSessionId = 0;
+	tpDphHashNode sta_ds;
+	uint16_t aid = 0;
+	uint8_t qos_mode = 0;
+	uint8_t tdls_link_type;
 
 	if (NULL == psessionEntry) {
 		lim_log(pMac, LOGE, FL("psessionEntry is NULL"));
@@ -1320,8 +1335,15 @@ tSirRetStatus lim_send_tdls_teardown_frame(tpAniSirGlobal pMac,
 	 * 89-0d.
 	 * 8 bytes of RFC 1042 header
 	 */
-
-	nBytes = nPayload + ((IS_QOS_ENABLED(psessionEntry))
+	sta_ds = dph_lookup_hash_entry(pMac, psessionEntry->bssId, &aid,
+					&psessionEntry->dph.dphHashTable);
+	if (sta_ds)
+		qos_mode = sta_ds->qosMode;
+	tdls_link_type = (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE)
+				? TDLS_LINK_AP : TDLS_LINK_DIRECT;
+	nBytes = nPayload + (((IS_QOS_ENABLED(psessionEntry) &&
+			     (tdls_link_type == TDLS_LINK_AP)) ||
+			     ((tdls_link_type == TDLS_LINK_DIRECT) && qos_mode))
 			     ? sizeof(tSirMacDataHdr3a) :
 			     sizeof(tSirMacMgmtHdr))
 		 + sizeof(eth_890d_header)
@@ -2461,7 +2483,8 @@ static void lim_tdls_update_hash_node_info(tpAniSirGlobal pMac,
 	pSessStaDs = dph_lookup_hash_entry(pMac, psessionEntry->bssId, &aid,
 					   &psessionEntry->dph.dphHashTable);
 	/* Lets enable QOS parameter */
-	pStaDs->qosMode = 1;
+	pStaDs->qosMode = (pTdlsAddStaReq->capability & CAPABILITIES_QOS_OFFSET)
+				|| pTdlsAddStaReq->htcap_present;
 	pStaDs->wmeEnabled = 1;
 	pStaDs->lleEnabled = 0;
 	/*  TDLS Dummy AddSTA does not have qosInfo , is it OK ??