diff --git a/0118-support-querying-udp-multicast-addresses.patch b/0118-support-querying-udp-multicast-addresses.patch new file mode 100644 index 0000000..1169f42 --- /dev/null +++ b/0118-support-querying-udp-multicast-addresses.patch @@ -0,0 +1,128 @@ +From 0ba2b637ae7ae725bdd7de24de58b517a0cce93f Mon Sep 17 00:00:00 2001 +From: wuchangye +Date: Sun, 24 Mar 2024 05:29:30 +0800 +Subject: [PATCH] support querying udp multicast addresses + +--- + src/api/sockets.c | 43 ++++++++++++++++++++++++++++++++++++-- + src/include/lwip/sockets.h | 1 + + 2 files changed, 42 insertions(+), 2 deletions(-) + +diff --git a/src/api/sockets.c b/src/api/sockets.c +index 66f6e2c..c544c22 100644 +--- a/src/api/sockets.c ++++ b/src/api/sockets.c +@@ -4342,6 +4342,27 @@ lwip_inet_pton(int af, const char *src, void *dst) + } + + #if LWIP_IGMP ++#if GAZELLE_ENABLE ++int lwip_socket_get_multi_memberships(int s, ip4_addr_t *if_addr, ip4_addr_t *multi_addr) ++{ ++ struct lwip_sock *sock = get_socket(s); ++ ++ if (!sock) { ++ return 0; ++ } ++ ++ if (socket_ipv4_multicast_memberships[s].sock == sock) { ++ ip4_addr_copy(*if_addr, socket_ipv4_multicast_memberships[s].if_addr); ++ ip4_addr_copy(*multi_addr, socket_ipv4_multicast_memberships[s].multi_addr); ++ done_socket(sock); ++ return 1; ++ } ++ ++ done_socket(sock); ++ return 0; ++} ++#endif ++ + /** Register a new IGMP membership. On socket close, the membership is dropped automatically. + * + * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). +@@ -4357,8 +4378,11 @@ lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr + if (!sock) { + return 0; + } +- ++#if GAZELLE_ENABLE ++ i = s; ++#else + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { ++#endif + if (socket_ipv4_multicast_memberships[i].sock == NULL) { + socket_ipv4_multicast_memberships[i].sock = sock; + ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr); +@@ -4366,7 +4390,9 @@ lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr + done_socket(sock); + return 1; + } ++#if !GAZELLE_ENABLE + } ++#endif + done_socket(sock); + return 0; + } +@@ -4386,16 +4412,24 @@ lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_ad + return; + } + ++#if GAZELLE_ENABLE ++ i = s; ++#else + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { ++#endif + if ((socket_ipv4_multicast_memberships[i].sock == sock) && + ip4_addr_eq(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) && + ip4_addr_eq(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) { + socket_ipv4_multicast_memberships[i].sock = NULL; + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); ++#if !GAZELLE_ENABLE + break; ++#endif + } ++#if !GAZELLE_ENABLE + } ++#endif + done_socket(sock); + } + +@@ -4412,8 +4446,11 @@ lwip_socket_drop_registered_memberships(int s) + if (!sock) { + return; + } +- ++#if GAZELLE_ENABLE ++ i = s; ++#else + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { ++#endif + if (socket_ipv4_multicast_memberships[i].sock == sock) { + ip_addr_t multi_addr, if_addr; + ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr); +@@ -4424,7 +4461,9 @@ lwip_socket_drop_registered_memberships(int s) + + netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE); + } ++#if !GAZELLE_ENABLE + } ++#endif + done_socket(sock); + } + #endif /* LWIP_IGMP */ +diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h +index 4466f11..296d4eb 100644 +--- a/src/include/lwip/sockets.h ++++ b/src/include/lwip/sockets.h +@@ -361,6 +361,7 @@ struct linger { + #if GAZELLE_UDP_ENABLE + #define IP_ADD_MEMBERSHIP 35 + #define IP_DROP_MEMBERSHIP 36 ++int lwip_socket_get_multi_memberships(int s, ip4_addr_t *if_addr, ip4_addr_t *multi_addr); + #else + /* + * Options and types related to multicast membership +-- +2.33.0 + diff --git a/lwip.spec b/lwip.spec index 650b5a1..8eca05a 100644 --- a/lwip.spec +++ b/lwip.spec @@ -4,7 +4,7 @@ Summary: lwip is a small independent implementation of the TCP/IP protocol suite Name: lwip Version: 2.2.0 -Release: 10 +Release: 11 License: BSD URL: http://savannah.nongnu.org/projects/lwip/ Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip @@ -129,6 +129,7 @@ Patch9113: 0114-sync-recv-flags-with-linux-kernel.patch Patch9114: 0115-enable-LWIP_SO_RCVTIMEO-to-support-recv-accept-timeo.patch Patch9115: 0116-transfer-pbuf-timestamp-in-ip-frag.patch Patch9116: 0117-udp-muticast-loop.patch +Patch9117: 0118-support-querying-udp-multicast-addresses.patch BuildRequires: gcc-c++ dos2unix dpdk-devel @@ -158,6 +159,9 @@ cd %{_builddir}/%{name}-%{version}/src %{_libdir}/liblwip.a %changelog +* Sat Mar 23 2024 wuchangye - 2.2.0-11 +- support querying udp multicast addresses + * Fri Mar 22 2024 zhujunhao - 2.2.0-10 - add udp muticast loop