1 Star 0 Fork 48

flying-eagle/lwip

forked from src-openEuler/lwip 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0060-lwip-add-udp-multicast.patch 9.89 KB
一键复制 编辑 原始数据 按行查看 历史
jinag12 提交于 2024-02-06 10:45 . adapt lwip-2.2.0
From d9ef907e03f44c30e26190b0c5ad895de716ac5c Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
Date: Fri, 12 May 2023 20:54:51 +0800
Subject: [PATCH] add udp multicast in support
---
src/api/api_msg.c | 5 +++++
src/api/sockets.c | 21 ++++++++++++++++++++-
src/core/dir.mk | 2 +-
src/core/udp.c | 28 +++++++++++++++++++++++++---
src/include/dpdk_cksum.h | 4 ++++
src/include/lwip/opt.h | 5 +++--
src/include/lwip/pbuf.h | 4 ++++
src/include/lwip/sockets.h | 15 +++++++++++++++
src/include/lwipopts.h | 2 +-
9 files changed, 78 insertions(+), 8 deletions(-)
diff --git a/src/api/api_msg.c b/src/api/api_msg.c
index 5a2e689..98537b8 100644
--- a/src/api/api_msg.c
+++ b/src/api/api_msg.c
@@ -285,8 +285,13 @@ recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
#if LWIP_SO_RCVBUF
SYS_ARCH_INC(conn->recv_avail, len);
#endif /* LWIP_SO_RCVBUF */
+#if GAZELLE_ENABLE
+ add_recv_list(conn->socket);
+ LWIP_UNUSED_ARG(len);
+#else
/* Register event with callback */
API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);
+#endif
}
}
#endif /* LWIP_UDP */
diff --git a/src/api/sockets.c b/src/api/sockets.c
index 7b5606f..bedb86b 100644
--- a/src/api/sockets.c
+++ b/src/api/sockets.c
@@ -54,6 +54,7 @@
#include "lwip/netif.h"
#include "lwip/priv/tcpip_priv.h"
#include "lwip/mld6.h"
+#include "lwip/api.h"
#if LWIP_CHECKSUM_ON_COPY
#include "lwip/inet_chksum.h"
#endif
@@ -1222,7 +1223,7 @@ lwip_recv_tcp_done:
#endif
/* Convert a netbuf's address data to struct sockaddr */
-static int
+int
lwip_sock_make_addr(struct netconn *conn, ip_addr_t *fromaddr, u16_t port,
struct sockaddr *from, socklen_t *fromlen)
{
@@ -1307,6 +1308,7 @@ lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16
apiflags = 0;
}
+#if !GAZELLE_ENABLE
LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: top sock->lastdata=%p\n", (void *)sock->lastdata.netbuf));
/* Check if there is data left from the last recv operation. */
buf = sock->lastdata.netbuf;
@@ -1394,6 +1396,18 @@ lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16
sock->lastdata.netbuf = NULL;
netbuf_delete(buf);
}
+#else /* GAZELLE_ENABLE */
+ LWIP_UNUSED_ARG(copylen);
+ LWIP_UNUSED_ARG(buf);
+ LWIP_UNUSED_ARG(err);
+ LWIP_UNUSED_ARG(copied);
+ LWIP_UNUSED_ARG(i);
+ buflen = read_lwip_data(sock, flags, apiflags);
+ if (buflen <= 0) {
+ return ERR_BUF;
+ }
+
+#endif /* GAZELLE_ENABLE */
if (datagram_len) {
*datagram_len = buflen;
}
@@ -1451,6 +1465,7 @@ lwip_recvfrom(int s, void *mem, size_t len, int flags,
done_socket(sock);
return -1;
}
+
ret = (ssize_t)LWIP_MIN(LWIP_MIN(len, datagram_len), SSIZE_MAX);
if (fromlen) {
*fromlen = msg.msg_namelen;
@@ -3998,6 +4013,10 @@ lwip_ioctl(int s, long cmd, ...)
struct lwip_sock *sock = posix_api->get_socket(s);
u8_t val;
+#if LWIP_SO_RCVBUF
+ int recv_avail;
+#endif /* LWIP_SO_RCVBUF */
+
int ret = -1;
void *argp;
va_list ap;
diff --git a/src/core/dir.mk b/src/core/dir.mk
index ebc01a5..57a9670 100644
--- a/src/core/dir.mk
+++ b/src/core/dir.mk
@@ -1,6 +1,6 @@
SRC = def.c inet_chksum.c init.c ip.c mem.c memp.c netif.c pbuf.c \
raw.c tcp.c tcp_in.c tcp_out.c timeouts.c udp.c stats.c\
ipv4/icmp.c ipv4/ip4_addr.c ipv4/ip4_frag.c ipv4/etharp.c \
- ipv4/ip4.c
+ ipv4/ip4.c ipv4/igmp.c
$(eval $(call register_dir, core, $(SRC)))
diff --git a/src/core/udp.c b/src/core/udp.c
index 24fc174..8a01c76 100644
--- a/src/core/udp.c
+++ b/src/core/udp.c
@@ -65,6 +65,12 @@
#include <string.h>
+#if GAZELLE_ENABLE
+#include "lwipsock.h"
+#include <rte_prefetch.h>
+#include "dpdk_cksum.h"
+#endif
+
#ifndef UDP_LOCAL_PORT_RANGE_START
/* From http://www.iana.org/assignments/port-numbers:
"The Dynamic and/or Private Ports are those from 49152 through 65535" */
@@ -210,7 +216,7 @@ udp_input(struct pbuf *p, struct netif *inp)
#if LWIP_RECORD_PERF
PERF_START(PERF_LAYER_UDP, PERF_POINT_UDP);
#else
- PERF_START;
+ //PERF_START;
#endif
UDP_STATS_INC(udp.recv);
@@ -435,7 +441,7 @@ end:
#if LWIP_RECORD_PERF
PERF_STOP_INCREASE_COUNT("udp_input", PERF_LAYER_UDP);
#else
- PERF_STOP("udp_input");
+ //PERF_STOP("udp_input");
#endif
return;
@@ -451,7 +457,7 @@ chkerr:
#if LWIP_RECORD_PERF
PERF_STOP_INCREASE_COUNT("udp_input", PERF_LAYER_UDP);
#else
- PERF_STOP("udp_input");
+ //PERF_STOP("udp_input");
#endif
#endif /* CHECKSUM_CHECK_UDP */
@@ -608,11 +614,26 @@ udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,
UDP_STATS_INC(udp.rterr);
return ERR_RTE;
}
+ uint8_t apiflags = 0;
+
+ struct pbuf *udp_pbuf = write_lwip_data((struct lwip_sock *)(p->payload), p->tot_len, &apiflags);
+ write_lwip_over((struct lwip_sock *)(p->payload));
+
+ pbuf_free(p);
+ p = udp_pbuf;
+ if (p == NULL) {
+ return ERR_MEM;
+ }
+
+ if (p->port) {
+ return udp_sendto_if(pcb, p, &(p->addr), p->port, netif);
+ } else {
#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP
return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);
#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);
#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */
+ }
}
/**
@@ -905,6 +926,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d
LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto));
/* output to IP */
NETIF_SET_HINTS(netif, &(pcb->netif_hints));
+ udph_cksum_set(q, UDP_HLEN);
err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);
NETIF_RESET_HINTS(netif);
diff --git a/src/include/dpdk_cksum.h b/src/include/dpdk_cksum.h
index df2e2a5..e41644b 100644
--- a/src/include/dpdk_cksum.h
+++ b/src/include/dpdk_cksum.h
@@ -82,6 +82,10 @@ static inline void tcph_cksum_set(struct pbuf *p, u16_t len) {
p->ol_flags |= RTE_MBUF_F_TX_TCP_CKSUM;
}
+static inline void udph_cksum_set(struct pbuf *p, u16_t len) {
+ p->l4_len = len;
+}
+
static inline u16_t ip_chksum_pseudo_offload(u8_t proto, u16_t proto_len,
const ip_addr_t *src, const ip_addr_t *dst)
{
diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h
index 527f2d7..e61b3f1 100644
--- a/src/include/lwip/opt.h
+++ b/src/include/lwip/opt.h
@@ -133,6 +133,7 @@
* MEMCPY: override this if you have a faster implementation at hand than the
* one included in your C library
*/
+//#include <rte_memcpy.h>
#if !defined MEMCPY || defined __DOXYGEN__
#define MEMCPY(dst,src,len) memcpy(dst,src,len)
#endif
@@ -1123,7 +1124,7 @@
* LWIP_IGMP==1: Turn on IGMP module.
*/
#if !defined LWIP_IGMP || defined __DOXYGEN__
-#define LWIP_IGMP 0
+#define LWIP_IGMP 1
#endif
#if !LWIP_IPV4
#undef LWIP_IGMP
@@ -2092,7 +2093,7 @@
* LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing.
*/
#if !defined LWIP_SO_RCVBUF || defined __DOXYGEN__
-#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_RCVBUF 1
#endif
/**
diff --git a/src/include/lwip/pbuf.h b/src/include/lwip/pbuf.h
index 46ff26a..e08d4fa 100644
--- a/src/include/lwip/pbuf.h
+++ b/src/include/lwip/pbuf.h
@@ -40,6 +40,8 @@
#include "lwip/opt.h"
#include "lwip/err.h"
+#include "lwip/ip_addr.h"
+#include "lwip/ip6_addr.h"
#ifdef __cplusplus
extern "C" {
@@ -236,6 +238,8 @@ struct pbuf {
struct pbuf *last;
pthread_spinlock_t pbuf_lock;
struct tcp_pcb *pcb;
+ ip_addr_t addr;
+ u16_t port;
#endif /* GAZELLE_ENABLE CHECKSUM_OFFLOAD_SWITCH */
/** In case the user needs to store data custom data on a pbuf */
diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h
index 8e41155..a7cec29 100644
--- a/src/include/lwip/sockets.h
+++ b/src/include/lwip/sockets.h
@@ -52,6 +52,7 @@
#include "lwip/err.h"
#include "lwip/inet.h"
#include "lwip/errno.h"
+#include "lwip/api.h"
#include <string.h>
@@ -332,20 +333,31 @@ struct linger {
#if LWIP_MULTICAST_TX_OPTIONS
+#if GAZELLE_ENABLE
+#define IP_MULTICAST_IF 32
+#define IP_MULTICAST_TTL 33
+#define IP_MULTICAST_LOOP 34
+#else
/*
* Options and types for UDP multicast traffic handling
*/
#define IP_MULTICAST_TTL 5
#define IP_MULTICAST_IF 6
#define IP_MULTICAST_LOOP 7
+#endif /* GAZELLE_ENABLE */
#endif /* LWIP_MULTICAST_TX_OPTIONS */
#if LWIP_IGMP
+#if GAZELLE_ENABLE
+#define IP_ADD_MEMBERSHIP 35
+#define IP_DROP_MEMBERSHIP 36
+#else
/*
* Options and types related to multicast membership
*/
#define IP_ADD_MEMBERSHIP 3
#define IP_DROP_MEMBERSHIP 4
+#endif /* GAZELLE_ENABLE */
typedef struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
@@ -675,6 +687,7 @@ ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags,
int lwip_socket(int domain, int type, int protocol);
ssize_t lwip_write(int s, const void *dataptr, size_t size);
ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt);
+
#if LWIP_SOCKET_SELECT
int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
struct timeval *timeout);
@@ -686,6 +699,8 @@ int lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout);
#if GAZELLE_ENABLE
int lwip_ioctl(int s, long cmd, ...);
int lwip_fcntl(int s, int cmd, int val);
+int lwip_sock_make_addr(struct netconn *conn, ip_addr_t *fromaddr, u16_t port,
+ struct sockaddr *from, socklen_t *fromlen);
#else
int lwip_ioctl(int s, long cmd, void *argp);
int lwip_fcntl(int s, int cmd, int val);
diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h
index 5b6bf6e..abc3f15 100644
--- a/src/include/lwipopts.h
+++ b/src/include/lwipopts.h
@@ -169,7 +169,7 @@
---------- UDP options ----------
---------------------------------
*/
-#define LWIP_UDP 0
+#define LWIP_UDP 1
/*
---------------------------------
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/flying-eagle12138/lwip.git
git@gitee.com:flying-eagle12138/lwip.git
flying-eagle12138
lwip
lwip
master

搜索帮助