aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2018-05-08 12:58:56 +0200
committerMicael Karlberg <[email protected]>2018-09-18 13:01:37 +0200
commit7bc2d3e8618f561185694ae11afe4fc83b1f72f3 (patch)
treedab9fe311fa471717041ce7fe32707cf38622f7f /erts
parentd6b051d9b09aeba00d1bbd0d448dde6e551c4442 (diff)
downloadotp-7bc2d3e8618f561185694ae11afe4fc83b1f72f3.tar.gz
otp-7bc2d3e8618f561185694ae11afe4fc83b1f72f3.tar.bz2
otp-7bc2d3e8618f561185694ae11afe4fc83b1f72f3.zip
[socket-nif] setopt of socket option reuseaddr
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/nifs/common/socket_nif.c52
-rw-r--r--erts/preloaded/src/socket.erl18
2 files changed, 48 insertions, 22 deletions
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c
index 14d7cd2611..843543b42b 100644
--- a/erts/emulator/nifs/common/socket_nif.c
+++ b/erts/emulator/nifs/common/socket_nif.c
@@ -359,8 +359,9 @@ typedef union {
#define SOCKET_OPT_OTP_DEBUG 0
#define SOCKET_OPT_OTP_IOW 1
-#define SOCKET_OPT_SOCK_KEEPALIVE 0
-#define SOCKET_OPT_SOCK_LINGER 1
+#define SOCKET_OPT_SOCK_KEEPALIVE 9
+#define SOCKET_OPT_SOCK_LINGER 10
+#define SOCKET_OPT_SOCK_REUSEADDR 21
#define SOCKET_OPT_IP_RECVTOS 0
#define SOCKET_OPT_IP_ROUTER_ALERT 1
@@ -3396,22 +3397,22 @@ BOOLEAN_T eoptval2optval_socket(ErlNifEnv* env,
{
switch (eOpt) {
#if defined(SO_KEEPALIVE)
- case SOCKET_OPT_SOCK_KEEPALIVE:
- {
- BOOLEAN_T val;
+ case SOCKET_OPT_SOCK_KEEPALIVE:
+ {
+ BOOLEAN_T val;
- if (decode_bool(env, eVal, &val)) {
- *opt = SO_KEEPALIVE;
- valP->tag = SOCKET_OPT_VALUE_INT;
- valP->u.intVal = (val) ? 1 : 0;
- return TRUE;
- } else {
- *opt = -1;
- valP->tag = SOCKET_OPT_VALUE_UNDEF;
- return FALSE;
- }
+ if (decode_bool(env, eVal, &val)) {
+ *opt = SO_KEEPALIVE;
+ valP->tag = SOCKET_OPT_VALUE_INT;
+ valP->u.intVal = (val) ? 1 : 0;
+ return TRUE;
+ } else {
+ *opt = -1;
+ valP->tag = SOCKET_OPT_VALUE_UNDEF;
+ return FALSE;
}
- break;
+ }
+ break;
#endif
#if defined(SO_LINGER)
@@ -3430,6 +3431,25 @@ BOOLEAN_T eoptval2optval_socket(ErlNifEnv* env,
break;
#endif
+#if defined(SO_REUSEADDR)
+ case SOCKET_OPT_SOCK_REUSEADDR:
+ {
+ BOOLEAN_T val;
+
+ if (decode_bool(env, eVal, &val)) {
+ *opt = SO_REUSEADDR;
+ valP->tag = SOCKET_OPT_VALUE_INT;
+ valP->u.intVal = (val) ? 1 : 0;
+ return TRUE;
+ } else {
+ *opt = -1;
+ valP->tag = SOCKET_OPT_VALUE_UNDEF;
+ return FALSE;
+ }
+ }
+ break;
+#endif
+
default:
*opt = -1;
valP->tag = SOCKET_OPT_VALUE_UNDEF;
diff --git a/erts/preloaded/src/socket.erl b/erts/preloaded/src/socket.erl
index 4a9de0dc9e..6b245c41f0 100644
--- a/erts/preloaded/src/socket.erl
+++ b/erts/preloaded/src/socket.erl
@@ -183,16 +183,19 @@
priority |
rcvbuf |
rcvbufforce |
- rcvlowat | sndlowat |
- rcvtimeo | sndtimeo |
+ rcvlowat |
+ rcvtimeo |
reuseaddr |
reuseport |
rxq_ovfl |
+ sndlowat |
+ sndtimeo |
setfib |
sndbuf |
sndbufforce |
timestamp |
type.
+
%% Read-only options:
%% mtu
%%
@@ -429,8 +432,9 @@
-define(SOCKET_OPT_OTP_DEBUG, 0).
-define(SOCKET_OPT_OTP_IOW, 1).
--define(SOCKET_OPT_SOCK_KEEPALIVE, 0).
--define(SOCKET_OPT_SOCK_LINGER, 1).
+-define(SOCKET_OPT_SOCK_KEEPALIVE, 9).
+-define(SOCKET_OPT_SOCK_LINGER, 10).
+-define(SOCKET_OPT_SOCK_REUSEADDR, 21).
-define(SOCKET_OPT_IP_RECVTOS, 0).
-define(SOCKET_OPT_IP_ROUTER_ALERT, 1).
@@ -1611,6 +1615,8 @@ enc_setopt_value(socket, linger, abort, D, T, P) ->
enc_setopt_value(socket, linger, {OnOff, Secs} = V, _D, _T, _P)
when is_boolean(OnOff) andalso is_integer(Secs) andalso (Secs >= 0) ->
V;
+enc_setopt_value(socket, reuseaddr, V, _D, _T, _P) when is_boolean(V) ->
+ V;
enc_setopt_value(socket = L, Opt, V, _D, _T, _P) ->
not_supported({L, Opt, V});
@@ -1826,8 +1832,8 @@ enc_sockopt_key(socket, rcvlowat = Opt, _Dir, _D, _T, _P) ->
not_supported(Opt);
enc_sockopt_key(socket, rcvtimeo = Opt, _Dir, _D, _T, _P) ->
not_supported(Opt);
-enc_sockopt_key(socket, reuseaddr = Opt, _Dir, _D, _T, _P) ->
- not_supported(Opt);
+enc_sockopt_key(socket, reuseaddr = _Opt, _Dir, _D, _T, _P) ->
+ ?SOCKET_OPT_SOCK_REUSEADDR;
enc_sockopt_key(socket, reuseport = Opt, _Dir, D, _T, _P)
when ((D =:= inet) orelse (D =:= inet6)) ->
not_supported(Opt);