summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pr/include/prio.h4
-rw-r--r--pr/src/io/prmapopt.c12
-rw-r--r--pr/src/pthreads/ptio.c2
-rw-r--r--pr/tests/sockopt.c10
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;
}