|
@@ -1143,10 +1143,10 @@ dp_rx_intrabss_fwd_mlo_allow(struct dp_peer *ta_peer,
|
|
false - not allow
|
|
false - not allow
|
|
*/
|
|
*/
|
|
static bool
|
|
static bool
|
|
-dp_rx_intrabss_ucast_check_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
|
|
|
|
|
+dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
|
|
struct dp_peer *ta_peer,
|
|
struct dp_peer *ta_peer,
|
|
struct hal_rx_msdu_metadata *msdu_metadata,
|
|
struct hal_rx_msdu_metadata *msdu_metadata,
|
|
- uint8_t *p_tx_vdev_id)
|
|
|
|
|
|
+ struct dp_be_intrabss_params *params)
|
|
{
|
|
{
|
|
uint16_t da_peer_id;
|
|
uint16_t da_peer_id;
|
|
struct dp_peer *da_peer;
|
|
struct dp_peer *da_peer;
|
|
@@ -1155,22 +1155,96 @@ dp_rx_intrabss_ucast_check_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
|
return false;
|
|
return false;
|
|
|
|
|
|
da_peer_id = dp_rx_peer_metadata_peer_id_get_be(
|
|
da_peer_id = dp_rx_peer_metadata_peer_id_get_be(
|
|
- soc,
|
|
|
|
|
|
+ params->dest_soc,
|
|
msdu_metadata->da_idx);
|
|
msdu_metadata->da_idx);
|
|
- da_peer = dp_peer_get_ref_by_id(soc, da_peer_id, DP_MOD_ID_RX);
|
|
|
|
|
|
+ da_peer = dp_peer_get_ref_by_id(params->dest_soc, da_peer_id,
|
|
|
|
+ DP_MOD_ID_RX);
|
|
if (!da_peer)
|
|
if (!da_peer)
|
|
return false;
|
|
return false;
|
|
- *p_tx_vdev_id = da_peer->vdev->vdev_id;
|
|
|
|
|
|
+ params->tx_vdev_id = da_peer->vdev->vdev_id;
|
|
dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
|
|
dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
|
|
+#ifdef WLAN_MLO_MULTI_CHIP
|
|
static bool
|
|
static bool
|
|
-dp_rx_intrabss_ucast_check_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
|
|
|
|
|
+dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
|
|
struct dp_peer *ta_peer,
|
|
struct dp_peer *ta_peer,
|
|
struct hal_rx_msdu_metadata *msdu_metadata,
|
|
struct hal_rx_msdu_metadata *msdu_metadata,
|
|
- uint8_t *p_tx_vdev_id)
|
|
|
|
|
|
+ struct dp_be_intrabss_params *params)
|
|
|
|
+{
|
|
|
|
+ uint16_t da_peer_id;
|
|
|
|
+ struct dp_peer *da_peer;
|
|
|
|
+ bool ret = false;
|
|
|
|
+ uint8_t dest_chip_id;
|
|
|
|
+ uint8_t soc_idx;
|
|
|
|
+ struct dp_vdev_be *be_vdev =
|
|
|
|
+ dp_get_be_vdev_from_dp_vdev(ta_peer->vdev);
|
|
|
|
+
|
|
|
|
+ if (!(qdf_nbuf_is_da_valid(nbuf) || qdf_nbuf_is_da_mcbc(nbuf)))
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ dest_chip_id = HAL_RX_DEST_CHIP_ID_GET(msdu_metadata);
|
|
|
|
+ qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1));
|
|
|
|
+
|
|
|
|
+ /* validate chip_id, get a ref, and re-assign soc */
|
|
|
|
+ params->dest_soc = dp_mlo_get_soc_ref_by_chip_id(
|
|
|
|
+ dp_mlo_get_peer_hash_obj(params->dest_soc),
|
|
|
|
+ dest_chip_id);
|
|
|
|
+ if (!params->dest_soc)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ da_peer_id = dp_rx_peer_metadata_peer_id_get_be(params->dest_soc,
|
|
|
|
+ msdu_metadata->da_idx);
|
|
|
|
+ da_peer = dp_peer_get_ref_by_id(params->dest_soc, da_peer_id,
|
|
|
|
+ DP_MOD_ID_RX);
|
|
|
|
+ if (!da_peer)
|
|
|
|
+ return false;
|
|
|
|
+ /* soc unref if needed */
|
|
|
|
+
|
|
|
|
+ params->tx_vdev_id = da_peer->vdev->vdev_id;
|
|
|
|
+
|
|
|
|
+ /* If the source or destination peer in the isolation
|
|
|
|
+ * list then dont forward instead push to bridge stack.
|
|
|
|
+ */
|
|
|
|
+ if (dp_get_peer_isolation(ta_peer) ||
|
|
|
|
+ dp_get_peer_isolation(da_peer))
|
|
|
|
+ goto rel_da_peer;
|
|
|
|
+
|
|
|
|
+ if (da_peer->bss_peer || da_peer == ta_peer)
|
|
|
|
+ goto rel_da_peer;
|
|
|
|
+
|
|
|
|
+ /* Same vdev, support Inra-BSS */
|
|
|
|
+ if (da_peer->vdev == ta_peer->vdev) {
|
|
|
|
+ ret = true;
|
|
|
|
+ goto rel_da_peer;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* MLO specific Intra-BSS check */
|
|
|
|
+ if (dp_rx_intrabss_fwd_mlo_allow(ta_peer, da_peer)) {
|
|
|
|
+ /* index of soc in the array */
|
|
|
|
+ soc_idx = dest_chip_id << DP_MLO_DEST_CHIP_ID_SHIFT;
|
|
|
|
+ if (!(be_vdev->partner_vdev_list[soc_idx][0] ==
|
|
|
|
+ params->tx_vdev_id) &&
|
|
|
|
+ !(be_vdev->partner_vdev_list[soc_idx][1] ==
|
|
|
|
+ params->tx_vdev_id)) {
|
|
|
|
+ /*dp_soc_unref_delete(soc);*/
|
|
|
|
+ goto rel_da_peer;
|
|
|
|
+ }
|
|
|
|
+ ret = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+rel_da_peer:
|
|
|
|
+ dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static bool
|
|
|
|
+dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
|
|
|
|
+ struct dp_peer *ta_peer,
|
|
|
|
+ struct hal_rx_msdu_metadata *msdu_metadata,
|
|
|
|
+ struct dp_be_intrabss_params *params)
|
|
{
|
|
{
|
|
uint16_t da_peer_id;
|
|
uint16_t da_peer_id;
|
|
struct dp_peer *da_peer;
|
|
struct dp_peer *da_peer;
|
|
@@ -1180,14 +1254,15 @@ dp_rx_intrabss_ucast_check_be(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
|
return false;
|
|
return false;
|
|
|
|
|
|
da_peer_id = dp_rx_peer_metadata_peer_id_get_be(
|
|
da_peer_id = dp_rx_peer_metadata_peer_id_get_be(
|
|
- soc,
|
|
|
|
|
|
+ params->dest_soc,
|
|
msdu_metadata->da_idx);
|
|
msdu_metadata->da_idx);
|
|
- da_peer = dp_peer_get_ref_by_id(soc, da_peer_id,
|
|
|
|
|
|
+
|
|
|
|
+ da_peer = dp_peer_get_ref_by_id(params->dest_soc, da_peer_id,
|
|
DP_MOD_ID_RX);
|
|
DP_MOD_ID_RX);
|
|
if (!da_peer)
|
|
if (!da_peer)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
- *p_tx_vdev_id = da_peer->vdev->vdev_id;
|
|
|
|
|
|
+ params->tx_vdev_id = da_peer->vdev->vdev_id;
|
|
/* If the source or destination peer in the isolation
|
|
/* If the source or destination peer in the isolation
|
|
* list then dont forward instead push to bridge stack.
|
|
* list then dont forward instead push to bridge stack.
|
|
*/
|
|
*/
|
|
@@ -1214,7 +1289,9 @@ rel_da_peer:
|
|
dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
|
|
dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
+#endif /* WLAN_MLO_MULTI_CHIP */
|
|
|
|
+#endif /* INTRA_BSS_FWD_OFFLOAD */
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* dp_rx_intrabss_fwd_be() - API for intrabss fwd. For EAPOL
|
|
* dp_rx_intrabss_fwd_be() - API for intrabss fwd. For EAPOL
|
|
* pkt with DA not equal to vdev mac addr, fwd is not allowed.
|
|
* pkt with DA not equal to vdev mac addr, fwd is not allowed.
|
|
@@ -1230,11 +1307,12 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_peer *ta_peer,
|
|
uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf,
|
|
uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf,
|
|
struct hal_rx_msdu_metadata msdu_metadata)
|
|
struct hal_rx_msdu_metadata msdu_metadata)
|
|
{
|
|
{
|
|
- uint8_t tx_vdev_id;
|
|
|
|
uint8_t tid = qdf_nbuf_get_tid_val(nbuf);
|
|
uint8_t tid = qdf_nbuf_get_tid_val(nbuf);
|
|
uint8_t ring_id = QDF_NBUF_CB_RX_CTX_ID(nbuf);
|
|
uint8_t ring_id = QDF_NBUF_CB_RX_CTX_ID(nbuf);
|
|
struct cdp_tid_rx_stats *tid_stats = &ta_peer->vdev->pdev->stats.
|
|
struct cdp_tid_rx_stats *tid_stats = &ta_peer->vdev->pdev->stats.
|
|
tid_stats.tid_rx_stats[ring_id][tid];
|
|
tid_stats.tid_rx_stats[ring_id][tid];
|
|
|
|
+ bool ret = false;
|
|
|
|
+ struct dp_be_intrabss_params params;
|
|
|
|
|
|
/* if it is a broadcast pkt (eg: ARP) and it is not its own
|
|
/* if it is a broadcast pkt (eg: ARP) and it is not its own
|
|
* source, then clone the pkt and send the cloned pkt for
|
|
* source, then clone the pkt and send the cloned pkt for
|
|
@@ -1244,15 +1322,23 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_peer *ta_peer,
|
|
* like igmpsnoop decide whether to forward or not with
|
|
* like igmpsnoop decide whether to forward or not with
|
|
* Mcast enhancement.
|
|
* Mcast enhancement.
|
|
*/
|
|
*/
|
|
- if (qdf_nbuf_is_da_mcbc(nbuf) && !ta_peer->bss_peer)
|
|
|
|
|
|
+ if (qdf_nbuf_is_da_mcbc(nbuf) && !ta_peer->bss_peer) {
|
|
return dp_rx_intrabss_mcbc_fwd(soc, ta_peer, rx_tlv_hdr,
|
|
return dp_rx_intrabss_mcbc_fwd(soc, ta_peer, rx_tlv_hdr,
|
|
nbuf, tid_stats);
|
|
nbuf, tid_stats);
|
|
|
|
+ }
|
|
|
|
|
|
- if (dp_rx_intrabss_ucast_check_be(soc, nbuf, ta_peer,
|
|
|
|
- &msdu_metadata, &tx_vdev_id))
|
|
|
|
- return dp_rx_intrabss_ucast_fwd(soc, ta_peer, tx_vdev_id,
|
|
|
|
- rx_tlv_hdr, nbuf, tid_stats);
|
|
|
|
|
|
+ if (dp_rx_intrabss_eapol_drop_check(soc, ta_peer, rx_tlv_hdr,
|
|
|
|
+ nbuf))
|
|
|
|
+ return true;
|
|
|
|
|
|
- return false;
|
|
|
|
|
|
+ params.dest_soc = soc;
|
|
|
|
+ if (dp_rx_intrabss_ucast_check_be(nbuf, ta_peer,
|
|
|
|
+ &msdu_metadata, ¶ms)) {
|
|
|
|
+ ret = dp_rx_intrabss_ucast_fwd(params.dest_soc, ta_peer,
|
|
|
|
+ params.tx_vdev_id,
|
|
|
|
+ rx_tlv_hdr, nbuf, tid_stats);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|