Projects
openEuler:C
gazelle
_service:tar_scm:0144-support-udp-pkglen-mtu.patch
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0144-support-udp-pkglen-mtu.patch of Package gazelle
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
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.