qcacmn: add support for Secondary HMWDS ast entry

add support for Secondary HMWDS ast entry

Change-Id: Ibf77659cbc2d7e2b536736d89e747549e269e68c
CRs-Fixed: 2312270
This commit is contained in:
Tallapragada Kalyan
2018-08-24 16:34:12 +05:30
committed by nshrivas
parent 9da501e634
commit 5e3a39c8d3
5 changed files with 32 additions and 7 deletions

View File

@@ -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
};

View File

@@ -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);

View File

@@ -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;

View File

@@ -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(

View File

@@ -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");
}