Compare commits

...
Author SHA1 Message Date
Simon Kelley c5379c1ab6 Don't send hoplimit 1 when multicasting RAs 2012-02-24 20:05:52 +00:00
Simon Kelley a4a5205fd7 Fix ordering problem in multicast setup. 2012-02-24 19:44:05 +00:00
2 changed files with 13 additions and 14 deletions

No files matched your search

+9 -8
View File
@@ -101,13 +101,6 @@ static int join_multicast(struct in6_addr *local, int prefix,
if (if_index == listenp->fd_or_iface)
return 1;
mreq.ipv6mr_interface = if_index;
inet_pton(AF_INET6, ALL_ROUTERS, &mreq.ipv6mr_multiaddr);
if (daemon->icmp6fd != -1 &&
setsockopt(daemon->icmp6fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == -1)
return 0;
if (!indextoname(fd, if_index, ifrn_name))
return 0;
@@ -126,7 +119,9 @@ static int join_multicast(struct in6_addr *local, int prefix,
if (!context)
return 1;
mreq.ipv6mr_interface = if_index;
inet_pton(AF_INET6, ALL_RELAY_AGENTS_AND_SERVERS, &mreq.ipv6mr_multiaddr);
if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == -1)
@@ -137,6 +132,12 @@ static int join_multicast(struct in6_addr *local, int prefix,
if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == -1)
return 0;
inet_pton(AF_INET6, ALL_ROUTERS, &mreq.ipv6mr_multiaddr);
if (daemon->icmp6fd != -1 &&
setsockopt(daemon->icmp6fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == -1)
return 0;
listenp = whine_malloc(sizeof(struct listen_param));
listenp->fd_or_iface = if_index;
listenp->next = param->next;
+4 -6
View File
@@ -41,7 +41,7 @@ static int iface_search(struct in6_addr *local, int prefix,
int scope, int if_index, int dad, void *vparam);
static int add_lla(int index, unsigned int type, char *mac, size_t maclen, void *parm);
static int unicast_hop_limit, multicast_hop_limit;
static int hop_limit;
static time_t ra_short_period_start;
void ra_init(time_t now)
@@ -53,16 +53,14 @@ void ra_init(time_t now)
int class = IPTOS_CLASS_CS6;
#endif
int val = 255; /* radvd uses this value */
size_t len1 = sizeof(int);
size_t len2 = sizeof(int);
size_t len = sizeof(int);
ICMP6_FILTER_SETBLOCKALL(&filter);
ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &filter);
ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filter);
if ((fd = socket(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) == -1 ||
getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &unicast_hop_limit, &len1) ||
getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &multicast_hop_limit, &len2) ||
getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hop_limit, &len) ||
#if defined(IP_TOS) && defined(IPTOS_CLASS_CS6)
setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &class, sizeof(class)) == -1 ||
#endif
@@ -198,7 +196,7 @@ static void send_ra(int iface, char *iface_name, struct in6_addr *dest)
ra->type = ICMP6_ROUTER_ADVERT;
ra->code = 0;
ra->hop_limit = dest ? unicast_hop_limit : multicast_hop_limit;
ra->hop_limit = hop_limit;
ra->flags = 0;
ra->lifetime = htons(1800); /* AdvDefaultLifetime*/
ra->reachable_time = 0;