]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixes problem with RIP on multiple ifaces on BSD.
authorOndrej Zajicek <santiago@crfreenet.org>
Fri, 22 Nov 2013 01:12:21 +0000 (02:12 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 22 Nov 2013 01:12:21 +0000 (02:12 +0100)
RIP sockets for multiple ifaces collided, because we cannot bind to
a specific iface on BSD. Workarounded by SO_REUSEPORT.

Thanks to Eugene M. Zheganin for the bugreport.

sysdep/cf/bsd-v6.h
sysdep/cf/bsd.h
sysdep/unix/io.c

index 3403299f698df7e6b2d563d91c9f1f25d3f6d8fa..47a7c7ff4e7b36242cb6c90cd3006940ecbcd268 100644 (file)
@@ -13,6 +13,7 @@
 #define CONFIG_MULTIPLE_TABLES
 
 #define CONFIG_SKIP_MC_BIND
+#define CONFIG_NO_IFACE_BIND
 
 /*
 Link: sysdep/unix
index 1101b228db0744d4eeb79f66287eeb1b05a0d4e5..5e6d03e8d4db5dde54f5ee1c3d09c09361efc743 100644 (file)
@@ -11,6 +11,7 @@
 #define CONFIG_MULTIPLE_TABLES
 
 #define CONFIG_SKIP_MC_BIND
+#define CONFIG_NO_IFACE_BIND
 
 /*
 Link: sysdep/unix
index fcf5dd1d9b283baa522850a8df67922ec40e8bf2..51c6c0c150c0f2702345c84e06296f5317563f52 100644 (file)
@@ -1181,6 +1181,15 @@ sk_open(sock *s)
          port = s->sport;
          if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0)
            ERR("SO_REUSEADDR");
+       
+#ifdef CONFIG_NO_IFACE_BIND
+         /* Workaround missing ability to bind to an iface */
+         if ((type == SK_UDP) && s->iface && ipa_zero(s->saddr))
+         {
+           if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) < 0)
+             ERR("SO_REUSEPORT");
+         }
+#endif
        }
       fill_in_sockaddr(&sa, s->saddr, s->iface, port);
       if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0)