|
@@ -3332,6 +3332,55 @@ static qdf_nbuf_t dp_ipa_intrabss_send(struct dp_pdev *pdev,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+#ifdef IPA_WDS_EASYMESH_FEATURE
|
|
|
+/**
|
|
|
+ * dp_ipa_peer_check() - Check for peer for given mac
|
|
|
+ * @soc: dp soc object
|
|
|
+ * @peer_mac_addr: peer mac address
|
|
|
+ * @vdev_id: vdev id
|
|
|
+ *
|
|
|
+ * Return: true if peer is found, else false
|
|
|
+ */
|
|
|
+static inline bool dp_ipa_peer_check(struct dp_soc *soc,
|
|
|
+ uint8_t *peer_mac_addr, uint8_t vdev_id)
|
|
|
+{
|
|
|
+ struct cdp_ast_entry_info ast_info = {0};
|
|
|
+ ol_txrx_soc_handle cdp_soc;
|
|
|
+ struct dp_peer *peer = NULL;
|
|
|
+
|
|
|
+ cdp_soc = dp_soc_to_cdp_soc_t(soc);
|
|
|
+ cdp_peer_get_ast_info_by_soc(cdp_soc, peer_mac_addr, &ast_info);
|
|
|
+
|
|
|
+ peer = dp_peer_get_ref_by_id(soc, ast_info.peer_id, DP_MOD_ID_IPA);
|
|
|
+
|
|
|
+ if (!peer) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ if ((peer->vdev->vdev_id == vdev_id)) {
|
|
|
+ dp_peer_unref_delete(peer, DP_MOD_ID_IPA);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ dp_peer_unref_delete(peer, DP_MOD_ID_IPA);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline bool dp_ipa_peer_check(struct dp_soc *soc,
|
|
|
+ uint8_t *peer_mac_addr, uint8_t vdev_id)
|
|
|
+{
|
|
|
+ struct dp_peer *peer = NULL;
|
|
|
+
|
|
|
+ peer = dp_peer_find_hash_find(soc, peer_mac_addr, 0, vdev_id,
|
|
|
+ DP_MOD_ID_IPA);
|
|
|
+ if (!peer) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ dp_peer_unref_delete(peer, DP_MOD_ID_IPA);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
qdf_nbuf_t nbuf, bool *fwd_success)
|
|
|
{
|
|
@@ -3339,8 +3388,6 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
|
|
DP_MOD_ID_IPA);
|
|
|
struct dp_pdev *pdev;
|
|
|
- struct dp_peer *da_peer;
|
|
|
- struct dp_peer *sa_peer;
|
|
|
qdf_nbuf_t nbuf_copy;
|
|
|
uint8_t da_is_bcmc;
|
|
|
struct ethhdr *eh;
|
|
@@ -3385,20 +3432,12 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
if (!qdf_mem_cmp(eh->h_dest, vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE))
|
|
|
goto out;
|
|
|
|
|
|
- da_peer = dp_peer_find_hash_find(soc, eh->h_dest, 0, vdev->vdev_id,
|
|
|
- DP_MOD_ID_IPA);
|
|
|
- if (!da_peer)
|
|
|
+ if (!dp_ipa_peer_check(soc, eh->h_dest, vdev->vdev_id))
|
|
|
goto out;
|
|
|
|
|
|
- dp_peer_unref_delete(da_peer, DP_MOD_ID_IPA);
|
|
|
-
|
|
|
- sa_peer = dp_peer_find_hash_find(soc, eh->h_source, 0, vdev->vdev_id,
|
|
|
- DP_MOD_ID_IPA);
|
|
|
- if (!sa_peer)
|
|
|
+ if (!dp_ipa_peer_check(soc, eh->h_source, vdev->vdev_id))
|
|
|
goto out;
|
|
|
|
|
|
- dp_peer_unref_delete(sa_peer, DP_MOD_ID_IPA);
|
|
|
-
|
|
|
/*
|
|
|
* In intra-bss forwarding scenario, skb is allocated by IPA driver.
|
|
|
* Need to add skb to internal tracking table to avoid nbuf memory
|