From 6825f94570b05f933f09ae1bd7e520954d903e6a Mon Sep 17 00:00:00 2001 From: Alexander Chernikov Date: Fri, 16 Dec 2022 19:35:02 +0100 Subject: FreeBSD: use interface index instead of IP address when specifying multicast interface Minor changes from committer. --- sysdep/bsd/sysio.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'sysdep/bsd/sysio.h') diff --git a/sysdep/bsd/sysio.h b/sysdep/bsd/sysio.h index f1887fb4..9fc58486 100644 --- a/sysdep/bsd/sysio.h +++ b/sysdep/bsd/sysio.h @@ -15,6 +15,7 @@ #ifdef __FreeBSD__ /* Should be defined in sysdep/cf/bsd.h, but it is flavor-specific */ #define CONFIG_DONTROUTE_UNICAST +#define CONFIG_USE_IP_MREQN #endif #ifdef __NetBSD__ @@ -45,13 +46,21 @@ #define INIT_MREQ4(maddr,ifa) \ { .imr_multiaddr = ipa_to_in4(maddr), .imr_interface = ip4_to_in4(ifa->sysdep) } +#define INIT_MREQN4(maddr,ifa) \ + { .imr_multiaddr = ipa_to_in4(maddr), .imr_ifindex = ifa->index } + static inline int sk_setup_multicast4(sock *s) { - struct in_addr ifa = ip4_to_in4(s->iface->sysdep); u8 ttl = s->ttl; u8 n = 0; +#ifdef CONFIG_USE_IP_MREQN + struct ip_mreqn ifa = { .imr_ifindex = s->iface->index }; +#else + struct in_addr ifa = ip4_to_in4(s->iface->sysdep); +#endif + /* This defines where should we send _outgoing_ multicasts */ if (setsockopt(s->fd, IPPROTO_IP, IP_MULTICAST_IF, &ifa, sizeof(ifa)) < 0) ERR("IP_MULTICAST_IF"); @@ -68,7 +77,11 @@ sk_setup_multicast4(sock *s) static inline int sk_join_group4(sock *s, ip_addr maddr) { +#ifdef CONFIG_USE_IP_MREQN + struct ip_mreqn mr = INIT_MREQN4(maddr, s->iface); +#else struct ip_mreq mr = INIT_MREQ4(maddr, s->iface); +#endif if (setsockopt(s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) ERR("IP_ADD_MEMBERSHIP"); @@ -79,7 +92,11 @@ sk_join_group4(sock *s, ip_addr maddr) static inline int sk_leave_group4(sock *s, ip_addr maddr) { +#ifdef CONFIG_USE_IP_MREQN + struct ip_mreqn mr = INIT_MREQN4(maddr, s->iface); +#else struct ip_mreq mr = INIT_MREQ4(maddr, s->iface); +#endif if (setsockopt(s->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mr, sizeof(mr)) < 0) ERR("IP_ADD_MEMBERSHIP"); -- cgit v1.2.3 From 2b7643e1f8ecb0bd4cf9af4183b4fd53b655d19c Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Sun, 18 Dec 2022 20:10:14 +0100 Subject: BSD: Use ip_mreqn on FreeBSD 12.1+ and OpenBSD 6.9+ --- sysdep/bsd/sysio.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'sysdep/bsd/sysio.h') diff --git a/sysdep/bsd/sysio.h b/sysdep/bsd/sysio.h index 9fc58486..b6b42b1e 100644 --- a/sysdep/bsd/sysio.h +++ b/sysdep/bsd/sysio.h @@ -15,9 +15,23 @@ #ifdef __FreeBSD__ /* Should be defined in sysdep/cf/bsd.h, but it is flavor-specific */ #define CONFIG_DONTROUTE_UNICAST + +#if __FreeBSD_version >= 1201000 +#define CONFIG_USE_IP_MREQN +#endif + +#endif + + +#ifdef __OpenBSD__ + +#if OpenBSD >= 202105 #define CONFIG_USE_IP_MREQN #endif +#endif + + #ifdef __NetBSD__ #ifndef IP_RECVTTL @@ -30,6 +44,7 @@ #endif + #ifdef __DragonFly__ #define TCP_MD5SIG TCP_SIGNATURE_ENABLE #endif -- cgit v1.2.3