summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Guo <chenguo@qti.qualcomm.com>2016-06-30 18:23:19 +0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-17 16:05:42 +0530
commitcbdab8cd8cef12d8c8e53dae17099c4d6f3a68a7 (patch)
treed16e14b28a289040f0cd2165a452bac0f1571f41
parent33bb288d83aa34d6c0647c71e3baa4bc7da07add (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.c1
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_classify.c3
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h26
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h18
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;