From 7bc2d3e8618f561185694ae11afe4fc83b1f72f3 Mon Sep 17 00:00:00 2001 From: Micael Karlberg Date: Tue, 8 May 2018 12:58:56 +0200 Subject: [socket-nif] setopt of socket option reuseaddr --- erts/emulator/nifs/common/socket_nif.c | 52 +++++++++++++++++++++++----------- erts/preloaded/src/socket.erl | 18 ++++++++---- 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); -- cgit v1.2.3