int
setsockopt_ipv4_multicast(int sock,
int optname,
+ struct in_addr if_addr,
unsigned int mcast_addr,
unsigned int ifindex)
{
#elif defined(HAVE_BSD_STRUCT_IP_MREQ_HACK) /* #if OS_TYPE */
/* standard BSD API */
- struct in_addr m;
struct ip_mreq mreq;
int ret;
assert(optname == IP_ADD_MEMBERSHIP || optname == IP_DROP_MEMBERSHIP);
- m.s_addr = htonl(ifindex);
memset (&mreq, 0, sizeof(mreq));
mreq.imr_multiaddr.s_addr = mcast_addr;
- mreq.imr_interface = m;
-
+#if !defined __OpenBSD__
+ mreq.imr_interface.s_addr = htonl (ifindex);
+#else
+ mreq.imr_interface.s_addr = if_addr.s_addr;
+#endif
+
ret = setsockopt (sock, IPPROTO_IP, optname, (void *)&mreq, sizeof(mreq));
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
{
* Set IP_MULTICAST_IF socket option in an OS-dependent manner.
*/
int
-setsockopt_ipv4_multicast_if(int sock,
+setsockopt_ipv4_multicast_if(int sock, struct in_addr if_addr,
unsigned int ifindex)
{
#elif defined(HAVE_BSD_STRUCT_IP_MREQ_HACK)
struct in_addr m;
- m.s_addr = htonl(ifindex);
+#if !defined __OpenBSD__
+ m.s_addr = htonl (ifindex);
+#else
+ m.s_addr = if_addr.s_addr;
+#endif
return setsockopt (sock, IPPROTO_IP, IP_MULTICAST_IF, (void *)&m, sizeof(m));
#else
(((af) == AF_INET) : SOPT_SIZE_CMSG_IFINDEX_IPV4() \
? SOPT_SIZE_CMSG_PKTINFO_IPV6())
-extern int setsockopt_ipv4_multicast_if(int sock,
+extern int setsockopt_ipv4_multicast_if(int sock, struct in_addr if_addr,
unsigned int ifindex);
extern int setsockopt_ipv4_multicast(int sock, int optname,
+ struct in_addr if_addr,
unsigned int mcast_addr,
unsigned int ifindex);
extern int setsockopt_ipv4_tos(int sock, int tos);
int ret;
ret = setsockopt_ipv4_multicast (top->fd, IP_ADD_MEMBERSHIP,
- htonl (OSPF_ALLSPFROUTERS),
+ p->u.prefix4, htonl (OSPF_ALLSPFROUTERS),
ifindex);
if (ret < 0)
zlog_warn ("can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %s, "
int ret;
ret = setsockopt_ipv4_multicast (top->fd, IP_DROP_MEMBERSHIP,
- htonl (OSPF_ALLSPFROUTERS),
+ p->u.prefix4, htonl (OSPF_ALLSPFROUTERS),
ifindex);
if (ret < 0)
zlog_warn ("can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %s, "
int ret;
ret = setsockopt_ipv4_multicast (top->fd, IP_ADD_MEMBERSHIP,
- htonl (OSPF_ALLDROUTERS),
+ p->u.prefix4, htonl (OSPF_ALLDROUTERS),
ifindex);
if (ret < 0)
zlog_warn ("can't setsockopt IP_ADD_MEMBERSHIP (fd %d, addr %s, "
int ret;
ret = setsockopt_ipv4_multicast (top->fd, IP_DROP_MEMBERSHIP,
- htonl (OSPF_ALLDROUTERS),
+ p->u.prefix4, htonl (OSPF_ALLDROUTERS),
ifindex);
if (ret < 0)
zlog_warn ("can't setsockopt IP_DROP_MEMBERSHIP (fd %d, addr %s, "
zlog_warn ("can't setsockopt IP_MULTICAST_TTL(1) for fd %d: %s",
top->fd, safe_strerror (errno));
- ret = setsockopt_ipv4_multicast_if (top->fd, ifindex);
+ ret = setsockopt_ipv4_multicast_if (top->fd, p->u.prefix4, ifindex);
if (ret < 0)
zlog_warn("can't setsockopt IP_MULTICAST_IF(fd %d, addr %s, "
"ifindex %u): %s",
ret = setsockopt_ipv4_multicast (sock,
IP_ADD_MEMBERSHIP,
+ ifa,
group.s_addr,
ifindex);
ret = setsockopt_ipv4_multicast (sock,
IP_DROP_MEMBERSHIP,
+ ifa,
group.s_addr,
ifindex);
void
rip_interface_multicast_set (int sock, struct connected *connected)
{
+ struct in_addr addr;
+
assert (connected != NULL);
-
- if (setsockopt_ipv4_multicast_if (sock, connected->ifp->ifindex) < 0)
+
+ addr = CONNECTED_ID(connected)->u.prefix4;
+
+ if (setsockopt_ipv4_multicast_if (sock, addr, connected->ifp->ifindex) < 0)
{
zlog_warn ("Can't setsockopt IP_MULTICAST_IF on fd %d to "
"ifindex %d for interface %s",