diff options
-rw-r--r-- | pr/include/prio.h | 4 | ||||
-rw-r--r-- | pr/src/io/prmapopt.c | 12 | ||||
-rw-r--r-- | pr/src/pthreads/ptio.c | 2 | ||||
-rw-r--r-- | pr/tests/sockopt.c | 10 |
4 files changed, 25 insertions, 3 deletions
diff --git a/pr/include/prio.h b/pr/include/prio.h index 72397c8e..c7e85db4 100644 --- a/pr/include/prio.h +++ b/pr/include/prio.h @@ -211,6 +211,8 @@ typedef enum PRSockOption PR_SockOpt_NoDelay, /* don't delay send to coalesce packets */ PR_SockOpt_MaxSegment, /* maximum segment size */ PR_SockOpt_Broadcast, /* enable broadcast */ + PR_SockOpt_Reuseport, /* allow local address & port reuse on + * platforms that support it */ PR_SockOpt_Last } PRSockOption; @@ -234,6 +236,8 @@ typedef struct PRSocketOptionData PRUintn tos; /* IP type of service and precedence */ PRBool non_blocking; /* Non-blocking (network) I/O */ PRBool reuse_addr; /* Allow local address reuse */ + PRBool reuse_port; /* Allow local address & port reuse on + * platforms that support it */ PRBool keep_alive; /* Keep connections alive */ PRBool mcast_loopback; /* IP multicast loopback */ PRBool no_delay; /* Don't delay send to coalesce packets */ diff --git a/pr/src/io/prmapopt.c b/pr/src/io/prmapopt.c index 43e8f9cb..f92a76b2 100644 --- a/pr/src/io/prmapopt.c +++ b/pr/src/io/prmapopt.c @@ -85,6 +85,7 @@ PRStatus PR_CALLBACK _PR_SocketGetSocketOption(PRFileDesc *fd, PRSocketOptionDat case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: case PR_SockOpt_Broadcast: + case PR_SockOpt_Reuseport: { #ifdef WIN32 /* Winsock */ BOOL value; @@ -236,6 +237,7 @@ PRStatus PR_CALLBACK _PR_SocketSetSocketOption(PRFileDesc *fd, const PRSocketOpt case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: case PR_SockOpt_Broadcast: + case PR_SockOpt_Reuseport: { #ifdef WIN32 /* Winsock */ BOOL value; @@ -412,10 +414,14 @@ PRStatus PR_CALLBACK _PR_SocketSetSocketOption(PRFileDesc *fd, const PRSocketOpt #define TCP_MAXSEG _PR_NO_SUCH_SOCKOPT #endif -#ifndef SO_BROADCAST /* enable broadcast on udp sockets */ +#ifndef SO_BROADCAST /* enable broadcast on UDP sockets */ #define SO_BROADCAST _PR_NO_SUCH_SOCKOPT #endif +#ifndef SO_REUSEPORT /* allow local address & port reuse */ +#define SO_REUSEPORT _PR_NO_SUCH_SOCKOPT +#endif + PRStatus _PR_MapOptionName( PRSockOption optname, PRInt32 *level, PRInt32 *name) { @@ -424,14 +430,14 @@ PRStatus _PR_MapOptionName( 0, SO_LINGER, SO_REUSEADDR, SO_KEEPALIVE, SO_RCVBUF, SO_SNDBUF, IP_TTL, IP_TOS, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_MULTICAST_LOOP, - TCP_NODELAY, TCP_MAXSEG, SO_BROADCAST + TCP_NODELAY, TCP_MAXSEG, SO_BROADCAST, SO_REUSEPORT }; static PRInt32 socketLevels[PR_SockOpt_Last] = { 0, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, SOL_SOCKET, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, IPPROTO_IP, - IPPROTO_TCP, IPPROTO_TCP, SOL_SOCKET + IPPROTO_TCP, IPPROTO_TCP, SOL_SOCKET, SOL_SOCKET }; if ((optname < PR_SockOpt_Linger) diff --git a/pr/src/pthreads/ptio.c b/pr/src/pthreads/ptio.c index b92749bb..125f1f93 100644 --- a/pr/src/pthreads/ptio.c +++ b/pr/src/pthreads/ptio.c @@ -2854,6 +2854,7 @@ static PRStatus pt_GetSocketOption(PRFileDesc *fd, PRSocketOptionData *data) case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: case PR_SockOpt_Broadcast: + case PR_SockOpt_Reuseport: { PRIntn value; length = sizeof(PRIntn); @@ -2973,6 +2974,7 @@ static PRStatus pt_SetSocketOption(PRFileDesc *fd, const PRSocketOptionData *dat case PR_SockOpt_Keepalive: case PR_SockOpt_NoDelay: case PR_SockOpt_Broadcast: + case PR_SockOpt_Reuseport: { PRIntn value = (data->value.reuse_addr) ? 1 : 0; rv = setsockopt( diff --git a/pr/tests/sockopt.c b/pr/tests/sockopt.c index 66b40277..158b8292 100644 --- a/pr/tests/sockopt.c +++ b/pr/tests/sockopt.c @@ -11,6 +11,10 @@ #include "plerror.h" +#ifdef XP_UNIX +#include <sys/socket.h> /* SO_REUSEPORT */ +#endif + static PRFileDesc *err = NULL; static PRBool failed = PR_FALSE; @@ -54,6 +58,7 @@ int main(int argc, char **argv) "PR_SockOpt_NoDelay", /* don't delay send to coalesce packets */ "PR_SockOpt_MaxSegment", /* maximum segment size */ "PR_SockOpt_Broadcast", /* Enable broadcast */ + "PR_SockOpt_Reuseport", /* allow local address & port reuse */ "PR_SockOpt_Last" }; @@ -130,6 +135,11 @@ int main(int argc, char **argv) data.value.broadcast = PR_TRUE; break; #endif +#ifdef SO_REUSEPORT + case PR_SockOpt_Reuseport: + data.value.reuse_port = PR_TRUE; + break; +#endif default: continue; } |