From 0b5337fd6b8acb01f6fe0e5dd6416134aa012932 Mon Sep 17 00:00:00 2001 From: Pranita Solanke Date: Fri, 17 May 2019 17:12:45 +0530 Subject: [PATCH] qca-wifi: Update feature wds APIs and move dp_peer_teardown_wifi3 to cmndev dp_tx_mec_handleri,dp_rx_wds_add_or_update_ast, dp_rx_wds_srcport_learn were changed inside common dp. As part of cleanup we have moved it to component dev.This change adopts to the latest dp_tx_mec_handler version. With this change we are moving dp_peer_teardown_wifi3 to common code as it is also required by MCL driver code. Change-Id: Ieba59ceb2f3a3b21f3588fe2685e0dc720ee049a --- dp/wifi3.0/dp_txrx_wds.c | 4 +- dp/wifi3.0/dp_txrx_wds.h | 107 +++++++++++++++------------------------ 2 files changed, 41 insertions(+), 70 deletions(-) diff --git a/dp/wifi3.0/dp_txrx_wds.c b/dp/wifi3.0/dp_txrx_wds.c index 0797fbad06..e706f877d9 100644 --- a/dp/wifi3.0/dp_txrx_wds.c +++ b/dp/wifi3.0/dp_txrx_wds.c @@ -197,9 +197,7 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status) return; soc = vdev->pdev->soc; - qdf_spin_lock_bh(&soc->peer_ref_mutex); - peer = TAILQ_FIRST(&vdev->peer_list); - qdf_spin_unlock_bh(&soc->peer_ref_mutex); + peer = vdev->vap_bss_peer; if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, diff --git a/dp/wifi3.0/dp_txrx_wds.h b/dp/wifi3.0/dp_txrx_wds.h index 38d0d616ac..f307b22212 100644 --- a/dp/wifi3.0/dp_txrx_wds.h +++ b/dp/wifi3.0/dp_txrx_wds.h @@ -34,48 +34,6 @@ dp_rx_da_learn(struct dp_soc *soc, qdf_nbuf_t nbuf); void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status); -#ifdef FEATURE_AST -/* - * dp_peer_delete_ast_entries(): Delete all AST entries for a peer - * @soc - datapath soc handle - * @peer - datapath peer handle - * - * Delete the AST entries belonging to a peer - */ -static inline void dp_peer_delete_ast_entries(struct dp_soc *soc, - struct dp_peer *peer) -{ - struct dp_ast_entry *ast_entry, *temp_ast_entry; - - qdf_spin_lock_bh(&soc->ast_lock); - DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry) - dp_peer_del_ast(soc, ast_entry); - - peer->self_ast_entry = NULL; - qdf_spin_unlock_bh(&soc->ast_lock); -} -static void dp_peer_teardown_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl) -{ - struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl; - struct dp_peer *peer = (struct dp_peer *)peer_hdl; - struct dp_soc *soc = (struct dp_soc *)vdev->pdev->soc; - - /* - * For BSS peer, new peer is not created on alloc_node if the - * peer with same address already exists , instead refcnt is - * increased for existing peer. Correspondingly in delete path, - * only refcnt is decreased; and peer is only deleted , when all - * references are deleted. So delete_in_progress should not be set - * for bss_peer, unless only 2 reference remains (peer map reference - * and peer hash table reference). - */ - if (peer->bss_peer && (qdf_atomic_read(&peer->ref_cnt) > 2)) - return; - - peer->delete_in_progress = true; - dp_peer_delete_ast_entries(soc, peer); -} -#endif #ifdef FEATURE_WDS static inline bool dp_tx_da_search_override(struct dp_vdev *vdev) { @@ -119,7 +77,7 @@ dp_txrx_set_wds_rx_policy(struct cdp_vdev *vdev_handle, */ static inline void dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, - uint8_t *wds_src_mac, uint8_t is_ad4_valid, + qdf_nbuf_t nbuf, uint8_t is_ad4_valid, uint8_t is_sa_valid, uint8_t is_chfrag_start, uint16_t sa_idx, uint16_t sa_sw_peer_id) { @@ -129,6 +87,7 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, uint32_t ret = 0; struct dp_neighbour_peer *neighbour_peer = NULL; struct dp_pdev *pdev = ta_peer->vdev->pdev; + uint8_t wds_src_mac[QDF_MAC_ADDR_SIZE]; /* For AP mode : Do wds source port learning only if it is a * 4-address mpdu @@ -150,8 +109,15 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, } if (qdf_unlikely(!is_sa_valid)) { - ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac, - CDP_TXRX_AST_TYPE_WDS, flags); + qdf_mem_copy(wds_src_mac, + (qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE), + QDF_MAC_ADDR_SIZE); + + ret = dp_peer_add_ast(soc, + ta_peer, + wds_src_mac, + CDP_TXRX_AST_TYPE_WDS, + flags); return; } @@ -174,11 +140,17 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, * cached. */ if (!soc->ast_override_support) { - ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac, - CDP_TXRX_AST_TYPE_WDS, flags); + qdf_mem_copy(wds_src_mac, + (qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE), + QDF_MAC_ADDR_SIZE); + + ret = dp_peer_add_ast(soc, + ta_peer, + wds_src_mac, + CDP_TXRX_AST_TYPE_WDS, + flags); return; - } - if (soc->ast_override_support) { + } else { /* In HKv2 smart monitor case, when NAC client is * added first and this client roams within BSS to * connect to RE, since we have an AST entry for @@ -187,24 +159,26 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, * to FW. */ if (pdev->neighbour_peers_added) { + qdf_mem_copy(wds_src_mac, + (qdf_nbuf_data(nbuf) + + QDF_MAC_ADDR_SIZE), + QDF_MAC_ADDR_SIZE); + qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); TAILQ_FOREACH(neighbour_peer, &pdev->neighbour_peers_list, neighbour_peer_list_elem) { - if (!qdf_mem_cmp(&neighbour_peer-> - neighbour_peers_macaddr - , wds_src_mac, - QDF_MAC_ADDR_SIZE)) { - ret = dp_peer_add_ast - (soc, - ta_peer, + if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr, wds_src_mac, - CDP_TXRX_AST_TYPE_WDS, - flags); - QDF_TRACE - (QDF_MODULE_ID_DP, - QDF_TRACE_LEVEL_INFO, - "sa valid and nac roamed to wds"); + QDF_MAC_ADDR_SIZE)) { + ret = dp_peer_add_ast(soc, + ta_peer, + wds_src_mac, + CDP_TXRX_AST_TYPE_WDS, + flags); + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_INFO, + "sa valid and nac roamed to wds"); break; } } @@ -214,6 +188,7 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, } } + if ((ast->type == CDP_TXRX_AST_TYPE_WDS_HM) || (ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)) return; @@ -262,8 +237,9 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, * for multicast loopback frames originated from connected * clients and looped back (intrabss) by Root AP */ - if (ast->pdev_id != ta_peer->vdev->pdev->pdev_id) + if (ast->pdev_id != ta_peer->vdev->pdev->pdev_id) { return; + } /* * Kickout, when direct associated peer(SA) roams @@ -300,7 +276,6 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, { uint16_t sa_sw_peer_id = hal_rx_msdu_end_sa_sw_peer_id_get(rx_tlv_hdr); uint8_t sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr); - uint8_t wds_src_mac[IEEE80211_ADDR_LEN]; uint16_t sa_idx; uint8_t is_chfrag_start = 0; uint8_t is_ad4_valid = 0; @@ -312,15 +287,13 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, if (is_chfrag_start) is_ad4_valid = hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr); - memcpy(wds_src_mac, (qdf_nbuf_data(nbuf) + IEEE80211_ADDR_LEN), - IEEE80211_ADDR_LEN); /* * Get the AST entry from HW SA index and mark it as active */ sa_idx = hal_rx_msdu_end_sa_idx_get(rx_tlv_hdr); - dp_rx_wds_add_or_update_ast(soc, ta_peer, wds_src_mac, is_ad4_valid, + dp_rx_wds_add_or_update_ast(soc, ta_peer, nbuf, is_ad4_valid, sa_is_valid, is_chfrag_start, sa_idx, sa_sw_peer_id); }