From ebc572b89c95f701e9dde9de0f75b636a90125c1 Mon Sep 17 00:00:00 2001 From: Jinwei Chen Date: Thu, 7 Sep 2023 19:44:05 -0700 Subject: [PATCH] qcacmn: Support RX MPDU sequence logging from DP tcp_seq_num and tcp_ack_num in qdf_nbuf_cb is not used for Beryllium, repurpose them to store RX MPDU sequence number. get RX mpdu sequence number from DP and store it in qdf_nbuf_cb for logging later. Change-Id: I3c21b383d827f12a1e1ec6202a5fc17804dddc1b CRs-Fixed: 3610468 --- dp/wifi3.0/be/dp_be_rx.c | 1 + dp/wifi3.0/be/dp_be_rx.h | 12 ++++++++++++ dp/wifi3.0/dp_rx.c | 12 ++++++------ qdf/inc/i_qdf_nbuf_api_m.h | 11 +++++++++++ qdf/inc/i_qdf_nbuf_api_w.h | 5 +++++ qdf/linux/src/i_qdf_nbuf_m.h | 31 +++++++++++++++++++++++++------ qdf/linux/src/qdf_trace.c | 10 +++++----- 7 files changed, 65 insertions(+), 17 deletions(-) diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 7d1353af8e..11caae0934 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -516,6 +516,7 @@ done: rx_tlv_hdr = qdf_nbuf_data(nbuf); vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); peer_id = dp_rx_get_peer_id_be(nbuf); + dp_rx_set_mpdu_seq_number_be(nbuf, rx_tlv_hdr); if (dp_rx_is_list_ready(deliver_list_head, vdev, txrx_peer, peer_id, vdev_id)) { diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index 0e1807dbee..9a20f3fd73 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -666,6 +666,13 @@ dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata) } #endif /* DP_MLO_LINK_STATS_SUPPORT */ +static inline void +dp_rx_set_mpdu_seq_number_be(qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr) +{ + QDF_NBUF_CB_RX_MPDU_SEQ_NUM(nbuf) = + hal_rx_mpdu_sequence_number_get_be(rx_tlv_hdr); +} + static inline void dp_rx_set_link_id_be(qdf_nbuf_t nbuf, uint32_t peer_mdata) { @@ -792,6 +799,11 @@ dp_rx_set_link_id_be(qdf_nbuf_t nbuf, uint32_t peer_mdata) { } +static inline void +dp_rx_set_mpdu_seq_number_be(qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr) +{ +} + static inline uint16_t dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) { diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 218f4008d8..bf954485d9 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1706,19 +1706,21 @@ void dp_rx_process_invalid_peer_wrapper(struct dp_soc *soc, * dp_rx_print_offload_info() - Print offload info from RX TLV * @soc: dp soc handle * @msdu: MSDU for which the offload info is to be printed + * @ofl_info: offload info saved in hal_offload_info structure * * Return: None */ static void dp_rx_print_offload_info(struct dp_soc *soc, - qdf_nbuf_t msdu) + qdf_nbuf_t msdu, + struct hal_offload_info *ofl_info) { dp_verbose_debug("----------------------RX DESC LRO/GRO----------------------"); dp_verbose_debug("lro_eligible 0x%x", QDF_NBUF_CB_RX_LRO_ELIGIBLE(msdu)); dp_verbose_debug("pure_ack 0x%x", QDF_NBUF_CB_RX_TCP_PURE_ACK(msdu)); dp_verbose_debug("chksum 0x%x", QDF_NBUF_CB_RX_TCP_CHKSUM(msdu)); - dp_verbose_debug("TCP seq num 0x%x", QDF_NBUF_CB_RX_TCP_SEQ_NUM(msdu)); - dp_verbose_debug("TCP ack num 0x%x", QDF_NBUF_CB_RX_TCP_ACK_NUM(msdu)); + dp_verbose_debug("TCP seq num 0x%x", ofl_info->tcp_seq_num); + dp_verbose_debug("TCP ack num 0x%x", ofl_info->tcp_ack_num); dp_verbose_debug("TCP window 0x%x", QDF_NBUF_CB_RX_TCP_WIN(msdu)); dp_verbose_debug("TCP protocol 0x%x", QDF_NBUF_CB_RX_TCP_PROTO(msdu)); dp_verbose_debug("TCP offset 0x%x", QDF_NBUF_CB_RX_TCP_OFFSET(msdu)); @@ -1744,15 +1746,13 @@ void dp_rx_fill_gro_info(struct dp_soc *soc, uint8_t *rx_tlv, QDF_NBUF_CB_RX_TCP_CHKSUM(msdu) = hal_rx_tlv_get_tcp_chksum(soc->hal_soc, rx_tlv); - QDF_NBUF_CB_RX_TCP_SEQ_NUM(msdu) = offload_info.tcp_seq_num; - QDF_NBUF_CB_RX_TCP_ACK_NUM(msdu) = offload_info.tcp_ack_num; QDF_NBUF_CB_RX_TCP_WIN(msdu) = offload_info.tcp_win; QDF_NBUF_CB_RX_TCP_PROTO(msdu) = offload_info.tcp_proto; QDF_NBUF_CB_RX_IPV6_PROTO(msdu) = offload_info.ipv6_proto; QDF_NBUF_CB_RX_TCP_OFFSET(msdu) = offload_info.tcp_offset; QDF_NBUF_CB_RX_FLOW_ID(msdu) = offload_info.flow_id; - dp_rx_print_offload_info(soc, msdu); + dp_rx_print_offload_info(soc, msdu, &offload_info); } #endif /* RECEIVE_OFFLOAD */ diff --git a/qdf/inc/i_qdf_nbuf_api_m.h b/qdf/inc/i_qdf_nbuf_api_m.h index 5b785a1577..b5ec2834d0 100644 --- a/qdf/inc/i_qdf_nbuf_api_m.h +++ b/qdf/inc/i_qdf_nbuf_api_m.h @@ -154,6 +154,17 @@ static inline uint8_t qdf_nbuf_get_lmac_id(qdf_nbuf_t buf) return QDF_NBUF_CB_RX_PACKET_LMAC_ID(buf); } +/** + * qdf_nbuf_get_mpdu_seq_num() - get MPDU sequence number + * @buf: Network buffer + * + * Return: mpdu sequence number value + */ +static inline uint16_t qdf_nbuf_get_mpdu_seq_num(qdf_nbuf_t buf) +{ + return QDF_NBUF_CB_RX_MPDU_SEQ_NUM(buf); +} + /** * qdf_nbuf_set_rx_ipa_smmu_map() - set ipa smmu mapped flag * @buf: Network buffer diff --git a/qdf/inc/i_qdf_nbuf_api_w.h b/qdf/inc/i_qdf_nbuf_api_w.h index 0cc045e539..e24347d1ba 100644 --- a/qdf/inc/i_qdf_nbuf_api_w.h +++ b/qdf/inc/i_qdf_nbuf_api_w.h @@ -265,6 +265,11 @@ static inline uint8_t qdf_nbuf_get_lmac_id(qdf_nbuf_t buf) return 0; } +static inline uint16_t qdf_nbuf_get_mpdu_seq_num(qdf_nbuf_t buf) +{ + return 0; +} + /** * qdf_nbuf_tx_set_band() - Set band in nbuf cb * @nbuf: nbuf pointer diff --git a/qdf/linux/src/i_qdf_nbuf_m.h b/qdf/linux/src/i_qdf_nbuf_m.h index 760dd215fe..67a3f08bc9 100644 --- a/qdf/linux/src/i_qdf_nbuf_m.h +++ b/qdf/linux/src/i_qdf_nbuf_m.h @@ -75,8 +75,12 @@ * @u.rx.dev.priv_cb_m.to_ds: to DS bit in RX packet * @u.rx.dev.priv_cb_m.logical_link_id: link id of RX packet * @u.rx.dev.priv_cb_m.reserved1: reserved bits - * @u.rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number - * @u.rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number + * @u.rx.dev.priv_cb_m.dp_ext: Union of tcp and ext structs + * @u.rx.dev.priv_cb_m.dp_ext.tcp: TCP structs + * @u.rx.dev.priv_cb_m.dp_ext.tcp.tcp_seq_num: TCP sequence number + * @u.rx.dev.priv_cb_m.dp_ext.tcp.tcp_ack_num: TCP ACK number + * @u.rx.dev.priv_cb_m.dp_ext.ext: Extension struct for other usage + * @u.rx.dev.priv_cb_m.dp_ext.ext.mpdu_seq: wifi MPDU sequence number * @u.rx.dev.priv_cb_m.dp: Union of wifi3 and wifi2 structs * @u.rx.dev.priv_cb_m.dp.wifi3: wifi3 data * @u.rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet @@ -219,8 +223,17 @@ struct qdf_nbuf_cb { logical_link_id:4, band:3, reserved1:7; - uint32_t tcp_seq_num; - uint32_t tcp_ack_num; + union { + struct { + uint32_t tcp_seq_num; + uint32_t tcp_ack_num; + } tcp; + struct { + uint32_t mpdu_seq:12, + reserved:20; + uint32_t reserved1; + } ext; + } dp_ext; union { struct { uint16_t msdu_len; @@ -542,9 +555,15 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) = 0) #define QDF_NBUF_CB_RX_TCP_SEQ_NUM(skb) \ - (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.tcp_seq_num) + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + dp_ext.tcp.tcp_seq_num) #define QDF_NBUF_CB_RX_TCP_ACK_NUM(skb) \ - (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.tcp_ack_num) + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + dp_ext.tcp.tcp_ack_num) +#define QDF_NBUF_CB_RX_MPDU_SEQ_NUM(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + dp_ext.ext.mpdu_seq) + #define QDF_NBUF_CB_RX_LRO_CTX(skb) \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx) diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 5588340cb1..d085a8cbf8 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -1524,7 +1524,7 @@ static bool qdf_log_icmpv6_pkt(uint8_t vdev_id, struct sk_buff *skb, cmn_info.type = QDF_PROTO_TYPE_ICMPv6; cmn_info.subtype = subtype; cmn_info.proto_priv_data = 0; - cmn_info.mpdu_seq = 0xFF; + cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb); DPTRACE(qdf_dp_trace_proto_pkt( QDF_DP_TRACE_ICMPv6_PACKET_RECORD, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), @@ -1590,7 +1590,7 @@ static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb, cmn_info.proto_priv_data |= (uint32_t)seq_num; cmn_info.type = QDF_PROTO_TYPE_ICMP; cmn_info.vdev_id = vdev_id; - cmn_info.mpdu_seq = 0xFF; + cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb); if (QDF_TX == dir) QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; @@ -1894,7 +1894,7 @@ static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb, cmn_info.type = QDF_PROTO_TYPE_EAPOL; cmn_info.subtype = subtype; cmn_info.proto_priv_data = 0; - cmn_info.mpdu_seq = 0xFF; + cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb); DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD, skb->data + QDF_NBUF_SRC_MAC_OFFSET, @@ -1979,7 +1979,7 @@ static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb, cmn_info.type = QDF_PROTO_TYPE_DHCP; cmn_info.subtype = subtype; cmn_info.proto_priv_data = 0; - cmn_info.mpdu_seq = 0xFF; + cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb); DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD, skb->data + QDF_NBUF_SRC_MAC_OFFSET, @@ -2043,7 +2043,7 @@ static bool qdf_log_arp_pkt(uint8_t vdev_id, struct sk_buff *skb, cmn_info.type = QDF_PROTO_TYPE_ARP; cmn_info.subtype = proto_subtype; cmn_info.proto_priv_data = 0; - cmn_info.mpdu_seq = 0xFF; + cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb); DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD, skb->data + QDF_NBUF_SRC_MAC_OFFSET,