Ver Fonte

qca-wifi: VoW IGMP improvements

As part of the VoW IGMP improvements, which deals with
conversion of igmp packets to unicast packets, the
following changes are done when the new feature is enabled:

1. IGMP/MLD packets with special addresses (addresses not
   part of any multicast group) will be converted to all
   existing clients of the AP. These packets will be
   directly fed to igmp multicast to unicast conversion
   module.
2. The IGMP/MLD packets with group specific addresses will
   first go to multicast enhancement module, where they
   will be allowed to pass and will be converted to unicast.
3. The new feature will be enabled only when multicast
   enhancement feature is enabled, which will be ensured
   at the configuration level.

FR : 61063

Change-Id: I06fc796af288f387b05e34f9b62028d648cdc8cc
Pavankumar Nandeshwar há 5 anos atrás
pai
commit
fd529cd60a
3 ficheiros alterados com 39 adições e 6 exclusões
  1. 28 5
      dp/wifi3.0/dp_txrx_me.c
  2. 8 1
      dp/wifi3.0/dp_txrx_me.h
  3. 3 0
      tools/linux/cfg80211_ven_cmd.h

+ 28 - 5
dp/wifi3.0/dp_txrx_me.c

@@ -210,6 +210,24 @@ dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
 	return QDF_STATUS_E_FAILURE;
 }
 
+/**
+ * dp_tx_prepare_send_igmp_me(): Call to check igmp ,convert mcast to ucast
+ * @vdev: DP VDEV handle
+ * @nbuf: Multicast buffer
+ *
+ * Return: no of packets transmitted
+ */
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
+{
+	if (dp_igmp_me_mcast_convert((struct cdp_soc_t *)(vdev->pdev->soc),
+				     vdev->vdev_id, vdev->pdev->pdev_id,
+				     nbuf) > 0)
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 /*
  * dp_tx_me_mem_free(): Function to free allocated memory in mcast enahncement
  * pdev: pointer to DP PDEV structure
@@ -249,6 +267,7 @@ static void dp_tx_me_mem_free(struct dp_pdev *pdev,
  * @nbuf: Multicast nbuf
  * @newmac: Table of the clients to which packets have to be sent
  * @new_mac_cnt: No of clients
+ * @tid: desired tid
  *
  * return: no of converted packets
  */
@@ -256,7 +275,7 @@ uint16_t
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt)
+			    uint8_t new_mac_cnt, uint8_t tid)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_pdev *pdev;
@@ -414,10 +433,14 @@ dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	msdu_info.num_seg = new_mac_cnt;
 	msdu_info.frm_type = dp_tx_frm_me;
 
-	msdu_info.tid = HTT_INVALID_TID;
-	if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
-	    qdf_unlikely(pdev->hmmc_tid_override_en))
-		msdu_info.tid = pdev->hmmc_tid;
+	if (tid == HTT_INVALID_TID) {
+		msdu_info.tid = HTT_INVALID_TID;
+		if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
+		    qdf_unlikely(pdev->hmmc_tid_override_en))
+			msdu_info.tid = pdev->hmmc_tid;
+	} else {
+		msdu_info.tid = tid;
+	}
 
 	DP_STATS_INC(vdev, tx_i.mcast_en.ucast, new_mac_cnt);
 	dp_tx_send_msdu_multiple(vdev, nbuf, &msdu_info);

+ 8 - 1
dp/wifi3.0/dp_txrx_me.h

@@ -21,15 +21,22 @@ uint16_t
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt);
+			    uint8_t new_mac_cnt, uint8_t tid);
 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_exit(struct dp_pdev *pdev);
 QDF_STATUS
 dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
 extern int
 dp_me_mcast_convert(struct cdp_soc_t *soc,
 		    uint8_t vdev_id,
 		    uint8_t pdev_id,
 		    qdf_nbuf_t wbuf);
+extern int
+dp_igmp_me_mcast_convert(struct cdp_soc_t *soc,
+			 uint8_t vdev_id,
+			 uint8_t pdev_id,
+			 qdf_nbuf_t wbuf);
 #endif

+ 3 - 0
tools/linux/cfg80211_ven_cmd.h

@@ -777,6 +777,7 @@ enum {
 	IEEE80211_PARAM_TX_VAP                     = 708, /* Current Tx Vap */
 	IEEE80211_PARAM_FILS_IS_ENABLE            = 709, /* Fils enable frames*/
 	IEEE80211_PARAM_MBSS_TXVDEV                = 710,
+	IEEE80211_PARAM_IGMP_ME      = 711, /* Set IGMP Mcast enhancement option: 0 disable, 1 enable */
 };
 
 enum {
@@ -2211,6 +2212,8 @@ struct vendor_commands vap_vendor_cmds[] = {
 	{"rxtimeout",           35839, SET_PARAM, 1},
 	{"oce_version_override ",     IEEE80211_PARAM_OCE_VERSION_OVERRIDE, SET_PARAM, 1},
 	{"g_oce_version_override ",   IEEE80211_PARAM_OCE_VERSION_OVERRIDE, GET_PARAM, 0},
+	{"igmpmcasten",         IEEE80211_PARAM_IGMP_ME, SET_PARAM, 1},
+	{"g_igmpmcasten",       IEEE80211_PARAM_IGMP_ME, GET_PARAM, 0},
 };
 
 struct vendor_commands radio_vendor_cmds[] = {