aboutsummaryrefslogtreecommitdiffstats
path: root/erts/preloaded
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2018-07-24 11:49:12 +0200
committerMicael Karlberg <[email protected]>2018-09-18 14:50:18 +0200
commit9ca6de6efbe844bcf7dc996cfcf51bcd50325007 (patch)
tree518c101fe7e6d1bb6d08782ae13346fb6a204504 /erts/preloaded
parent8b61022bdca354e541380391e3b0b2606f7af3f8 (diff)
downloadotp-9ca6de6efbe844bcf7dc996cfcf51bcd50325007.tar.gz
otp-9ca6de6efbe844bcf7dc996cfcf51bcd50325007.tar.bz2
otp-9ca6de6efbe844bcf7dc996cfcf51bcd50325007.zip
[socket-nif] Add support for socket (level ipv6) option dstopts
Added support for the IPv6 socket option(s) DSTOPTS. The option returns with einval when calling setsockopt, so either you need to be a privileged user to update, or its not actually possible to update this option (even though it says nothing about that in the man page. It only talks about set). This is the same behaviour as with RTHDR and HOPLIMIT. On FreeBSD, it says that HOPOPTS requires superuser privileges. Needs furher checking. OTP-14831.
Diffstat (limited to 'erts/preloaded')
-rw-r--r--erts/preloaded/ebin/socket.beambin57388 -> 57468 bytes
-rw-r--r--erts/preloaded/src/socket.erl11
2 files changed, 7 insertions, 4 deletions
diff --git a/erts/preloaded/ebin/socket.beam b/erts/preloaded/ebin/socket.beam
index da825abb98..17622c5341 100644
--- a/erts/preloaded/ebin/socket.beam
+++ b/erts/preloaded/ebin/socket.beam
Binary files differ
diff --git a/erts/preloaded/src/socket.erl b/erts/preloaded/src/socket.erl
index 3c0dc6e95b..2bab42267a 100644
--- a/erts/preloaded/src/socket.erl
+++ b/erts/preloaded/src/socket.erl
@@ -636,7 +636,7 @@
%% -define(SOCKET_OPT_IPV6_AUTH_LEVEL, 4).
%% -define(SOCKET_OPT_IPV6_CHECKSUM, 5).
-define(SOCKET_OPT_IPV6_DROP_MEMBERSHIP, 6).
-%% -define(SOCKET_OPT_IPV6_DSTOPTS, 7).
+-define(SOCKET_OPT_IPV6_DSTOPTS, 7).
%% -define(SOCKET_OPT_IPV6_ESP_TRANS_LEVEL, 8).
%% -define(SOCKET_OPT_IPV6_ESP_NETWORK_LEVEL, 9).
%% -define(SOCKET_OPT_IPV6_FAITH, 10).
@@ -2255,6 +2255,9 @@ enc_setopt_value(ipv6, add_membership, #{multiaddr := MA,
enc_setopt_value(ipv6, authhdr, V, _D, T, _P)
when is_boolean(V) andalso ((T =:= dgram) orelse (T =:= raw)) ->
V;
+enc_setopt_value(ipv6, dstopts, V, _D, T, _P)
+ when is_boolean(V) andalso ((T =:= dgram) orelse (T =:= raw)) ->
+ V;
enc_setopt_value(ipv6, drop_membership, #{multiaddr := MA,
interface := IF} = V, _D, _T, _P)
when ((is_tuple(MA) andalso (size(MA) =:= 8)) andalso
@@ -2692,14 +2695,14 @@ enc_sockopt_key(ipv6 = L, checksum = Opt, _Dir, _D, _T, _P) ->
not_supported({L, Opt});
enc_sockopt_key(ipv6, drop_membership = _Opt, set = _Dir, _D, _T, _P) ->
?SOCKET_OPT_IPV6_DROP_MEMBERSHIP;
-enc_sockopt_key(ipv6 = L, dstopts = Opt, set = _Dir, _D, T, _P)
+enc_sockopt_key(ipv6 = _L, dstopts = _Opt, _Dir, _D, T, _P)
when (T =:= dgram) orelse (T =:= raw) ->
- not_supported({L, Opt});
+ ?SOCKET_OPT_IPV6_DSTOPTS;
enc_sockopt_key(ipv6 = L, esp_trans_level = Opt, _Dir, _D, _T, _P) ->
not_supported({L, Opt});
enc_sockopt_key(ipv6 = L, esp_network_level = Opt, _Dir, _D, _T, _P) ->
not_supported({L, Opt});
-enc_sockopt_key(ipv6 = L, flowinfo = Opt, set = _Dir, _D, T, _P)
+enc_sockopt_key(ipv6 = L, flowinfo = Opt, _Dir, _D, T, _P)
when (T =:= dgram) orelse (T =:= raw) ->
not_supported({L, Opt});
enc_sockopt_key(ipv6, hoplimit = _Opt, _Dir, _D, T, _P)