From d96a90a5ec1579327c46be132b31ec27d0e273bd Mon Sep 17 00:00:00 2001 From: Nate Karstens Date: Wed, 10 May 2023 09:58:30 -0500 Subject: [PATCH] Implement IPV6_MULTICAST_IF socket option Implements the IPV6_MULTICAST_IF socket option, which specifies the interface for outgoing multicast packets. Based on work from https://savannah.nongnu.org/patch/?9554 Co-authored-by: Christina Schoenrogge Co-authored-by: Chee Bin Hoh Co-authored-by: hanhui --- src/api/sockets.c | 16 ++++++++++++++++ src/include/lwip/sockets.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/src/api/sockets.c b/src/api/sockets.c index dc3e6f58..638b137a 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -3181,6 +3181,14 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\n", s, *(int *)optval)); break; +#if LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP + case IPV6_MULTICAST_IF: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP); + *(int *)optval = udp_get_multicast_netif_index(sock->conn->pcb.udp); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_IF) = %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", s, optname)); @@ -3668,6 +3676,14 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\n", s, (netconn_get_ipv6only(sock->conn) ? 1 : 0))); break; +#if LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP + case IPV6_MULTICAST_IF: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP); + udp_set_multicast_netif_index(sock->conn->pcb.udp, (u8_t)(*(int *)optval)); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_IF, ..) -> %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ #if LWIP_IPV6_MLD case IPV6_JOIN_GROUP: case IPV6_LEAVE_GROUP: { diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h index 0a2d92ff..c01877aa 100644 --- a/src/include/lwip/sockets.h +++ b/src/include/lwip/sockets.h @@ -317,6 +317,8 @@ struct linger { #define IP_MULTICAST_TTL 5 #define IP_MULTICAST_IF 6 #define IP_MULTICAST_LOOP 7 + +#define IPV6_MULTICAST_IF 17 /* RFC3493: interface for outgoing multicast packets */ #endif /* LWIP_MULTICAST_TX_OPTIONS */ #if LWIP_IGMP