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
This commit is contained in:

committed by
nshrivas

부모
74c34ff6b0
커밋
f6c061252f
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user