From 4e292d89ba5404ca35c47d60223573236f92e871 Mon Sep 17 00:00:00 2001 From: kircher Date: Tue, 27 Jun 2023 11:22:47 +0800 Subject: [PATCH] add CHECKSUM_UDP when not support OFFLOAD_UDP_CHECKSUM (cherry picked from commit 475db80d1216198d2ac7d21f39d13c9b4b5bcd64) --- ...-when-not-support-OFFLOAD_UDP_CHECKS.patch | 180 ++++++++++++++++++ lwip.spec | 6 +- 2 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 0070-add-CHECKSUM_UDP-when-not-support-OFFLOAD_UDP_CHECKS.patch diff --git a/0070-add-CHECKSUM_UDP-when-not-support-OFFLOAD_UDP_CHECKS.patch b/0070-add-CHECKSUM_UDP-when-not-support-OFFLOAD_UDP_CHECKS.patch new file mode 100644 index 0000000..55b1779 --- /dev/null +++ b/0070-add-CHECKSUM_UDP-when-not-support-OFFLOAD_UDP_CHECKS.patch @@ -0,0 +1,180 @@ +From 4ea38ff354eb4dad54be3c056b884ff7920135da Mon Sep 17 00:00:00 2001 +From: kircher +Date: Tue, 27 Jun 2023 11:18:58 +0800 +Subject: [PATCH] add CHECKSUM_UDP when not support OFFLOAD_UDP_CHECKSUM + +--- + src/core/tcp_in.c | 2 +- + src/core/udp.c | 26 +++++++++++++++++++++++++- + src/include/dpdk_cksum.h | 16 ++++++++++------ + src/include/dpdk_version.h | 1 + + src/include/lwipopts.h | 8 ++++++-- + 5 files changed, 43 insertions(+), 10 deletions(-) + +diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c +index 62a6511..5014a21 100644 +--- a/src/core/tcp_in.c ++++ b/src/core/tcp_in.c +@@ -210,7 +210,7 @@ tcp_input(struct pbuf *p, struct netif *inp) + #if CHECKSUM_CHECK_TCP_HW + u64_t ret; + if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_TCP_CKSUM) { +- ret = is_cksum_tcpbad(p); ++ ret = is_cksum_bad(p); + } else { + ret = (u64_t)ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, + ip_current_src_addr(), ip_current_dest_addr()); +diff --git a/src/core/udp.c b/src/core/udp.c +index 0b1fa65..d9db535 100644 +--- a/src/core/udp.c ++++ b/src/core/udp.c +@@ -412,9 +412,21 @@ udp_input(struct pbuf *p, struct netif *inp) + #endif /* LWIP_UDPLITE */ + { + if (udphdr->chksum != 0) { ++#if CHECKSUM_CHECK_UDP_HW ++ u64_t ret = 0; ++ if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_UDP_CKSUM) { ++ ret = is_cksum_bad(p); ++ } else { ++ ret = ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, ++ ip_current_src_addr(), ++ ip_current_dest_addr()); ++ } ++ if (ret != 0) { ++#else /* CHECKSUM_CHECK_UDP_HW */ + if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, + ip_current_src_addr(), + ip_current_dest_addr()) != 0) { ++#endif /* CHECKSUM_CHECK_UDP_HW */ + goto chkerr; + } + } +@@ -970,8 +982,18 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d + } else + #endif /* LWIP_CHECKSUM_ON_COPY */ + { ++#if CHECKSUM_GEN_UDP_HW ++ if (get_eth_params_tx_ol() & DEV_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); ++ } else { ++ udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, ++ src_ip, dst_ip); ++ } ++#else /* CHECKSUM_GEN_UDP_HW */ + udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, + src_ip, dst_ip); ++#endif /* CHECKSUM_GEN_UDP_HW */ + } + + /* chksum zero must become 0xffff, as zero means 'no checksum' */ +@@ -996,7 +1018,9 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto)); + /* output to IP */ + NETIF_SET_HINTS(netif, &(pcb->netif_hints)); +- udph_cksum_set(q, UDP_HLEN); ++#if GAZELLE_UDP_ENABLE ++ 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 2c5b31e..d092a1d 100644 +--- a/src/include/dpdk_cksum.h ++++ b/src/include/dpdk_cksum.h +@@ -54,12 +54,12 @@ static inline u64_t is_cksum_ipbad(struct pbuf *p) { + } + #endif /* CHECKSUM_CHECK_IP_HW */ + +-#if CHECKSUM_CHECK_TCP_HW +-// for tcp_input +-static inline u64_t is_cksum_tcpbad(struct pbuf *p) { ++#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); + } +-#endif /* CHECKSUM_CHECK_TCP_HW */ ++#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) { +@@ -77,18 +77,22 @@ static inline void iph_cksum_set(struct pbuf *p, u16_t len, bool do_ipcksum) { + #endif /* CHECKSUM_GEN_IP_HW */ + + // replace ip_chksum_pseudo +-#if CHECKSUM_GEN_TCP_HW ++#if (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) + #include + ++#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; + } ++#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; + } ++#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) +@@ -109,7 +113,7 @@ static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len, + + return rte_raw_cksum(&psd_hdr, sizeof(psd_hdr)); + } +-#endif /* CHECKSUM_GEN_TCP_HW */ ++#endif /* (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) */ + + #endif /* GAZELLE_ENABLE */ + #endif /* __DPDK_CKSUM_H__ */ +diff --git a/src/include/dpdk_version.h b/src/include/dpdk_version.h +index 43b254a..c90ddb8 100644 +--- a/src/include/dpdk_version.h ++++ b/src/include/dpdk_version.h +@@ -46,6 +46,7 @@ + #define RTE_MBUF_F_TX_IP_CKSUM PKT_TX_IP_CKSUM + #define RTE_MBUF_F_TX_TCP_CKSUM PKT_TX_TCP_CKSUM + #define RTE_MBUF_F_TX_TCP_SEG PKT_TX_TCP_SEG ++#define RTE_MBUF_F_TX_UDP_CKSUM PKT_TX_UDP_CKSUM + + #endif /* DPDK_VERSION_1911 */ + +diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h +index 2ba1e4c..5ba123f 100644 +--- a/src/include/lwipopts.h ++++ b/src/include/lwipopts.h +@@ -71,18 +71,22 @@ + // rx cksum + #define CHECKSUM_CHECK_IP 1 /* master switch */ + #define CHECKSUM_CHECK_TCP 1 /* master switch */ ++#define CHECKSUM_CHECK_UDP 1 /* master switch */ + // tx cksum + #define CHECKSUM_GEN_IP 1 /* master switch */ +-#define CHECKSUM_GEN_TCP 1 /* master switch */ ++#define CHECKSUM_GEN_TCP 1 /* master switch */ ++#define CHECKSUM_GEN_UDP 1 /* master switch */ + + // rx offload cksum + #define CHECKSUM_CHECK_IP_HW (1 && CHECKSUM_CHECK_IP) /* hardware switch */ + #define CHECKSUM_CHECK_TCP_HW (1 && CHECKSUM_CHECK_TCP) /* hardware switch */ ++#define CHECKSUM_CHECK_UDP_HW (1 && CHECKSUM_CHECK_UDP) /* hardware switch */ + // tx offload cksum + #define CHECKSUM_GEN_IP_HW (1 && CHECKSUM_GEN_IP) /* hardware switch */ + #define CHECKSUM_GEN_TCP_HW (1 && CHECKSUM_GEN_TCP) /* hardware switch */ ++#define CHECKSUM_GEN_UDP_HW (1 && CHECKSUM_GEN_UDP) /* hardware switch */ + +-#define CHECKSUM_OFFLOAD_ALL (CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW || CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW) ++#define CHECKSUM_OFFLOAD_ALL (CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW || CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW || CHECKSUM_GEN_UDP_HW) + + + /* +-- +2.28.0.windows.1 + diff --git a/lwip.spec b/lwip.spec index b9329c3..6438ae0 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: 74 +Release: 75 License: BSD URL: http://savannah.nongnu.org/projects/lwip/ Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip @@ -81,6 +81,7 @@ Patch9065: 0066-adapt-to-dpdk-19.11-and-dpdk-21.11.patch Patch9066: 0067-fix-null-pointer-when-all-zero-address-listen.patch Patch9067: 0068-enable-UDP-CKSUM-in-lwip.patch Patch9068: 0069-add-error-check-in-hugepage_init-and-sys_mbox_free.patch +Patch9069: 0070-add-CHECKSUM_UDP-when-not-support-OFFLOAD_UDP_CHECKS.patch BuildRequires: gcc-c++ dos2unix dpdk-devel @@ -111,6 +112,9 @@ cd %{_builddir}/%{name}-%{version}/src %{_libdir}/liblwip.a %changelog +* Tue Jun 27 2023 kircher - 2.1.3-75 +- add CHECKSUM_UDP when not support OFFLOAD_UDP_CHECKS + * Sun Jun 25 2023 jiangheng - 2.1.3-74 - add error check in hugepage_init and sys_mbox_free