qcacmn: Vdev attach changes for MLO

Add mld mac address info during datapath
vdev attach.

Change-Id: I0ea22025d19be82be0c56809871e8513c3ce7962
CRs-Fixed: 3039326
This commit is contained in:
Rakesh Pillai
2021-06-18 03:00:08 -07:00
committed by Madan Koyyalamudi
parent 5c85cfb5a0
commit 32046ad850
7 changed files with 142 additions and 67 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)