From 42c981994adcf7fb2e1c2bea170cc5f196d5a1d7 Mon Sep 17 00:00:00 2001 From: paul Date: Sat, 7 May 2005 02:22:51 +0000 Subject: 2005-05-07 Yar Tikhiy * configure.ac: Check for OSes which support passing ifindex in struct ip_mreq. * lib/sockopt.c: Add support for BSD style ifindex in ip_mreq. * ospfd/ospf_network.c: Log ifindex on multicast membership leave/join events. --- lib/sockopt.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/sockopt.c') diff --git a/lib/sockopt.c b/lib/sockopt.c index 81db88d9..655ecdc0 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -171,8 +171,7 @@ setsockopt_multicast_ipv4(int sock, unsigned int ifindex) { - /* Linux 2.2.0 and up */ -#if defined(GNU_LINUX) && LINUX_VERSION_CODE > 131584 +#ifdef HAVE_STRUCT_IP_MREQN_IMR_IFINDEX /* This is better because it uses ifindex directly */ struct ip_mreqn mreqn; @@ -212,11 +211,16 @@ setsockopt_multicast_ipv4(int sock, struct in_addr m; struct ip_mreq mreq; +#ifdef HAVE_BSD_STRUCT_IP_MREQ_HACK + if (ifindex) + m.s_addr = htonl(ifindex); + else +#endif + m = if_addr; + switch (optname) { case IP_MULTICAST_IF: - m = if_addr; - return setsockopt (sock, IPPROTO_IP, optname, (void *)&m, sizeof(m)); break; @@ -224,7 +228,7 @@ setsockopt_multicast_ipv4(int sock, case IP_DROP_MEMBERSHIP: memset (&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = mcast_addr; - mreq.imr_interface = if_addr; + mreq.imr_interface = m; return setsockopt (sock, IPPROTO_IP, -- cgit v1.2.1