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.
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 */