On 06/03/14(Thu) 09:34, Martin Pieuchot wrote: > On 19/02/14(Wed) 12:53, Martin Pieuchot wrote: > > Generally, when a NA is received we check if the receiving interface > > has the target address advertised and if it's the case we warn about > > duplicate addresses and bail. > > > > But in the case of a carp interface in BACKUP state it's different. In > > this case we have a hack that sets the ifa to NULL and continue. This > > hack relies on the fact that no cache entry will be found later on > > (because it was removed when the state switch to BACKUP) or that there > > is no lladdr change in the NA (like it is right now) to work properly. > > > > So instead of expecting such things, simply ignore NAs with matching > > address on carp BACKUP nodes since they are more likely to come from > > the carp MASTER. > > > > Less is more, ok? > > Anybody?
And now a correct version without a "typo" (|| should be &&) spotted by sthen@. Here's a freshly retested the diff: Index: netinet6/nd6_nbr.c =================================================================== RCS file: /home/ncvs/src/sys/netinet6/nd6_nbr.c,v retrieving revision 1.75 diff -u -p -r1.75 nd6_nbr.c --- netinet6/nd6_nbr.c 24 Jan 2014 12:20:22 -0000 1.75 +++ netinet6/nd6_nbr.c 6 Mar 2014 10:08:17 -0000 @@ -570,9 +570,6 @@ nd6_na_input(struct mbuf *m, int off, in struct rtentry *rt; struct sockaddr_dl *sdl; union nd_opts ndopts; -#if NCARP > 0 - struct sockaddr_dl *proxydl = NULL; -#endif char addr[INET6_ADDRSTRLEN], addr0[INET6_ADDRSTRLEN]; if (ip6->ip6_hlim != 255) { @@ -632,11 +629,6 @@ nd6_na_input(struct mbuf *m, int off, in } ifa = &in6ifa_ifpwithaddr(ifp, &taddr6)->ia_ifa; -#if NCARP > 0 - if (ifp->if_type == IFT_CARP && ifa && - !carp_iamatch6(ifp, lladdr, &proxydl)) - ifa = NULL; -#endif /* * Target address matches one of my interface address. @@ -652,8 +644,18 @@ nd6_na_input(struct mbuf *m, int off, in goto freeit; } - /* Just for safety, maybe unnecessary. */ if (ifa) { +#if NCARP > 0 + struct sockaddr_dl *proxydl = NULL; + + /* + * Ignore NAs silently for carp addresses if we're not + * the CARP master. + */ + if (ifp->if_type == IFT_CARP && + !carp_iamatch6(ifp, lladdr, &proxydl)) + goto freeit; +#endif log(LOG_ERR, "nd6_na_input: duplicate IP6 address %s\n", inet_ntop(AF_INET6, &taddr6, addr, sizeof(addr)));