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
This commit is contained in:
@@ -197,9 +197,7 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
soc = vdev->pdev->soc;
|
soc = vdev->pdev->soc;
|
||||||
qdf_spin_lock_bh(&soc->peer_ref_mutex);
|
peer = vdev->vap_bss_peer;
|
||||||
peer = TAILQ_FIRST(&vdev->peer_list);
|
|
||||||
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
|
|
||||||
|
|
||||||
if (!peer) {
|
if (!peer) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
|
||||||
|
@@ -34,48 +34,6 @@ dp_rx_da_learn(struct dp_soc *soc,
|
|||||||
qdf_nbuf_t nbuf);
|
qdf_nbuf_t nbuf);
|
||||||
|
|
||||||
void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status);
|
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
|
#ifdef FEATURE_WDS
|
||||||
static inline bool dp_tx_da_search_override(struct dp_vdev *vdev)
|
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
|
static inline void
|
||||||
dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
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,
|
uint8_t is_sa_valid, uint8_t is_chfrag_start,
|
||||||
uint16_t sa_idx, uint16_t sa_sw_peer_id)
|
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;
|
uint32_t ret = 0;
|
||||||
struct dp_neighbour_peer *neighbour_peer = NULL;
|
struct dp_neighbour_peer *neighbour_peer = NULL;
|
||||||
struct dp_pdev *pdev = ta_peer->vdev->pdev;
|
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
|
/* For AP mode : Do wds source port learning only if it is a
|
||||||
* 4-address mpdu
|
* 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)) {
|
if (qdf_unlikely(!is_sa_valid)) {
|
||||||
ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac,
|
qdf_mem_copy(wds_src_mac,
|
||||||
CDP_TXRX_AST_TYPE_WDS, flags);
|
(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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,11 +140,17 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
|||||||
* cached.
|
* cached.
|
||||||
*/
|
*/
|
||||||
if (!soc->ast_override_support) {
|
if (!soc->ast_override_support) {
|
||||||
ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac,
|
qdf_mem_copy(wds_src_mac,
|
||||||
CDP_TXRX_AST_TYPE_WDS, flags);
|
(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;
|
return;
|
||||||
}
|
} else {
|
||||||
if (soc->ast_override_support) {
|
|
||||||
/* In HKv2 smart monitor case, when NAC client is
|
/* In HKv2 smart monitor case, when NAC client is
|
||||||
* added first and this client roams within BSS to
|
* added first and this client roams within BSS to
|
||||||
* connect to RE, since we have an AST entry for
|
* connect to RE, since we have an AST entry for
|
||||||
@@ -187,22 +159,24 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
|||||||
* to FW.
|
* to FW.
|
||||||
*/
|
*/
|
||||||
if (pdev->neighbour_peers_added) {
|
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);
|
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
|
||||||
TAILQ_FOREACH(neighbour_peer,
|
TAILQ_FOREACH(neighbour_peer,
|
||||||
&pdev->neighbour_peers_list,
|
&pdev->neighbour_peers_list,
|
||||||
neighbour_peer_list_elem) {
|
neighbour_peer_list_elem) {
|
||||||
if (!qdf_mem_cmp(&neighbour_peer->
|
if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr,
|
||||||
neighbour_peers_macaddr
|
wds_src_mac,
|
||||||
, wds_src_mac,
|
|
||||||
QDF_MAC_ADDR_SIZE)) {
|
QDF_MAC_ADDR_SIZE)) {
|
||||||
ret = dp_peer_add_ast
|
ret = dp_peer_add_ast(soc,
|
||||||
(soc,
|
|
||||||
ta_peer,
|
ta_peer,
|
||||||
wds_src_mac,
|
wds_src_mac,
|
||||||
CDP_TXRX_AST_TYPE_WDS,
|
CDP_TXRX_AST_TYPE_WDS,
|
||||||
flags);
|
flags);
|
||||||
QDF_TRACE
|
QDF_TRACE(QDF_MODULE_ID_DP,
|
||||||
(QDF_MODULE_ID_DP,
|
|
||||||
QDF_TRACE_LEVEL_INFO,
|
QDF_TRACE_LEVEL_INFO,
|
||||||
"sa valid and nac roamed to wds");
|
"sa valid and nac roamed to wds");
|
||||||
break;
|
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) ||
|
if ((ast->type == CDP_TXRX_AST_TYPE_WDS_HM) ||
|
||||||
(ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC))
|
(ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC))
|
||||||
return;
|
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
|
* for multicast loopback frames originated from connected
|
||||||
* clients and looped back (intrabss) by Root AP
|
* 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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kickout, when direct associated peer(SA) roams
|
* 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);
|
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 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;
|
uint16_t sa_idx;
|
||||||
uint8_t is_chfrag_start = 0;
|
uint8_t is_chfrag_start = 0;
|
||||||
uint8_t is_ad4_valid = 0;
|
uint8_t is_ad4_valid = 0;
|
||||||
@@ -312,15 +287,13 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
|||||||
if (is_chfrag_start)
|
if (is_chfrag_start)
|
||||||
is_ad4_valid = hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr);
|
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
|
* 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);
|
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_is_valid, is_chfrag_start,
|
||||||
sa_idx, sa_sw_peer_id);
|
sa_idx, sa_sw_peer_id);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user