Просмотр исходного кода

qcacmn: Vdev attach changes for MLO

Add mld mac address info during datapath
vdev attach.

Change-Id: I0ea22025d19be82be0c56809871e8513c3ce7962
CRs-Fixed: 3039326
Rakesh Pillai 4 лет назад
Родитель
Сommit
32046ad850

+ 2 - 5
dp/inc/cdp_txrx_cmn.h

@@ -146,8 +146,7 @@ cdp_soc_attach_target(ol_txrx_soc_handle soc)
 
 static inline QDF_STATUS
 cdp_vdev_attach(ol_txrx_soc_handle soc, uint8_t pdev_id,
-		uint8_t *vdev_mac_addr, uint8_t vdev_id,
-		enum wlan_op_mode op_mode, enum wlan_op_subtype subtype)
+		struct cdp_vdev_info *vdev_info)
 {
 	if (!soc || !soc->ops) {
 		dp_cdp_debug("Invalid Instance:");
@@ -159,9 +158,7 @@ cdp_vdev_attach(ol_txrx_soc_handle soc, uint8_t pdev_id,
 	    !soc->ops->cmn_drv_ops->txrx_vdev_attach)
 		return QDF_STATUS_E_FAILURE;
 
-	return soc->ops->cmn_drv_ops->txrx_vdev_attach(soc, pdev_id,
-						       vdev_mac_addr, vdev_id,
-						       op_mode, subtype);
+	return soc->ops->cmn_drv_ops->txrx_vdev_attach(soc, pdev_id, vdev_info);
 }
 
 #ifdef DP_FLOW_CTL

+ 55 - 36
dp/inc/cdp_txrx_cmn_struct.h

@@ -639,6 +639,61 @@ struct cdp_tx_exception_metadata {
 #endif
 };
 
+/**
+ * wlan_op_mode - Virtual device operation mode
+ * @wlan_op_mode_unknown: Unknown mode
+ * @wlan_op_mode_ap: AP mode
+ * @wlan_op_mode_ibss: IBSS mode
+ * @wlan_op_mode_sta: STA (client) mode
+ * @wlan_op_mode_monitor: Monitor mode
+ * @wlan_op_mode_ocb: OCB mode
+ * @wlan_op_mode_ndi: NDI mode
+ */
+enum wlan_op_mode {
+	wlan_op_mode_unknown,
+	wlan_op_mode_ap,
+	wlan_op_mode_ibss,
+	wlan_op_mode_sta,
+	wlan_op_mode_monitor,
+	wlan_op_mode_ocb,
+	wlan_op_mode_ndi,
+};
+
+/**
+ * enum wlan_op_subtype - Virtual device subtype
+ * @wlan_op_subtype_none: Subtype not applicable
+ * @wlan_op_subtype_p2p_device: P2P device
+ * @wlan_op_subtye_p2p_cli: P2P Client
+ * @wlan_op_subtype_p2p_go: P2P GO
+ *
+ * This enum lists the subtypes of a particular virtual
+ * device.
+ */
+enum wlan_op_subtype {
+	wlan_op_subtype_none,
+	wlan_op_subtype_p2p_device,
+	wlan_op_subtype_p2p_cli,
+	wlan_op_subtype_p2p_go,
+};
+
+/**
+ * struct cdp_vdev_info - Vdev information
+ * @vdev_mac_addr: mac address of the vdev
+ * @vdev_id: ID of the vdev
+ * @op_mode: Operation mode of the vdev
+ * @subtype: subtype of the vdev
+ * @mld_mac_addr: MLD mac addr of the current vdev.
+ */
+struct cdp_vdev_info {
+	uint8_t *vdev_mac_addr;
+	uint8_t vdev_id;
+	enum wlan_op_mode op_mode;
+	enum wlan_op_subtype subtype;
+#ifdef WLAN_FEATURE_11BE_MLO
+	uint8_t *mld_mac_addr;
+#endif
+};
+
 typedef struct cdp_soc_t *ol_txrx_soc_handle;
 
 /**
@@ -726,42 +781,6 @@ struct ol_osif_peer_t;
 typedef struct ol_osif_peer_t *ol_osif_peer_handle;
 #endif
 
-/**
- * wlan_op_mode - Virtual device operation mode
- * @wlan_op_mode_unknown: Unknown mode
- * @wlan_op_mode_ap: AP mode
- * @wlan_op_mode_ibss: IBSS mode
- * @wlan_op_mode_sta: STA (client) mode
- * @wlan_op_mode_monitor: Monitor mode
- * @wlan_op_mode_ocb: OCB mode
- */
-enum wlan_op_mode {
-	wlan_op_mode_unknown,
-	wlan_op_mode_ap,
-	wlan_op_mode_ibss,
-	wlan_op_mode_sta,
-	wlan_op_mode_monitor,
-	wlan_op_mode_ocb,
-	wlan_op_mode_ndi,
-};
-
-/**
- * enum wlan_op_subtype - Virtual device subtype
- * @wlan_op_subtype_none: Subtype not applicable
- * @wlan_op_subtype_p2p_device: P2P device
- * @wlan_op_subtye_p2p_cli: P2P Client
- * @wlan_op_subtype_p2p_go: P2P GO
- *
- * This enum lists the subtypes of a particular virtual
- * device.
- */
-enum wlan_op_subtype {
-	wlan_op_subtype_none,
-	wlan_op_subtype_p2p_device,
-	wlan_op_subtype_p2p_cli,
-	wlan_op_subtype_p2p_go,
-};
-
 /**
  * connectivity_stats_pkt_status - data pkt type
  * @PKT_TYPE_REQ: Request packet

+ 2 - 3
dp/inc/cdp_txrx_ops.h

@@ -118,9 +118,8 @@ struct cdp_cmn_ops {
 	int (*txrx_pdev_attach_target)(ol_txrx_soc_handle soc, uint8_t pdev_id);
 
 	QDF_STATUS (*txrx_vdev_attach)
-		(struct cdp_soc_t *soc, uint8_t pdev_id, uint8_t *mac,
-		 uint8_t vdev_id, enum wlan_op_mode op_mode,
-		 enum wlan_op_subtype subtype);
+		(struct cdp_soc_t *soc, uint8_t pdev_id,
+		 struct cdp_vdev_info *vdev_info);
 
 	QDF_STATUS
 	(*txrx_vdev_detach)(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,

+ 26 - 10
dp/wifi3.0/dp_main.c

@@ -5892,22 +5892,33 @@ static inline void dp_vdev_register_rx_eapol(struct dp_vdev *vdev,
 }
 #endif
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static inline void dp_vdev_save_mld_addr(struct dp_vdev *vdev,
+					 struct cdp_vdev_info *vdev_info)
+{
+	if (vdev_info->mld_mac_addr)
+		qdf_mem_copy(&vdev->mld_mac_addr.raw[0],
+			     vdev_info->mld_mac_addr, QDF_MAC_ADDR_SIZE);
+}
+#else
+static inline void dp_vdev_save_mld_addr(struct dp_vdev *vdev,
+					 struct cdp_vdev_info *vdev_info)
+{
+
+}
+#endif
+
 /*
 * dp_vdev_attach_wifi3() - attach txrx vdev
 * @txrx_pdev: Datapath PDEV handle
-* @vdev_mac_addr: MAC address of the virtual interface
-* @vdev_id: VDEV Id
-* @wlan_op_mode: VDEV operating mode
-* @subtype: VDEV operating subtype
+* @pdev_id: PDEV ID for vdev creation
+* @vdev_info: parameters used for vdev creation
 *
 * Return: status
 */
 static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
 				       uint8_t pdev_id,
-				       uint8_t *vdev_mac_addr,
-				       uint8_t vdev_id,
-				       enum wlan_op_mode op_mode,
-				       enum wlan_op_subtype subtype)
+				       struct cdp_vdev_info *vdev_info)
 {
 	int i = 0;
 	qdf_size_t vdev_context_size;
@@ -5916,6 +5927,10 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
 		dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc,
 						   pdev_id);
 	struct dp_vdev *vdev;
+	uint8_t *vdev_mac_addr = vdev_info->vdev_mac_addr;
+	uint8_t vdev_id = vdev_info->vdev_id;
+	enum wlan_op_mode op_mode = vdev_info->op_mode;
+	enum wlan_op_subtype subtype = vdev_info->subtype;
 
 	vdev_context_size =
 		soc->arch_ops.txrx_get_context_size(DP_CONTEXT_TYPE_VDEV);
@@ -5968,8 +5983,9 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
 #endif
 	vdev->lmac_id = pdev->lmac_id;
 
-	qdf_mem_copy(
-		&vdev->mac_addr.raw[0], vdev_mac_addr, QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(&vdev->mac_addr.raw[0], vdev_mac_addr, QDF_MAC_ADDR_SIZE);
+
+	dp_vdev_save_mld_addr(vdev, vdev_info);
 
 	/* TODO: Initialize default HTT meta data that will be used in
 	 * TCL descriptors for packets transmitted from this VDEV

+ 28 - 4
dp/wifi3.0/dp_rx.h

@@ -1118,6 +1118,32 @@ bool dp_rx_intrabss_fwd(struct dp_soc *soc,
 			struct hal_rx_msdu_metadata msdu_metadata);
 
 #ifdef DISABLE_EAPOL_INTRABSS_FWD
+#ifdef WLAN_FEATURE_11BE_MLO
+static inline bool dp_nbuf_dst_addr_is_mld_addr(struct dp_vdev *vdev,
+						qdf_nbuf_t nbuf)
+{
+	struct qdf_mac_addr *self_mld_mac_addr =
+				(struct qdf_mac_addr *)vdev->mld_mac_addr.raw;
+	return qdf_is_macaddr_equal(self_mld_mac_addr,
+				    (struct qdf_mac_addr *)qdf_nbuf_data(nbuf) +
+				    QDF_NBUF_DEST_MAC_OFFSET);
+}
+#else
+static inline bool dp_nbuf_dst_addr_is_mld_addr(struct dp_vdev *vdev,
+						qdf_nbuf_t nbuf)
+{
+	return false;
+}
+#endif
+
+static inline bool dp_nbuf_dst_addr_is_self_addr(struct dp_vdev *vdev,
+						 qdf_nbuf_t nbuf)
+{
+	return qdf_is_macaddr_equal((struct qdf_mac_addr *)vdev->mac_addr.raw,
+				    (struct qdf_mac_addr *)qdf_nbuf_data(nbuf) +
+				    QDF_NBUF_DEST_MAC_OFFSET);
+}
+
 /*
  * dp_rx_intrabss_eapol_drop_check() - API For EAPOL
  *  pkt with DA not equal to vdev mac addr, fwd is not allowed.
@@ -1134,10 +1160,8 @@ bool dp_rx_intrabss_eapol_drop_check(struct dp_soc *soc,
 				     uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf)
 {
 	if (qdf_unlikely(qdf_nbuf_is_ipv4_eapol_pkt(nbuf) &&
-			 qdf_mem_cmp(qdf_nbuf_data(nbuf) +
-				     QDF_NBUF_DEST_MAC_OFFSET,
-				     ta_peer->vdev->mac_addr.raw,
-				     QDF_MAC_ADDR_SIZE))) {
+			 !(dp_nbuf_dst_addr_is_self_addr(ta_peer->vdev, nbuf) ||
+			   dp_nbuf_dst_addr_is_mld_addr(ta_peer->vdev, nbuf)))) {
 		qdf_nbuf_free(nbuf);
 		DP_STATS_INC(soc, rx.err.intrabss_eapol_drop, 1);
 		return true;

+ 5 - 0
dp/wifi3.0/dp_types.h

@@ -2796,6 +2796,11 @@ struct dp_vdev {
 	/* MAC address */
 	union dp_align_mac_addr mac_addr;
 
+#ifdef WLAN_FEATURE_11BE_MLO
+	/* MLO MAC address corresponding to vdev */
+	union dp_align_mac_addr mld_mac_addr;
+#endif
+
 	/* node in the pdev's list of vdevs */
 	TAILQ_ENTRY(dp_vdev) vdev_list_elem;
 

+ 24 - 9
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c

@@ -47,6 +47,21 @@ static inline struct wlan_lmac_if_mlme_tx_ops
 	return target_if_vdev_mgr_get_tx_ops(psoc);
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static inline void
+wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
+			      struct vdev_create_params *param)
+{
+	vdev_info->mld_mac_addr = param->mlo_mac;
+}
+#else
+static inline void
+wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info,
+			      struct vdev_create_params *param)
+{
+}
+#endif
+
 QDF_STATUS tgt_vdev_mgr_create_send(
 				struct vdev_mlme_obj *mlme_obj,
 				struct vdev_create_params *param)
@@ -57,10 +72,8 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 	struct wlan_objmgr_pdev *pdev;
 	struct wlan_objmgr_vdev *vdev;
 	ol_txrx_soc_handle soc_txrx_handle;
-	enum wlan_op_mode cdp_txrx_opmode;
-	enum wlan_op_subtype cdp_txrx_subtype;
 	uint32_t vdev_id;
-	uint8_t *vdev_addr;
+	struct cdp_vdev_info vdev_info = { 0 };
 
 	if (!param) {
 		mlme_err("Invalid input");
@@ -88,19 +101,21 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 		return status;
 	}
 
-	cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
-	cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
-	vdev_addr = wlan_vdev_mlme_get_macaddr(vdev);
+	vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
+	vdev_info.vdev_id = vdev_id;
+	vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
+	vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
+	wlan_vdev_mgr_fill_mlo_params(&vdev_info, param);
 	pdev = wlan_vdev_get_pdev(vdev);
+
 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
 	if (!soc_txrx_handle)
 		return QDF_STATUS_E_FAILURE;
 
+
 	return cdp_vdev_attach(soc_txrx_handle,
 			       wlan_objmgr_pdev_get_pdev_id(pdev),
-			       vdev_addr, vdev_id,
-			       cdp_txrx_opmode,
-			       cdp_txrx_subtype);
+			       &vdev_info);
 }
 
 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme)