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

Reply via email to