summaryrefslogtreecommitdiffstats
path: root/lib/sockopt.c
diff options
context:
space:
mode:
authorpaul <paul>2005-05-07 04:22:51 +0200
committerpaul <paul>2005-05-07 04:22:51 +0200
commit42c981994adcf7fb2e1c2bea170cc5f196d5a1d7 (patch)
treeba2bae75f527d0a034cb42ee3177db9f47802fda /lib/sockopt.c
parent2005-05-06 Paul Jakma <paul.jakma@sun.com> (diff)
downloadfrr-42c981994adcf7fb2e1c2bea170cc5f196d5a1d7.tar.xz
frr-42c981994adcf7fb2e1c2bea170cc5f196d5a1d7.zip
2005-05-07 Yar Tikhiy <yar@comp.chem.msu.su>
* 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.
Diffstat (limited to 'lib/sockopt.c')
-rw-r--r--lib/sockopt.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 81db88d91..655ecdc06 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,