From 5e3a39c8d3e51dfd7adc5b20e38bdf4062396537 Mon Sep 17 00:00:00 2001 From: Tallapragada Kalyan Date: Fri, 24 Aug 2018 16:34:12 +0530 Subject: [PATCH] qcacmn: add support for Secondary HMWDS ast entry add support for Secondary HMWDS ast entry Change-Id: Ibf77659cbc2d7e2b536736d89e747549e269e68c CRs-Fixed: 2312270 --- dp/inc/cdp_txrx_cmn_struct.h | 1 + dp/wifi3.0/dp_main.c | 3 ++- dp/wifi3.0/dp_peer.c | 25 +++++++++++++++++++++---- dp/wifi3.0/dp_rx.h | 7 ++++++- dp/wifi3.0/dp_tx.c | 3 ++- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 5b1266136049..d717a0c6aa49 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -314,6 +314,7 @@ enum cdp_txrx_ast_entry_type { CDP_TXRX_AST_TYPE_WDS_HM, /* HM WDS entry */ CDP_TXRX_AST_TYPE_STA_BSS, /* BSS entry(STA mode) */ CDP_TXRX_AST_TYPE_DA, /* AST entry based on Destination address */ + CDP_TXRX_AST_TYPE_WDS_HM_SEC, /* HM WDS entry for secondary radio */ CDP_TXRX_AST_TYPE_MAX }; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 2bbf5751f2d7..174e2cea9470 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -872,7 +872,8 @@ static void dp_print_ast_stats(struct dp_soc *soc) struct dp_peer *peer; struct dp_ast_entry *ase, *tmp_ase; char type[CDP_TXRX_AST_TYPE_MAX][10] = { - "NONE", "STATIC", "SELF", "WDS", "MEC", "HMWDS", "BSS", "DA"}; + "NONE", "STATIC", "SELF", "WDS", "MEC", "HMWDS", "BSS", + "DA", "HMWDS_SEC"}; DP_PRINT_STATS("AST Stats:"); DP_PRINT_STATS(" Entries Added = %d", soc->stats.ast.added); diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 6f0767fdb039..5b902eb1c157 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -502,6 +502,15 @@ int dp_peer_add_ast(struct dp_soc *soc, qdf_spin_lock_bh(&soc->ast_lock); + /* For HMWDS and HWMWDS_SEC entries can be added for same mac address + * do not check for existing entry + * SON takes care of deleting any existing AST entry with other types + * before adding HMWDS entries + */ + if ((type == CDP_TXRX_AST_TYPE_WDS_HM) || + (type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)) + goto add_ast_entry; + /* If AST entry already exists , just return from here * ast entry with same mac address can exist on different radios * if ast_override support is enabled use search by pdev in this @@ -548,6 +557,7 @@ int dp_peer_add_ast(struct dp_soc *soc, } } +add_ast_entry: ast_entry = (struct dp_ast_entry *) qdf_mem_malloc(sizeof(struct dp_ast_entry)); @@ -583,6 +593,10 @@ int dp_peer_add_ast(struct dp_soc *soc, ast_entry->next_hop = 1; ast_entry->type = CDP_TXRX_AST_TYPE_WDS_HM; break; + case CDP_TXRX_AST_TYPE_WDS_HM_SEC: + ast_entry->next_hop = 1; + ast_entry->type = CDP_TXRX_AST_TYPE_WDS_HM_SEC; + break; case CDP_TXRX_AST_TYPE_MEC: ast_entry->next_hop = 1; ast_entry->type = CDP_TXRX_AST_TYPE_MEC; @@ -610,7 +624,8 @@ int dp_peer_add_ast(struct dp_soc *soc, if ((ast_entry->type != CDP_TXRX_AST_TYPE_STATIC) && (ast_entry->type != CDP_TXRX_AST_TYPE_SELF) && - (ast_entry->type != CDP_TXRX_AST_TYPE_STA_BSS)) { + (ast_entry->type != CDP_TXRX_AST_TYPE_STA_BSS) && + (ast_entry->type != CDP_TXRX_AST_TYPE_WDS_HM_SEC)) { if (QDF_STATUS_SUCCESS == soc->cdp_soc.ol_ops->peer_add_wds_entry( peer->vdev->osif_vdev, @@ -658,7 +673,8 @@ void dp_peer_del_ast(struct dp_soc *soc, struct dp_ast_entry *ast_entry) { struct dp_peer *peer = ast_entry->peer; - if (ast_entry->next_hop) + if (ast_entry->next_hop && + ast_entry->type != CDP_TXRX_AST_TYPE_WDS_HM_SEC) soc->cdp_soc.ol_ops->peer_del_wds_entry(peer->vdev->osif_vdev, ast_entry->mac_addr.raw); @@ -695,8 +711,9 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer, struct dp_peer *old_peer; if ((ast_entry->type == CDP_TXRX_AST_TYPE_STATIC) || - (ast_entry->type == CDP_TXRX_AST_TYPE_SELF) || - (ast_entry->type == CDP_TXRX_AST_TYPE_STA_BSS)) + (ast_entry->type == CDP_TXRX_AST_TYPE_SELF) || + (ast_entry->type == CDP_TXRX_AST_TYPE_STA_BSS) || + (ast_entry->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)) return 0; old_peer = ast_entry->peer; diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 63e9b14fc280..f87cf6f48d03 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -451,6 +451,10 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, qdf_spin_unlock_bh(&soc->ast_lock); + if ((ast->type == CDP_TXRX_AST_TYPE_WDS_HM) || + (ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)) + return; + /* * Ensure we are updating the right AST entry by * validating ast_idx. @@ -492,7 +496,8 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, * Kickout, when direct associated peer(SA) roams * to another AP and reachable via TA peer */ - if (!sa_peer->delete_in_progress) { + if ((sa_peer->vdev->opmode == wlan_op_mode_ap) && + !sa_peer->delete_in_progress) { sa_peer->delete_in_progress = true; if (soc->cdp_soc.ol_ops->peer_sta_kickout) { soc->cdp_soc.ol_ops->peer_sta_kickout( diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 9c95a0478809..1ea9b097a4e2 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1848,7 +1848,8 @@ qdf_nbuf_t dp_tx_send_exception(void *vap_dev, qdf_nbuf_t nbuf, /* Mcast enhancement*/ if (qdf_unlikely(vdev->mcast_enhancement_en > 0)) { - if (DP_FRAME_IS_MULTICAST((eh)->ether_dhost)) { + if (DP_FRAME_IS_MULTICAST((eh)->ether_dhost) && + !DP_FRAME_IS_BROADCAST((eh)->ether_dhost)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "Ignoring mcast_enhancement_en which is set and sending the mcast packet to the FW"); }