86 lines
3.0 KiB
Diff
86 lines
3.0 KiB
Diff
From 5ba19529acaf76a681313245a9a278356b615687 Mon Sep 17 00:00:00 2001
|
|
From: yangchen <yangchen145@huawei.com>
|
|
Date: Mon, 4 Mar 2024 14:10:43 +0800
|
|
Subject: [PATCH] support udp pkglen > mtu
|
|
|
|
---
|
|
src/lstack/core/lstack_lwip.c | 20 ++++++++++++++++++--
|
|
src/lstack/include/lstack_dpdk.h | 2 +-
|
|
2 files changed, 19 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
|
|
index 7715cf3..f4199f8 100644
|
|
--- a/src/lstack/core/lstack_lwip.c
|
|
+++ b/src/lstack/core/lstack_lwip.c
|
|
@@ -252,6 +252,13 @@ struct pbuf *do_lwip_get_from_sendring(struct lwip_sock *sock, uint16_t remain_s
|
|
return NULL;
|
|
}
|
|
|
|
+ /* udp send a pbuf chain, dequeue all pbufs except head pbuf */
|
|
+ if (NETCONN_IS_UDP(sock) && remain_size > MBUF_MAX_DATA_LEN) {
|
|
+ int size = (remain_size + MBUF_MAX_DATA_LEN - 1) / MBUF_MAX_DATA_LEN - 1;
|
|
+ struct pbuf *pbuf_used[size];
|
|
+ gazelle_ring_sc_dequeue(sock->send_ring, (void **)&pbuf_used, size);
|
|
+ }
|
|
+
|
|
if (get_protocol_stack_group()->latency_start) {
|
|
calculate_lstack_latency(&sock->stack->latency, pbuf, GAZELLE_LATENCY_WRITE_LWIP);
|
|
}
|
|
@@ -285,7 +292,7 @@ void do_lwip_get_from_sendring_over(struct lwip_sock *sock)
|
|
sock->stack->stats.write_lwip_cnt++;
|
|
}
|
|
|
|
-static ssize_t do_app_write(struct pbuf *pbufs[], void *buf, size_t len, uint32_t write_num)
|
|
+static ssize_t do_app_write(struct lwip_sock *sock, struct pbuf *pbufs[], void *buf, size_t len, uint32_t write_num)
|
|
{
|
|
ssize_t send_len = 0;
|
|
uint32_t i = 0;
|
|
@@ -297,6 +304,11 @@ static ssize_t do_app_write(struct pbuf *pbufs[], void *buf, size_t len, uint32_
|
|
rte_memcpy((char *)pbufs[i]->payload, (char *)buf + send_len, MBUF_MAX_DATA_LEN);
|
|
pbufs[i]->tot_len = pbufs[i]->len = MBUF_MAX_DATA_LEN;
|
|
send_len += MBUF_MAX_DATA_LEN;
|
|
+
|
|
+ /* if udp pkg len > mtu, use pbuf chain to send it */
|
|
+ if (NETCONN_IS_UDP(sock) && i > 0) {
|
|
+ pbuf_cat(pbufs[0], pbufs[i]);
|
|
+ }
|
|
}
|
|
|
|
/* reduce the branch in loop */
|
|
@@ -305,6 +317,10 @@ static ssize_t do_app_write(struct pbuf *pbufs[], void *buf, size_t len, uint32_
|
|
pbufs[i]->tot_len = pbufs[i]->len = copy_len;
|
|
send_len += copy_len;
|
|
|
|
+ if (NETCONN_IS_UDP(sock) && i > 0) {
|
|
+ pbuf_cat(pbufs[0], pbufs[i]);
|
|
+ }
|
|
+
|
|
return send_len;
|
|
}
|
|
|
|
@@ -320,7 +336,7 @@ static inline ssize_t app_buff_write(struct lwip_sock *sock, void *buf, size_t l
|
|
time_stamp_into_pbuf(write_num, pbufs, time_stamp);
|
|
}
|
|
|
|
- ssize_t send_len = do_app_write(pbufs, buf, len, write_num);
|
|
+ ssize_t send_len = do_app_write(sock, pbufs, buf, len, write_num);
|
|
|
|
if (addr) {
|
|
if (addr->sa_family == AF_INET) {
|
|
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
|
|
index c40f3c0..c7cfbdf 100644
|
|
--- a/src/lstack/include/lstack_dpdk.h
|
|
+++ b/src/lstack/include/lstack_dpdk.h
|
|
@@ -21,7 +21,7 @@
|
|
|
|
#define KNI_NB_MBUF (DEFAULT_RING_SIZE << 4)
|
|
|
|
-#define MAX_PACKET_SZ 1530
|
|
+#define MAX_PACKET_SZ 1538
|
|
|
|
#define RING_SIZE(x) ((x) - 1)
|
|
|
|
--
|
|
2.27.0
|
|
|