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