Commit 8931425d authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Fixes problem with RIP on multiple ifaces on BSD.

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.
parent 548c329c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#define CONFIG_MULTIPLE_TABLES

#define CONFIG_SKIP_MC_BIND
#define CONFIG_NO_IFACE_BIND

/*
Link: sysdep/unix
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#define CONFIG_MULTIPLE_TABLES

#define CONFIG_SKIP_MC_BIND
#define CONFIG_NO_IFACE_BIND

/*
Link: sysdep/unix
+9 −0
Original line number Diff line number Diff line
@@ -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)