1From 4ea38ff354eb4dad54be3c056b884ff7920135da Mon Sep 17 00:00:00 2001 2From: kircher <majun65@huawei.com> 3Date: Tue, 27 Jun 2023 11:18:58 +0800 4Subject: [PATCH] add CHECKSUM_UDP when not support OFFLOAD_UDP_CHECKSUM 5 6--- 7 src/core/tcp_in.c | 2 +- 8 src/core/udp.c | 26 +++++++++++++++++++++++++- 9 src/include/dpdk_cksum.h | 16 ++++++++++------ 10 src/include/dpdk_version.h | 1 + 11 src/include/lwipopts.h | 8 ++++++-- 12 5 files changed, 43 insertions(+), 10 deletions(-) 13 14diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c 15index 62a6511..5014a21 100644 16--- a/src/core/tcp_in.c 17+++ b/src/core/tcp_in.c 18@@ -210,7 +210,7 @@ tcp_input(struct pbuf *p, struct netif *inp) 19 #if CHECKSUM_CHECK_TCP_HW 20 u64_t ret; 21 if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_TCP_CKSUM) { 22- ret = is_cksum_tcpbad(p); 23+ ret = is_cksum_bad(p); 24 } else { 25 ret = (u64_t)ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, 26 ip_current_src_addr(), ip_current_dest_addr()); 27diff --git a/src/core/udp.c b/src/core/udp.c 28index 0b1fa65..d9db535 100644 29--- a/src/core/udp.c 30+++ b/src/core/udp.c 31@@ -412,9 +412,21 @@ udp_input(struct pbuf *p, struct netif *inp) 32 #endif /* LWIP_UDPLITE */ 33 { 34 if (udphdr->chksum != 0) { 35+#if CHECKSUM_CHECK_UDP_HW 36+ u64_t ret = 0; 37+ if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_UDP_CKSUM) { 38+ ret = is_cksum_bad(p); 39+ } else { 40+ ret = ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, 41+ ip_current_src_addr(), 42+ ip_current_dest_addr()); 43+ } 44+ if (ret != 0) { 45+#else /* CHECKSUM_CHECK_UDP_HW */ 46 if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len, 47 ip_current_src_addr(), 48 ip_current_dest_addr()) != 0) { 49+#endif /* CHECKSUM_CHECK_UDP_HW */ 50 goto chkerr; 51 } 52 } 53@@ -970,8 +982,18 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d 54 } else 55 #endif /* LWIP_CHECKSUM_ON_COPY */ 56 { 57+#if CHECKSUM_GEN_UDP_HW 58+ if (get_eth_params_tx_ol() & DEV_TX_OFFLOAD_UDP_CKSUM) { 59+ udph_cksum_set(q, UDP_HLEN); 60+ udpchksum = ip_chksum_pseudo_offload(IP_PROTO_UDP, q->tot_len, &pcb->local_ip, &pcb->remote_ip); 61+ } else { 62+ udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, 63+ src_ip, dst_ip); 64+ } 65+#else /* CHECKSUM_GEN_UDP_HW */ 66 udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, 67 src_ip, dst_ip); 68+#endif /* CHECKSUM_GEN_UDP_HW */ 69 } 70 71 /* chksum zero must become 0xffff, as zero means 'no checksum' */ 72@@ -996,7 +1018,9 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d 73 LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto)); 74 /* output to IP */ 75 NETIF_SET_HINTS(netif, &(pcb->netif_hints)); 76- udph_cksum_set(q, UDP_HLEN); 77+#if GAZELLE_UDP_ENABLE 78+ q->l4_len = UDP_HLEN; 79+#endif /* GAZELLE_UDP_ENABLE */ 80 err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif); 81 NETIF_RESET_HINTS(netif); 82 83diff --git a/src/include/dpdk_cksum.h b/src/include/dpdk_cksum.h 84index 2c5b31e..d092a1d 100644 85--- a/src/include/dpdk_cksum.h 86+++ b/src/include/dpdk_cksum.h 87@@ -54,12 +54,12 @@ static inline u64_t is_cksum_ipbad(struct pbuf *p) { 88 } 89 #endif /* CHECKSUM_CHECK_IP_HW */ 90 91-#if CHECKSUM_CHECK_TCP_HW 92-// for tcp_input 93-static inline u64_t is_cksum_tcpbad(struct pbuf *p) { 94+#if (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW) 95+// for tcp_input and udp_input 96+static inline u64_t is_cksum_bad(struct pbuf *p) { 97 return p->ol_flags & (RTE_MBUF_F_RX_L4_CKSUM_BAD); 98 } 99-#endif /* CHECKSUM_CHECK_TCP_HW */ 100+#endif /* (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW) */ 101 102 #if CHECKSUM_GEN_IP_HW 103 static inline void ethh_cksum_set(struct pbuf *p, u16_t len) { 104@@ -77,18 +77,22 @@ static inline void iph_cksum_set(struct pbuf *p, u16_t len, bool do_ipcksum) { 105 #endif /* CHECKSUM_GEN_IP_HW */ 106 107 // replace ip_chksum_pseudo 108-#if CHECKSUM_GEN_TCP_HW 109+#if (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) 110 #include <rte_ip.h> 111 112+#if CHECKSUM_GEN_TCP_HW 113 static inline void tcph_cksum_set(struct pbuf *p, u16_t len) { 114 p->l4_len = len; 115 p->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM; 116 } 117+#endif /* CHECKSUM_GEN_TCP_HW */ 118 119+#if CHECKSUM_GEN_UDP_HW 120 static inline void udph_cksum_set(struct pbuf *p, u16_t len) { 121 p->l4_len = len; 122 p->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM; 123 } 124+#endif /* CHECKSUM_GEN_UDP_HW */ 125 126 static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len, 127 const ip_addr_t *src, const ip_addr_t *dst) 128@@ -109,7 +113,7 @@ static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len, 129 130 return rte_raw_cksum(&psd_hdr, sizeof(psd_hdr)); 131 } 132-#endif /* CHECKSUM_GEN_TCP_HW */ 133+#endif /* (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) */ 134 135 #endif /* GAZELLE_ENABLE */ 136 #endif /* __DPDK_CKSUM_H__ */ 137diff --git a/src/include/dpdk_version.h b/src/include/dpdk_version.h 138index 43b254a..c90ddb8 100644 139--- a/src/include/dpdk_version.h 140+++ b/src/include/dpdk_version.h 141@@ -46,6 +46,7 @@ 142 #define RTE_MBUF_F_TX_IP_CKSUM PKT_TX_IP_CKSUM 143 #define RTE_MBUF_F_TX_TCP_CKSUM PKT_TX_TCP_CKSUM 144 #define RTE_MBUF_F_TX_TCP_SEG PKT_TX_TCP_SEG 145+#define RTE_MBUF_F_TX_UDP_CKSUM PKT_TX_UDP_CKSUM 146 147 #endif /* DPDK_VERSION_1911 */ 148 149diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h 150index 2ba1e4c..5ba123f 100644 151--- a/src/include/lwipopts.h 152+++ b/src/include/lwipopts.h 153@@ -71,18 +71,22 @@ 154 // rx cksum 155 #define CHECKSUM_CHECK_IP 1 /* master switch */ 156 #define CHECKSUM_CHECK_TCP 1 /* master switch */ 157+#define CHECKSUM_CHECK_UDP 1 /* master switch */ 158 // tx cksum 159 #define CHECKSUM_GEN_IP 1 /* master switch */ 160-#define CHECKSUM_GEN_TCP 1 /* master switch */ 161+#define CHECKSUM_GEN_TCP 1 /* master switch */ 162+#define CHECKSUM_GEN_UDP 1 /* master switch */ 163 164 // rx offload cksum 165 #define CHECKSUM_CHECK_IP_HW (1 && CHECKSUM_CHECK_IP) /* hardware switch */ 166 #define CHECKSUM_CHECK_TCP_HW (1 && CHECKSUM_CHECK_TCP) /* hardware switch */ 167+#define CHECKSUM_CHECK_UDP_HW (1 && CHECKSUM_CHECK_UDP) /* hardware switch */ 168 // tx offload cksum 169 #define CHECKSUM_GEN_IP_HW (1 && CHECKSUM_GEN_IP) /* hardware switch */ 170 #define CHECKSUM_GEN_TCP_HW (1 && CHECKSUM_GEN_TCP) /* hardware switch */ 171+#define CHECKSUM_GEN_UDP_HW (1 && CHECKSUM_GEN_UDP) /* hardware switch */ 172 173-#define CHECKSUM_OFFLOAD_ALL (CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW || CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW) 174+#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) 175 176 177 /* 178-- 1792.28.0.windows.1 180 181