From 0850c563fe206044243689cdb8e2316a92e12688 Mon Sep 17 00:00:00 2001 From: jiangheng Date: Fri, 19 Jan 2024 20:49:09 +0800 Subject: [PATCH] remove unnecessary variables in struct pbuf (cherry picked from commit c312a40cbfe8b8edf4b1ab4853052952c85ab9ed) --- ...unnecessary-variables-in-struct-pbuf.patch | 228 ++++++++++++++++++ lwip.spec | 6 +- 2 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 0106-remove-unnecessary-variables-in-struct-pbuf.patch diff --git a/0106-remove-unnecessary-variables-in-struct-pbuf.patch b/0106-remove-unnecessary-variables-in-struct-pbuf.patch new file mode 100644 index 0000000..fdc9bfc --- /dev/null +++ b/0106-remove-unnecessary-variables-in-struct-pbuf.patch @@ -0,0 +1,228 @@ +From bb07cd2f26a91c4f5396f2e19a409e4014e7a7e8 Mon Sep 17 00:00:00 2001 +From: jiangheng +Date: Fri, 19 Jan 2024 20:44:54 +0800 +Subject: [PATCH] remove unnecessary variables in struct pbuf + +--- + src/core/pbuf.c | 5 ++-- + src/core/tcp_out.c | 3 +- + src/core/udp.c | 4 +-- + src/include/dpdk_cksum.h | 60 ++++++++++++++++++++-------------------- + src/include/lwip/pbuf.h | 12 -------- + src/netif/ethernet.c | 3 +- + 6 files changed, 36 insertions(+), 51 deletions(-) + +diff --git a/src/core/pbuf.c b/src/core/pbuf.c +index 61690ff..cb5003a 100644 +--- a/src/core/pbuf.c ++++ b/src/core/pbuf.c +@@ -86,6 +86,7 @@ + #endif + #if GAZELLE_ENABLE + #include ++#include "dpdk_cksum.h" + #endif + + #include +@@ -1041,9 +1042,7 @@ pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_ + } + + #if GAZELLE_ENABLE && (CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW) +- p_to->l2_len = p_from->l2_len; +- p_to->l3_len = p_from->l3_len; +- p_to->ol_flags = p_from->ol_flags; ++ pbuf_offload_copy(p_to, p_from); + #endif + + len = (u16_t)LWIP_MIN(copy_len, len_calc); +diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c +index bb03aae..f5e1968 100644 +--- a/src/core/tcp_out.c ++++ b/src/core/tcp_out.c +@@ -1941,7 +1941,6 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif + #if CHECKSUM_GEN_TCP_HW + if (netif_get_txol_flags(netif) & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) { + tcph_cksum_set(seg->p, TCPH_HDRLEN_BYTES(seg->tcphdr)); +- seg->tcphdr->chksum = ip_chksum_pseudo_offload(IP_PROTO_TCP,seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); + } else { + #if TCP_CHECKSUM_ON_COPY + u32_t acc; +@@ -2388,10 +2387,10 @@ tcp_output_control_segment(struct tcp_pcb *pcb, struct pbuf *p, + #if CHECKSUM_GEN_TCP + IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { + struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload; ++ tcphdr->chksum = 0; + #if CHECKSUM_GEN_TCP_HW + if (netif_get_txol_flags(netif) & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) { + tcph_cksum_set(p, TCPH_HDRLEN_BYTES(tcphdr)); +- tcphdr->chksum = ip_chksum_pseudo_offload(IP_PROTO_TCP, p->tot_len, src, dst); + } else { + tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, + src, dst); +diff --git a/src/core/udp.c b/src/core/udp.c +index 718f9f4..99bdac1 100644 +--- a/src/core/udp.c ++++ b/src/core/udp.c +@@ -985,7 +985,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d + #if CHECKSUM_GEN_UDP_HW + if (netif_get_txol_flags(netif) & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) { + udph_cksum_set(q, UDP_HLEN); +- udpchksum = ip_chksum_pseudo_offload(IP_PROTO_UDP, q->tot_len, &pcb->local_ip, &pcb->remote_ip); ++ udpchksum = 0; + } else { + udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, + src_ip, dst_ip); +@@ -1019,7 +1019,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d + /* output to IP */ + NETIF_SET_HINTS(netif, &(pcb->netif_hints)); + #if GAZELLE_UDP_ENABLE +- q->l4_len = UDP_HLEN; ++ PBUF_TO_MBUF(q)->l4_len = UDP_HLEN; + #endif /* GAZELLE_UDP_ENABLE */ + err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif); + NETIF_RESET_HINTS(netif); +diff --git a/src/include/dpdk_cksum.h b/src/include/dpdk_cksum.h +index 38cfb96..115155d 100644 +--- a/src/include/dpdk_cksum.h ++++ b/src/include/dpdk_cksum.h +@@ -45,32 +45,48 @@ + #include "lwip/pbuf.h" + #endif + ++#define PBUF_TO_MBUF(p) ((struct rte_mbuf *)RTE_PTR_SUB(p, sizeof(struct rte_mbuf))) ++ ++static inline void pbuf_offload_copy(struct pbuf *to, const struct pbuf *from) ++{ ++ PBUF_TO_MBUF(to)->l4_len = PBUF_TO_MBUF(from)->l4_len; ++ PBUF_TO_MBUF(to)->l3_len = PBUF_TO_MBUF(from)->l3_len; ++ PBUF_TO_MBUF(to)->l2_len = PBUF_TO_MBUF(from)->l2_len; ++ PBUF_TO_MBUF(to)->ol_flags = PBUF_TO_MBUF(from)->ol_flags; ++} ++ ++static inline void pbuf_set_vlan(struct pbuf *p, u16_t vlan_tci) ++{ ++ PBUF_TO_MBUF(p)->ol_flags |= RTE_MBUF_F_TX_VLAN; ++ PBUF_TO_MBUF(p)->vlan_tci = vlan_tci; ++} ++ + #if CHECKSUM_CHECK_IP_HW + // for ip4_input + static inline u64_t is_cksum_ipbad(struct pbuf *p) { +- return p->ol_flags & (RTE_MBUF_F_RX_IP_CKSUM_BAD); ++ return PBUF_TO_MBUF(p)->ol_flags & (RTE_MBUF_F_RX_IP_CKSUM_BAD); + } + #endif /* CHECKSUM_CHECK_IP_HW */ + + #if (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW) + // for tcp_input and udp_input + static inline u64_t is_cksum_bad(struct pbuf *p) { +- return p->ol_flags & (RTE_MBUF_F_RX_L4_CKSUM_BAD); ++ return PBUF_TO_MBUF(p)->ol_flags & (RTE_MBUF_F_RX_L4_CKSUM_BAD); + } + #endif /* (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW) */ + + #if CHECKSUM_GEN_IP_HW + static inline void ethh_cksum_set(struct pbuf *p, u16_t len) { +- p->l2_len = len; ++ PBUF_TO_MBUF(p)->l2_len = len; + } + + // replaces IPH_CHKSUM_SET + static inline void iph_cksum_set(struct pbuf *p, u16_t len, bool do_ipcksum) { +- p->ol_flags |= ((len == IP_HLEN) ? RTE_MBUF_F_TX_IPV4 : RTE_MBUF_F_TX_IPV6); ++ PBUF_TO_MBUF(p)->ol_flags |= ((len == IP_HLEN) ? RTE_MBUF_F_TX_IPV4 : RTE_MBUF_F_TX_IPV6); + if (do_ipcksum) { +- p->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; ++ PBUF_TO_MBUF(p)->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM; + } +- p->l3_len = len; ++ PBUF_TO_MBUF(p)->l3_len = len; + } + #endif /* CHECKSUM_GEN_IP_HW */ + +@@ -80,37 +96,17 @@ static inline void iph_cksum_set(struct pbuf *p, u16_t len, bool do_ipcksum) { + + #if CHECKSUM_GEN_TCP_HW + static inline void tcph_cksum_set(struct pbuf *p, u16_t len) { +- p->l4_len = len; +- p->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; ++ PBUF_TO_MBUF(p)->l4_len = len; ++ PBUF_TO_MBUF(p)->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; + } + #endif /* CHECKSUM_GEN_TCP_HW */ + + #if CHECKSUM_GEN_UDP_HW + static inline void udph_cksum_set(struct pbuf *p, u16_t len) { +- p->l4_len = len; +- p->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; ++ PBUF_TO_MBUF(p)->l4_len = len; ++ PBUF_TO_MBUF(p)->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; + } + #endif /* CHECKSUM_GEN_UDP_HW */ +- +-static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len, +- const ip_addr_t *src, const ip_addr_t *dst) +-{ +- struct ip_psd_header { +- ip_addr_t src_addr; /* IP address of source host. */ +- ip_addr_t dst_addr; /* IP address of destination host. */ +- uint8_t zero; /* zero. */ +- uint8_t proto; /* L4 protocol type. */ +- uint16_t len; /* L4 length. */ +- } psd_hdr; +- +- ip_addr_copy(psd_hdr.src_addr, *src); +- ip_addr_copy(psd_hdr.dst_addr, *dst); +- psd_hdr.proto = proto; +- psd_hdr.len = lwip_htons(proto_len); +- psd_hdr.zero = 0; +- +- return rte_raw_cksum(&psd_hdr, sizeof(psd_hdr)); +-} + #endif /* (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) */ + + #endif /* GAZELLE_ENABLE */ +diff --git a/src/include/lwip/pbuf.h b/src/include/lwip/pbuf.h +index ffdc9fe..99a259c 100644 +--- a/src/include/lwip/pbuf.h ++++ b/src/include/lwip/pbuf.h +@@ -225,22 +225,10 @@ struct pbuf { + u8_t if_idx; + + #if GAZELLE_ENABLE && CHECKSUM_OFFLOAD_ALL +- /** checksum offload ol_flags */ +- u64_t ol_flags; +- /* < L2 (MAC) Header Length for non-tunneling pkt. */ +- u64_t l2_len:7; +- /* < L3 (IP) Header Length. */ +- u64_t l3_len:9; +- /* < L4 (TCP/UDP) Header Length. */ +- u64_t l4_len:8; +- u8_t header_off; +- u8_t rexmit; + volatile u8_t allow_in; +- u8_t head; + struct pbuf *last; + pthread_spinlock_t pbuf_lock; + struct tcp_pcb *pcb; +- u16_t vlan_tci; + #if GAZELLE_UDP_ENABLE + ip_addr_t addr; + u16_t port; +diff --git a/src/netif/ethernet.c b/src/netif/ethernet.c +index afd13ad..9fb9357 100644 +--- a/src/netif/ethernet.c ++++ b/src/netif/ethernet.c +@@ -290,8 +290,7 @@ ethernet_output(struct netif * netif, struct pbuf * p, + #else + if (netif->vlan_enable) { + if (netif->txol_flags & RTE_ETH_TX_OFFLOAD_VLAN_INSERT) { +- p->ol_flags |= RTE_MBUF_F_TX_VLAN; +- p->vlan_tci = netif->vlan_tci; ++ pbuf_set_vlan(p, netif->vlan_tci); + } else { + vlan_prio_vid = netif->vlan_tci; + } +-- +2.33.0 + diff --git a/lwip.spec b/lwip.spec index 8ee9ddb..ea2d0cd 100644 --- a/lwip.spec +++ b/lwip.spec @@ -4,7 +4,7 @@ Summary: lwip is a small independent implementation of the TCP/IP protocol suite Name: lwip Version: 2.1.3 -Release: 110 +Release: 111 License: BSD URL: http://savannah.nongnu.org/projects/lwip/ Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip @@ -122,6 +122,7 @@ Patch6005: backport-tcp_in-fix-ooseq-update-error.patch Patch9102: 0103-adapt-for-dpdk-23.11.patch Patch9103: 0104-optimize-enqueue-for-unacked-and-unsent-queue.patch Patch9104: 0105-delete-redundant-logs-in-lwip.patch +Patch9105: 0106-remove-unnecessary-variables-in-struct-pbuf.patch BuildRequires: gcc-c++ dos2unix dpdk-devel @@ -151,6 +152,9 @@ cd %{_builddir}/%{name}-%{version}/src %{_libdir}/liblwip.a %changelog +* Fri Jan 19 2024 jiangheng - 2.1.3-111 +- remove unnecessary variables in struct pbuf + * Wed Jan 10 2024 hankangkang - 2.1.3-110 - delete redundant logs in lwip