On Sat, Apr 23, 2011 at 09:15:51PM +0000, Stuart Henderson wrote:
> On 2011-04-21, ???? ??????? <chipits...@gmail.com> wrote:
> > Dear Sirs,
> >
> > I need to configure ipv6 over carp interface. It seems that carp doesn't
> > like things in one line
> >
> >
> > ifconfig carp470 vhid 70 pass xxx carpdev vlan470 advskew 20 inet6
> > 2a00:1a70:80:470::2 prefixlen 128
> >
> > it says something wrong about ipv6. don't have any idea why. so, one-line
> > config for hostname.carpXXX will not work.
> >
> > if I do two ifconfigs:
> >
> >
> > ifconfig carp470 vhid 70 pass xxx carpdev vlan470 advskew 20
> > ifconfig carp470 inet6 2a00:1a70:80:470::2 prefixlen 128
> >
> >
> > everthing seems to be ok.
> 
> Not really, it just sits in init unless you also configure a (possibly
> dummy) ipv4 address.
 
This is a bug in -current. I broke IPv6-only setups.


Index: ip_carp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_carp.c,v
retrieving revision 1.181
diff -p -u -p -u -r1.181 ip_carp.c
--- ip_carp.c   8 Mar 2011 22:53:28 -0000       1.181
+++ ip_carp.c   22 Apr 2011 12:19:01 -0000
@@ -902,6 +902,11 @@ carp_clone_create(ifc, unit)
 #if NBPFILTER > 0
        bpfattach(&ifp->if_bpf, ifp, DLT_EN10MB, ETHER_HDR_LEN);
 #endif
+
+       /* Hook carp_addr_updated to cope with address and route changes */
+       if (sc->ah_cookie == NULL)
+               sc->ah_cookie = hook_establish(sc->sc_if.if_addrhooks, 0,
+                   carp_addr_updated, sc);
        return (0);
 }
 
@@ -2039,14 +2044,6 @@ carp_set_addr(struct carp_softc *sc, str
 
        carp_set_state_all(sc, INIT);
 
-       /*
-        * Hook if_addrhooks so that we get a callback after in_ifinit has run,
-        * to correct any inappropriate routes that it inserted.
-        */
-       if (sc->ah_cookie == NULL)
-               sc->ah_cookie = hook_establish(sc->sc_if.if_addrhooks, 0,
-                   carp_addr_updated, sc);
-
        return (0);
 }
 
@@ -2131,10 +2128,10 @@ carp_set_addr6(struct carp_softc *sc, st
        if (sc->sc_naddrs6 == 0 && (error = carp_join_multicast6(sc)) != 0)
                return (error);
 
-       if (sc->sc_carpdev != NULL && sc->sc_naddrs6)
+       if (sc->sc_carpdev != NULL)
                sc->sc_if.if_flags |= IFF_UP;
+
        carp_set_state_all(sc, INIT);
-       carp_setrun_all(sc, 0);
 
        return (0);
 }

Reply via email to