From 545a57ce60d568c19b59f3dd9f4b91c6700bc7cc Mon Sep 17 00:00:00 2001 From: Nate Karstens Date: Wed, 10 May 2023 09:58:30 -0500 Subject: [PATCH] Implement IPV6_MULTICAST_HOPS socket option Implements the IPV6_MULTICAST_HOPS socket option, which sets the hop limit for outgoing multicast packets. Also fixes debug message in getsockopt for IP_MULTICAST_TTL. 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 | 12 +++++++++++- src/include/lwip/sockets.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index 7680a46a..6101c889 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -3083,7 +3083,7 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, u8_t, NETCONN_UDP); *(u8_t *)optval = udp_get_multicast_ttl(sock->conn->pcb.udp); LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n", - s, *(int *)optval)); + s, *(u8_t *)optval)); break; case IP_MULTICAST_IF: LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, struct in_addr, NETCONN_UDP); @@ -3180,6 +3180,12 @@ lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *opt LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_IF) = %d\n", s, *(int *)optval)); break; + case IPV6_MULTICAST_HOPS: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, u8_t, NETCONN_UDP); + *(u8_t *)optval = udp_get_multicast_ttl(sock->conn->pcb.udp); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_HOPS) = %d\n", + s, *(u8_t *)optval)); + break; #endif /* LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ default: LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", @@ -3675,6 +3681,10 @@ lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_ LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_MULTICAST_IF, ..) -> %d\n", s, *(int *)optval)); break; + case IPV6_MULTICAST_HOPS: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP); + udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t *)optval)); + break; #endif /* LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ #if LWIP_IPV6_MLD case IPV6_JOIN_GROUP: diff --git a/src/include/lwip/sockets.h b/src/include/lwip/sockets.h index c01877aa..8d0534c2 100644 --- a/src/include/lwip/sockets.h +++ b/src/include/lwip/sockets.h @@ -319,6 +319,7 @@ struct linger { #define IP_MULTICAST_LOOP 7 #define IPV6_MULTICAST_IF 17 /* RFC3493: interface for outgoing multicast packets */ +#define IPV6_MULTICAST_HOPS 18 /* RFC3493: hop limit for outgoing multicast packets */ #endif /* LWIP_MULTICAST_TX_OPTIONS */ #if LWIP_IGMP