diff options
author | Micael Karlberg <bmk@erlang.org> | 2021-09-02 11:26:18 +0200 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2021-09-02 11:26:18 +0200 |
commit | 3aba42c203efa7673c22a0af44347653b74e493e (patch) | |
tree | 6b976ae3523afb5d0f6cd5cc0123b50ca71ab0df | |
parent | 98317a64fe29c227f21a9dc84d6bfee2d7f870ec (diff) | |
parent | 13c94e43ae2c2827d01bbd7b65c32a3a78bf81f8 (diff) | |
download | erlang-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.erl | 35 | ||||
-rw-r--r-- | lib/snmp/doc/src/snmp_app.xml | 18 | ||||
-rw-r--r-- | lib/snmp/doc/src/snmp_config.xml | 16 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_net_if.erl | 205 | ||||
-rw-r--r-- | lib/snmp/src/manager/snmpm_net_if.erl | 139 | ||||
-rw-r--r-- | lib/snmp/src/misc/snmp_misc.erl | 2 | ||||
-rw-r--r-- | lib/snmp/test/snmp_agent_SUITE.erl | 459 | ||||
-rw-r--r-- | lib/snmp/test/snmp_agent_test_lib.erl | 55 | ||||
-rw-r--r-- | lib/snmp/test/snmp_manager_SUITE.erl | 534 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_global_sys_monitor.erl | 6 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_lib.erl | 78 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_lib.hrl | 3 | ||||
-rw-r--r-- | lib/snmp/test/snmp_test_mgr.erl | 2 |
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]), |