ports/158697: radvd doesn't listen for Router Solicitations

Geoffrey Sisson geoff at dns-oarc.net
Wed Jul 6 22:10:08 UTC 2011


>Number:         158697
>Category:       ports
>Synopsis:       radvd doesn't listen for Router Solicitations
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jul 06 22:10:07 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Geoffrey Sisson <geoff at dns-oarc.net>
>Release:        radvd-1.8 (net/radvd)
>Organization:
DNS-OARC (http://www.dns-oarc.net/)
>Environment:
System: FreeBSD dns-tender.dns-oarc.net 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Wed May 11 00:24:33 UTC 2011 root at dns-tender.dns-oarc.net:/usr/obj/usr/src/sys/DNS-TENDER amd64
Version: radvd-1.8

>Description:
   radvd doesn't listen for Router Solicitations even when
   "AdvSendAdvert" is set to "on".  The function
   setup_allrouters_membership in device-bsd44.c is just a stub
   that effectively performs a NOP when establishing a listen socket.
   The same function in device-linux.c contains a setsockopt call
   that causes radvd to join the all-routers multicast group.

   While ignoring RS messages isn't fatal (unconfigured hosts will
   eventually see an RA message), it is contrary to RFC 2461:

      A router MUST join the all-routers multicast address on an
      advertising interface. [Section 6.2.2]

>How-To-Repeat:
   Send Router Solicitations from a host to a FreeBSD router running
   radvd.  tcpdump -i <interface> dst host \( ff02::1 or ff02::2 \)
   will show unanswered Router Solicitations.

>Fix:
   Patch attached.  Note that this patch is only partial.  The
   function check_allrouters_membership in device-bsd44.c also needs
   attention.

------------------------ Begin included text ------------------------
--- radvd-1.8/device-bsd44.c.orig	2011-07-06 20:19:40.000000000 +0000
+++ radvd-1.8/device-bsd44.c	2011-07-06 20:30:37.000000000 +0000
@@ -189,6 +189,24 @@
 
 int setup_allrouters_membership(struct Interface *iface)
 {
+	struct ipv6_mreq mreq;
+
+	memset(&mreq, 0, sizeof(mreq));
+	mreq.ipv6mr_interface = iface->if_index;
+
+	/* all-routers multicast address */
+	if (inet_pton(AF_INET6, "ff02::2",
+			&mreq.ipv6mr_multiaddr.s6_addr) != 1) {
+		flog(LOG_ERR, "inet_pton failed");
+		return (-1);
+	}
+
+	if (setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,
+			&mreq, sizeof(mreq)) < 0) {
+		flog(LOG_ERR, "can't join ipv6-allrouters on %s", iface->Name);
+		return (-1);
+	}
+
 	return (0);
 }
 
------------------------- End included text -------------------------
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list