On Wed, Nov 26, 2014 at 04:05:42PM -0500, Forman, Jeffrey wrote:
> Hi Misc,
> 
> Long time listener, seldom caller.
> 
> My problem statement: I run OpenBSD 5.6-stable on my fw/router. My ISP
> (Comcast in the US) provides native IPv6 support for all their customers.
> They provide a /128 address for your external WAN interface, along with a
> /64 delegation for your internal LAN. I can use ISC's dhclient binary (from
> the isc-dhcp-client-4.3 package) along with OpenBSD's rtsold binary to
> request an IP and router gateway information respectively on my fw/router.
> My problem is, rtsold is only expected/allowed to be used on host
> (non-router) nodes.

On -current there is no longer the need to run rtsold(8), I just didn't
get around to delet it, yet.
        inet6 autoconf
in your /etc/hostname.$WAN_IF will suffice.
However, the problem is actually in the kernel. If you feel courageous
you can try this diff with net.inet6.ip6.forwarding=1 enabled.

And please use "inet6 autoconf" and not rtsold(8), I seem to recall that
there is a check in rtsold(8) that it won't send solicitations if
forwarding is enabled, I might be mistaken though.
Only tested a little; I don't have a testsetup for this.
It compiles, doesn't panic immediately and I do get a default route
with forwarding enabled.

diff --git sys/netinet6/nd6.c sys/netinet6/nd6.c
index 529f077..52f1146 100644
--- sys/netinet6/nd6.c
+++ sys/netinet6/nd6.c
@@ -610,8 +610,7 @@ nd6_purge(struct ifnet *ifp)
                }
        }
 
-       /* XXX: too restrictive? */
-       if (!ip6_forwarding && (ifp->if_xflags & IFXF_AUTOCONF6)) {
+       if (ifp->if_xflags & IFXF_AUTOCONF6) {
                /* refresh default router list */
                defrouter_select();
        }
@@ -1574,12 +1573,8 @@ fail:
         * defrtrlist_update called the function as well.  However, I believe
         * we can compromise the overhead, since it only happens the first
         * time.
-        * XXX: although defrouter_select() should not have a bad effect
-        * for those are not autoconfigured hosts, we explicitly avoid such
-        * cases for safety.
         */
-       if (do_update && ln->ln_router && !ip6_forwarding &&
-           (ifp->if_xflags & IFXF_AUTOCONF6))
+       if (do_update && ln->ln_router && (ifp->if_xflags & IFXF_AUTOCONF6))
                defrouter_select();
 
        return rt;
diff --git sys/netinet6/nd6_rtr.c sys/netinet6/nd6_rtr.c
index ba16368..9f1b728 100644
--- sys/netinet6/nd6_rtr.c
+++ sys/netinet6/nd6_rtr.c
@@ -712,21 +712,6 @@ defrouter_select(void)
        struct llinfo_nd6 *ln = NULL;
 
        /*
-        * This function should be called only when acting as an autoconfigured
-        * host.  Although the remaining part of this function is not effective
-        * if the node is not an autoconfigured host, we explicitly exclude
-        * such cases here for safety.
-        */
-       /* XXX too strict? */
-       if (ip6_forwarding) {
-               nd6log((LOG_WARNING,
-                   "defrouter_select: called unexpectedly (forwarding=%d)\n",
-                   ip6_forwarding));
-               splx(s);
-               return;
-       }
-
-       /*
         * Let's handle easy case (3) first:
         * If default router list is empty, there's nothing to be done.
         */
@@ -879,7 +864,7 @@ defrtrlist_update(struct nd_defrouter *new)
        /* entry does not exist */
        if (new->rtlifetime == 0) {
                /* flush all possible redirects */
-               if (!ip6_forwarding && (new->ifp->if_xflags & IFXF_AUTOCONF6))
+               if (new->ifp->if_xflags & IFXF_AUTOCONF6)
                        rt6_flush(&new->rtaddr, new->ifp);
                splx(s);
                return (NULL);


-- 
It compiles, let's ship it!

Reply via email to