1195972f6Sopenharmony_ciFrom 4ea38ff354eb4dad54be3c056b884ff7920135da Mon Sep 17 00:00:00 2001
2195972f6Sopenharmony_ciFrom: kircher <majun65@huawei.com>
3195972f6Sopenharmony_ciDate: Tue, 27 Jun 2023 11:18:58 +0800
4195972f6Sopenharmony_ciSubject: [PATCH] add CHECKSUM_UDP when not support OFFLOAD_UDP_CHECKSUM
5195972f6Sopenharmony_ci
6195972f6Sopenharmony_ci---
7195972f6Sopenharmony_ci src/core/tcp_in.c          |  2 +-
8195972f6Sopenharmony_ci src/core/udp.c             | 26 +++++++++++++++++++++++++-
9195972f6Sopenharmony_ci src/include/dpdk_cksum.h   | 16 ++++++++++------
10195972f6Sopenharmony_ci src/include/dpdk_version.h |  1 +
11195972f6Sopenharmony_ci src/include/lwipopts.h     |  8 ++++++--
12195972f6Sopenharmony_ci 5 files changed, 43 insertions(+), 10 deletions(-)
13195972f6Sopenharmony_ci
14195972f6Sopenharmony_cidiff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
15195972f6Sopenharmony_ciindex 62a6511..5014a21 100644
16195972f6Sopenharmony_ci--- a/src/core/tcp_in.c
17195972f6Sopenharmony_ci+++ b/src/core/tcp_in.c
18195972f6Sopenharmony_ci@@ -210,7 +210,7 @@ tcp_input(struct pbuf *p, struct netif *inp)
19195972f6Sopenharmony_ci #if CHECKSUM_CHECK_TCP_HW
20195972f6Sopenharmony_ci   u64_t ret;
21195972f6Sopenharmony_ci   if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_TCP_CKSUM) {
22195972f6Sopenharmony_ci-    ret = is_cksum_tcpbad(p);
23195972f6Sopenharmony_ci+    ret = is_cksum_bad(p);
24195972f6Sopenharmony_ci   } else {
25195972f6Sopenharmony_ci     ret = (u64_t)ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,
26195972f6Sopenharmony_ci                                   ip_current_src_addr(), ip_current_dest_addr());
27195972f6Sopenharmony_cidiff --git a/src/core/udp.c b/src/core/udp.c
28195972f6Sopenharmony_ciindex 0b1fa65..d9db535 100644
29195972f6Sopenharmony_ci--- a/src/core/udp.c
30195972f6Sopenharmony_ci+++ b/src/core/udp.c
31195972f6Sopenharmony_ci@@ -412,9 +412,21 @@ udp_input(struct pbuf *p, struct netif *inp)
32195972f6Sopenharmony_ci #endif /* LWIP_UDPLITE */
33195972f6Sopenharmony_ci       {
34195972f6Sopenharmony_ci         if (udphdr->chksum != 0) {
35195972f6Sopenharmony_ci+#if CHECKSUM_CHECK_UDP_HW
36195972f6Sopenharmony_ci+          u64_t ret = 0;
37195972f6Sopenharmony_ci+          if (get_eth_params_rx_ol() & DEV_RX_OFFLOAD_UDP_CKSUM) {
38195972f6Sopenharmony_ci+            ret = is_cksum_bad(p);
39195972f6Sopenharmony_ci+          } else {
40195972f6Sopenharmony_ci+            ret = ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len,
41195972f6Sopenharmony_ci+                               ip_current_src_addr(),
42195972f6Sopenharmony_ci+                               ip_current_dest_addr());
43195972f6Sopenharmony_ci+          }
44195972f6Sopenharmony_ci+          if (ret != 0) {
45195972f6Sopenharmony_ci+#else /* CHECKSUM_CHECK_UDP_HW */
46195972f6Sopenharmony_ci           if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len,
47195972f6Sopenharmony_ci                                ip_current_src_addr(),
48195972f6Sopenharmony_ci                                ip_current_dest_addr()) != 0) {
49195972f6Sopenharmony_ci+#endif /* CHECKSUM_CHECK_UDP_HW */
50195972f6Sopenharmony_ci             goto chkerr;
51195972f6Sopenharmony_ci           }
52195972f6Sopenharmony_ci         }
53195972f6Sopenharmony_ci@@ -970,8 +982,18 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d
54195972f6Sopenharmony_ci         } else
55195972f6Sopenharmony_ci #endif /* LWIP_CHECKSUM_ON_COPY */
56195972f6Sopenharmony_ci         {
57195972f6Sopenharmony_ci+#if CHECKSUM_GEN_UDP_HW
58195972f6Sopenharmony_ci+          if (get_eth_params_tx_ol() & DEV_TX_OFFLOAD_UDP_CKSUM) {
59195972f6Sopenharmony_ci+            udph_cksum_set(q, UDP_HLEN);
60195972f6Sopenharmony_ci+            udpchksum = ip_chksum_pseudo_offload(IP_PROTO_UDP, q->tot_len, &pcb->local_ip, &pcb->remote_ip);
61195972f6Sopenharmony_ci+          } else {
62195972f6Sopenharmony_ci+            udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len,
63195972f6Sopenharmony_ci+                                         src_ip, dst_ip);
64195972f6Sopenharmony_ci+          }
65195972f6Sopenharmony_ci+#else /* CHECKSUM_GEN_UDP_HW */
66195972f6Sopenharmony_ci           udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len,
67195972f6Sopenharmony_ci                                        src_ip, dst_ip);
68195972f6Sopenharmony_ci+#endif /* CHECKSUM_GEN_UDP_HW */
69195972f6Sopenharmony_ci         }
70195972f6Sopenharmony_ci 
71195972f6Sopenharmony_ci         /* chksum zero must become 0xffff, as zero means 'no checksum' */
72195972f6Sopenharmony_ci@@ -996,7 +1018,9 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d
73195972f6Sopenharmony_ci   LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto));
74195972f6Sopenharmony_ci   /* output to IP */
75195972f6Sopenharmony_ci   NETIF_SET_HINTS(netif, &(pcb->netif_hints));
76195972f6Sopenharmony_ci-  udph_cksum_set(q, UDP_HLEN);
77195972f6Sopenharmony_ci+#if GAZELLE_UDP_ENABLE
78195972f6Sopenharmony_ci+  q->l4_len = UDP_HLEN;
79195972f6Sopenharmony_ci+#endif /* GAZELLE_UDP_ENABLE */
80195972f6Sopenharmony_ci   err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);
81195972f6Sopenharmony_ci   NETIF_RESET_HINTS(netif);
82195972f6Sopenharmony_ci 
83195972f6Sopenharmony_cidiff --git a/src/include/dpdk_cksum.h b/src/include/dpdk_cksum.h
84195972f6Sopenharmony_ciindex 2c5b31e..d092a1d 100644
85195972f6Sopenharmony_ci--- a/src/include/dpdk_cksum.h
86195972f6Sopenharmony_ci+++ b/src/include/dpdk_cksum.h
87195972f6Sopenharmony_ci@@ -54,12 +54,12 @@ static inline u64_t is_cksum_ipbad(struct pbuf *p) {
88195972f6Sopenharmony_ci }
89195972f6Sopenharmony_ci #endif /* CHECKSUM_CHECK_IP_HW */
90195972f6Sopenharmony_ci 
91195972f6Sopenharmony_ci-#if CHECKSUM_CHECK_TCP_HW
92195972f6Sopenharmony_ci-// for tcp_input
93195972f6Sopenharmony_ci-static inline u64_t is_cksum_tcpbad(struct pbuf *p) {
94195972f6Sopenharmony_ci+#if (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW)
95195972f6Sopenharmony_ci+// for tcp_input and udp_input
96195972f6Sopenharmony_ci+static inline u64_t is_cksum_bad(struct pbuf *p) {
97195972f6Sopenharmony_ci     return p->ol_flags & (RTE_MBUF_F_RX_L4_CKSUM_BAD);
98195972f6Sopenharmony_ci }
99195972f6Sopenharmony_ci-#endif /* CHECKSUM_CHECK_TCP_HW */
100195972f6Sopenharmony_ci+#endif /* (CHECKSUM_CHECK_TCP_HW || CHECKSUM_CHECK_UDP_HW) */
101195972f6Sopenharmony_ci 
102195972f6Sopenharmony_ci #if CHECKSUM_GEN_IP_HW
103195972f6Sopenharmony_ci static inline void ethh_cksum_set(struct pbuf *p, u16_t len) {
104195972f6Sopenharmony_ci@@ -77,18 +77,22 @@ static inline void iph_cksum_set(struct pbuf *p, u16_t len, bool do_ipcksum) {
105195972f6Sopenharmony_ci #endif /* CHECKSUM_GEN_IP_HW */
106195972f6Sopenharmony_ci 
107195972f6Sopenharmony_ci // replace ip_chksum_pseudo
108195972f6Sopenharmony_ci-#if CHECKSUM_GEN_TCP_HW
109195972f6Sopenharmony_ci+#if (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW)
110195972f6Sopenharmony_ci #include <rte_ip.h>
111195972f6Sopenharmony_ci 
112195972f6Sopenharmony_ci+#if CHECKSUM_GEN_TCP_HW
113195972f6Sopenharmony_ci static inline void tcph_cksum_set(struct pbuf *p, u16_t len) {
114195972f6Sopenharmony_ci     p->l4_len = len;
115195972f6Sopenharmony_ci     p->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM;
116195972f6Sopenharmony_ci }
117195972f6Sopenharmony_ci+#endif /* CHECKSUM_GEN_TCP_HW */
118195972f6Sopenharmony_ci 
119195972f6Sopenharmony_ci+#if CHECKSUM_GEN_UDP_HW
120195972f6Sopenharmony_ci static inline void udph_cksum_set(struct pbuf *p, u16_t len) {
121195972f6Sopenharmony_ci     p->l4_len = len;
122195972f6Sopenharmony_ci     p->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM;
123195972f6Sopenharmony_ci }
124195972f6Sopenharmony_ci+#endif /* CHECKSUM_GEN_UDP_HW */
125195972f6Sopenharmony_ci 
126195972f6Sopenharmony_ci static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len,
127195972f6Sopenharmony_ci                                              const ip_addr_t *src, const ip_addr_t *dst)
128195972f6Sopenharmony_ci@@ -109,7 +113,7 @@ static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len,
129195972f6Sopenharmony_ci 
130195972f6Sopenharmony_ci     return rte_raw_cksum(&psd_hdr, sizeof(psd_hdr));
131195972f6Sopenharmony_ci }
132195972f6Sopenharmony_ci-#endif /* CHECKSUM_GEN_TCP_HW */
133195972f6Sopenharmony_ci+#endif /* (CHECKSUM_GEN_TCP_HW || CHECKSUM_GEN_UDP_HW) */
134195972f6Sopenharmony_ci 
135195972f6Sopenharmony_ci #endif /* GAZELLE_ENABLE */
136195972f6Sopenharmony_ci #endif /* __DPDK_CKSUM_H__ */
137195972f6Sopenharmony_cidiff --git a/src/include/dpdk_version.h b/src/include/dpdk_version.h
138195972f6Sopenharmony_ciindex 43b254a..c90ddb8 100644
139195972f6Sopenharmony_ci--- a/src/include/dpdk_version.h
140195972f6Sopenharmony_ci+++ b/src/include/dpdk_version.h
141195972f6Sopenharmony_ci@@ -46,6 +46,7 @@
142195972f6Sopenharmony_ci #define RTE_MBUF_F_TX_IP_CKSUM      PKT_TX_IP_CKSUM 
143195972f6Sopenharmony_ci #define RTE_MBUF_F_TX_TCP_CKSUM     PKT_TX_TCP_CKSUM
144195972f6Sopenharmony_ci #define RTE_MBUF_F_TX_TCP_SEG       PKT_TX_TCP_SEG
145195972f6Sopenharmony_ci+#define RTE_MBUF_F_TX_UDP_CKSUM     PKT_TX_UDP_CKSUM
146195972f6Sopenharmony_ci 
147195972f6Sopenharmony_ci #endif /* DPDK_VERSION_1911 */
148195972f6Sopenharmony_ci 
149195972f6Sopenharmony_cidiff --git a/src/include/lwipopts.h b/src/include/lwipopts.h
150195972f6Sopenharmony_ciindex 2ba1e4c..5ba123f 100644
151195972f6Sopenharmony_ci--- a/src/include/lwipopts.h
152195972f6Sopenharmony_ci+++ b/src/include/lwipopts.h
153195972f6Sopenharmony_ci@@ -71,18 +71,22 @@
154195972f6Sopenharmony_ci // rx cksum
155195972f6Sopenharmony_ci #define CHECKSUM_CHECK_IP     1 /*  master switch */
156195972f6Sopenharmony_ci #define CHECKSUM_CHECK_TCP    1 /*  master switch */
157195972f6Sopenharmony_ci+#define CHECKSUM_CHECK_UDP    1 /*  master switch */
158195972f6Sopenharmony_ci // tx cksum
159195972f6Sopenharmony_ci #define CHECKSUM_GEN_IP       1 /*  master switch */
160195972f6Sopenharmony_ci-#define CHECKSUM_GEN_TCP      1 /* master switch */
161195972f6Sopenharmony_ci+#define CHECKSUM_GEN_TCP      1 /*  master switch */
162195972f6Sopenharmony_ci+#define CHECKSUM_GEN_UDP      1 /*  master switch */
163195972f6Sopenharmony_ci 
164195972f6Sopenharmony_ci // rx offload cksum
165195972f6Sopenharmony_ci #define CHECKSUM_CHECK_IP_HW  (1 && CHECKSUM_CHECK_IP) /*  hardware switch */
166195972f6Sopenharmony_ci #define CHECKSUM_CHECK_TCP_HW (1 && CHECKSUM_CHECK_TCP) /*  hardware switch */
167195972f6Sopenharmony_ci+#define CHECKSUM_CHECK_UDP_HW (1 && CHECKSUM_CHECK_UDP) /*  hardware switch */
168195972f6Sopenharmony_ci // tx offload cksum
169195972f6Sopenharmony_ci #define CHECKSUM_GEN_IP_HW    (1 && CHECKSUM_GEN_IP) /* hardware switch */
170195972f6Sopenharmony_ci #define CHECKSUM_GEN_TCP_HW   (1 && CHECKSUM_GEN_TCP) /*  hardware switch */
171195972f6Sopenharmony_ci+#define CHECKSUM_GEN_UDP_HW   (1 && CHECKSUM_GEN_UDP) /*  hardware switch */
172195972f6Sopenharmony_ci 
173195972f6Sopenharmony_ci-#define CHECKSUM_OFFLOAD_ALL (CHECKSUM_GEN_IP_HW || CHECKSUM_GEN_TCP_HW || CHECKSUM_CHECK_IP_HW || CHECKSUM_CHECK_TCP_HW)
174195972f6Sopenharmony_ci+#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)
175195972f6Sopenharmony_ci 
176195972f6Sopenharmony_ci 
177195972f6Sopenharmony_ci /*
178195972f6Sopenharmony_ci-- 
179195972f6Sopenharmony_ci2.28.0.windows.1
180195972f6Sopenharmony_ci
181