aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/socket_SUITE.erl
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2019-05-29 12:38:26 +0200
committerMicael Karlberg <[email protected]>2019-07-08 16:53:40 +0200
commit86751fcc8665748a6bc8eeb5ab078f403d14107e (patch)
treedc8ba2cca39800281a76711ecc7dc29c95ada4de /erts/emulator/test/socket_SUITE.erl
parente6226c6741f336b4c0f2d5b4c930be2fcd9c3737 (diff)
downloadotp-86751fcc8665748a6bc8eeb5ab078f403d14107e.tar.gz
otp-86751fcc8665748a6bc8eeb5ab078f403d14107e.tar.bz2
otp-86751fcc8665748a6bc8eeb5ab078f403d14107e.zip
[esock] Make it it work for IPv6
The nif code expects the socket address to be "complete", that is all fields must exist. This was not the case for a couple of functions, sendto, sendmsg and connect. What was mssing was a call to 'ensure_sockaddr'. Test: 1) Add a condition function to test if IPv6 is available and works. 2) Needed to adjust a test case (actually a common function used in several test cases) since the socket address data type has two optional fields, which we do not initiate (when sending), but the nif-code does fill in. OTP-15897
Diffstat (limited to 'erts/emulator/test/socket_SUITE.erl')
-rw-r--r--erts/emulator/test/socket_SUITE.erl129
1 files changed, 74 insertions, 55 deletions
diff --git a/erts/emulator/test/socket_SUITE.erl b/erts/emulator/test/socket_SUITE.erl
index b80cc794e7..e19bb9b1bb 100644
--- a/erts/emulator/test/socket_SUITE.erl
+++ b/erts/emulator/test/socket_SUITE.erl
@@ -8146,7 +8146,7 @@ which_multicast_address3(Domain, [MAddrStr|MAddrs]) ->
end.
which_local_host_ifname(Domain) ->
- case which_local_host_info(Domain) of
+ case ?LIB:which_local_host_info(Domain) of
{ok, {Name, _Addr, _Flags}} ->
Name;
{error, Reason} ->
@@ -19408,7 +19408,9 @@ tpp_udp_client_handler_msg_exchange_loop(_Sock, _Dest, _Send, _Recv, _Msg,
Start) ->
Stop = ?LIB:timestamp(),
{Sent, Received, Start, Stop};
-tpp_udp_client_handler_msg_exchange_loop(Sock, Dest, Send, Recv, Data,
+tpp_udp_client_handler_msg_exchange_loop(Sock,
+ #{family := local} = Dest,
+ Send, Recv, Data,
Num, N, Sent, Received, Start) ->
case tpp_udp_send_req(Sock, Send, Data, Dest) of
{ok, SendSz} ->
@@ -19427,6 +19429,28 @@ tpp_udp_client_handler_msg_exchange_loop(Sock, Dest, Send, Recv, Data,
{error, SReason} ->
?SEV_EPRINT("send (~w of ~w): ~p", [N, Num, SReason]),
exit({send, SReason, N})
+ end;
+tpp_udp_client_handler_msg_exchange_loop(Sock,
+ #{addr := Addr, port := Port} = Dest0,
+ Send, Recv, Data,
+ Num, N, Sent, Received, Start) ->
+ case tpp_udp_send_req(Sock, Send, Data, Dest0) of
+ {ok, SendSz} ->
+ case tpp_udp_recv_rep(Sock, Recv) of
+ {ok, NewData, RecvSz, #{addr := Addr, port := Port} = Dest1} ->
+ tpp_udp_client_handler_msg_exchange_loop(Sock, Dest1,
+ Send, Recv,
+ NewData, Num, N+1,
+ Sent+SendSz,
+ Received+RecvSz,
+ Start);
+ {error, RReason} ->
+ ?SEV_EPRINT("recv (~w of ~w): ~p", [N, Num, RReason]),
+ exit({recv, RReason, N})
+ end;
+ {error, SReason} ->
+ ?SEV_EPRINT("send (~w of ~w): ~p", [N, Num, SReason]),
+ exit({send, SReason, N})
end.
@@ -26355,7 +26379,7 @@ which_local_socket_addr(local = Domain) ->
%% We should really implement this using the (new) net module,
%% but until that gets the necessary functionality...
which_local_socket_addr(Domain) ->
- case which_local_host_info(Domain) of
+ case ?LIB:which_local_host_info(Domain) of
{ok, {_Name, _Flags, Addr}} ->
#{family => Domain,
addr => Addr};
@@ -26366,52 +26390,52 @@ which_local_socket_addr(Domain) ->
%% Returns the interface (name), flags and address (not 127...)
%% of the local host.
-which_local_host_info(Domain) ->
- case inet:getifaddrs() of
- {ok, IFL} ->
- which_local_host_info(Domain, IFL);
- {error, _} = ERROR ->
- ERROR
- end.
-
-which_local_host_info(_Domain, []) ->
- ?FAIL(no_address);
-which_local_host_info(Domain, [{"lo" ++ _, _}|IFL]) ->
- which_local_host_info(Domain, IFL);
-which_local_host_info(Domain, [{"docker" ++ _, _}|IFL]) ->
- which_local_host_info(Domain, IFL);
-which_local_host_info(Domain, [{"br-" ++ _, _}|IFL]) ->
- which_local_host_info(Domain, IFL);
-which_local_host_info(Domain, [{Name, IFO}|IFL]) ->
- case which_local_host_info2(Domain, IFO) of
- {ok, {Flags, Addr}} ->
- {ok, {Name, Flags, Addr}};
- {error, _} ->
- which_local_host_info(Domain, IFL)
- end;
-which_local_host_info(Domain, [_|IFL]) ->
- which_local_host_info(Domain, IFL).
+%% which_local_host_info(Domain) ->
+%% case inet:getifaddrs() of
+%% {ok, IFL} ->
+%% which_local_host_info(Domain, IFL);
+%% {error, _} = ERROR ->
+%% ERROR
+%% end.
-which_local_host_info2(Domain, IFO) ->
- case lists:keysearch(flags, 1, IFO) of
- {value, {flags, Flags}} ->
- which_local_host_info2(Domain, IFO, Flags);
- false ->
- {error, no_flags}
- end.
+%% which_local_host_info(_Domain, []) ->
+%% ?FAIL(no_address);
+%% which_local_host_info(Domain, [{"lo" ++ _, _}|IFL]) ->
+%% which_local_host_info(Domain, IFL);
+%% which_local_host_info(Domain, [{"docker" ++ _, _}|IFL]) ->
+%% which_local_host_info(Domain, IFL);
+%% which_local_host_info(Domain, [{"br-" ++ _, _}|IFL]) ->
+%% which_local_host_info(Domain, IFL);
+%% which_local_host_info(Domain, [{Name, IFO}|IFL]) ->
+%% case which_local_host_info2(Domain, IFO) of
+%% {ok, {Flags, Addr}} ->
+%% {ok, {Name, Flags, Addr}};
+%% {error, _} ->
+%% which_local_host_info(Domain, IFL)
+%% end;
+%% which_local_host_info(Domain, [_|IFL]) ->
+%% which_local_host_info(Domain, IFL).
+
+%% which_local_host_info2(Domain, IFO) ->
+%% case lists:keysearch(flags, 1, IFO) of
+%% {value, {flags, Flags}} ->
+%% which_local_host_info2(Domain, IFO, Flags);
+%% false ->
+%% {error, no_flags}
+%% end.
-which_local_host_info2(_Domain, [], _Flags) ->
- {error, no_address};
-which_local_host_info2(inet = _Domain, [{addr, Addr}|_IFO], Flags)
- when (size(Addr) =:= 4) andalso (element(1, Addr) =/= 127) ->
- {ok, {Flags, Addr}};
-which_local_host_info2(inet6 = _Domain, [{addr, Addr}|_IFO], Flags)
- when (size(Addr) =:= 8) andalso
- (element(1, Addr) =/= 0) andalso
- (element(1, Addr) =/= 16#fe80) ->
- {ok, {Flags, Addr}};
-which_local_host_info2(Domain, [_|IFO], Flags) ->
- which_local_host_info2(Domain, IFO, Flags).
+%% which_local_host_info2(_Domain, [], _Flags) ->
+%% {error, no_address};
+%% which_local_host_info2(inet = _Domain, [{addr, Addr}|_IFO], Flags)
+%% when (size(Addr) =:= 4) andalso (element(1, Addr) =/= 127) ->
+%% {ok, {Flags, Addr}};
+%% which_local_host_info2(inet6 = _Domain, [{addr, Addr}|_IFO], Flags)
+%% when (size(Addr) =:= 8) andalso
+%% (element(1, Addr) =/= 0) andalso
+%% (element(1, Addr) =/= 16#fe80) ->
+%% {ok, {Flags, Addr}};
+%% which_local_host_info2(Domain, [_|IFO], Flags) ->
+%% which_local_host_info2(Domain, IFO, Flags).
@@ -26429,7 +26453,7 @@ has_ip_multicast_support() ->
case os:type() of
{unix, OsName} when (OsName =:= linux) orelse
(OsName =:= sunos) ->
- case which_local_host_info(inet) of
+ case ?LIB:which_local_host_info(inet) of
{ok, {_Name, Flags, _Addr}} ->
case lists:member(multicast, Flags) of
true ->
@@ -26491,13 +26515,8 @@ has_support_unix_domain_socket() ->
%% support for IPv6. If not, there is no point in running IPv6 tests.
%% Currently we just skip.
has_support_ipv6() ->
- %% case socket:supports(ipv6) of
- %% true ->
- %% ok;
- %% false ->
- %% {error, not_supported}
- %% end.
- not_yet_implemented().
+ %%not_yet_implemented().
+ ?LIB:has_support_ipv6().