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:

committed by
Madan Koyyalamudi

parent
5c85cfb5a0
commit
32046ad850
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user