From 64522cfa38654de31cb0fff3832a8404cb953358 Mon Sep 17 00:00:00 2001 From: Rakesh Pillai Date: Thu, 22 Oct 2020 18:41:44 +0530 Subject: [PATCH] qcacld-3.0: Use reo dst indication in CMEM based HW FT entry Currently we configure the REO ID in the HW FST entry, which is later used by HW to route the packets matching this particular flow. Such a kind of configuration can lead to incorrect routing of packets incase the RX path mapping is changed (eg when IPA is enabled). Hence to fix this issue, use the reo destination indication which is received in the first packet of the new flow in the HW FST entry. Change-Id: Ide230dcfb07862b3921aeb02d83ad7c30cb284c2 CRs-Fixed: 2803828 --- core/dp/txrx3.0/dp_fisa_rx.c | 16 ++++++++++++---- core/dp/txrx3.0/dp_fisa_rx.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/dp/txrx3.0/dp_fisa_rx.c b/core/dp/txrx3.0/dp_fisa_rx.c index c82e01cff870..677edf407532 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.c +++ b/core/dp/txrx3.0/dp_fisa_rx.c @@ -286,8 +286,7 @@ dp_rx_fisa_setup_cmem_fse(struct dp_rx_fst *fisa_hdl, uint32_t hashed_flow_idx, fisa_hdl->base)[hashed_flow_idx]); sw_ft_entry->metadata = ++fisa_hdl->meta_counter; - /* REO destination index starts from 1 */ - flow.reo_destination_indication = flow_steer_info + 1; + flow.reo_destination_indication = flow_steer_info; flow.fse_metadata = sw_ft_entry->metadata; flow.tuple_info.dest_ip_127_96 = rx_flow_info->dest_ip_127_96; flow.tuple_info.dest_ip_95_64 = rx_flow_info->dest_ip_95_64; @@ -552,10 +551,12 @@ dp_fisa_rx_delete_flow(struct dp_rx_fst *fisa_hdl, /* Add HW FT entry */ sw_ft_entry->cmem_offset = dp_rx_fisa_setup_cmem_fse( fisa_hdl, hashed_flow_idx, - &elem->flow_tuple_info, elem->reo_id); + &elem->flow_tuple_info, + elem->reo_dest_indication); sw_ft_entry->is_populated = true; sw_ft_entry->napi_id = elem->reo_id; + sw_ft_entry->reo_dest_indication = elem->reo_dest_indication; qdf_mem_copy(&sw_ft_entry->rx_flow_tuple_info, &elem->flow_tuple_info, sizeof(struct cdp_rx_flow_tuple_info)); @@ -613,6 +614,7 @@ static void dp_fisa_rx_fst_update(struct dp_rx_fst *fisa_hdl, uint32_t lru_ft_entry_time = 0xffffffff; uint32_t lru_ft_entry_idx = 0; uint32_t timestamp; + uint32_t reo_dest_indication; /* Get the hash from TLV * FSE FT Toeplitz hash is same Common parser hash available in TLV @@ -623,6 +625,7 @@ static void dp_fisa_rx_fst_update(struct dp_rx_fst *fisa_hdl, hashed_flow_idx = flow_hash & fisa_hdl->hash_mask; max_skid_length = fisa_hdl->max_skid_length; rx_flow_tuple_info = &elem->flow_tuple_info; + reo_dest_indication = elem->reo_dest_indication; dp_fisa_debug("flow_hash 0x%x hashed_flow_idx 0x%x", flow_hash, hashed_flow_idx); @@ -643,9 +646,10 @@ static void dp_fisa_rx_fst_update(struct dp_rx_fst *fisa_hdl, dp_rx_fisa_setup_cmem_fse(fisa_hdl, hashed_flow_idx, rx_flow_tuple_info, - elem->reo_id); + reo_dest_indication); sw_ft_entry->is_populated = true; sw_ft_entry->napi_id = elem->reo_id; + sw_ft_entry->reo_dest_indication = reo_dest_indication; qdf_mem_copy(&sw_ft_entry->rx_flow_tuple_info, rx_flow_tuple_info, sizeof(struct cdp_rx_flow_tuple_info)); @@ -787,6 +791,7 @@ dp_fisa_rx_queue_fst_update_work(struct dp_rx_fst *fisa_hdl, uint32_t flow_idx, struct dp_fisa_rx_fst_update_elem *elem; struct dp_fisa_rx_sw_ft *sw_ft_entry; uint32_t hashed_flow_idx; + uint32_t reo_dest_indication; bool found; is_flow_tcp = HAL_RX_TLV_GET_TCP_PROTO(rx_tlv_hdr); @@ -798,6 +803,8 @@ dp_fisa_rx_queue_fst_update_work(struct dp_rx_fst *fisa_hdl, uint32_t flow_idx, return NULL; } + hal_rx_msdu_get_reo_destination_indication(hal_soc_hdl, rx_tlv_hdr, + &reo_dest_indication); qdf_spin_lock_bh(&fisa_hdl->dp_rx_fst_lock); found = dp_fisa_rx_is_fst_work_queued(fisa_hdl, flow_idx); qdf_spin_unlock_bh(&fisa_hdl->dp_rx_fst_lock); @@ -827,6 +834,7 @@ dp_fisa_rx_queue_fst_update_work(struct dp_rx_fst *fisa_hdl, uint32_t flow_idx, elem->is_tcp_flow = is_flow_tcp; elem->is_udp_flow = is_flow_udp; elem->reo_id = QDF_NBUF_CB_RX_CTX_ID(nbuf); + elem->reo_dest_indication = reo_dest_indication; elem->vdev = vdev; qdf_spin_lock_bh(&fisa_hdl->dp_rx_fst_lock); diff --git a/core/dp/txrx3.0/dp_fisa_rx.h b/core/dp/txrx3.0/dp_fisa_rx.h index 7b19963955d3..dc60d7868f59 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.h +++ b/core/dp/txrx3.0/dp_fisa_rx.h @@ -44,6 +44,7 @@ struct dp_fisa_rx_fst_update_elem { struct cdp_rx_flow_tuple_info flow_tuple_info; struct dp_vdev *vdev; uint32_t flow_idx; + uint32_t reo_dest_indication; bool is_tcp_flow; bool is_udp_flow; u8 reo_id;