On 11/02/14(Tue) 19:40, Alexander Bluhm wrote:
> On Tue, Feb 11, 2014 at 03:53:24PM +0100, Martin Pieuchot wrote:
> > When a carp node sends a neighbor advertisement, because its status
> > switch from BACKUP to MASTER for example, it does it using a wrong
> > mac address: the one from its real associated interface (carpdev).
> >
> > Because of this, a hack was added later on to remove and re-add the
> > route entry to loopback for the local IPv6 address, otherwise this
> > entry would be updated on the BACKUP node with the MAC address of
> > the physical interface on the MASTER node!
> >
> > So this diff fix this by using the carp interface to send the NA and
> > also change it for the ARP request for consistency.
>
> There is the ip-stealth mode where the switch must not see the
> virtual MAC address to make it flooding. An ARP or ND packet with
> the CARP MAC as source address would break the feature.
This diff doesn't change anything on this regard. It changes the target
link-layer address send inside the NA to be the CARP MAC address and not
the physical interface's one.
Without it I get:
icmp6: neighbor adv: tgt is ...(RO)(tgt lladdr: 00:00:14:ee:43:71)
^^^^^^^^^^^^^^^^^
MAC addr. of carpdev
And with it:
icmp6: neighbor adv: tgt is ...(RO)(tgt lladdr: 00:00:5e:00:01:03)
^^^^^^^^^^^^^^^^^
CARP MAC addr
So ok?
> > Index: netinet/ip_carp.c
> > ===================================================================
> > RCS file: /home/ncvs/src/sys/netinet/ip_carp.c,v
> > retrieving revision 1.221
> > diff -u -p -r1.221 ip_carp.c
> > --- netinet/ip_carp.c 7 Feb 2014 22:22:37 -0000 1.221
> > +++ netinet/ip_carp.c 11 Feb 2014 13:53:16 -0000
> > @@ -509,17 +509,6 @@ carp_setroute(struct carp_softc *sc, int
> > }
> > break;
> > }
> > -
> > -#ifdef INET6
> > - case AF_INET6:
> > - if (sc->sc_balancing >= CARP_BAL_IP)
> > - continue;
> > - if (cmd == RTM_ADD)
> > - in6_ifaddloop(ifa);
> > - else
> > - in6_ifremloop(ifa);
> > - break;
> > -#endif /* INET6 */
> > default:
> > break;
> > }
> > @@ -1330,7 +1319,7 @@ carp_send_arp(struct carp_softc *sc)
> > continue;
> >
> > in = ifatoia(ifa)->ia_addr.sin_addr.s_addr;
> > - arprequest(sc->sc_carpdev, &in, &in, sc->sc_ac.ac_enaddr);
> > + arprequest(&sc->sc_if, &in, &in, sc->sc_ac.ac_enaddr);
> > DELAY(1000); /* XXX */
> > }
> > splx(s);
> > @@ -1351,7 +1340,7 @@ carp_send_na(struct carp_softc *sc)
> > continue;
> >
> > in6 = &ifatoia6(ifa)->ia_addr.sin6_addr;
> > - nd6_na_output(sc->sc_carpdev, &mcast, in6,
> > + nd6_na_output(&sc->sc_if, &mcast, in6,
> > ND_NA_FLAG_OVERRIDE |
> > (ip6_forwarding ? ND_NA_FLAG_ROUTER : 0), 1, NULL);
> > DELAY(1000); /* XXX */