fix udp send/recv in multiple queue
This commit is contained in:
parent
290299c940
commit
7c71e985b3
169
0064-fix-udp-send-recv-in-multiple-queue.patch
Normal file
169
0064-fix-udp-send-recv-in-multiple-queue.patch
Normal file
@ -0,0 +1,169 @@
|
||||
From 71d82a830005540ef92b2bcd7c121c9ff85beb64 Mon Sep 17 00:00:00 2001
|
||||
From: j00660176 <jiangheng14@huawei.com>
|
||||
Date: Mon, 12 Jun 2023 20:21:23 +0800
|
||||
Subject: [PATCH] fix udp send/recv in multiple queue
|
||||
|
||||
---
|
||||
src/core/udp.c | 73 +++++++++++++++++++++++++++++++++++++++---
|
||||
src/include/lwip/udp.h | 4 +++
|
||||
2 files changed, 73 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/core/udp.c b/src/core/udp.c
|
||||
index fba645b..0b1fa65 100644
|
||||
--- a/src/core/udp.c
|
||||
+++ b/src/core/udp.c
|
||||
@@ -65,10 +65,12 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
-#if GAZELLE_ENABLE
|
||||
-#include "lwipsock.h"
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+#include <pthread.h>
|
||||
#include <rte_prefetch.h>
|
||||
+#include "lwipsock.h"
|
||||
#include "dpdk_cksum.h"
|
||||
+#include "reg_sock.h"
|
||||
#endif
|
||||
|
||||
#ifndef UDP_LOCAL_PORT_RANGE_START
|
||||
@@ -81,10 +83,24 @@
|
||||
|
||||
/* last local UDP port */
|
||||
static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START;
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+static pthread_mutex_t g_udp_port_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
+static u8_t port_state[UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START + 1] = {0};
|
||||
+static void udp_release_port(u16_t port)
|
||||
+{
|
||||
+ if (port >= UDP_LOCAL_PORT_RANGE_START && port <= UDP_LOCAL_PORT_RANGE_END) {
|
||||
+ port_state[port - UDP_LOCAL_PORT_RANGE_START] = 0;
|
||||
+ }
|
||||
+}
|
||||
+#endif
|
||||
|
||||
/* The list of UDP PCBs */
|
||||
/* exported in udp.h (was static) */
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+PER_THREAD struct udp_pcb *udp_pcbs;
|
||||
+#else
|
||||
struct udp_pcb *udp_pcbs;
|
||||
+#endif
|
||||
|
||||
/**
|
||||
* Initialize this module.
|
||||
@@ -102,6 +118,37 @@ udp_init(void)
|
||||
*
|
||||
* @return a new (free) local UDP port number
|
||||
*/
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+static u16_t
|
||||
+udp_new_port(struct udp_pcb *dst_pcb)
|
||||
+{
|
||||
+ u16_t n = 0;
|
||||
+ u16_t tmp_port = 0;
|
||||
+
|
||||
+ pthread_mutex_lock(&g_udp_port_mutex);
|
||||
+ do {
|
||||
+ if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {
|
||||
+ udp_port = UDP_LOCAL_PORT_RANGE_START;
|
||||
+ }
|
||||
+
|
||||
+ if (__atomic_load_n(&port_state[udp_port - UDP_LOCAL_PORT_RANGE_START], __ATOMIC_ACQUIRE) == 0) {
|
||||
+ if (port_in_stack_queue(dst_pcb->remote_ip.addr, dst_pcb->local_ip.addr, dst_pcb->remote_port, udp_port)) {
|
||||
+ tmp_port = udp_port;
|
||||
+ __atomic_store_n(&port_state[udp_port - UDP_LOCAL_PORT_RANGE_START], 1, __ATOMIC_RELEASE);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ n++;
|
||||
+ if (n > UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START) {
|
||||
+ break;
|
||||
+ }
|
||||
+ } while (tmp_port == 0);
|
||||
+
|
||||
+ pthread_mutex_unlock(&g_udp_port_mutex);
|
||||
+
|
||||
+ return tmp_port;
|
||||
+}
|
||||
+#else
|
||||
static u16_t
|
||||
udp_new_port(void)
|
||||
{
|
||||
@@ -123,6 +170,7 @@ again:
|
||||
}
|
||||
return udp_port;
|
||||
}
|
||||
+#endif
|
||||
|
||||
/** Common code to see if the current input packet matches the pcb
|
||||
* (current input packet is accessed via ip(4/6)_current_* macros)
|
||||
@@ -789,7 +837,21 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d
|
||||
/* if the PCB is not yet bound to a port, bind it here */
|
||||
if (pcb->local_port == 0) {
|
||||
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n"));
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+ ip_addr_t tmp_local_ip = pcb->local_ip;
|
||||
+ ip_addr_t tmp_remote_ip = pcb->remote_ip;
|
||||
+ u16_t tmp_remote_port = pcb->remote_port;
|
||||
+
|
||||
+ pcb->local_ip = netif->ip_addr;
|
||||
+ pcb->remote_port = dst_port;
|
||||
+ pcb->remote_ip = *dst_ip;
|
||||
+#endif
|
||||
err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+ pcb->local_ip = tmp_local_ip;
|
||||
+ pcb->remote_ip = tmp_remote_ip;
|
||||
+ pcb->remote_port = tmp_remote_port;
|
||||
+#endif
|
||||
if (err != ERR_OK) {
|
||||
LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n"));
|
||||
return err;
|
||||
@@ -941,7 +1003,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d
|
||||
/* @todo: must this be increased even if error occurred? */
|
||||
MIB2_STATS_INC(mib2.udpoutdatagrams);
|
||||
|
||||
-#if !GAZELLE_ENABLE
|
||||
+#if !GAZELLE_UDP_ENABLE
|
||||
/* did we chain a separate header pbuf earlier? */
|
||||
if (q != p)
|
||||
#endif
|
||||
@@ -1026,7 +1088,7 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)
|
||||
|
||||
/* no port specified? */
|
||||
if (port == 0) {
|
||||
- port = udp_new_port();
|
||||
+ port = udp_new_port(pcb);
|
||||
if (port == 0) {
|
||||
/* no more ports available in local range */
|
||||
LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
|
||||
@@ -1252,6 +1314,9 @@ udp_remove(struct udp_pcb *pcb)
|
||||
}
|
||||
}
|
||||
}
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+ udp_release_port(pcb->local_port);
|
||||
+#endif
|
||||
memp_free(MEMP_UDP_PCB, pcb);
|
||||
}
|
||||
|
||||
diff --git a/src/include/lwip/udp.h b/src/include/lwip/udp.h
|
||||
index b1c78e5..f588d90 100644
|
||||
--- a/src/include/lwip/udp.h
|
||||
+++ b/src/include/lwip/udp.h
|
||||
@@ -112,7 +112,11 @@ struct udp_pcb {
|
||||
void *recv_arg;
|
||||
};
|
||||
/* udp_pcbs export for external reference (e.g. SNMP agent) */
|
||||
+#if GAZELLE_UDP_ENABLE
|
||||
+extern PER_THREAD struct udp_pcb *udp_pcbs;
|
||||
+#else
|
||||
extern struct udp_pcb *udp_pcbs;
|
||||
+#endif
|
||||
|
||||
/* The following functions is the application layer interface to the
|
||||
UDP code. */
|
||||
--
|
||||
2.33.0
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
Summary: lwip is a small independent implementation of the TCP/IP protocol suite
|
||||
Name: lwip
|
||||
Version: 2.1.3
|
||||
Release: 67
|
||||
Release: 68
|
||||
License: BSD
|
||||
URL: http://savannah.nongnu.org/projects/lwip/
|
||||
Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip
|
||||
@ -75,6 +75,7 @@ Patch9059: 0060-lwip-add-udp-multicast.patch
|
||||
Patch9060: 0061-fix-pbuf-leak-in-udp-connection.patch
|
||||
Patch9061: 0062-drop-netbuf-in-recv_udp-to-fix-mem-overflow.patch
|
||||
Patch9062: 0063-optimize-avoid-too-many-empty-acks-in-tcp_input.patch
|
||||
Patch9063: 0064-fix-udp-send-recv-in-multiple-queue.patch
|
||||
|
||||
BuildRequires: gcc-c++ dos2unix dpdk-devel
|
||||
|
||||
@ -154,6 +155,7 @@ find %{_builddir}/%{name}-%{version} -type f -exec dos2unix -q {} \;
|
||||
%patch9060 -p1
|
||||
%patch9061 -p1
|
||||
%patch9062 -p1
|
||||
%patch9063 -p1
|
||||
|
||||
%build
|
||||
cd %{_builddir}/%{name}-%{version}/src
|
||||
@ -169,6 +171,9 @@ cd %{_builddir}/%{name}-%{version}/src
|
||||
%{_libdir}/liblwip.a
|
||||
|
||||
%changelog
|
||||
* Wed Jun 14 2023 jiangheng <jiangheng14@huawei.com> - 2.1.3-68
|
||||
- fix udp send/recv in mutiple queue
|
||||
|
||||
* Thu Jun 07 2023 Lemmy Huang <huangliming5@huawei.com> - 2.1.3-67
|
||||
- optimize: avoid too many empty acks in tcp_input
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user