diff --git a/core/dp/txrx3.0/dp_fisa_rx.c b/core/dp/txrx3.0/dp_fisa_rx.c index 400781a8b294..14c221f45de7 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.c +++ b/core/dp/txrx3.0/dp_fisa_rx.c @@ -1003,16 +1003,19 @@ static int get_transport_payload_offset(struct dp_rx_fst *fisa_hdl, /** * get_transport_header_offset() - Get transport header offset * @fisa_flow: Handle to FISA sw flow entry - * @nbuf: Incoming nbuf, should have data pointing to ethernet hdr + * @rx_tlv_hdr: TLV hdr pointer * * Return: Offset value to transport header */ static int get_transport_header_offset(struct dp_fisa_rx_sw_ft *fisa_flow, - qdf_nbuf_t nbuf) + uint8_t *rx_tlv_hdr) { - return (fisa_flow->head_skb_ip_hdr_offset + - fisa_flow->head_skb_l4_hdr_offset); + uint32_t eth_hdr_len = HAL_RX_TLV_GET_IP_OFFSET(rx_tlv_hdr); + uint32_t ip_hdr_len = HAL_RX_TLV_GET_TCP_OFFSET(rx_tlv_hdr); + + /* ETHERNET_HDR_LEN + ip_hdr_len */ + return (eth_hdr_len + ip_hdr_len); } /** @@ -1038,7 +1041,7 @@ dp_rx_fisa_aggr_udp(struct dp_rx_fst *fisa_hdl, qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN + l2_hdr_offset); udp_hdr = (struct udphdr *)(qdf_nbuf_data(nbuf) + - get_transport_header_offset(fisa_flow, nbuf)); + get_transport_header_offset(fisa_flow, rx_tlv_hdr)); udp_len = qdf_ntohs(udp_hdr->len); @@ -1065,6 +1068,10 @@ dp_rx_fisa_aggr_udp(struct dp_rx_fst *fisa_hdl, fisa_flow->head_skb_udp_hdr = udp_hdr; fisa_flow->cur_aggr_gso_size = udp_len - sizeof(struct udphdr); fisa_flow->adjusted_cumulative_ip_length = udp_len; + fisa_flow->head_skb_ip_hdr_offset = + HAL_RX_TLV_GET_IP_OFFSET(rx_tlv_hdr); + fisa_flow->head_skb_l4_hdr_offset = + HAL_RX_TLV_GET_TCP_OFFSET(rx_tlv_hdr); fisa_flow->frags_cumulative_len = 0; @@ -1234,7 +1241,8 @@ dp_rx_fisa_flush_udp_flow(struct dp_vdev *vdev, head_skb_iph->ihl); head_skb_udp_hdr->len = - qdf_htons(qdf_ntohs(head_skb_iph->tot_len) - 20); + qdf_htons(qdf_ntohs(head_skb_iph->tot_len) - + fisa_flow->head_skb_l4_hdr_offset); head_skb_udp_hdr->check = pseudo; head_skb->csum_start = (u8 *)head_skb_udp_hdr - head_skb->head; head_skb->csum_offset = offsetof(struct udphdr, check); @@ -1503,10 +1511,6 @@ static int dp_add_nbuf_to_fisa_flow(struct dp_rx_fst *fisa_hdl, if (!fisa_flow->head_skb) { /* This is start of aggregation for the flow, save the offsets*/ - fisa_flow->head_skb_ip_hdr_offset = - HAL_RX_TLV_GET_IP_OFFSET(rx_tlv_hdr); - fisa_flow->head_skb_l4_hdr_offset = - HAL_RX_TLV_GET_TCP_OFFSET(rx_tlv_hdr); fisa_flow->napi_flush_cumulative_l4_checksum = 0; fisa_flow->cur_aggr = 0; }