From 7dfe566da1724851ff0ccdd7ee92166936941fda Mon Sep 17 00:00:00 2001 From: wanfeng Date: Tue, 16 Apr 2024 15:29:06 +0800 Subject: [PATCH] add MCAST_JOIN_SOURCE_GROUP to setsockopt for mldv2 (cherry picked from commit dc1cccb2ccb020e63c461da7bbee8604685eb424) --- ...SOURCE_GROUP-to-setsockopt-for-mldv2.patch | 124 ++++++++++++++++++ lwip.spec | 6 +- 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 0125-add-MCAST_JOIN_SOURCE_GROUP-to-setsockopt-for-mldv2.patch diff --git a/0125-add-MCAST_JOIN_SOURCE_GROUP-to-setsockopt-for-mldv2.patch b/0125-add-MCAST_JOIN_SOURCE_GROUP-to-setsockopt-for-mldv2.patch new file mode 100644 index 0000000..ed1b118 --- /dev/null +++ b/0125-add-MCAST_JOIN_SOURCE_GROUP-to-setsockopt-for-mldv2.patch @@ -0,0 +1,124 @@ +From c822d404bae65db647d7c0ddec4647f8b0cce1e1 Mon Sep 17 00:00:00 2001 +From: wanfeng +Date: Tue, 16 Apr 2024 15:23:46 +0800 +Subject: [PATCH] add MCAST_JOIN_SOURCE_GROUP to setsockopt for mldv2 + +--- + src/api/sockets.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 94 insertions(+) + +diff --git a/src/api/sockets.c b/src/api/sockets.c +index 6b2f5ee..50fa335 100644 +--- a/src/api/sockets.c ++++ b/src/api/sockets.c +@@ -3976,6 +3976,29 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ + } + } + break; ++ case MCAST_JOIN_SOURCE_GROUP: ++ case MCAST_LEAVE_SOURCE_GROUP: ++ LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, struct group_source_req); ++ if ((((const struct group_source_req *)optval)->gsr_group.ss_family != AF_INET6) || ++ (((const struct group_source_req *)optval)->gsr_source.ss_family != AF_INET6)) { ++ done_socket(sock); ++ return EINVAL; ++ } ++#if LWIP_UDP ++ if (NETCONNTYPE_GROUPV6(netconn_type(sock->conn)) == NETCONN_UDP_IPV6) { ++ err = mcast_sock_join_leave_source_group(s, &sock->conn->pcb.udp->ipmc, optname, (const struct group_source_req *)optval); ++ } else ++#endif /* LWIP_UDP */ ++#if LWIP_RAW ++ if (NETCONNTYPE_GROUPV6(netconn_type(sock->conn)) == NETCONN_RAW_IPV6) { ++ err = mcast_sock_join_leave_source_group(s, &sock->conn->pcb.raw->ipmc, optname, (const struct group_source_req *)optval); ++ } else ++#endif /* LWIP_RAW */ ++ { ++ done_socket(sock); ++ return ENOPROTOOPT; ++ } ++ break; + #endif /* LWIP_IPV6_MLD */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", +@@ -4869,6 +4892,77 @@ out: + return err_to_errno(err); + } + ++/** ++ * setsockopt() MCAST_JOIN_SOURCE_GROUP / MCAST_LEAVE_SOURCE_GROUP command ++ */ ++int ++mcast_sock_join_leave_source_group(int s, struct ip_mc *ipmc, int optname, const struct group_source_req *gsr) ++{ ++ struct netif *netif; ++ ip_addr_t multi_addr; ++ ip_addr_t src_addr; ++ err_t err; ++ u8_t if_idx; ++ ++ if (gsr->gsr_group.ss_family == AF_INET) { ++ inet_addr_to_ip4addr(ip_2_ip4(&multi_addr), &(((struct sockaddr_in *)&(gsr->gsr_group))->sin_addr)); ++ inet_addr_to_ip4addr(ip_2_ip4(&src_addr), &(((struct sockaddr_in *)&(gsr->gsr_source))->sin_addr)); ++ IP_SET_TYPE_VAL(multi_addr, IPADDR_TYPE_V4); ++ IP_SET_TYPE_VAL(src_addr, IPADDR_TYPE_V4); ++ if (!ip4_addr_ismulticast(ip_2_ip4(&multi_addr)) || ip4_addr_isany(ip_2_ip4(&src_addr))) { ++ return EADDRNOTAVAIL; ++ } ++ ++ } else if (gsr->gsr_group.ss_family == AF_INET6) { ++ inet6_addr_to_ip6addr(ip_2_ip6(&multi_addr), &(((struct sockaddr_in6 *)&(gsr->gsr_group))->sin6_addr)); ++ inet6_addr_to_ip6addr(ip_2_ip6(&src_addr), &(((struct sockaddr_in6 *)&(gsr->gsr_source))->sin6_addr)); ++ IP_SET_TYPE_VAL(multi_addr, IPADDR_TYPE_V6); ++ IP_SET_TYPE_VAL(src_addr, IPADDR_TYPE_V6); ++ if (!ip6_addr_ismulticast(ip_2_ip6(&multi_addr)) || ip6_addr_isany(ip_2_ip6(&src_addr))) { ++ return EADDRNOTAVAIL; ++ } ++ ++ } else { ++ return EADDRNOTAVAIL; ++ } ++ ++ if (gsr->gsr_interface) { ++ netif = netif_get_by_index((u8_t)gsr->gsr_interface); ++ } else { ++ netif = netif_default; /* To default network interface */ ++ } ++ if (netif == NULL) { ++ return ENXIO; ++ } ++ ++ if_idx = netif_get_index(netif); ++ if (optname == MCAST_JOIN_SOURCE_GROUP) { ++#if LWIP_IPV4 && LWIP_IGMP ++ if (IP_IS_V4(&multi_addr)) { ++ if (!lwip_socket_register_membership(s, if_idx, ip_2_ip4(&multi_addr))) { ++ /* cannot track membership (out of memory) */ ++ err = ENOMEM; ++ goto out; ++ } ++ } else ++#endif ++ { ++#if LWIP_IPV6 && LWIP_IPV6_MLD ++ if (!lwip_socket_register_mld6_membership(s, if_idx, ip_2_ip6(&multi_addr))) { ++ /* cannot track membership (out of memory) */ ++ err = ENOMEM; ++ goto out; ++ } ++#endif ++ } ++ err = mcast_join_netif(ipmc, netif, &multi_addr, &src_addr); ++ } else { ++ err = mcast_leave_netif(ipmc, netif, &multi_addr, &src_addr); ++ } ++out: ++ return err_to_errno(err); ++} ++ + /** + * setsockopt() IPV6_JOIN_GROUP / IPV6_LEAVE_GROUP command + */ +-- +2.25.1 + diff --git a/lwip.spec b/lwip.spec index 1a19d09..6099169 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: 17 +Release: 18 License: BSD URL: http://savannah.nongnu.org/projects/lwip/ Source0: http://download.savannah.nongnu.org/releases/lwip/%{name}-%{version}.zip @@ -136,6 +136,7 @@ Patch9120: 0121-add-vlan-filter.patch Patch9121: 0122-support-mldv2.patch Patch9122: 0123-opts-modify-MEMP_NUM_UDP_PCB.patch Patch9123: 0124-fix-udp-recv-memleak.patch +Patch9124: 0125-add-MCAST_JOIN_SOURCE_GROUP-to-setsockopt-for-mldv2.patch BuildRequires: gcc-c++ dos2unix dpdk-devel @@ -165,6 +166,9 @@ cd %{_builddir}/%{name}-%{version}/src %{_libdir}/liblwip.a %changelog +* Wed Apr 24 2024 wanfeng - 2.2.0-18 +- add option MCAST_JOIN_SOURCE_GROUP to the setsockopt for the mldv2 protocol + * Mon Apr 22 2024 zhujunhao - 2.2.0-17 - fix udp recv memleak