From 8f3194f7ac4590deeaf427fa40aa0f8d53588c05 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Mon, 30 Sep 2013 15:04:58 +0100 Subject: [PATCH] Do multicast interface selection portably for router advertisements. --- src/radv.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/radv.c b/src/radv.c index d2b3977..b1f2bc1 100644 --- a/src/radv.c +++ b/src/radv.c @@ -391,10 +391,13 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de addr.sin6_scope_id = iface; } else - inet_pton(AF_INET6, ALL_NODES, &addr.sin6_addr); + { + inet_pton(AF_INET6, ALL_NODES, &addr.sin6_addr); + setsockopt(daemon->icmp6fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &iface, sizeof(iface)); + } - send_from(daemon->icmp6fd, 0, daemon->outpacket.iov_base, save_counter(0), - (union mysockaddr *)&addr, (struct all_addr *)&parm.link_local, iface); + while (sendto(daemon->icmp6fd, daemon->outpacket.iov_base, save_counter(0), 0, + (struct sockaddr *)&addr, sizeof(addr)) == -1 && retry_send()); }