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