From f6c061252fc8bde52a779b84b4715a7595fb3073 Mon Sep 17 00:00:00 2001 From: Chaitanya Kiran Godavarthi Date: Fri, 23 Nov 2018 23:24:05 +0530 Subject: [PATCH] qcacmn: Reduce ASE aging for MEC entry type ASE entry aging for MEC entry type was same as WDS type for 120 secs, this creates an issue when device roams from MEC to WDS connection by not aging out till 120secs. So now we reduce the MEC aging time to 1sec Change-Id: I6ab3b095a85c6d09f9fcd95b3b39f7152064d297 --- dp/wifi3.0/dp_main.c | 95 ++++++++++++++++++++++++++++++------------- dp/wifi3.0/dp_rx.c | 37 ++++++++++------- dp/wifi3.0/dp_types.h | 6 ++- 3 files changed, 94 insertions(+), 44 deletions(-) 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;