summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorFederico Ceratto <federico.ceratto@gmail.com>2015-12-15 23:50:28 +0000
committerFederico Ceratto <federico.ceratto@gmail.com>2015-12-16 00:42:22 +0000
commite174aa1dbccd6c5c5b6a05543da41158c3e2c374 (patch)
treee76d99c2087bc7ae6f2435abcbfc7cc16a74c6ce /lib
parent31ebb11d73f7ad58afc497f20d9723503b83ca75 (diff)
downloadNim-e174aa1dbccd6c5c5b6a05543da41158c3e2c374.tar.gz
Add SO_REUSEPORT support
Diffstat (limited to 'lib')
-rw-r--r--lib/posix/posix.nim2
-rw-r--r--lib/pure/asynchttpserver.nim6
-rw-r--r--lib/pure/nativesockets.nim2
-rw-r--r--lib/pure/net.nim3
4 files changed, 10 insertions, 3 deletions
diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim
index 5f1dfcfcd..c3d563419 100644
--- a/lib/posix/posix.nim
+++ b/lib/posix/posix.nim
@@ -1566,6 +1566,8 @@ var
     ## Receive timeout.
   SO_REUSEADDR* {.importc, header: "<sys/socket.h>".}: cint
     ## Reuse of local addresses is supported.
+  SO_REUSEPORT* {.importc, header: "<sys/socket.h>".}: cint
+    ## Multiple binding: load balancing on incoming TCP connections or UDP packets. (Requires Linux kernel > 3.9)
   SO_SNDBUF* {.importc, header: "<sys/socket.h>".}: cint
     ## Send buffer size.
   SO_SNDLOWAT* {.importc, header: "<sys/socket.h>".}: cint
diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim
index 590b52c1a..865b14c75 100644
--- a/lib/pure/asynchttpserver.nim
+++ b/lib/pure/asynchttpserver.nim
@@ -39,6 +39,7 @@ type
   AsyncHttpServer* = ref object
     socket: AsyncSocket
     reuseAddr: bool
+    reusePort: bool
 
   HttpCode* = enum
     Http100 = "100 Continue",
@@ -99,10 +100,11 @@ proc `==`*(protocol: tuple[orig: string, major, minor: int],
     of HttpVer10: 0
   result = protocol.major == major and protocol.minor == minor
 
-proc newAsyncHttpServer*(reuseAddr = true): AsyncHttpServer =
+proc newAsyncHttpServer*(reuseAddr = true, reusePort = false): AsyncHttpServer =
   ## Creates a new ``AsyncHttpServer`` instance.
   new result
   result.reuseAddr = reuseAddr
+  result.reusePort = reusePort
 
 proc addHeaders(msg: var string, headers: StringTableRef) =
   for k, v in headers:
@@ -264,6 +266,8 @@ proc serve*(server: AsyncHttpServer, port: Port,
   server.socket = newAsyncSocket()
   if server.reuseAddr:
     server.socket.setSockOpt(OptReuseAddr, true)
+  if server.reusePort:
+    server.socket.setSockOpt(OptReusePort, true)
   server.socket.bindAddr(port, address)
   server.socket.listen()
 
diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim
index 8a7780570..37e3773c5 100644
--- a/lib/pure/nativesockets.nim
+++ b/lib/pure/nativesockets.nim
@@ -38,7 +38,7 @@ export
   SOL_SOCKET,
   SOMAXCONN,
   SO_ACCEPTCONN, SO_BROADCAST, SO_DEBUG, SO_DONTROUTE,
-  SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR,
+  SO_KEEPALIVE, SO_OOBINLINE, SO_REUSEADDR, SO_REUSEPORT,
   MSG_PEEK
 
 when defined(macosx) and not defined(nimdoc):
diff --git a/lib/pure/net.nim b/lib/pure/net.nim
index d1016011e..1243201ab 100644
--- a/lib/pure/net.nim
+++ b/lib/pure/net.nim
@@ -72,7 +72,7 @@ type
 
   SOBool* = enum ## Boolean socket options.
     OptAcceptConn, OptBroadcast, OptDebug, OptDontRoute, OptKeepAlive,
-    OptOOBInline, OptReuseAddr
+    OptOOBInline, OptReuseAddr, OptReusePort
 
   ReadLineResult* = enum ## result for readLineAsync
     ReadFullLine, ReadPartialLine, ReadDisconnected, ReadNone
@@ -523,6 +523,7 @@ proc toCInt*(opt: SOBool): cint =
   of OptKeepAlive: SO_KEEPALIVE
   of OptOOBInline: SO_OOBINLINE
   of OptReuseAddr: SO_REUSEADDR
+  of OptReusePort: SO_REUSEPORT
 
 proc getSockOpt*(socket: Socket, opt: SOBool, level = SOL_SOCKET): bool {.
   tags: [ReadIOEffect].} =