diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5b4b9e408534..8709190a94af 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -71,7 +71,12 @@ static void dp_ppdu_ring_reset(struct dp_pdev *pdev); static void dp_ppdu_ring_cfg(struct dp_pdev *pdev); #define DP_INTR_POLL_TIMER_MS 10 -#define DP_WDS_AGING_TIMER_DEFAULT_MS 120000 +/* Generic AST entry aging timer value */ +#define DP_AST_AGING_TIMER_DEFAULT_MS 1000 +/* WDS AST entry aging timer value */ +#define DP_WDS_AST_AGING_TIMER_DEFAULT_MS 120000 +#define DP_WDS_AST_AGING_TIMER_CNT \ +((DP_WDS_AST_AGING_TIMER_DEFAULT_MS / DP_AST_AGING_TIMER_DEFAULT_MS) - 1) #define DP_MCS_LENGTH (6*MAX_MCS) #define DP_NSS_LENGTH (6*SS_COUNT) #define DP_RXDMA_ERR_LENGTH (6*HAL_RXDMA_ERR_MAX) @@ -980,6 +985,12 @@ static void dp_print_ast_stats(struct dp_soc *soc) } #endif +/** + * dp_print_peer_table() - Dump all Peer stats + * @vdev: Datapath Vdev handle + * + * return void + */ static void dp_print_peer_table(struct dp_vdev *vdev) { struct dp_peer *peer = NULL; @@ -990,18 +1001,17 @@ static void dp_print_peer_table(struct dp_vdev *vdev) DP_PRINT_STATS("Invalid Peer"); return; } - DP_PRINT_STATS(" peer_mac_addr = %pM" - " nawds_enabled = %d" - " bss_peer = %d" - " wapi = %d" - " wds_enabled = %d" - " delete in progress = %d", - peer->mac_addr.raw, - peer->nawds_enabled, - peer->bss_peer, - peer->wapi, - peer->wds_enabled, - peer->delete_in_progress); + DP_PRINT_STATS(" peer_mac_addr = %pM nawds_enabled = %d", + peer->mac_addr.raw, + peer->nawds_enabled); + DP_PRINT_STATS(" bss_peer = %d wapi = %d wds_enabled = %d", + peer->bss_peer, + peer->wapi, + peer->wds_enabled); + + DP_PRINT_STATS(" delete in progress = %d peer id = %d", + peer->delete_in_progress, + peer->peer_ids[0]); } } @@ -1976,14 +1986,14 @@ static void dp_hw_link_desc_pool_cleanup(struct dp_soc *soc) #endif /* IPA_OFFLOAD */ /* - * dp_wds_aging_timer_fn() - Timer callback function for WDS aging + * dp_ast_aging_timer_fn() - Timer callback function for WDS aging * @soc: Datapath SOC handle * * This is a timer function used to age out stale AST nodes from * AST table */ #ifdef FEATURE_WDS -static void dp_wds_aging_timer_fn(void *soc_hdl) +static void dp_ast_aging_timer_fn(void *soc_hdl) { struct dp_soc *soc = (struct dp_soc *) soc_hdl; struct dp_pdev *pdev; @@ -1991,7 +2001,12 @@ static void dp_wds_aging_timer_fn(void *soc_hdl) struct dp_peer *peer; struct dp_ast_entry *ase, *temp_ase; int i; + bool check_wds_ase = false; + if (soc->wds_ast_aging_timer_cnt++ >= DP_WDS_AST_AGING_TIMER_CNT) { + soc->wds_ast_aging_timer_cnt = 0; + check_wds_ase = true; + } qdf_spin_lock_bh(&soc->ast_lock); for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) { @@ -2006,16 +2021,38 @@ static void dp_wds_aging_timer_fn(void *soc_hdl) */ if (ase->type != CDP_TXRX_AST_TYPE_WDS && - ase->type != CDP_TXRX_AST_TYPE_MEC) + ase->type != + CDP_TXRX_AST_TYPE_MEC && + ase->type != + CDP_TXRX_AST_TYPE_DA) continue; - if (ase->is_active) { + /* Expire MEC entry every n sec. + * This needs to be expired in + * case if STA backbone is made as + * AP backbone, In this case it needs + * to be re-added as a WDS entry. + */ + if (ase->is_active && ase->type == + CDP_TXRX_AST_TYPE_MEC) { + ase->is_active = FALSE; + continue; + } else if (ase->is_active && + check_wds_ase) { ase->is_active = FALSE; continue; } - DP_STATS_INC(soc, ast.aged_out, 1); - dp_peer_del_ast(soc, ase); + if (ase->type == + CDP_TXRX_AST_TYPE_MEC) { + DP_STATS_INC(soc, + ast.aged_out, 1); + dp_peer_del_ast(soc, ase); + } else if (check_wds_ase) { + DP_STATS_INC(soc, + ast.aged_out, 1); + dp_peer_del_ast(soc, ase); + } } } } @@ -2025,7 +2062,8 @@ static void dp_wds_aging_timer_fn(void *soc_hdl) qdf_spin_unlock_bh(&soc->ast_lock); if (qdf_atomic_read(&soc->cmn_init_done)) - qdf_timer_mod(&soc->wds_aging_timer, DP_WDS_AGING_TIMER_DEFAULT_MS); + qdf_timer_mod(&soc->ast_aging_timer, + DP_AST_AGING_TIMER_DEFAULT_MS); } @@ -2037,11 +2075,12 @@ static void dp_wds_aging_timer_fn(void *soc_hdl) */ static void dp_soc_wds_attach(struct dp_soc *soc) { - qdf_timer_init(soc->osdev, &soc->wds_aging_timer, - dp_wds_aging_timer_fn, (void *)soc, - QDF_TIMER_TYPE_WAKE_APPS); + soc->wds_ast_aging_timer_cnt = 0; + qdf_timer_init(soc->osdev, &soc->ast_aging_timer, + dp_ast_aging_timer_fn, (void *)soc, + QDF_TIMER_TYPE_WAKE_APPS); - qdf_timer_mod(&soc->wds_aging_timer, DP_WDS_AGING_TIMER_DEFAULT_MS); + qdf_timer_mod(&soc->ast_aging_timer, DP_AST_AGING_TIMER_DEFAULT_MS); } /* @@ -2052,8 +2091,8 @@ static void dp_soc_wds_attach(struct dp_soc *soc) */ static void dp_soc_wds_detach(struct dp_soc *soc) { - qdf_timer_stop(&soc->wds_aging_timer); - qdf_timer_free(&soc->wds_aging_timer); + qdf_timer_stop(&soc->ast_aging_timer); + qdf_timer_free(&soc->ast_aging_timer); } #else static void dp_soc_wds_attach(struct dp_soc *soc) @@ -7435,9 +7474,9 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle, break; case CDP_CFG_WDS_AGING_TIMER: if (val == 0) - qdf_timer_stop(&vdev->pdev->soc->wds_aging_timer); + qdf_timer_stop(&vdev->pdev->soc->ast_aging_timer); else if (val != vdev->wds_aging_timer_val) - qdf_timer_mod(&vdev->pdev->soc->wds_aging_timer, val); + qdf_timer_mod(&vdev->pdev->soc->ast_aging_timer, val); vdev->wds_aging_timer_val = val; break; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 5598d5c64c0d..6c0c02d072ca 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -343,7 +343,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc, * * @soc: core txrx main context * @rx_tlv_hdr : start address of rx tlvs - * @sa_peer : source peer entry + * @ta_peer : Transmitter peer entry * @nbuf : nbuf to retrieve destination mac for which AST will be added * */ @@ -384,7 +384,7 @@ dp_rx_da_learn(struct dp_soc *soc, * dp_rx_intrabss_fwd() - Implements the Intra-BSS forwarding logic * * @soc: core txrx main context - * @sa_peer : source peer entry + * @ta_peer : source peer entry * @rx_tlv_hdr : start address of rx tlvs * @nbuf : nbuf that has to be intrabss forwarded * @@ -392,7 +392,7 @@ dp_rx_da_learn(struct dp_soc *soc, */ static bool dp_rx_intrabss_fwd(struct dp_soc *soc, - struct dp_peer *sa_peer, + struct dp_peer *ta_peer, uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf) { @@ -424,8 +424,14 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, if (!da_peer) return false; + /* TA peer cannot be same as peer(DA) on which AST is present + * this indicates a change in topology and that AST entries + * are yet to be updated. + */ + if (da_peer == ta_peer) + return false; - if (da_peer->vdev == sa_peer->vdev && !da_peer->bss_peer) { + if (da_peer->vdev == ta_peer->vdev && !da_peer->bss_peer) { memset(nbuf->cb, 0x0, sizeof(nbuf->cb)); len = qdf_nbuf_len(nbuf); @@ -438,7 +444,7 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, nbuf = qdf_nbuf_unshare(nbuf); if (!nbuf) { - DP_STATS_INC_PKT(sa_peer, + DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, len); @@ -451,13 +457,13 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, } } - if (!dp_tx_send(sa_peer->vdev, nbuf)) { - DP_STATS_INC_PKT(sa_peer, rx.intra_bss.pkts, - 1, len); + if (!dp_tx_send(ta_peer->vdev, nbuf)) { + DP_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1, + len); return true; } else { - DP_STATS_INC_PKT(sa_peer, rx.intra_bss.fail, 1, - len); + DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, + len); return false; } } @@ -471,18 +477,19 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, * Mcast enhancement. */ else if (qdf_unlikely((hal_rx_msdu_end_da_is_mcbc_get(rx_tlv_hdr) && - !sa_peer->bss_peer))) { + !ta_peer->bss_peer))) { nbuf_copy = qdf_nbuf_copy(nbuf); if (!nbuf_copy) return false; memset(nbuf_copy->cb, 0x0, sizeof(nbuf_copy->cb)); len = qdf_nbuf_len(nbuf_copy); - if (dp_tx_send(sa_peer->vdev, nbuf_copy)) { - DP_STATS_INC_PKT(sa_peer, rx.intra_bss.fail, 1, len); + if (dp_tx_send(ta_peer->vdev, nbuf_copy)) { + DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, len); qdf_nbuf_free(nbuf_copy); - } else - DP_STATS_INC_PKT(sa_peer, rx.intra_bss.pkts, 1, len); + } else { + DP_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1, len); + } } /* return false as we have to still send the original pkt * up the stack diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 5053e3a6379c..8750e1f81eb4 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -896,7 +896,11 @@ struct dp_soc { } ast_hash; qdf_spinlock_t ast_lock; - qdf_timer_t wds_aging_timer; + /*Timer for AST entry ageout maintainance */ + qdf_timer_t ast_aging_timer; + + /*Timer counter for WDS AST entry ageout*/ + uint8_t wds_ast_aging_timer_cnt; /*interrupt timer*/ qdf_timer_t mon_reap_timer;