From 983107dafb6452c74221c7434d6d53aedd9a236d Mon Sep 17 00:00:00 2001 From: Pradeep Reddy POTTETI Date: Fri, 30 Sep 2016 15:03:41 +0530 Subject: [PATCH] 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 --- core/mac/src/pe/lim/lim_process_tdls.c | 35 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index b2e15757fb..7b2e5cae97 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/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 ??