diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 1c345e7e11..b4ddbb81a7 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/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 diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index d5fda34c53..f4b02f4dbe 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 30a0021b07..0a94879bf4 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/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, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 6997f18b3c..6b4d220740 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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 diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index ae26107197..b2086d8b67 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/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; diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 5a8e73fbc5..f761fe0e76 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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; diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c index 4abcd6e51e..c8ef354556 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c +++ b/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)