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); }