]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use SO_REUSEPORT_LB on FreeBSD if available
authorOndřej Surý <ondrej@sury.org>
Mon, 29 Apr 2019 17:29:09 +0000 (19:29 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 15 May 2019 05:30:23 +0000 (07:30 +0200)
lib/isc/unix/socket.c

index 1e358420065f382cd12e87f5257b2e71acd95ea4..58fa29e3db02faf10b1d2c1ccd6e1a488b79b2cf 100644 (file)
@@ -4475,6 +4475,13 @@ isc_socket_bind(isc_socket_t *sock0, const isc_sockaddr_t *sockaddr,
                        UNEXPECTED_ERROR(__FILE__, __LINE__,
                                         "setsockopt(%d) failed", sock->fd);
                }
+#if defined(__FreeBSD_kernel__) && defined(SO_REUSEPORT_LB)
+               if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEPORT_LB,
+                              (void *)&on, sizeof(on)) < 0)
+               {
+                       UNEXPECTED_ERROR(__FILE__, __LINE__,
+                                        "setsockopt(%d) failed", sock->fd);
+               }
 #elif defined(__linux__) && defined(SO_REUSEPORT)
                if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEPORT,
                               (void *)&on, sizeof(on)) < 0)
@@ -5334,7 +5341,8 @@ init_hasreuseport() {
  * We only want to use it on Linux, if it's available. On BSD we want to dup()
  * sockets instead of re-binding them.
  */
-#if defined(SO_REUSEPORT) && defined(__linux__)
+#if (defined(SO_REUSEPORT) && defined(__linux__)) || \
+    (defined(SO_REUSEPORT_LB) && defined(__FreeBSD_kernel__))
        int sock, yes = 1;
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock < 0) {
@@ -5348,8 +5356,13 @@ init_hasreuseport() {
        {
                close(sock);
                return;
+#if defined(__FreeBSD_kernel__)
+       } else if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT_LB,
+                             (void *)&yes, sizeof(yes)) < 0)
+#else
        } else if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT,
                              (void *)&yes, sizeof(yes)) < 0)
+#endif
        {
                close(sock);
                return;