summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2021-09-02 11:26:18 +0200
committerMicael Karlberg <bmk@erlang.org>2021-09-02 11:26:18 +0200
commit3aba42c203efa7673c22a0af44347653b74e493e (patch)
tree6b976ae3523afb5d0f6cd5cc0123b50ca71ab0df
parent98317a64fe29c227f21a9dc84d6bfee2d7f870ec (diff)
parent13c94e43ae2c2827d01bbd7b65c32a3a78bf81f8 (diff)
downloaderlang-3aba42c203efa7673c22a0af44347653b74e493e.tar.gz
Merge branch 'bmk/snmp/20210830/use_inet_backend/OTP-17526' into maint
OTP-17526
-rw-r--r--lib/kernel/src/gen_udp_socket.erl35
-rw-r--r--lib/snmp/doc/src/snmp_app.xml18
-rw-r--r--lib/snmp/doc/src/snmp_config.xml16
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl205
-rw-r--r--lib/snmp/src/manager/snmpm_net_if.erl139
-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_manager_SUITE.erl534
-rw-r--r--lib/snmp/test/snmp_test_global_sys_monitor.erl6
-rw-r--r--lib/snmp/test/snmp_test_lib.erl78
-rw-r--r--lib/snmp/test/snmp_test_lib.hrl3
-rw-r--r--lib/snmp/test/snmp_test_mgr.erl2
13 files changed, 969 insertions, 583 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/doc/src/snmp_app.xml b/lib/snmp/doc/src/snmp_app.xml
index 361781cb61..9f346f0fe2 100644
--- a/lib/snmp/doc/src/snmp_app.xml
+++ b/lib/snmp/doc/src/snmp_app.xml
@@ -294,13 +294,15 @@ in the snmp_config file!
<tag><marker id="agent_ni_opts"></marker>
<c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>agent_net_if_option() = {bind_to, bind_to()} |
+ <p><c>agent_net_if_option() =
+ {bind_to, bind_to()} |
{sndbuf, sndbuf()} |
{recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{req_limit, req_limit()} |
{filter, agent_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>agent_net_if_module()</c>.</p>
@@ -796,12 +798,14 @@ in the snmp_config file!
<tag><marker id="manager_ni_opts"></marker>
<c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>manager_net_if_option() = {bind_to, bind_to()} |
- {sndbuf, sndbuf()} |
- {recbuf, recbuf()} |
- {no_reuse, no_reuse()} |
+ <p><c>manager_net_if_option() =
+ {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
+ {no_reuse, no_reuse()} |
{filter, manager_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>manager_net_if_module()</c>.</p>
diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml
index 41646d86c3..7dc8e2f66e 100644
--- a/lib/snmp/doc/src/snmp_config.xml
+++ b/lib/snmp/doc/src/snmp_config.xml
@@ -280,13 +280,15 @@
<tag><marker id="agent_ni_opts"></marker>
<c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>agent_net_if_option() = {bind_to, bind_to()} |
+ <p><c>agent_net_if_option() =
+ {bind_to, bind_to()} |
{sndbuf, sndbuf()} |
{recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{req_limit, req_limit()} |
{filter, agent_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>agent_net_if_module()</c>.</p>
@@ -818,12 +820,14 @@ in so far as it will be converted to the new format if found.
<tag><marker id="manager_ni_opts"></marker>
<c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>manager_net_if_option() = {bind_to, bind_to()} |
- {sndbuf, sndbuf()} |
- {recbuf, recbuf()} |
+ <p><c>manager_net_if_option() =
+ {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{filter, manager_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>manager_net_if_module()</c>. </p>
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/manager/snmpm_net_if.erl b/lib/snmp/src/manager/snmpm_net_if.erl
index 1eb5ae216a..5ff8f91a6e 100644
--- a/lib/snmp/src/manager/snmpm_net_if.erl
+++ b/lib/snmp/src/manager/snmpm_net_if.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -81,7 +81,11 @@
-record(transport,
{socket,
- domain = snmpUDPDomain}).
+ port_info,
+ opts,
+ domain = snmpUDPDomain,
+ inet_backend = []
+ }).
-define(DEFAULT_FILTER_MODULE, snmpm_net_if_filter).
-define(DEFAULT_FILTER_OPTS, [{module, ?DEFAULT_FILTER_MODULE}]).
@@ -285,15 +289,29 @@ do_init(Server, NoteStore) ->
?vdebug("Log: ~w", [Log]),
{ok, DomainAddresses} = snmpm_config:system_info(transports),
- ?vdebug("DomainAddresses: ~w",[DomainAddresses]),
+ ?vdebug("DomainAddresses: ~w", [DomainAddresses]),
CommonSocketOpts = common_socket_opts(Opts),
- BindTo = get_opt(Opts, bind_to, false),
+ BindTo = get_opt(Opts, bind_to, false),
+ InetBackend = case get_opt(Opts, inet_backend, use_default) of
+ use_default -> [];
+ IB -> [{inet_backend, IB}]
+ end,
case
[begin
{IpPort, SocketOpts} =
socket_params(Domain, Address, BindTo, CommonSocketOpts),
- Socket = socket_open(IpPort, SocketOpts),
- #transport{socket = Socket, domain = Domain}
+ %% The 'inet-backend' option has to be first,
+ %% so we might as well add it last.
+ Socket = socket_open(IpPort, InetBackend ++ SocketOpts),
+ ?vtrace("socket created: "
+ "~n Ip Port: ~p"
+ "~n Socket Opts: ~p"
+ "~n Socket: ~p", [IpPort, SocketOpts, Socket]),
+ #transport{socket = Socket,
+ port_info = IpPort,
+ opts = SocketOpts,
+ inet_backend = InetBackend,
+ domain = Domain}
end || {Domain, Address} <- DomainAddresses]
of
[] ->
@@ -318,9 +336,9 @@ do_init(Server, NoteStore) ->
end.
socket_open(IpPort, SocketOpts) ->
- ?vtrace("socket_open -> entry with~n"
- " IpPort: ~p~n"
- " SocketOpts: ~p", [IpPort, SocketOpts]),
+ ?vtrace("socket_open -> entry with"
+ "~n IpPort: ~p"
+ "~n SocketOpts: ~p", [IpPort, SocketOpts]),
case gen_udp:open(IpPort, SocketOpts) of
{error, _} = Error ->
throw(Error);
@@ -354,6 +372,7 @@ socket_params(Domain, {IpAddr, IpPort} = Addr, BindTo, CommonSocketOpts) ->
_ ->
socket_params(SocketOpts, Addr, BindTo)
end.
+
%%
socket_params(SocketOpts, {IpAddr, IpPort}, BindTo) ->
case BindTo of
@@ -1253,9 +1272,9 @@ error_msg(F, A) ->
%%%-------------------------------------------------------------------
-% get_opt(Key, Opts) ->
-% ?vtrace("get option ~w", [Key]),
-% snmp_misc:get_option(Key, Opts).
+%% get_opt(Key, Opts) ->
+%% ?vtrace("get option ~w", [Key]),
+%% snmp_misc:get_option(Key, Opts).
get_opt(Opts, Key, Def) ->
?vtrace("get option ~w with default ~p", [Key, Def]),
@@ -1265,10 +1284,19 @@ get_opt(Opts, Key, Def) ->
%% -------------------------------------------------------------------
get_info(#state{transports = Transports}) ->
- ProcSize = proc_mem(self()),
- [{process_memory, ProcSize}
- | [{port_info, get_port_info(Socket)}
- || #transport{socket = Socket} <- Transports]].
+ ProcSize = proc_mem(self()),
+ Counters = get_counters(),
+ TransportInfo = [#{tdomain => Domain,
+ port_info => PI,
+ opts => Opts,
+ socket_info => get_socket_info(Socket)} ||
+ #transport{socket = Socket,
+ port_info = PI,
+ opts = Opts,
+ domain = Domain} <- Transports],
+ [{counters, Counters},
+ {process_memory, ProcSize},
+ {transport_info, TransportInfo}].
proc_mem(P) when is_pid(P) ->
case (catch erlang:process_info(P, memory)) of
@@ -1279,35 +1307,9 @@ proc_mem(P) when is_pid(P) ->
end.
-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} ->
@@ -1315,6 +1317,29 @@ get_port_info(Id) ->
_ ->
[]
end,
+
+ BufSz =
+ case (catch inet:getopts(Id, [recbuf, sndbuf, buffer])) of
+ {ok, Sz} ->
+ [{buffer_size, Sz}];
+ _ ->
+ []
+ end,
+
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz;
+
+get_socket_info(Id) ->
+ Info = inet:info(Id),
+
+ %% Does not exist for 'socket' ... yet
+ %% IfList =
+ %% case (catch inet:getif(Id)) of
+ %% {ok, IFs} ->
+ %% [{interfaces, IFs}];
+ %% _ ->
+ %% []
+ %% end,
+
BufSz =
case (catch inet:getopts(Id, [recbuf, sndbuf, buffer])) of
{ok, Sz} ->
@@ -1322,13 +1347,9 @@ get_port_info(Id) ->
_ ->
[]
end,
- [{socket, Id}] ++
- IfList ++
- PortStats ++
- PortInfo ++
- PortStatus ++
- PortAct ++
- BufSz.
+
+ [{socket, Id}, {info, Info}] ++ BufSz.
+
%%-----------------------------------------------------------------
@@ -1356,6 +1377,20 @@ counters() ->
inc(Name) -> inc(Name, 1).
inc(Name, N) -> snmpm_config:incr_stats_counter(Name, N).
+get_counters() ->
+ Counters = counters(),
+ get_counters(Counters, []).
+
+get_counters([], Acc) ->
+ lists:reverse(Acc);
+get_counters([Counter|Counters], Acc) ->
+ case snmpm_config:get_stats_counter(Counter) of
+ {ok, CounterVal} ->
+ get_counters(Counters, [{Counter, CounterVal}|Acc]);
+ _ ->
+ get_counters(Counters, Acc)
+ end.
+
%% ----------------------------------------------------------------
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_manager_SUITE.erl b/lib/snmp/test/snmp_manager_SUITE.erl
index 1f0dd506b5..15c02942ba 100644
--- a/lib/snmp/test/snmp_manager_SUITE.erl
+++ b/lib/snmp/test/snmp_manager_SUITE.erl
@@ -143,8 +143,61 @@
suite() ->
[{ct_hooks, [ts_install_cth]}].
-
all() ->
+ %% 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() ->
+ [
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {start_and_stop_tests, [], start_and_stop_tests_cases()},
+ {misc_tests, [], misc_tests_cases()},
+ {user_tests, [], user_tests_cases()},
+ {agent_tests, [], agent_tests_cases()},
+ {request_tests, [], request_tests_cases()},
+ {request_tests_mt, [], request_tests_mt_cases()},
+ {get_tests, [], get_tests_cases()},
+ {get_next_tests, [], get_next_tests_cases()},
+ {set_tests, [], set_tests_cases()},
+ {bulk_tests, [], bulk_tests_cases()},
+ {event_tests, [], event_tests_cases()},
+ {event_tests_mt, [], event_tests_mt_cases()},
+ {tickets, [], tickets_cases()},
+ {otp8015, [], otp8015_cases()},
+ {otp8395, [], otp8395_cases()},
+ {ipv6, [], ipv6_tests()},
+ {ipv6_mt, [], ipv6_tests()}
+
+ ].
+
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
{group, start_and_stop_tests},
{group, misc_tests},
@@ -160,130 +213,73 @@ all() ->
{group, ipv6_mt}
].
-groups() ->
+start_and_stop_tests_cases() ->
+ [
+ simple_start_and_stop1,
+ simple_start_and_stop2,
+ simple_start_and_stop3,
+ simple_start_and_monitor_crash1,
+ simple_start_and_monitor_crash2,
+ notify_started01,
+ notify_started02
+ ].
+
+misc_tests_cases() ->
+ [
+ info,
+ usm_priv_aes
+ ].
+
+user_tests_cases() ->
+ [
+ register_user1
+ ].
+
+agent_tests_cases() ->
+ [
+ register_agent_old,
+ register_agent2,
+ register_agent3
+ ].
+
+request_tests_cases() ->
[
- {start_and_stop_tests, [],
- [
- simple_start_and_stop1,
- simple_start_and_stop2,
- simple_start_and_stop3,
- simple_start_and_monitor_crash1,
- simple_start_and_monitor_crash2,
- notify_started01,
- notify_started02
- ]
- },
- {misc_tests, [],
- [
- info,
- usm_priv_aes
- ]
- },
- {user_tests, [],
- [
- register_user1
- ]
- },
- {agent_tests, [],
- [
- register_agent_old,
- register_agent2,
- register_agent3
- ]
- },
- {request_tests, [],
- [
- {group, get_tests},
- {group, get_next_tests},
- {group, set_tests},
- {group, bulk_tests}
- ]
- },
- {request_tests_mt, [],
- [
- {group, get_tests},
- {group, get_next_tests},
- {group, set_tests},
- {group, bulk_tests}
- ]
- },
- {get_tests, [],
- [
- simple_sync_get3,
- simple_async_get3
- ]
- },
- {get_next_tests, [],
- [
- simple_sync_get_next3,
- simple_async_get_next3_cbp_def,
- simple_async_get_next3_cbp_temp,
- simple_async_get_next3_cbp_perm
- ]
- },
- {set_tests, [],
- [
- simple_sync_set3,
- simple_async_set3_cbp_def,
- simple_async_set3_cbp_temp,
- simple_async_set3_cbp_perm
- ]
- },
- {bulk_tests, [],
- [
- simple_sync_get_bulk3,
- simple_async_get_bulk3_cbp_def,
- simple_async_get_bulk3_cbp_temp,
- simple_async_get_bulk3_cbp_perm
- ]
- },
- {event_tests, [],
- [
- trap1,
- trap2,
- inform1,
- inform2,
- inform3,
- inform4,
- inform_swarm_cbp_def,
- inform_swarm_cbp_temp,
- inform_swarm_cbp_perm,
- report
- ]
- },
- {event_tests_mt, [],
- [
- trap1,
- trap2,
- inform1,
- inform2,
- inform3,
- inform4,
- inform_swarm_cbp_def,
- inform_swarm_cbp_temp,
- inform_swarm_cbp_perm,
- report
- ]
- },
- {tickets, [],
- [
- {group, otp8015},
- {group, otp8395}
- ]
- },
- {otp8015, [],
- [
- otp8015_1
- ]
- },
- {otp8395, [],
- [
- otp8395_1
- ]
- },
- {ipv6, [], ipv6_tests()},
- {ipv6_mt, [], ipv6_tests()}
+ {group, get_tests},
+ {group, get_next_tests},
+ {group, set_tests},
+ {group, bulk_tests}
+ ].
+request_tests_mt_cases() -> request_tests_cases().
+
+get_tests_cases() ->
+ [
+ simple_sync_get3,
+ simple_async_get3
+ ].
+
+get_next_tests_cases() ->
+ [
+ simple_sync_get_next3,
+ simple_async_get_next3_cbp_def,
+ simple_async_get_next3_cbp_temp,
+ simple_async_get_next3_cbp_perm
+ ].
+
+set_tests_cases() ->
+ [
+ simple_sync_set3,
+ simple_async_set3_cbp_def,
+ simple_async_set3_cbp_temp,
+ simple_async_set3_cbp_perm
+ ].
+
+bulk_tests_cases() ->
+ [
+ simple_sync_get_bulk3,
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm
].
ipv6_tests() ->
@@ -301,7 +297,37 @@ ipv6_tests() ->
inform_swarm_cbp_perm
].
+event_tests_cases() ->
+ [
+ trap1,
+ trap2,
+ inform1,
+ inform2,
+ inform3,
+ inform4,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
+ report
+ ].
+
+event_tests_mt_cases() -> event_tests_cases().
+
+tickets_cases() ->
+ [
+ {group, otp8015},
+ {group, otp8395}
+ ].
+
+otp8015_cases() ->
+ [
+ otp8015_1
+ ].
+otp8395_cases() ->
+ [
+ otp8395_1
+ ].
%%
%% -----
@@ -310,7 +336,13 @@ ipv6_tests() ->
init_per_suite(Config0) when is_list(Config0) ->
?IPRINT("init_per_suite -> entry with"
- "~n Config0: ~p", [Config0]),
+ "~n Config0: ~p"
+ "~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 ->
@@ -363,20 +395,61 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(request_tests_mt = 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) ->
+ ?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 ->
+ ?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 ->
+ ?LIB:init_group_top_dir(socket, [{socket_create_opts, [{inet_backend, socket}]} | Config])
+ end;
+init_per_group2(all = GroupName, Config) ->
+ ?LIB:init_group_top_dir(GroupName, Config);
+init_per_group2(request_tests_mt = GroupName, Config) ->
?LIB:init_group_top_dir(
GroupName,
[{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(event_tests_mt = GroupName, Config) ->
+init_per_group2(event_tests_mt = GroupName, Config) ->
?LIB:init_group_top_dir(
GroupName,
[{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(ipv6_mt = GroupName, Config) ->
+init_per_group2(ipv6_mt = GroupName, Config) ->
init_per_group_ipv6(GroupName,
[{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(ipv6 = GroupName, Config) ->
+init_per_group2(ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config);
-init_per_group(GroupName, Config) ->
+init_per_group2(GroupName, Config) ->
?LIB:init_group_top_dir(GroupName, Config).
@@ -728,15 +801,16 @@ simple_start_and_stop1(Config) when is_list(Config) ->
do_simple_start_and_stop1(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start_link(Opts),
@@ -768,15 +842,16 @@ do_simple_start_and_stop2([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try load snmp application"),
@@ -812,13 +887,15 @@ do_simple_start_and_stop3(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
+ SCO = ?config(socket_create_opts, Config),
ConfDir = ?config(manager_conf_dir, Config),
DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}, {options, [{extra_sock_opts, ['this-should-not-work']}]}]},
+ {net_if, [{verbosity, trace},
+ {options, SCO ++ [{extra_sock_opts, ['this-should-not-work']}]}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -850,15 +927,16 @@ do_simple_start_and_monitor_crash1(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
@@ -923,16 +1001,17 @@ do_simple_start_and_monitor_crash2(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{restart_type, permanent},
- {server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
@@ -1018,15 +1097,16 @@ do_notify_started01(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, log}]},
- {net_if, [{verbosity, silence}]},
+ Opts = [{server, [{verbosity, log}]},
+ {net_if, [{verbosity, silence}, {options, SCO}]},
{note_store, [{verbosity, silence}]},
- {config, [{verbosity, log}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, log}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("request start notification (1)"),
Pid1 = snmpm:notify_started(10000),
@@ -1128,13 +1208,14 @@ do_notify_started02(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, log}]},
- {net_if, [{verbosity, silence}]},
+ {net_if, [{verbosity, silence}, {options, SCO}]},
{note_store, [{verbosity, silence}]},
{config, [{verbosity, debug}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1328,17 +1409,18 @@ ns02_ctrl_loop(Opts, N) ->
info(suite) -> [];
info(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace},
- {dir, ConfDir},
- {db_dir, DbDir}]}],
+ {config, [{verbosity, trace},
+ {dir, ConfDir},
+ {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
?SLEEP(1000),
@@ -1370,32 +1452,54 @@ do_info(Config) ->
verify_info(Info) when is_list(Info) ->
Keys = [{server, [process_memory, db_memory]},
{config, [process_memory, db_memory]},
- {net_if, [process_memory, port_info]},
+ {net_if, [process_memory, transport_info]},
{note_store, [process_memory, db_memory]},
stats_counters],
- verify_info(Keys, Info);
+ try verify_info(Keys, Info)
+ catch
+ C:E:S ->
+ ?IPRINT("Verification Failed: "
+ "~n Class: ~p"
+ "~n Error: ~p"
+ "~n Stack: ~p", [C, E, S]),
+ {error, {verification_failed, C, E, S}}
+ end;
verify_info(BadInfo) ->
{error, {bad_info, BadInfo}}.
verify_info([], _) ->
+ ?IPRINT("verified"),
ok;
verify_info([Key|Keys], Info) when is_atom(Key) ->
+ ?IPRINT("try verify '~p'", [Key]),
case lists:keymember(Key, 1, Info) of
true ->
verify_info(Keys, Info);
false ->
+ ?IPRINT("Verification of '~p' failed", [Key]),
{error, {missing_info, {Key, Info}}}
end;
verify_info([{Key, SubKeys}|Keys], Info) ->
+ ?IPRINT("try verify '~p' with sub-keys: "
+ "~n ~p", [Key, SubKeys]),
case lists:keysearch(Key, 1, Info) of
{value, {Key, SubInfo}} ->
- case verify_info(SubKeys, SubInfo) of
+ SubInfo2 =
+ if is_list(SubInfo) -> SubInfo;
+ is_map(SubInfo) -> maps:to_list(SubInfo)
+ end,
+ ?IPRINT("try verify sub-key(s) with sub-info: "
+ "~n (Sub-) Keys: ~p"
+ "~n (Sub-) Info: ~p", [SubKeys, SubInfo2]),
+ case verify_info(SubKeys, SubInfo2) of
ok ->
verify_info(Keys, Info);
{error, {missing_info, {SubKey, _}}} ->
+ ?IPRINT("Verification of sub-key '~p' failed", [SubKey]),
{error, {missing_subinfo, {Key, SubKey, Info}}}
end;
false ->
+ ?IPRINT("Verification of key '~p' failed", [Key]),
{error, {missing_info, {Key, Info}}}
end.
@@ -1408,13 +1512,14 @@ verify_info([{Key, SubKeys}|Keys], Info) ->
usm_priv_aes(suite) -> [];
usm_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace},
{dir, ConfDir},
@@ -1505,11 +1610,11 @@ do_usm_priv_aes(Config) ->
?IPRINT("encode scoped pdu"),
Message =
{ message,
- _Version = 'version-3',
+ 'version-3',
{ v3_hdr,
- _MsgID = 1,
+ 1, % MsgID1
MsgMaxSize,
- _MsgFlags = snmp_misc:mk_msg_flags(PduType, 2),
+ snmp_misc:mk_msg_flags(PduType, 2), % MsgFlags1
_MsgSecurityModel = 3, % SEC_USM
MsgSecurityParameters,
0
@@ -1587,13 +1692,14 @@ do_register_user1([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1687,13 +1793,14 @@ do_register_agent_old([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1820,14 +1927,15 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
LocalHost = snmp_test_lib:localhost(),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1965,15 +2073,16 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
LocalHost = snmp_test_lib:localhost(),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -4490,13 +4599,14 @@ otp8015_1(doc) -> ["OTP-8015:1 - testing the new api-function."];
otp8015_1(suite) -> [];
otp8015_1(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace},
{dir, ConfDir},
@@ -5349,10 +5459,12 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
"~n Conf0: ~p"
"~n Opts: ~p", [Node, Vsns, Conf0, _Opts]),
- AtlDir = ?config(manager_log_dir, Conf0),
- ConfDir = ?config(manager_conf_dir, Conf0),
- DbDir = ?config(manager_db_dir, Conf0),
- IRB = ?config(irb, Conf0),
+ SCO = ?config(socket_create_opts, Conf0),
+
+ AtlDir = ?config(manager_log_dir, Conf0),
+ ConfDir = ?config(manager_conf_dir, Conf0),
+ DbDir = ?config(manager_db_dir, Conf0),
+ IRB = ?config(irb, Conf0),
ConfigVerbosity = get_opt(manager_config_verbosity, Conf0, trace),
NoteStoreVerbosity = get_opt(manager_note_store_verbosity, Conf0, log),
@@ -5367,27 +5479,29 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
NetIfConf =
case get_opt(manager_net_if_module, Conf0, no_module) of
no_module ->
- [{verbosity, NetIfVerbosity}];
+ [{verbosity, NetIfVerbosity},
+ {options, SCO}];
NetIfModule ->
[{module, NetIfModule},
- {verbosity, NetIfVerbosity}]
+ {verbosity, NetIfVerbosity},
+ {options, SCO}]
end,
- Env = [{versions, Vsns},
- {inform_request_behaviour, IRB},
- {audit_trail_log, [{type, read_write},
- {dir, AtlDir},
- {size, {10240, 10}},
- {repair, true},
- {seqno, AtlSeqNo}]},
- {config, [{dir, ConfDir},
- {db_dir, DbDir},
- {verbosity, ConfigVerbosity}]},
- {note_store, [{verbosity, NoteStoreVerbosity}]},
- {server, [{verbosity, ServerVerbosity},
- {cbproxy, CBP},
- {netif_sup, NIS}]},
- {net_if, NetIfConf}],
+ Env = [{versions, Vsns},
+ {inform_request_behaviour, IRB},
+ {audit_trail_log, [{type, read_write},
+ {dir, AtlDir},
+ {size, {10240, 10}},
+ {repair, true},
+ {seqno, AtlSeqNo}]},
+ {config, [{dir, ConfDir},
+ {db_dir, DbDir},
+ {verbosity, ConfigVerbosity}]},
+ {note_store, [{verbosity, NoteStoreVerbosity}]},
+ {server, [{verbosity, ServerVerbosity},
+ {cbproxy, CBP},
+ {netif_sup, NIS}]},
+ {net_if, NetIfConf}],
?line ok = set_mgr_env(Node, Env),
?line ok = try start_snmp(Node) of
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..bbf53f8f3e 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]) ->
@@ -624,6 +690,17 @@ old_is_ipv6_host(Hostname) ->
init_per_suite(Config) ->
+ iprint("snmp environment: "
+ "~n (snmp) app: ~p"
+ "~n (all) init: ~p"
+ "~n (snmp) init: ~p",
+ [application:get_all_env(snmp),
+ init:get_arguments(),
+ case init:get_argument(snmp) of
+ {ok, Args} -> Args;
+ error -> undefined
+ end]),
+
ct:timetrap(minutes(2)),
try analyze_and_print_host_info() of
@@ -781,6 +858,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]),