summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2021-07-15 17:41:37 +0200
committerMicael Karlberg <bmk@erlang.org>2021-08-30 17:56:42 +0200
commit711ebaaab326ce262f7604f8f0766bf571f2351e (patch)
tree2610552482fc19c8a450a023a6f09a50131b609c
parentcc73e5065cbc230505135e241d38a070db8922af (diff)
downloaderlang-711ebaaab326ce262f7604f8f0766bf571f2351e.tar.gz
[snmp|agent] Use of inet-backend for gen_udp
Make it possible to configure agent transport (net-if) to use the inet_backend gen_udp option. OTP-17526 OTP-17410
-rw-r--r--lib/kernel/src/gen_udp_socket.erl35
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl205
-rw-r--r--lib/snmp/src/misc/snmp_misc.erl2
-rw-r--r--lib/snmp/test/snmp_agent_SUITE.erl459
-rw-r--r--lib/snmp/test/snmp_agent_test_lib.erl55
-rw-r--r--lib/snmp/test/snmp_test_global_sys_monitor.erl6
-rw-r--r--lib/snmp/test/snmp_test_lib.erl67
-rw-r--r--lib/snmp/test/snmp_test_lib.hrl3
-rw-r--r--lib/snmp/test/snmp_test_mgr.erl2
9 files changed, 526 insertions, 308 deletions
diff --git a/lib/kernel/src/gen_udp_socket.erl b/lib/kernel/src/gen_udp_socket.erl
index 43b11b456b..998ec8e194 100644
--- a/lib/kernel/src/gen_udp_socket.erl
+++ b/lib/kernel/src/gen_udp_socket.erl
@@ -1142,7 +1142,7 @@ init(Arg) ->
error_logger:error_report([{badarg, {?MODULE, init, [Arg]}}]),
error(badarg, [Arg]).
-
+
socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) ->
Opts =
(maps:merge(Extra, maps:remove(fd, ExtraOpts)))
@@ -1170,6 +1170,8 @@ socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) ->
ERROR
end;
socket_open(Domain, Proto, ExtraOpts, Extra) ->
+ %% ?DBG([{domain, Domain}, {proto, Proto},
+ %% {extra_opts, ExtraOpts}, {extra, Extra}]),
Opts = maps:merge(Extra, ExtraOpts),
socket:open(Domain, dgram, Proto, Opts).
@@ -1444,7 +1446,18 @@ handle_event({call, From}, {bind, BindAddr} = _BIND, _State, {P, _D}) ->
%% ?DBG(['try bind',
%% {handle_event, call}, {bind_addr, BindAddr}, {state, _State}]),
Result = socket:bind(P#params.socket, BindAddr),
- %% ?DBG([{bind_result, Result}]),
+ %% ?DBG([{bind_result, Result}] ++
+ %% case Result of
+ %% ok ->
+ %% case socket:sockname(P#params.socket) of
+ %% {ok, SockAddr} ->
+ %% [{sockaddr, SockAddr}];
+ %% {error, SAReason} ->
+ %% [{sockaddr_reason, SAReason}]
+ %% end;
+ %% {error, BReason} ->
+ %% [{bind_reason, BReason}]
+ %% end),
{keep_state_and_data, [{reply, From, Result}]};
@@ -1478,7 +1491,7 @@ handle_event(
info, ?socket_select(Socket, SelectRef),
#recv{info = ?select_info(SelectRef)},
{#params{socket = Socket} = P, D}) ->
- %% ?DBG([info, {socket, Socket}, {ref, SelectRef}]),
+ %% ?DBG(['info socket select', {socket, Socket}, {ref, SelectRef}, {p, P}, {d, D}]),
handle_recv(P, D, []);
%%
@@ -1486,7 +1499,7 @@ handle_event(
info, ?socket_abort(Socket, SelectRef, Reason),
#recv{info = ?select_info(SelectRef)},
{#params{socket = Socket} = P, D}) ->
- %% ?DBG({abort, Reason}),
+ %% ?DBG(['socket abort', {reason, Reason}, {p, P}, {d, D}]),
handle_reading(P, cleanup_recv_reply(P, D, [], Reason));
%%
@@ -1622,6 +1635,8 @@ handle_recv(#params{socket = Socket, recv_method = []} = P,
%% ?DBG(['try recvfrom', {socket, Socket}, {length, Length}]),
case socket_recvfrom(Socket, Length) of
{ok, {Source, <<Data/binary>>}} ->
+ %% ?DBG(['recvfrom ok', {source, Source},
+ %% {'data sz', byte_size(Data)}]),
handle_recv_deliver(P, D, ActionsR, {Source, Data});
{select, ?select_info(_) = SelectInfo} ->
%% ?DBG(['recvfrom select', {socket_info, SelectInfo}]),
@@ -1635,16 +1650,18 @@ handle_recv(#params{socket = Socket, recv_method = []} = P,
end;
handle_recv(#params{socket = Socket} = P,
#{recv_length := Length} = D, ActionsR) ->
+ %% ?DBG(['try recvmsg', {socket, Socket}, {length, Length}]),
case socket_recvmsg(Socket, Length) of
{ok, MsgHdr} ->
handle_recv_deliver(P, D, ActionsR, MsgHdr);
{select, ?select_info(_) = SelectInfo} ->
+ %% ?DBG(['recvmsg select', {socket_info, SelectInfo}]),
{next_state,
#recv{info = SelectInfo},
{P, D},
reverse(ActionsR)};
{error, Reason} ->
- %% ?DBG({'recv error wo rest-data', Reason}),
+ %% ?DBG(['recvmsg error', {reason, Reason}]),
handle_recv_error(P, D, ActionsR, Reason)
end.
@@ -1731,10 +1748,9 @@ recv_data_deliver(
#params{owner = Owner} = P,
#{mode := Mode, deliver := Deliver} = D,
ActionsR, Data) ->
- %%
- %% ?DBG([{owner, Owner},
- %% {mode, Mode},
- %% {header, Header}, {deliver, Deliver}, {packet, Packet}]),
+
+ %% ?DBG([{owner, Owner}, {mode, Mode}, {deliver, Deliver}]),
+
{IP, Port, AncData, DeliverData} = deliver_data(Data, Mode),
case D of
#{recv_from := From} ->
@@ -1769,6 +1785,7 @@ mk_recv_reply(IP, Port, AncData, Data) ->
{IP, Port, AncData, Data}.
deliver_recv_msg(Pid, Active, Deliver, Socket, IP, Port, AncData, Data) ->
+ %% ?DBG(['deliver packet', {pid, Pid}]),
Pid ! mk_recv_msg(Active, Deliver, Socket, IP, Port, AncData, Data).
mk_recv_msg(true = _Active, port = _Deliver,
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index b6b115bd75..cdb68afef4 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -128,17 +128,19 @@
-record(transport,
{socket,
- kind = all :: all | transport_kind(),
- domain = snmpUDPDomain,
+ mref,
+ kind = all :: all | transport_kind(),
+ domain = snmpUDPDomain,
address :: inet:ip_address(),
port_no :: pos_integer(),
port_info :: port_info(),
%% <EPHEMERAL-FOR-FUTUR-USE>
- ephm = none, %% :: ephemeral(),
- ephm_info = undefined, % Only used if ephm =/= none and once
+ ephm = none, %% :: ephemeral(),
+ ephm_info = undefined, % Only used if ephm =/= none and once
%% </EPHEMERAL-FOR-FUTUR-USE>
- opts = [],
- req_refs = [] % Not used for trap/notification transports
+ inet_backend = [],
+ opts = [],
+ req_refs = [] % Not used for trap/notification transports
}).
-ifndef(default_verbosity).
@@ -274,34 +276,45 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
%% will be taken from the "global" socket options (which serve as
%% default values).
%% Also, note that Ephm are not actually used at this time.
- {Ephm, IpAddr, PortInfo, SocketOpts} = socket_opts(Domain, Address,
- RawSocketOpts, Opts),
+ {Ephm, IpAddr, PortInfo, InetBackend, SocketOpts} =
+ socket_opts(Domain, Address, RawSocketOpts, Opts),
?vtrace("socket opts processed:"
- "~n Ephm: ~p"
- "~n Port Info: ~p"
- "~n Socket Opts: ~p", [Ephm, PortInfo, SocketOpts]),
+ "~n Ephm: ~p"
+ "~n Port Info: ~p"
+ "~n Inet Backend: ~p"
+ "~n Socket Opts: ~p",
+ [Ephm, PortInfo, InetBackend, SocketOpts]),
{Socket, IpPort} = socket_open(Domain, PortInfo,
+ InetBackend,
SocketOpts),
+ SockMRef = inet:monitor(Socket),
?vtrace("socket opened:"
- "~n Socket: ~p"
- "~n Port No: ~p", [Socket, IpPort]),
+ "~n Socket: ~p"
+ "~n Port No: ~p"
+ "~n Info: ~p",
+ [Socket, IpPort, inet:info(Socket)]),
+
%% Should we really do this here?
%% If Kind =:= trap_sender, we only need to receive after
%% we have sent an inform!
active_once(Socket),
+ ?vtrace("socket activated:"
+ "~n Info: ~p", [inet:info(Socket)]),
#transport{
- socket = Socket,
- kind = Kind,
- domain = Domain,
+ socket = Socket,
+ mref = SockMRef,
+ kind = Kind,
+ domain = Domain,
%% We may not have explicitly specified the port ('system'
%% or a range), so it could have been "generated".
%% Also, shall we push this into the transport (handled by the
%% FRAMEWORK MIB)? Would not work for ephemeral sockets.
- address = IpAddr,
- port_no = IpPort,
- port_info = PortInfo,
- ephm = Ephm,
- opts = SocketOpts}
+ address = IpAddr,
+ port_no = IpPort,
+ port_info = PortInfo,
+ ephm = Ephm,
+ inet_backend = InetBackend,
+ opts = SocketOpts}
%% We need to fix this also
end || {Domain, Address, Kind, RawSocketOpts} <- RawTransports]
of
@@ -401,7 +414,7 @@ format_address(Address) ->
iolist_to_binary(snmp_conf:mk_addr_string(Address)).
-socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
+socket_open(snmpUDPDomain = Domain, IpPort, InetBackend, Opts) ->
?vdebug("socket_open(~p) -> entry with"
"~n Port: ~p"
"~n Opts: ~p", [Domain, IpPort, Opts]),
@@ -413,7 +426,7 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
"~n FD: ~p"
"~n Port: ~p"
"~n Opts: ~p", [Domain, FD, IpPort, Opts]),
- gen_udp_open(0, [{fd, FD} | Opts]);
+ gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]);
error ->
case init:get_argument(snmpa_fd) of
{ok, [[FdStr]]} ->
@@ -423,26 +436,28 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
"~n FD: ~p"
"~n Port: ~p"
"~n Opts: ~p", [Domain, FD, IpPort, Opts]),
- gen_udp_open(0, [{fd, FD} | Opts]);
+ gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]);
error ->
?vdebug("socket_open(~p) -> plain open"
"~n Port: ~p"
"~n Opts: ~p", [Domain, IpPort, Opts]),
- gen_udp_open(IpPort, Opts)
+ gen_udp_open(IpPort, InetBackend ++ Opts)
end
end;
-socket_open(Domain, PortInfo, Opts)
+socket_open(Domain, PortInfo, InetBackend, Opts)
when (Domain =:= transportDomainUdpIpv4) orelse
(Domain =:= transportDomainUdpIpv6) ->
?vdebug("socket_open(~p) -> entry with"
- "~n PortInfo: ~p"
- "~n Opts: ~p", [Domain, PortInfo, Opts]),
- gen_udp_open(PortInfo, Opts);
-socket_open(Domain, PortInfo, Opts) ->
+ "~n PortInfo: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]),
+ gen_udp_open(PortInfo, InetBackend ++ Opts);
+socket_open(Domain, PortInfo, InetBackend, Opts) ->
?vinfo("socket_open(~p) -> entry when invalid with"
- "~n PortInfo: ~p"
- "~n Opts: ~p", [Domain, PortInfo, Opts]),
- throw({socket_open, Domain, Opts}).
+ "~n PortInfo: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]),
+ throw({socket_open, Domain, InetBackend, Opts}).
%% Make the system choose!
@@ -464,7 +479,8 @@ gen_udp_open(system, Opts) ->
end;
%% This is for "future compat" since we cannot actually config '0'...
gen_udp_open(IpPort, Opts) when (IpPort =:= 0) ->
- ?vtrace("gen_udp_open(0) -> entry"),
+ ?vtrace("gen_udp_open(0) -> entry with"
+ "~n Opts: ~p", [Opts]),
case gen_udp:open(IpPort, Opts) of
{ok, Socket} ->
case inet:port(Socket) of
@@ -480,7 +496,8 @@ gen_udp_open(IpPort, Opts) when (IpPort =:= 0) ->
throw({udp_open, {open, IpPort, Reason}})
end;
gen_udp_open(IpPort, Opts) when is_integer(IpPort) ->
- ?vtrace("gen_udp_open(~w) -> entry", [IpPort]),
+ ?vtrace("gen_udp_open(~w) -> entry with"
+ "~n Opts: ~p", [IpPort, Opts]),
case gen_udp:open(IpPort, Opts) of
{ok, Socket} ->
?vtrace("gen_udp_open(~w) -> created: "
@@ -555,7 +572,7 @@ loop(#state{transports = Transports,
parent = Parent} = S) ->
?vdebug("loop(~p)", [S]),
receive
- {udp, Socket, IpAddr, IpPort, Packet} = Msg when is_port(Socket) ->
+ {udp, Socket, IpAddr, IpPort, Packet} = Msg ->
?vlog("got paket from ~w:~w on ~w", [IpAddr, IpPort, Socket]),
case lists:keyfind(Socket, #transport.socket, Transports) of
#transport{socket = Socket, domain = Domain} = Transport ->
@@ -568,7 +585,8 @@ loop(#state{transports = Transports,
end,
loop(maybe_handle_recv(S, Transport, From, Packet));
false ->
- error_msg("Packet on unknown port: ~p", [Msg]),
+ error_msg("Packet on unknown socket: "
+ "~n ~p", [Msg]),
loop(S)
end;
@@ -750,17 +768,16 @@ loop(#state{transports = Transports,
"~n ~p", [Parent, Reason]),
exit(Reason);
- %% We should not do this.
- %% Future versions of sockets will/may not be linkable (port)
- {'EXIT', Socket, Reason} when is_port(Socket) ->
+ {'DOWN', _SockMRef, socket, Socket, Reason} ->
case lists:keyfind(Socket, #transport.socket, Transports) of
#transport{
- socket = Socket,
- domain = Domain,
- port_info = PortInfo,
- opts = SocketOpts,
- req_refs = ReqRefs} = Transport ->
- try socket_open(Domain, PortInfo, SocketOpts) of
+ socket = Socket,
+ domain = Domain,
+ port_info = PortInfo,
+ inet_backend = InetBackend,
+ opts = SocketOpts,
+ req_refs = ReqRefs} = Transport ->
+ try socket_open(Domain, PortInfo, InetBackend, SocketOpts) of
{NewSocket, PortNo} ->
error_msg(
"Socket ~p exited for reason"
@@ -769,11 +786,13 @@ loop(#state{transports = Transports,
[Socket, Reason, NewSocket, PortNo]),
(length(ReqRefs) < Limit) andalso
active_once(NewSocket),
+ NewSockMRef = inet:monitor(NewSocket),
S#state{
transports =
lists:keyreplace(
Socket, #transport.socket, Transports,
Transport#transport{socket = NewSocket,
+ mref = NewSockMRef,
port_no = PortNo})}
catch
ReopenReason ->
@@ -787,7 +806,7 @@ loop(#state{transports = Transports,
end;
false ->
error_msg(
- "Exit message from port ~p for reason ~p~n",
+ "Exit message from socket ~p for reason ~p~n",
[Socket, Reason]),
loop(S)
end;
@@ -806,7 +825,6 @@ loop(#state{transports = Transports,
loop(S)
end.
-
handle_udp_error(S, #transport{socket = Socket,
kind = Kind}, Error) ->
try inet:sockname(Socket) of
@@ -1702,7 +1720,7 @@ toname(Else) ->
active_once(Sock) ->
?vtrace("activate once", []),
- inet:setopts(Sock, [{active, once}]).
+ ok = inet:setopts(Sock, [{active, once}]).
select_transport(_, []) ->
@@ -1988,7 +2006,7 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
"~n Domain: ~p"
"~n IpAddr: ~p"
"~n PortInfo: ~p"
- "~n SpocketOpts: ~p"
+ "~n SocketOpts: ~p"
"~n DefaultOpts: ~p",
[Domain, IpAddr, PortInfo, SocketOpts, DefaultOpts]),
Opts =
@@ -2017,12 +2035,12 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
Sz ->
[{recbuf, Sz}]
end ++
- case get_sndbuf(SocketOpts, DefaultOpts) of
- use_default ->
- [];
- Sz ->
- [{sndbuf, Sz}]
- end
+ case get_sndbuf(SocketOpts, DefaultOpts) of
+ use_default ->
+ [];
+ Sz ->
+ [{sndbuf, Sz}]
+ end
] ++
case get_extra_sock_opts(SocketOpts, DefaultOpts) of
ESO when is_list(ESO) ->
@@ -2032,11 +2050,18 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
"~n ~p", [BadESO]),
[]
end,
+ InetBackend =
+ case get_inet_backend(SocketOpts, DefaultOpts) of
+ use_default ->
+ [];
+ Backend when (Backend =:= inet) orelse (Backend =:= socket) ->
+ [{inet_backend, Backend}]
+ end,
%% <EPHEMERAL-FOR-FUTUR-USE>
%% Ephm = get_ephemeral(SocketOpts),
%% {Ephm, PortInfo, Opts}.
%% </EPHEMERAL-FOR-FUTUR-USE>
- {none, IpAddr, PortInfo, Opts}.
+ {none, IpAddr, PortInfo, InetBackend, Opts}.
%% ----------------------------------------------------------------
@@ -2093,6 +2118,9 @@ get_no_reuse_address(Opts, DefaultOpts) ->
get_extra_sock_opts(Opts, DefaultOpts) ->
get_socket_opt(extra_sock_opts, Opts, DefaultOpts, []).
+get_inet_backend(Opts, DefaultOpts) ->
+ get_socket_opt(inet_backend, Opts, DefaultOpts, use_default).
+
%% <EPHEMERAL-FOR-FUTUR-USE>
%% This is not realy a socket option, but rather socket 'meta'
%% information. Its still put together with the actual socket
@@ -2157,7 +2185,7 @@ get_info(#state{transports = Transports, reqs = Reqs}) ->
transport_kind => Kind,
port_info => PortInfo,
opts => Opts,
- socket_info => get_port_info(Socket),
+ socket_info => get_socket_info(Socket),
num_reqs => length(Refs)} ||
#transport{socket = Socket,
domain = Domain,
@@ -2178,35 +2206,8 @@ proc_mem(P) when is_pid(P) ->
%% proc_mem(_) ->
%% undefined.
-get_port_info(Id) ->
- PortInfo =
- case (catch erlang:port_info(Id)) of
- PI when is_list(PI) ->
- [{port_info, PI}];
- _ ->
- []
- end,
- PortStatus =
- case (catch prim_inet:getstatus(Id)) of
- {ok, PS} ->
- [{port_status, PS}];
- _ ->
- []
- end,
- PortAct =
- case (catch inet:getopts(Id, [active])) of
- {ok, PA} ->
- [{port_act, PA}];
- _ ->
- []
- end,
- PortStats =
- case (catch inet:getstat(Id)) of
- {ok, Stat} ->
- [{port_stats, Stat}];
- _ ->
- []
- end,
+get_socket_info(Id) when is_port(Id) ->
+ Info = inet:info(Id),
IfList =
case (catch inet:getif(Id)) of
{ok, IFs} ->
@@ -2221,13 +2222,29 @@ get_port_info(Id) ->
_ ->
[]
end,
- [{socket, Id}] ++
- IfList ++
- PortStats ++
- PortInfo ++
- PortStatus ++
- PortAct ++
- BufSz.
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz;
+get_socket_info(Id) ->
+ Info = inet:info(Id),
+
+ %% Does not exist for 'socket'
+ IfList = [],
+ %% case (catch inet:getif(Id)) of
+ %% {ok, IFs} ->
+ %% [{interfaces, IFs}];
+ %% _ ->
+ %% []
+ %% end,
+
+ BufSz =
+ case (catch inet:getopts(Id, [recbuf, sndbuf])) of
+ {ok, Sz} ->
+ [{buffer_size, Sz}];
+ _ ->
+ []
+ end,
+
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz.
+
%% ---------------------------------------------------------------
diff --git a/lib/snmp/src/misc/snmp_misc.erl b/lib/snmp/src/misc/snmp_misc.erl
index 39254503ac..63abb1ac90 100644
--- a/lib/snmp/src/misc/snmp_misc.erl
+++ b/lib/snmp/src/misc/snmp_misc.erl
@@ -455,7 +455,7 @@ bits_to_int([],_Kibbles,Res) -> Res;
bits_to_int([Kibble|Ks],Kibbles,Res) ->
case snmp_misc:assq(Kibble,Kibbles) of
{value,V} ->
- bits_to_int(Ks,Kibbles,Res + round(math:pow(2,V)));
+ bits_to_int(Ks, Kibbles, Res + round(math:pow(2,V)));
_ ->
error
end.
diff --git a/lib/snmp/test/snmp_agent_SUITE.erl b/lib/snmp/test/snmp_agent_SUITE.erl
index fc4de668ab..6564c48d70 100644
--- a/lib/snmp/test/snmp_agent_SUITE.erl
+++ b/lib/snmp/test/snmp_agent_SUITE.erl
@@ -26,12 +26,12 @@
init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
- %% all_tcs - misc
+ %% major_tcs - misc
app_info/1,
info_test/1,
create_local_db_dir/1,
- %% all_tcs - test_v1
+ %% major_tcs - test_v1
simple/1,
db_notify_client/1,
v1_processing/1,
@@ -51,7 +51,7 @@
opaque/1,
change_target_addr_config/1,
- %% all_tcs - test_v1 - multiple_reqs
+ %% major_tcs - test_v1 - multiple_reqs
mul_get/1,
mul_get_err/1,
mul_next/1,
@@ -59,7 +59,7 @@
mul_set/1,
mul_set_err/1,
- %% all_tcs - test_v1 - reported_bugs
+ %% major_tcs - test_v1 - reported_bugs
otp_1128/1,
otp_1129/1,
otp_1131/1,
@@ -75,7 +75,7 @@
otp_3187/1,
otp_3725/1,
- %% all_tcs - test_v1 - standard_mibs
+ %% major_tcs - test_v1 - standard_mibs
snmp_standard_mib/1,
snmp_community_mib/1,
snmp_framework_mib/1,
@@ -83,7 +83,7 @@
snmp_notification_mib/1,
snmp_view_based_acm_mib/1,
- %% all_tcs - test_v2
+ %% major_tcs - test_v2
simple_2/1,
v2_processing/1,
big_2/1,
@@ -104,7 +104,7 @@
opaque_2/1,
v2_caps/1,
- %% all_tcs - test_v2 - multiple_reqs_2
+ %% major_tcs - test_v2 - multiple_reqs_2
mul_get_2/1,
mul_get_err_2/1,
mul_next_2/1,
@@ -112,10 +112,10 @@
mul_set_2/1,
mul_set_err_2/1,
- %% all_tcs - test_v2 - v2_inform
+ %% major_tcs - test_v2 - v2_inform
v2_inform_i/1,
- %% all_tcs - test_v2 - reported_bugs_2
+ %% major_tcs - test_v2 - reported_bugs_2
otp_1128_2/1,
otp_1129_2/1,
otp_1131_2/1,
@@ -130,7 +130,7 @@
otp_2979_2/1,
otp_3187_2/1,
- %% all_tcs - test_v2 - standard_mibs_2
+ %% major_tcs - test_v2 - standard_mibs_2
snmpv2_mib_2/1,
snmp_community_mib_2/1,
snmp_framework_mib_2/1,
@@ -138,10 +138,10 @@
snmp_notification_mib_2/1,
snmp_view_based_acm_mib_2/1,
- %% all_tcs - test_v1_v2
+ %% major_tcs - test_v1_v2
simple_bi/1,
- %% all_tcs - test_v3
+ %% major_tcs - test_v3
simple_3/1,
v3_processing/1,
big_3/1,
@@ -162,7 +162,7 @@
opaque_3/1,
v2_caps_3/1,
- %% all_tcs - test_v3 - multiple_reqs_3
+ %% major_tcs - test_v3 - multiple_reqs_3
mul_get_3/1,
mul_get_err_3/1,
mul_next_3/1,
@@ -170,10 +170,10 @@
mul_set_3/1,
mul_set_err_3/1,
- %% all_tcs - test_v3 - v3_inform
+ %% major_tcs - test_v3 - v3_inform
v3_inform_i/1,
- %% all_tcs - test_v3 - reported_bugs_3
+ %% major_tcs - test_v3 - reported_bugs_3
otp_1128_3/1,
otp_1129_3/1,
otp_1131_3/1,
@@ -189,7 +189,7 @@
otp_3187_3/1,
otp_3542/1,
- %% all_tcs - test_v3 - standard_mibs_3
+ %% major_tcs - test_v3 - standard_mibs_3
snmpv2_mib_3/1,
snmp_framework_mib_3/1,
snmp_mpd_mib_3/1,
@@ -198,17 +198,17 @@
snmp_view_based_acm_mib_3/1,
snmp_user_based_sm_mib_3/1,
- %% all_tcs - test_v3 - v3_security
+ %% major_tcs - test_v3 - v3_security
v3_crypto_basic/1,
v3_md5_auth/1,
v3_sha_auth/1,
v3_des_priv/1,
- %% all_tcs - test_multi_threaded, test_multi_threaded_ext
+ %% major_tcs - test_multi_threaded, test_multi_threaded_ext
multi_threaded/1,
mt_trap/1,
- %% all_tcs - mib_storage - mib_storage_ets
+ %% major_tcs - mib_storage - mib_storage_ets
mse_simple/1,
mse_v1_processing/1,
mse_big/1,
@@ -230,7 +230,7 @@
mse_me_of/1,
mse_mib_of/1,
- %% all_tcs - mib_storage - mib_storage_dets
+ %% major_tcs - mib_storage - mib_storage_dets
msd_simple/1,
msd_v1_processing/1,
msd_big/1,
@@ -252,7 +252,7 @@
msd_me_of/1,
msd_mib_of/1,
- %% all_tcs - mib_storage - mib_storage_mnesia
+ %% major_tcs - mib_storage - mib_storage_mnesia
msm_simple/1,
msm_v1_processing/1,
msm_big/1,
@@ -274,28 +274,28 @@
msm_me_of/1,
msm_mib_of/1,
- %% all_tcs - mib_storage - mse_size_check
+ %% major_tcs - mib_storage - mse_size_check
mse_size_check/1,
- %% all_tcs - mib_storage - msd_size_check
+ %% major_tcs - mib_storage - msd_size_check
msd_size_check/1,
- %% all_tcs - mib_storage - msm_size_check
+ %% major_tcs - mib_storage - msm_size_check
msm_size_check/1,
- %% all_tcs - mib_storage - varm_mib_storage_dets
+ %% major_tcs - mib_storage - varm_mib_storage_dets
msd_varm_mib_start/1,
- %% all_tcs - mib_storage - varm_mib_storage_mnesia
+ %% major_tcs - mib_storage - varm_mib_storage_mnesia
msm_varm_mib_start/1,
- %% all_tcs - tickets1 - otp4394
+ %% major_tcs - tickets1 - otp4394
otp_4394/1,
- %% all_tcs - tickets1 - otp7157
+ %% major_tcs - tickets1 - otp7157
otp_7157/1,
- %% all_tcs - tickets1 - otp16092
+ %% major_tcs - tickets1 - otp16092
otp_16092_simple_start_and_stop1/1,
otp_16092_simple_start_and_stop2/1,
otp_16092_simple_start_and_stop3/1,
@@ -526,14 +526,31 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
- %% Reqs = [mnesia, distribution, {local_slave_nodes, 2}, {time, 360}],
- Conf1 = [{group, all_tcs}],
- Conf2 = [{group, tickets2}],
- Conf1 ++ Conf2.
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
groups() ->
[
- {all_tcs, [], all_cases()},
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {major_tcs, [], major_cases()},
{mib_storage, [], mib_storage_cases()},
{mib_storage_ets, [], mib_storage_ets_cases()},
{mib_storage_dets, [], mib_storage_dets_cases()},
@@ -568,17 +585,32 @@ groups() ->
{reported_bugs_2, [], reported_bugs2_cases()},
{reported_bugs_3, [], reported_bugs3_cases()},
{tickets1, [], tickets1_cases()},
- {tickets2, [], tickets2_cases()},
{otp4394, [], [otp_4394]},
{otp7157, [], [otp_7157]},
{otp16092, [], otp16092_cases()},
+
+ %% These all belong to group 'tickets2'
+ {tickets2, [], tickets2_cases()},
{otp16649, [], otp16649_cases()},
{otp16649_ipv4, [], otp16649_gen_cases()},
{otp16649_ipv6, [], otp16649_gen_cases()}
].
-all_cases() ->
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+
+%% The agent and the nodes of the agent and manager
+%% is started at group init and then lives until
+%% group end!
+major_cases() ->
[
{group, misc},
{group, test_v1},
@@ -594,6 +626,53 @@ all_cases() ->
{group, mib_storage},
{group, tickets1}
].
+
+all_cases() ->
+ [
+ %% The agent and the nodes of the agent and manager
+ %% is started at group init and then lives until
+ %% group end!
+ {group, major_tcs},
+
+ %% The test cases in the 'tickets2' group
+ %% require control of start and stop of agents and inodes!
+ {group, tickets2}
+ ].
+
+
+tickets1_cases() ->
+ [
+ {group, otp4394},
+ {group, otp7157},
+ {group, otp16092}
+ ].
+
+
+tickets2_cases() ->
+ [
+ otp8395,
+ otp9884,
+ {group, otp16649}
+ ].
+
+otp16649_cases() ->
+ [
+ {group, otp16649_ipv4},
+ {group, otp16649_ipv6}
+ ].
+
+otp16649_gen_cases() ->
+ [
+ otp16649_1,
+ otp16649_2,
+ otp16649_3,
+ otp16649_4,
+ otp16649_5,
+ otp16649_6,
+ otp16649_7
+ ].
+
+
%%
%% -----
@@ -603,7 +682,12 @@ init_per_suite(Config0) when is_list(Config0) ->
?IPRINT("init_per_suite -> entry with"
"~n Config: ~p"
- "~n Nodes: ~p", [Config0, erlang:nodes()]),
+ "~n Nodes: ~p"
+ "~n explicit inet backend: ~p"
+ "~n test inet backends: ~p",
+ [Config0, erlang:nodes(),
+ ?EXPLICIT_INET_BACKEND(),
+ ?TEST_INET_BACKENDS()]),
case ?LIB:init_per_suite(Config0) of
{skip, _} = SKIP ->
@@ -660,125 +744,133 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(all_tcs = GroupName, Config) ->
+init_per_group(GroupName, Config0) ->
+ ?IPRINT("init_per_group -> entry with"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n when"
+ "~n Nodes: ~p",
+ [GroupName, Config0, nodes()]),
+
+ Config1 = init_per_group2(GroupName, Config0),
+
+ ?IPRINT("init_per_group -> done when"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n Nodes: ~p",
+ [GroupName, Config1, nodes()]),
+
+ Config1.
+
+
+init_per_group2(inet_backend_default = _GroupName, Config) ->
+ snmp_test_lib:init_group_top_dir(default, [{socket_create_opts, []} | Config]);
+init_per_group2(inet_backend_inet = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ snmp_test_lib:init_group_top_dir(inet, [{socket_create_opts, [{inet_backend, inet}]} | Config])
+ end;
+init_per_group2(inet_backend_socket = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ snmp_test_lib:init_group_top_dir(socket, [{socket_create_opts, [{inet_backend, socket}]} | Config])
+ end;
+init_per_group2(major_tcs = GroupName, Config) ->
init_all(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp7157 = GroupName, Config) ->
+init_per_group2(otp7157 = GroupName, Config) ->
otp_7157_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp4394 = GroupName, Config) ->
+init_per_group2(otp4394 = GroupName, Config) ->
otp_4394_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(v2_inform = GroupName, Config) ->
+init_per_group2(v2_inform = GroupName, Config) ->
init_v2_inform(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(v3_inform = GroupName, Config) ->
+init_per_group2(v3_inform = GroupName, Config) ->
init_v3_inform(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs = GroupName, Config) ->
+init_per_group2(multiple_reqs = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs_2 = GroupName, Config) ->
+init_per_group2(multiple_reqs_2 = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs_3 = GroupName, Config) ->
+init_per_group2(multiple_reqs_3 = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_multi_threaded = GroupName, Config) ->
+init_per_group2(test_multi_threaded = GroupName, Config) ->
init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), true);
-init_per_group(test_multi_threaded_ext = GroupName, Config) ->
+init_per_group2(test_multi_threaded_ext = GroupName, Config) ->
init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), extended);
-init_per_group(test_v3 = GroupName, Config) ->
+init_per_group2(test_v3 = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_v3(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(test_v1_v2 = GroupName, Config) ->
+init_per_group2(test_v1_v2 = GroupName, Config) ->
init_v1_v2(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v2 = GroupName, Config) ->
+init_per_group2(test_v2 = GroupName, Config) ->
init_v2(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v1 = GroupName, Config) ->
+init_per_group2(test_v1 = GroupName, Config) ->
init_v1(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v1_ipv6 = GroupName, Config) ->
+init_per_group2(test_v1_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v1/1);
-init_per_group(test_v2_ipv6 = GroupName, Config) ->
+init_per_group2(test_v2_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v2/1);
-init_per_group(test_v1_v2_ipv6 = GroupName, Config) ->
+init_per_group2(test_v1_v2_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v1_v2/1);
-init_per_group(test_v3_ipv6 = GroupName, Config) ->
+init_per_group2(test_v3_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v3/1);
-init_per_group(misc = GroupName, Config) ->
+init_per_group2(misc = GroupName, Config) ->
init_misc(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_varm_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_varm_mnesia = GroupName, Config) ->
init_varm_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName,
Config));
-init_per_group(mib_storage_varm_dets = GroupName, Config) ->
- ?DBG("init_per_group(mib_storage_varm_dets) -> entry with"
- "~n Config: ~p", [Config]),
+init_per_group2(mib_storage_varm_dets = GroupName, Config) ->
init_varm_mib_storage_dets(
snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_size_check_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_mnesia = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(mib_storage_size_check_dets = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_dets = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(mib_storage_size_check_ets = GroupName, Config) ->
- case snmp_test_lib:crypto_start() of
- ok ->
- init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
- _ ->
- {skip, "Crypto did not start"}
- end;
-init_per_group(mib_storage_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_ets = GroupName, Config) ->
+ case snmp_test_lib:crypto_start() of
+ ok ->
+ init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
+ _ ->
+ {skip, "Crypto did not start"}
+ end;
+init_per_group2(mib_storage_mnesia = GroupName, Config) ->
init_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName,
Config));
-init_per_group(mib_storage_dets = GroupName, Config) ->
+init_per_group2(mib_storage_dets = GroupName, Config) ->
init_mib_storage_dets(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_ets = GroupName, Config) ->
+init_per_group2(mib_storage_ets = GroupName, Config) ->
init_mib_storage_ets(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp16649_ipv4 = GroupName, Config) ->
+init_per_group2(otp16649_ipv4 = GroupName, Config) ->
Config2 = [{ip, ?LOCALHOST(inet)},
{ipfamily, inet},
{tdomain, transportDomainUdpIpv4} |
lists:keydelete(ip, 1, Config)],
snmp_test_lib:init_group_top_dir(GroupName, Config2);
-init_per_group(otp16649_ipv6 = GroupName, Config) ->
+init_per_group2(otp16649_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName,
[{tdomain, transportDomainUdpIpv6} | Config],
fun(C) -> C end);
- %% SupportsIPv6 =
- %% case ?HAS_SUPPORT_IPV6() of
- %% true ->
- %% case os:type() of
- %% {unix, netbsd} ->
- %% {false, "Host *may* not *properly* support IPV6"};
- %% {unix, darwin} ->
- %% case os:version() of
- %% V > {9, 8, 0} ->
- %% true;
- %% _ ->
- %% {false, "Host *may* not *properly* support IPV6"};
- %% end;
- %% _ ->
- %% true
- %% end;
- %% false ->
- %% {false, "Host does not support IPv6"}
- %% end,
- %% case SupportsIPv6 of
- %% true ->
- %% Config2 = [{ip, ?LOCALHOST(inet6)},
- %% {ipfamily, inet6},
- %% {tdomain, transportDomainUdpIpv6} |
- %% lists:keydelete(ip, 1, Config)],
- %% snmp_test_lib:init_group_top_dir(GroupName, Config2);
- %% {false, SkipReason} ->
- %% {skip, SkipReason}
- %% end;
-init_per_group(GroupName, Config) ->
+init_per_group2(GroupName, Config) ->
snmp_test_lib:init_group_top_dir(GroupName, Config).
init_per_group_ipv6(GroupName, Config, Init) ->
@@ -820,61 +912,78 @@ init_per_group_ipv6(GroupName, Config, Init) ->
end
end.
-end_per_group(all_tcs, Config) ->
+
+end_per_group(GroupName, Config) ->
+ ?IPRINT("end_per_group -> entry with"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n when"
+ "~n Nodes: ~p",
+ [GroupName, Config, nodes()]),
+
+ Config1 = end_per_group2(GroupName, Config),
+
+ ?IPRINT("end_per_group -> done when"
+ "~n Nodes: ~p",
+ [nodes()]),
+
+ Config1.
+
+end_per_group2(major_tcs, Config) ->
finish_all(Config);
-end_per_group(otp7157, Config) ->
+end_per_group2(otp7157, Config) ->
otp_7157_finish(Config);
-end_per_group(otp4394, Config) ->
+end_per_group2(otp4394, Config) ->
otp_4394_finish(Config);
-end_per_group(v2_inform, Config) ->
+end_per_group2(v2_inform, Config) ->
finish_v2_inform(Config);
-end_per_group(v3_inform, Config) ->
+end_per_group2(v3_inform, Config) ->
finish_v3_inform(Config);
-end_per_group(multiple_reqs, Config) ->
+end_per_group2(multiple_reqs, Config) ->
finish_mul(Config);
-end_per_group(multiple_reqs_2, Config) ->
+end_per_group2(multiple_reqs_2, Config) ->
finish_mul(Config);
-end_per_group(multiple_reqs_3, Config) ->
+end_per_group2(multiple_reqs_3, Config) ->
finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
+end_per_group2(test_multi_threaded, Config) ->
finish_mt(Config);
-end_per_group(test_multi_threaded_ext, Config) ->
+end_per_group2(test_multi_threaded_ext, Config) ->
finish_mt(Config);
-end_per_group(test_v3_ipv6, Config) ->
+end_per_group2(test_v3_ipv6, Config) ->
finish_v3(Config);
-end_per_group(test_v1_v2_ipv6, Config) ->
+end_per_group2(test_v1_v2_ipv6, Config) ->
finish_v1_v2(Config);
-end_per_group(test_v2_ipv6, Config) ->
+end_per_group2(test_v2_ipv6, Config) ->
finish_v2(Config);
-end_per_group(test_v1_ipv6, Config) ->
+end_per_group2(test_v1_ipv6, Config) ->
finish_v1(Config);
-end_per_group(test_v3, Config) ->
+end_per_group2(test_v3, Config) ->
finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
+end_per_group2(test_v1_v2, Config) ->
finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
+end_per_group2(test_v2, Config) ->
finish_v2(Config);
-end_per_group(test_v1, Config) ->
+end_per_group2(test_v1, Config) ->
finish_v1(Config);
-end_per_group(misc, Config) ->
+end_per_group2(misc, Config) ->
finish_misc(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
+end_per_group2(mib_storage_varm_mnesia, Config) ->
finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
+end_per_group2(mib_storage_varm_dets, Config) ->
finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
+end_per_group2(mib_storage_size_check_mnesia, Config) ->
finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
+end_per_group2(mib_storage_size_check_dets, Config) ->
finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
+end_per_group2(mib_storage_size_check_ets, Config) ->
finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
+end_per_group2(mib_storage_mnesia, Config) ->
finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
+end_per_group2(mib_storage_dets, Config) ->
finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
+end_per_group2(mib_storage_ets, Config) ->
finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
+end_per_group2(_GroupName, Config) ->
Config.
@@ -7025,14 +7134,6 @@ otp_3725_test(MaNode) ->
%% Slogan: Target mib tag list check invalid
%%-----------------------------------------------------------------
-tickets1_cases() ->
- [
- {group, otp4394},
- {group, otp7157},
- {group, otp16092}
- ].
-
-
otp_4394_init(Config) when is_list(Config) ->
?DBG("otp_4394_init -> entry with"
"~n Config: ~p", [Config]),
@@ -7398,31 +7499,6 @@ otp16092_try_start_and_stop_agent(Node, Opts, Expected) ->
%% These cases are started in the new way
%%-----------------------------------------------------------------
-tickets2_cases() ->
- [
- otp8395,
- otp9884,
- {group, otp16649}
- ].
-
-otp16649_cases() ->
- [
- {group, otp16649_ipv4},
- {group, otp16649_ipv6}
- ].
-
-otp16649_gen_cases() ->
- [
- otp16649_1,
- otp16649_2,
- otp16649_3,
- otp16649_4,
- otp16649_5,
- otp16649_6,
- otp16649_7
- ].
-
-
otp8395({init, Config}) when is_list(Config) ->
?DBG("otp8395(init) -> entry with"
"~n Config: ~p", [Config]),
@@ -7430,9 +7506,9 @@ otp8395({init, Config}) when is_list(Config) ->
%% --
%% Start nodes
%%
-
- {ok, AgentNode} = start_node(agent),
- {ok, ManagerNode} = start_node(manager),
+ FName = ?FUNCTION_NAME,
+ {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
+ {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
%% --
%% Mnesia init
@@ -7580,7 +7656,7 @@ otp8395(Config) when is_list(Config) ->
otp9884({init, Config}) when is_list(Config) ->
?DBG("otp9884(init) -> entry with"
"~n Config: ~p", [Config]),
- init_v1_agent([{ipfamily, inet} | Config]);
+ init_v1_agent([{fname, otp9884}, {ipfamily, inet} | Config]);
otp9884({fin, Config}) when is_list(Config) ->
?DBG("otp9884(fin) -> entry with"
@@ -8024,8 +8100,12 @@ otp16649_init(N, AgentPreTransports, Config) ->
"~n Config2: ~p", [Config3]),
[{agent_raw_transports, AgentPreTransports} | Config3].
+mk_node_name(FName, Post) when is_atom(FName) andalso is_atom(Post) ->
+ list_to_atom(?F("~w_~w", [FName, Post])).
+
otp16649_mk_name(N, Post) when is_integer(N) andalso is_atom(Post) ->
- list_to_atom(?F("otp16649_~w_~w", [N, Post])).
+ mk_node_name(otp16649, list_to_atom(?F("~w_~w", [N, Post]))).
+%% list_to_atom(?F("otp16649_~w_~w", [N, Post])).
otp16649_fin(N, Config) when is_integer(N) ->
@@ -8241,13 +8321,15 @@ start_agent(Config) ->
start_agent(Config, Opts) ->
%% Directories
- ConfDir = ?config(agent_conf_dir, Config),
- DbDir = ?config(agent_db_dir, Config),
- LogDir = ?config(agent_log_dir, Config),
+ ConfDir = ?config(agent_conf_dir, Config),
+ DbDir = ?config(agent_db_dir, Config),
+ LogDir = ?config(agent_log_dir, Config),
+ InetBackend = ?config(socket_create_opts, Config),
Vsns = [v1],
- AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts),
+ AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns,
+ InetBackend, Opts),
%% Nodes
AgentNode = ?config(agent_node, Config),
@@ -8259,7 +8341,15 @@ start_agent(Config, Opts) ->
[{agent_sup, AgentTopSup} | Config].
-process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) ->
+process_agent_options(ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts) ->
+ ?IPRINT("process_agent_options ->"
+ "~n ConfDir: ~p"
+ "~n DbDir: ~p"
+ "~n LogDir: ~p"
+ "~n Vsns: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p",
+ [ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts]),
Defaults =
[{agent_type, master},
{agent_verbosity, trace},
@@ -8283,9 +8373,9 @@ process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) ->
{note_store, [{timeout,30000}, {verbosity,log}]},
{net_if, [{module, snmpa_net_if},
{verbosity, trace},
- {options, [{bind_to, false},
- {no_reuse, false},
- {req_limit, infinity}]}]},
+ {options, InetBackend ++ [{bind_to, false},
+ {no_reuse, false},
+ {req_limit, infinity}]}]},
{audit_trail_log, [{type, read_write},
{dir, LogDir},
{size, {10240,20}},
@@ -8699,11 +8789,12 @@ init_v1_agent(Config) ->
%% Start nodes
%%
- {ok, AgentNode} = start_node(agent),
+ FName = ?config(fname, Config),
+ {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
%% We don't use a manager in this test but the (common) config
%% function takes an argument that is derived from this
- {ok, ManagerNode} = start_node(manager),
+ {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
%% --
%% Mnesia init
@@ -8758,7 +8849,11 @@ init_v1_agent(Config) ->
{agent_node, AgentNode},
{agent_host, AgentHost},
{agent_ip, AgentIP},
- {agent_backup_dirs, AgentBkpDirs}|Config]),
+ {agent_backup_dirs, AgentBkpDirs},
+
+ %% We need this here since without it
+ %% fin_v1_agent will not be able to stop!
+ {manager_node, ManagerNode}|Config]),
%% --
%% Create watchdog
@@ -8786,7 +8881,7 @@ fin_v1_agent(Config) ->
%% -
%% Stop the agent node
- %%
+ %%
stop_node(AgentNode),
diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl
index c99c0359f2..236015cfe0 100644
--- a/lib/snmp/test/snmp_agent_test_lib.erl
+++ b/lib/snmp/test/snmp_agent_test_lib.erl
@@ -123,7 +123,8 @@
init_all(Config) when is_list(Config) ->
?IPRINT("init_all -> entry with"
- "~n Config: ~p", [Config]),
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config, nodes()]),
%% --
%% Start nodes
@@ -140,12 +141,12 @@ init_all(Config) when is_list(Config) ->
%% Create necessary files ( and dirs )
%%
- ?IPRINT("init_all -> create suite top dir"),
- SuiteTopDir = ?config(snmp_suite_top_dir, Config),
- ?DBG("init_all -> SuiteTopDir ~p", [SuiteTopDir]),
+ ?IPRINT("init_all -> lookup group top dir"),
+ GroupTopDir = ?config(snmp_group_top_dir, Config),
+ ?DBG("init_all -> GroupTopDir ~p", [GroupTopDir]),
?IPRINT("init_all -> create agent dir"),
- AgentDir = join(SuiteTopDir, "agent/"),
+ AgentDir = join(GroupTopDir, "agent/"),
?line ok = file:make_dir(AgentDir),
?DBG("init_all -> AgentDir ~p", [AgentDir]),
@@ -165,12 +166,12 @@ init_all(Config) when is_list(Config) ->
?DBG("init_all -> AgentConfDir ~p", [AgentConfDir]),
?IPRINT("init_all -> create manager dir"),
- MgrDir = join(SuiteTopDir, "mgr/"),
+ MgrDir = join(GroupTopDir, "mgr/"),
?line ok = file:make_dir(MgrDir),
?DBG("init_all -> MgrDir ~p", [MgrDir]),
?IPRINT("init_all -> create sub-agent dir"),
- SaDir = join(SuiteTopDir, "sa/"),
+ SaDir = join(GroupTopDir, "sa/"),
?line ok = file:make_dir(SaDir),
?DBG("init_all -> SaDir ~p", [SaDir]),
@@ -213,7 +214,8 @@ init_all(Config) when is_list(Config) ->
?IPRINT("init_all -> get localhost"),
Ip = ?LOCALHOST(),
- ?IPRINT("init_all -> done"),
+ ?IPRINT("init_all -> done when"
+ "~n Nodes: ~p", [nodes()]),
[{snmp_sa, SaNode},
{snmp_mgr, MgrNode},
{snmp_master, node()},
@@ -232,7 +234,8 @@ init_all(Config) when is_list(Config) ->
finish_all(Config) when is_list(Config) ->
?IPRINT("finish_all -> entry with"
- "~n Config: ~p", [Config]),
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config, nodes()]),
SaNode = ?config(snmp_sa, Config),
MgrNode = ?config(snmp_mgr, Config),
@@ -246,7 +249,11 @@ finish_all(Config) when is_list(Config) ->
?IPRINT("finish_all -> stop mnesia application"),
application:stop(mnesia),
- ?IPRINT("finish_all -> stop"),
+ ?IPRINT("finish_all -> unload mnesia application"),
+ application:unload(mnesia),
+
+ ?IPRINT("finish_all -> stop when"
+ "~n Nodes: ~p", [nodes()]),
ok.
@@ -266,9 +273,18 @@ init_case(Config) when is_list(Config) ->
SaHost = ?HOSTNAME(SaNode),
MgrHost = ?HOSTNAME(MgrNode),
MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost, IpFamily),
- {ok, MIP} = snmp_misc:ip(MgrHost, IpFamily),
- {ok, SIP} = snmp_misc:ip(SaHost, IpFamily),
+ {ok, MasterIP} = ?LIB:which_host_ip(MasterHost, IpFamily),
+ {ok, MIP} = ?LIB:which_host_ip(MgrHost, IpFamily),
+ {ok, SIP} = ?LIB:which_host_ip(SaHost, IpFamily),
+
+ ?IPRINT("init_case -> "
+ "~n SaHost: ~p"
+ "~n MgrHost: ~p"
+ "~n MasterHost: ~p"
+ "~n MasterIP: ~p"
+ "~n MIP: ~p"
+ "~n SIP: ~p",
+ [SaHost, MgrHost, MasterHost, MasterIP, MIP, SIP]),
put(mgr_node, MgrNode),
put(sa_node, SaNode),
@@ -296,6 +312,7 @@ init_case(Config) when is_list(Config) ->
"~n SaNode: ~p"
"~n MgrNode: ~p"
"~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
+
{SaNode, MgrNode, MibDir}.
@@ -646,10 +663,11 @@ start_agent(Config, Vsns, Opts) ->
"~n Vsns: ~p"
"~n Opts: ~p", [node(), Config, Vsns, Opts]),
- ?line AgentLogDir = ?config(agent_log_dir, Config),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line AgentDbDir = ?config(agent_db_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
+ ?line AgentLogDir = ?config(agent_log_dir, Config),
+ ?line AgentConfDir = ?config(agent_conf_dir, Config),
+ ?line AgentDbDir = ?config(agent_db_dir, Config),
+ ?line SaNode = ?config(snmp_sa, Config),
+ ?line InetBackend = ?config(socket_create_opts, Config),
Env = app_agent_env_init(
[{versions, Vsns},
@@ -668,7 +686,8 @@ start_agent(Config, Vsns, Opts) ->
{mib_server, [{verbosity, log}]},
{symbolic_store, [{verbosity, log}]},
{note_store, [{verbosity, log}]},
- {net_if, [{verbosity, trace}]}],
+ {net_if, [{verbosity, trace},
+ {options, InetBackend}]}],
Opts),
diff --git a/lib/snmp/test/snmp_test_global_sys_monitor.erl b/lib/snmp/test/snmp_test_global_sys_monitor.erl
index c3f2e24096..c77b118d18 100644
--- a/lib/snmp/test/snmp_test_global_sys_monitor.erl
+++ b/lib/snmp/test/snmp_test_global_sys_monitor.erl
@@ -240,13 +240,13 @@ call(Req, Timeout1, Timeout2) ->
NamePid when is_pid(NamePid) ->
receive
{?MODULE, Ref, Rep} ->
- Rep
+ exit(Rep)
after Timeout2 ->
- {error, timeout}
+ exit({error, timeout})
end
catch
C:E:_ ->
- {error, {catched, C, E}}
+ exit({error, {catched, C, E}})
end
end,
{Pid, Mon} = spawn_monitor(F),
diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl
index c2c720fdb4..10a1bc9202 100644
--- a/lib/snmp/test/snmp_test_lib.erl
+++ b/lib/snmp/test/snmp_test_lib.erl
@@ -51,6 +51,8 @@
-export([f/2, formated_timestamp/0]).
-export([p/2, print1/2, print2/2, print/5]).
-export([eprint/2, wprint/2, nprint/2, iprint/2]).
+-export([explicit_inet_backend/0, test_inet_backends/0]).
+-export([which_host_ip/2]).
-define(SKIP(R), skip(R, ?MODULE, ?LINE)).
@@ -258,6 +260,45 @@ tc_which_name() ->
%% Misc functions
%%
+explicit_inet_backend() ->
+ %% This is intentional!
+ %% This is a kernel flag, which if set disables
+ %% our own special handling of the inet_backend
+ %% in our test suites.
+ case application:get_all_env(kernel) of
+ Env when is_list(Env) ->
+ case lists:keysearch(inet_backend, 1, Env) of
+ {value, {inet_backend, _}} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end.
+
+test_inet_backends() ->
+ case init:get_argument(snmp) of
+ {ok, SnmpArgs} when is_list(SnmpArgs) ->
+ test_inet_backends(SnmpArgs, atom_to_list(?FUNCTION_NAME));
+ error ->
+ false
+ end.
+
+test_inet_backends([], _) ->
+ false;
+test_inet_backends([[Key, Val] | _], Key) ->
+ case list_to_atom(string:to_lower(Val)) of
+ Bool when is_boolean(Bool) ->
+ Bool;
+ _ ->
+ false
+ end;
+test_inet_backends([_|Args], Key) ->
+ test_inet_backends(Args, Key).
+
+
+
proxy_call(F, Timeout, Default)
when is_function(F, 0) andalso is_integer(Timeout) andalso (Timeout > 0) ->
{P, M} = erlang:spawn_monitor(fun() -> exit(F()) end),
@@ -282,6 +323,29 @@ hostname(Node) ->
[]
end.
+
+which_host_ip(Hostname, Family) ->
+ case snmp_misc:ip(Hostname, Family) of
+ {ok, {A, _, _, _}} = OK
+ when (A =/= 127) ->
+ OK;
+ {ok, {A, _, _, _, _, _, _, _}} = OK
+ when (A =/= 0) andalso
+ (A =/= 16#fe80) ->
+ OK;
+ {ok, _} ->
+ try localhost(Family) of
+ Addr ->
+ {ok, Addr}
+ catch
+ C:E:S ->
+ {error, {C, E, S}}
+ end;
+ {error, _} = ERROR ->
+ ERROR
+ end.
+
+
localhost() ->
localhost(inet).
@@ -315,6 +379,8 @@ which_addr(_Family, []) ->
fail(no_valid_addr, ?MODULE, ?LINE);
which_addr(Family, [{"lo", _} | IfList]) ->
which_addr(Family, IfList);
+which_addr(Family, [{"tun" ++ _, _} | IfList]) ->
+ which_addr(Family, IfList);
which_addr(Family, [{"docker" ++ _, _} | IfList]) ->
which_addr(Family, IfList);
which_addr(Family, [{"br-" ++ _, _} | IfList]) ->
@@ -781,6 +847,7 @@ init_group_top_dir(GroupName, Config) ->
[{snmp_group_top_dir, GroupTopDir} | Config];
_ ->
+ %% This is a "top level" group, that is, there is only the suite
case lists:keysearch(snmp_suite_top_dir, 1, Config) of
{value, {_Key, Dir}} ->
GroupTopDir = filename:join(Dir, GroupName),
diff --git a/lib/snmp/test/snmp_test_lib.hrl b/lib/snmp/test/snmp_test_lib.hrl
index 78d1453c12..a6b1be76ea 100644
--- a/lib/snmp/test/snmp_test_lib.hrl
+++ b/lib/snmp/test/snmp_test_lib.hrl
@@ -41,6 +41,9 @@
-define(OSTYPE(), ?LIB:os_type()).
-define(DISPLAY_SUITE_INFO(), ?LIB:display_suite_info(?MODULE)).
+-define(EXPLICIT_INET_BACKEND(), ?LIB:explicit_inet_backend()).
+-define(TEST_INET_BACKENDS(), ?LIB:test_inet_backends()).
+
%% - Test case macros -
diff --git a/lib/snmp/test/snmp_test_mgr.erl b/lib/snmp/test/snmp_test_mgr.erl
index fe2852c573..7fab69c043 100644
--- a/lib/snmp/test/snmp_test_mgr.erl
+++ b/lib/snmp/test/snmp_test_mgr.erl
@@ -262,7 +262,7 @@ init({Options, CallerPid}) ->
Addr;
{value, Host} when is_list(Host) ->
?IPRINT("init -> Host: ~p", [Host]),
- {ok, Ip} = snmp_misc:ip(Host, IpFamily),
+ {ok, Ip} = ?LIB:which_host_ip(Host, IpFamily),
Ip
end,
?IPRINT("init -> AgIp: ~p", [AgIp]),