On Sat, Aug 06, 2011 at 12:47:27AM +0200, Alexander Bluhm wrote:
> To trigger the bug, you need two adresses in the same network on
> the carp and on the parent interface.  One of them has the route,
> the other cannot do ndp.

The bridge has the same problem there, bridge and carp can be fixed
in the same way.

In my experience ipv6 bridge has always been broken and has more
issues.  Do we want this larger diff in release mode?

bluhm


Index: netinet6/in6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6.c,v
retrieving revision 1.91
diff -u -p -r1.91 in6.c
--- netinet6/in6.c      26 Jul 2011 21:19:51 -0000      1.91
+++ netinet6/in6.c      6 Aug 2011 05:04:18 -0000
@@ -61,6 +61,9 @@
  *     @(#)in.c        8.2 (Berkeley) 11/15/93
  */
 
+#include "bridge.h"
+#include "carp.h"
+
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <sys/errno.h>
@@ -1945,7 +1948,16 @@ in6_ifpprefix(const struct ifnet *ifp, c
        if (rt == NULL)
                return (0);
        if ((rt->rt_flags & (RTF_CLONING | RTF_CLONED)) == 0 ||
-           rt->rt_ifp != ifp) {
+           (rt->rt_ifp != ifp &&
+#if NBRIDGE > 0
+           (rt->rt_ifp->if_bridge == NULL || ifp->if_bridge == NULL ||
+           rt->rt_ifp->if_bridge != ifp->if_bridge) &&
+#endif
+#if NCARP > 0
+           (ifp->if_type != IFT_CARP || rt->rt_ifp != ifp->if_carpdev) &&
+           (rt->rt_ifp->if_type != IFT_CARP || rt->rt_ifp->if_carpdev != ifp)&&
+#endif
+           1)) {
                RTFREE(rt);
                return (0);
        }

Reply via email to