瀏覽代碼

qcacmn: Adding NAWDS support along with WDS-EXT

Adding NAWDS support along with WDS-EXT

Change-Id: I19d277fa575750d3194afc9ec9af3180a8c936ad
CRs-Fixed: 3406151
Sai Rupesh Chevuru 2 年之前
父節點
當前提交
10826afad5
共有 5 個文件被更改,包括 55 次插入6 次删除
  1. 12 2
      dp/wifi3.0/be/dp_be_rx.c
  2. 10 0
      dp/wifi3.0/be/dp_be_tx.c
  3. 21 0
      dp/wifi3.0/dp_peer.h
  4. 6 4
      dp/wifi3.0/dp_tx.c
  5. 6 0
      dp/wifi3.0/dp_tx.h

+ 12 - 2
dp/wifi3.0/be/dp_be_rx.c

@@ -111,8 +111,18 @@ static inline void dp_wds_ext_peer_learn_be(struct dp_soc *soc,
 		qdf_atomic_test_and_set_bit(WDS_EXT_PEER_INIT_BIT,
 					    &ta_txrx_peer->wds_ext.init);
 
-		ta_base_peer = dp_peer_get_ref_by_id(soc, ta_txrx_peer->peer_id,
-						     DP_MOD_ID_RX);
+		if (qdf_unlikely(ta_txrx_peer->nawds_enabled &&
+				 ta_txrx_peer->mld_peer)) {
+			ta_base_peer = dp_get_primary_link_peer_by_id(
+							soc,
+							ta_txrx_peer->peer_id,
+							DP_MOD_ID_RX);
+		} else {
+			ta_base_peer = dp_peer_get_ref_by_id(
+							soc,
+							ta_txrx_peer->peer_id,
+							DP_MOD_ID_RX);
+		}
 
 		if (!ta_base_peer)
 			return;

+ 10 - 0
dp/wifi3.0/be/dp_be_tx.c

@@ -749,6 +749,16 @@ dp_tx_mlo_mcast_pkt_send(struct dp_vdev_be *be_vdev,
 		nbuf_clone = nbuf;
 	}
 
+	/* NAWDS clients will accepts on 4 addr format MCAST packets
+	 * This will ensure to send packets in 4 addr format to NAWDS clients.
+	 */
+	if (qdf_unlikely(ptnr_vdev->nawds_enabled)) {
+		qdf_mem_zero(&msdu_info, sizeof(msdu_info));
+		dp_tx_get_queue(ptnr_vdev, nbuf_clone, &msdu_info.tx_queue);
+		dp_tx_nawds_handler(ptnr_vdev->pdev->soc, ptnr_vdev,
+				    &msdu_info, nbuf_clone, DP_INVALID_PEER);
+	}
+
 	qdf_mem_zero(&msdu_info, sizeof(msdu_info));
 	dp_tx_get_queue(ptnr_vdev, nbuf_clone, &msdu_info.tx_queue);
 	msdu_info.gsn = be_vdev->seq_num;

+ 21 - 0
dp/wifi3.0/dp_peer.h

@@ -67,6 +67,27 @@ struct ast_del_ctxt {
 	int del_count;
 };
 
+#ifdef QCA_SUPPORT_WDS_EXTENDED
+/**
+ * dp_peer_is_wds_ext_peer() - peer is WDS_EXT peer
+ *
+ * @peer: DP peer context
+ *
+ * This API checks whether the peer is WDS_EXT peer or not
+ *
+ * Return: true in the wds_ext peer else flase
+ */
+static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer)
+{
+	return qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, &peer->wds_ext.init);
+}
+#else
+static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer)
+{
+	return false;
+}
+#endif
+
 typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
 			       void *arg);
 /**

+ 6 - 4
dp/wifi3.0/dp_tx.c

@@ -64,9 +64,6 @@
 /* disable TQM_BYPASS */
 #define TQM_BYPASS_WAR 0
 
-/* invalid peer id for reinject*/
-#define DP_INVALID_PEER 0XFFFE
-
 #define DP_RETRY_COUNT 7
 #ifdef WLAN_PEER_JITTER
 #define DP_AVG_JITTER_WEIGHT_DENOM 4
@@ -3154,7 +3151,6 @@ dp_tx_per_pkt_vdev_id_check(qdf_nbuf_t nbuf, struct dp_vdev *vdev)
  * Return: none
  */
 
-static inline
 void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
 			 struct dp_tx_msdu_info_s *msdu_info,
 			 qdf_nbuf_t nbuf, uint16_t sa_peer_id)
@@ -3182,6 +3178,12 @@ void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
 			if (!dp_peer_is_primary_link_peer(peer))
 				continue;
 
+			/* In the case of wds ext peer mcast traffic will be
+			 * sent as part of VLAN interface
+			 */
+			if (dp_peer_is_wds_ext_peer(txrx_peer))
+				continue;
+
 			/* Multicast packets needs to be
 			 * dropped in case of intra bss forwarding
 			 */

+ 6 - 0
dp/wifi3.0/dp_tx.h

@@ -41,6 +41,12 @@
 
 #define DP_TX_MAX_NUM_FRAGS 6
 
+/* invalid peer id for reinject*/
+#define DP_INVALID_PEER 0XFFFE
+
+void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
+			 struct dp_tx_msdu_info_s *msdu_info,
+			 qdf_nbuf_t nbuf, uint16_t sa_peer_id);
 /*
  * DP_TX_DESC_FLAG_FRAG flags should always be defined to 0x1
  * please do not change this flag's definition