diff options
| author | Chris Guo <chenguo@qti.qualcomm.com> | 2016-06-30 18:23:19 +0800 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-08-17 16:05:42 +0530 |
| commit | cbdab8cd8cef12d8c8e53dae17099c4d6f3a68a7 (patch) | |
| tree | d16e14b28a289040f0cd2165a452bac0f1571f41 | |
| parent | 33bb288d83aa34d6c0647c71e3baa4bc7da07add (diff) | |
qcacld-2.0: Fix Intra-BSS forwarding QoS unfair issue for HL
For HL WLAN, TX QoS is decided by WLAN driver and all TX packets for
non-qos-capable peer will get TID of OL_TX_NON_QOS_TID. This is not
fair for Intra-BSS fowarding frames which are possible different QoS
from a qos-capable peer. So bypass this logic for Intra-BSS forward
scenario.
Change-Id: I4d61a46190853265a81b167aa72dca0edba3df70
CR: 1055231
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_fwd.c | 1 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_classify.c | 3 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 26 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h | 18 |
4 files changed, 47 insertions, 1 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c index bde21e87eff9..ead13c7e1eb2 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_fwd.c @@ -143,6 +143,7 @@ ol_rx_fwd_to_tx(struct ol_txrx_vdev_t *vdev, adf_nbuf_t msdu) adf_nbuf_pull_head(msdu, htt_rx_msdu_rx_desc_size_hl(pdev->htt_pdev, rx_desc)); + adf_nbuf_set_fwd_flag(msdu, ADF_NBUF_FWD_FLAG); } msdu = vdev->tx(vdev, msdu); diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c index 7ae70b9a173d..a67082d290df 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c @@ -498,7 +498,8 @@ ol_tx_classify( return NULL; /* error */ } TX_SCHED_DEBUG_PRINT("Peer found\n"); - if (!peer->qos_capable) { + if ((adf_nbuf_get_fwd_flag(tx_nbuf) != ADF_NBUF_FWD_FLAG) && + (!peer->qos_capable)) { tid = OL_TX_NON_QOS_TID; } else if ((peer->security[OL_TXRX_PEER_SECURITY_UNICAST].sec_type != htt_sec_type_wapi) && diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index b1d46d8acc90..3540a66035a3 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -56,6 +56,7 @@ #define NBUF_PKT_TRAC_MAX_STRING 12 #define NBUF_PKT_TRAC_PROTO_STRING 4 #define ADF_NBUF_PKT_ERROR 1 +#define ADF_NBUF_FWD_FLAG 1 #define ADF_NBUF_TRAC_IPV4_OFFSET 14 #define ADF_NBUF_TRAC_IPV4_HEADER_SIZE 20 @@ -1283,6 +1284,31 @@ adf_nbuf_trace_set_proto_type(adf_nbuf_t buf, uint8_t proto_type) } /** + * adf_nbuf_get_fwd_flag() - get packet forwarding flag + * @buf: pointer to adf_nbuf_t structure + * + * Returns: packet forwarding flag +*/ +static inline uint8_t +adf_nbuf_get_fwd_flag(adf_nbuf_t buf) +{ + return __adf_nbuf_get_fwd_flag(buf); +} + +/** + * adf_nbuf_get_fwd_flag() - update packet forwarding flag + * @buf: pointer to adf_nbuf_t structure + * @flag: forwarding flag + * + * Returns: none +*/ +static inline void +adf_nbuf_set_fwd_flag(adf_nbuf_t buf, uint8_t flag) +{ + __adf_nbuf_set_fwd_flag(buf, flag); +} + +/** * @brief This function registers protocol trace callback * * @param[in] adf_nbuf_trace_update_t callback pointer diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index dbedb1050ef6..e2579aac8df6 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -149,6 +149,9 @@ struct cvg_nbuf_cb { unsigned char proto_type; unsigned char vdev_id; #endif /* QCA_PKT_PROTO_TRACE */ +#ifdef QOS_FWD_SUPPORT + unsigned char fwd_flag: 1; +#endif /* QOS_FWD_SUPPORT */ #ifdef QCA_TX_HTT2_SUPPORT unsigned char tx_htt2_frm: 1; unsigned char tx_htt2_reserved: 7; @@ -209,6 +212,16 @@ struct cvg_nbuf_cb { #define NBUF_GET_PROTO_TYPE(skb) 0; #endif /* QCA_PKT_PROTO_TRACE */ +#ifdef QOS_FWD_SUPPORT +#define NBUF_SET_FWD_FLAG(skb, flag) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->fwd_flag = flag) +#define NBUF_GET_FWD_FLAG(skb) \ + (((struct cvg_nbuf_cb *)((skb)->cb))->fwd_flag) +#else +#define NBUF_SET_FWD_FLAG(skb, fwd_flag); +#define NBUF_GET_FWD_FLAG(skb) 0; +#endif /* QOS_FWD_SUPPORT */ + #ifdef QCA_TX_HTT2_SUPPORT #define NBUF_SET_TX_HTT2_FRM(skb, candi) \ (((struct cvg_nbuf_cb *)((skb)->cb))->tx_htt2_frm = candi) @@ -333,6 +346,11 @@ struct cvg_nbuf_cb { #define __adf_nbuf_trace_get_proto_type(skb) \ NBUF_GET_PROTO_TYPE(skb); +#define __adf_nbuf_set_fwd_flag(skb, flag) \ + NBUF_SET_FWD_FLAG(skb, flag) +#define __adf_nbuf_get_fwd_flag(skb) \ + NBUF_GET_FWD_FLAG(skb); + typedef struct __adf_nbuf_qhead { struct sk_buff *head; struct sk_buff *tail; |
