File 3479-snmp-agent-Cleanup.patch of Package erlang

From 87b14e4fde5c0cf10a15d4e30f44477bdf87c56c Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Tue, 29 Sep 2020 19:03:54 +0200
Subject: [PATCH 09/21] [snmp|agent] Cleanup

Commented out all 'ephemeral code'. Also updated and
modified comments accordingly.

OTP-16649
---
 lib/snmp/src/agent/snmpa_net_if.erl | 523 ++++++++++++++--------------
 lib/snmp/src/agent/snmpa_trap.erl   |  12 +-
 lib/snmp/src/misc/snmp_conf.erl     |  57 +--
 3 files changed, 291 insertions(+), 301 deletions(-)

diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index c50ba285af..63884f94aa 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -38,37 +38,52 @@
 
 
 %% Regarding Trap/Notification transport(s),
-%% it should be possible to specify either:
+%% it *should* be possible to specify either:
 %% 1) A fixed set of transport(s) used for sending.
 %%    For instance, one for IPv4 and one for IPv6.
-%% 2) A pool of fixed transports used for sending.
-%%    The transports are cycled through when sending traps.
-%% 3) A single one-shot ephemeral port.
+%% 2) A single one-shot ephemeral port.
 %%    That is, a port is created, used once, and then closed.
-%% 4) A pool of ephemeral ports, used for "a time"
+%% 3) A pool of ephemeral ports, used for "a time"
 %%    (a configurable number of sends, a set number of bytes
 %%     or time based) thar is cycled through.
+%% Though, we do *not* currently implement ephemeral sockets,
+%% so case 2 and 3 are not possible at the moment.
 
-%% Should we have a single list of all transports, and
-%% some way to indicate the kind of transport?
-%% A new field, kind = req_responder | trap_sender, in the transport record?
-%% Or two separate lists in the state?
-
-%% Also, the trap/notification transport, has different needs.
-%% It should not be allowed to configure both an 'all' transport
-%% and one or more specialized transports (req_responder and/or trap_sender).
-%% We will send more data then we will receive.
-%% Therefor, we should be able to specify; 
+%% Also, the request-reponder and trap-sender transport(s),
+%% has different needs.
+%% The trap-sender transport will send more data then it will receive.
+%% Therefor, we should be able to specify;
 %% bind_to, no_reuse_address, recbuf and sndbuf individually:
 %% {intAgentTransports,
-%%  [{transportDomainUdpIpv4, {141,213,11,24},   trap, Opts},
-%%   {transportDomainUdpIpv6, {0,0,0,0,0,0,0,1}, trap, Opts}]}.
-%% Opts is basically socket options for this transport, *but*
+%%  [{transportDomainUdpIpv4, {{141,213,11,24},   PortInfo},
+%%    req_responder, Opts},
+%%   {transportDomainUdpIpv4, {{141,213,11,24},   PortInfo},
+%%    trap_sender,   Opts},
+%%   {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, Portinfo},
+%%    req_responder, Opts},
+%%   {transportDomainUdpIpv6, {{0,0,0,0,0,0,0,1}, Portinfo},
+%%    trap_sender,   Opts}]}.
+%% Opts is basically "socket options" for this transport (the same
+%% options as for net-if).
+%% Also, always give the option to provide a port range:
+%%    Port     :: pos_integer() | system | range() || ranges()
+%%                system => Let the system choose
+%%                (0 is unfortunately already used as 'default',
+%%                 so we can't use that for 'system').
+%%    range()  :: {Min :: pos_integer(), Max :: pos_integer()} when Min < Max
+%%    ranges() :: [pos_integer() | range()]
+%%                Examples:
+%%                      [{2000, 2004}]
+%%                      [2000, 2001, 2002, 2003, 2004]
+%%                      [2000, 2001, {2002, 2004}]
+%%                      [{5000, 5100}, {6000, 6100}]
+
+%% <EPHEMERAL-FOR-FUTUR-USE>
+%% , *but*
 %% may also contain the tuple, {ephemeral, EphmOpts}.
 %% Ephm sockets are created on the fly, used for the specified
 %% time (number of sends, number of bytes sent, used time, ...).
-%% Also, always give the option to provide a port range:
-%%    port() :: pos_integer() | range() || [range()]
+%% </EPHEMERAL-FOR-FUTUR-USE>
 
 -record(state,
 	{parent,
@@ -83,7 +98,11 @@
 	 filter}).
 
 -type transport_kind() :: req_responder | trap_sender.
--type port_info() :: pos_integer() | system | {pos_integer(), pos_integer()}.
+-type port_info() :: non_neg_integer() |
+                     system |
+                     {pos_integer(), pos_integer()}.
+
+%% <EPHEMERAL-FOR-FUTUR-USE>
 %% How would 'ephemeral' effect this?
 %% What kind of usage would we have for emphemeral ports?
 %%    once (send and maybe receive reply (inform)) |
@@ -94,25 +113,29 @@
 %% The port_info() is used when creating a port, even an ephemeral port.
 %% But it must either be 'system' or a range in that (ephemeral) case.
 %% Also, ephemeral transports are only allowed if kind = trap_sender
--type ephemeral() :: none |
-                     once |
-                     {sends,      pos_integer()} |
-                     {data,       pos_integer()} |
-                     {alive_time, pos_integer()}.
+%% -type ephemeral() :: none |
+%%                      once |
+%%                      {sends,      pos_integer()} |
+%%                      {data,       pos_integer()} |
+%%                      {alive_time, pos_integer()}.
 
 %% Note that since informs require confirmation,
 %% an ephemeral socket cannot be removed immediately
 %% when it has been "used up".
 %% We need to keep it for some time to receive responces
 %% and in case a resend is needed!.
+%% </EPHEMERAL-FOR-FUTUR-USE>
+
 -record(transport,
 	{socket,
          kind      = all :: all | transport_kind(),
 	 domain    = snmpUDPDomain,
          port_no   :: pos_integer(),
          port_info :: port_info(),
-         ephm      = none :: ephemeral(),
+         %% <EPHEMERAL-FOR-FUTUR-USE>
+         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
         }).
@@ -249,6 +272,7 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
              %% Any socket option not explicitly configured for the transport
              %% 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, PortInfo, SocketOpts} = socket_opts(Domain, Address,
                                                         RawSocketOpts, Opts),
              ?vtrace("socket opts processed:"
@@ -376,23 +400,30 @@ format_address(Address) ->
 
 
 socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
+    ?vdebug("socket_open(~p) -> entry with"
+            "~n   Port: ~p"
+            "~n   Opts: ~p", [Domain, IpPort, Opts]),
     case init:get_argument(snmp_fd) of
 	{ok, [[FdStr]]} ->
-	    Fd = list_to_integer(FdStr),
-	    ?vdebug("socket_open(~p, ~p): "
+	    FD = list_to_integer(FdStr),
+	    ?vdebug("socket_open(~p) -> open with fd - "
+                    "(old) snmp_fd command line argument provided: "
+                    "~n   FD:   ~p"
                     "~n   Port: ~p"
-                    "~n   Opts: ~p", [Domain, Fd, IpPort, Opts]),
-	    gen_udp_open(0, [{fd, Fd} | Opts]);
+                    "~n   Opts: ~p", [Domain, FD, IpPort, Opts]),
+	    gen_udp_open(0, [{fd, FD} | Opts]);
 	error ->
 	    case init:get_argument(snmpa_fd) of
 		{ok, [[FdStr]]} ->
-		    Fd = list_to_integer(FdStr),
-		    ?vdebug("socket_open(~p, ~p): "
+		    FD = list_to_integer(FdStr),
+                    ?vdebug("socket_open(~p) -> open with fd - "
+                            "snmpa_fd command line argument provided: "
+                            "~n   FD:   ~p"
                             "~n   Port: ~p"
-                            "~n   Opts: ~p", [Domain, Fd, IpPort, Opts]),
-		    gen_udp_open(0, [{fd, Fd} | Opts]);
+                            "~n   Opts: ~p", [Domain, FD, IpPort, Opts]),
+		    gen_udp_open(0, [{fd, FD} | Opts]);
 		error ->
-		    ?vdebug("socket_open(~p): "
+		    ?vdebug("socket_open(~p) -> plain open"
                             "~n   Port: ~p"
                             "~n   Opts: ~p", [Domain, IpPort, Opts]),
 		    gen_udp_open(IpPort, Opts)
@@ -429,6 +460,7 @@ gen_udp_open(system, Opts) ->
 	{error, OReason} ->
             throw({udp_open, {open, OReason}})
     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"),
     case gen_udp:open(IpPort, Opts) of
@@ -455,9 +487,13 @@ gen_udp_open(IpPort, Opts) when is_integer(IpPort) ->
 	{error, Reason} ->
 	    throw({udp_open, {open, IpPort, Reason}})
     end;
+%% A range is "pointless" if we allow reuseaddr...
+%% ...but we leave that to the user...
 gen_udp_open({Min, Max}, Opts) ->
     ?vtrace("gen_udp_open(~w,~w) -> entry", [Min, Max]),
     gen_udp_range_open(Min, Max, Opts);
+%% A range is "pointless" if we allow reuseaddr...
+%% ...but we leave that to the user...
 gen_udp_open(Ranges, Opts) when is_list(Ranges) ->
     gen_udp_ranges_open(Ranges, Opts).
 
@@ -512,10 +548,6 @@ gen_udp_ranges_open([{Min, Max}|Ranges], Opts) ->
     end.
 
 
-%% Are we ever expected to receive on the ntransports?
-%% If not, we can set active = false, and therefor
-%% all incoming messages will arrive on the transports.
-
 loop(#state{transports = Transports,
             limit      = Limit,
             parent     = Parent} = S) ->
@@ -1103,26 +1135,13 @@ handle_reply_pdu(
 
 
 
-%% maybe_handle_send_pdu(#state{transports  = T,
-%%                              ntransports = []} = S,
-%%                       Vsn, Pdu, MsgData, TDomAddrSecs, From) ->
-%%     maybe_handle_send_pdu2(S, T,
-%%                            Vsn, Pdu, MsgData, TDomAddrSecs, From);
-%% maybe_handle_send_pdu(#state{ntransports = T} = S,
-%%                       Vsn, Pdu, MsgData, TDomAddrSecs, From) ->
-%%     maybe_handle_send_pdu2(S, T,
-%%                            Vsn, Pdu, MsgData, TDomAddrSecs, From).
-
-%% maybe_handle_send_pdu2(#state{filter = FilterMod} = S,
-%%                        Transports,
-%%                        Vsn, Pdu, MsgData, TDomAddrSecs, From) ->
 maybe_handle_send_pdu(#state{filter     = FilterMod,
                              transports = Transports} = S,
                        Vsn, Pdu, MsgData, TDomAddrSecs, From) ->
     
-    ?vtrace("maybe_handle_send_pdu -> entry with~n"
-	    "   FilterMod:    ~p~n"
-	    "   TDomAddrSecs: ~p", [FilterMod, TDomAddrSecs]),
+    ?vtrace("maybe_handle_send_pdu -> entry with"
+	    "~n   FilterMod:    ~p"
+	    "~n   TDomAddrSecs: ~p", [FilterMod, TDomAddrSecs]),
 
     DomAddrSecs = snmpa_mpd:process_taddrs(TDomAddrSecs),
     AddressesToFilter =
@@ -1273,17 +1292,6 @@ do_handle_send_pdu(S, Type, Pdu, Addresses) ->
 	      [Sz, Reason, Pdu])
     end.
 
-%% do_handle_send_pdu1(S, Type, Addresses) ->
-%%     lists:foreach(
-%%       fun ({Domain, Address, Pkg}) when is_binary(Pkg) ->
-%% 	      do_handle_send_pdu2(S, Type, Domain, Address,
-%%                                   Pkg, Pkg, "");
-%% 	  ({Domain, Address, {Pkg, LogPkg}}) when is_binary(Pkg) ->
-%% 	      do_handle_send_pdu2(S, Type, Domain, Address,
-%%                                   Pkg, LogPkg, " encrypted")
-%%       end,
-%%       Addresses).
-
 %% Because of the ephemeral sockets used by some transports,
 %% the list of transports may be update for each send...
 do_handle_send_pdu1(S, _Type, []) ->
@@ -1317,19 +1325,24 @@ do_handle_send_pdu2(#state{transports = Transports} = S,
             ?vtrace("do_handle_send_pdu2 -> transport(ephm = none) selected: "
                     "~n      ~p", [Transport]),
 	    maybe_udp_send_w_log(S, Transport, To, Pkg, LogPkg, Type),
-            S;
-	#transport{} = Transport ->
-            ?vtrace("do_handle_send_pdu2 -> transport selected: "
-                    "~n      ~p", [Transport]),
-	    case maybe_udp_send_w_log(S, Transport, To, Pkg, LogPkg, Type) of
-                {ok, Sz} -> % we actually sent something
-                   maybe_update_ephm_transport(S, Transport, Type, Sz);
-                _ -> % Non-fatal error -> Nothing sent
-                    S
-            end
+            S%;
+
+            %% <EPHEMERAL-FOR-FUTUR-USE>
+            %% #transport{} = Transport ->
+            %% ?vtrace("do_handle_send_pdu2 -> transport selected: "
+            %%         "~n      ~p", [Transport]),
+	    %% case maybe_udp_send_w_log(S, Transport, To, Pkg, LogPkg, Type) of
+            %%     {ok, Sz} -> % we actually sent something
+            %%        maybe_update_ephm_transport(S, Transport, Type, Sz);
+            %%     _ -> % Non-fatal error -> Nothing sent
+            %%         S
+            %% end
+            %% </EPHEMERAL-FOR-FUTUR-USE>
     end.
 
 
+%% <EPHEMERAL-FOR-FUTUR-USE>
+
 %% For inform:
 %% This will have a reply, so we cannot close it directly!
 %% Also, we will resend (a couple of times), if we don't
@@ -1349,155 +1362,157 @@ do_handle_send_pdu2(#state{transports = Transports} = S,
 %% use of so many sockets.
 %%
 
-maybe_update_ephm_transport(S, #transport{ephm = once} = _Transport,
-                            'inform-request' = _Type, _Sz) ->
-    S; % Figure out the above first!
-
-%% Before we close the current socket, create the new.
-%% This is done in case we fail to create a new socket
-%% (if we first close the current and then fail to create
-%%  the new, we are stuck).
-%% If we fail to create the new socket, we keep the current.
-%% Better then nothing!
-maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
-                                          ephm      = once,
-                                          port_info = PortInfo,
-                                          opts      = Opts} = Transport,
-                            _Type, _Sz) ->
-    try
-        begin
-            {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
-            (catch gen_udp:close(OldSocket)),
-            T2 = Transport#transport{socket  = Socket,
-                                     port_no = PortNo},
-            TS  = S#state.transports,
-            TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
-            S#state{transports = TS2}
-        end
-    catch
-        _:_:_ ->
-            %% We need to identify which transport!
-            error_msg("Failed creating new ephemeral socket for transport"),
-            S
-    end;
-
-%% Note that we do not currently handle inform:s, as that adds a whole
-%% set of issues. See above for more info.
-maybe_update_ephm_transport(S, #transport{socket    = Socket,
-                                          ephm      = {sends, MaxSends},
-                                          ephm_info = NumSends,
-                                          port_info = _PortInfo,
-                                          opts      = _Opts} = Transport,
-                            _Type, _Sz) when (MaxSends > NumSends) ->
-    T2  = Transport#transport{ephm_info = NumSends + 1},
-    TS  = S#state.transports,
-    TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
-    S#state{transports = TS2};
-maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
-                                          ephm      = {sends, _MaxSends},
-                                          ephm_info = _NumSends,
-                                          port_info = PortInfo,
-                                          opts      = Opts} = Transport,
-                            _Type, _Sz) ->
-    try
-        begin
-            {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
-            (catch gen_udp:close(OldSocket)),
-            T2 = Transport#transport{socket    = Socket,
-                                     ephm_info = 0,
-                                     port_no   = PortNo},
-            TS  = S#state.transports,
-            TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
-            S#state{transports = TS2}
-        end
-    catch
-        _:_:_ ->
-            %% We need to identify which transport!
-            error_msg("Failed creating new ephemeral socket for transport"),
-            S
-    end;
-
-%% Note that we do not currently handle inform:s, as that adds a whole
-%% set of issues. See above for more info.
-maybe_update_ephm_transport(S, #transport{socket    = Socket,
-                                          ephm      = {data, MaxData},
-                                          ephm_info = AccSent,
-                                          port_info = _PortInfo,
-                                          opts      = _Opts} = Transport,
-                            _Type, Sz) when (MaxData > (AccSent + Sz)) ->
-    T2 = Transport#transport{ephm_info = AccSent + Sz},
-    TS  = S#state.transports,
-    TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
-    S#state{transports = TS2};
-maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
-                                          ephm      = {data, _MaxData},
-                                          ephm_info = _AccSent,
-                                          port_info = PortInfo,
-                                          opts      = Opts} = Transport,
-                            _Type, _Sz) ->
-    try
-        begin
-            {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
-            (catch gen_udp:close(OldSocket)),
-            T2 = Transport#transport{socket    = Socket,
-                                     ephm_info = 0,
-                                     port_no   = PortNo},
-            TS  = S#state.transports,
-            TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
-            S#state{transports = TS2}
-        end
-    catch
-        _:_:_ ->
-            %% We need to identify which transport!
-            error_msg("Failed creating new ephemeral socket for transport"),
-            S
-    end;
-
-%% Note that we do not currently handle inform:s, as that adds a whole
-%% set of issues. See above for more info.
-maybe_update_ephm_transport(S, #transport{socket    = Socket,
-                                          ephm      = {alive_time, AliveTime},
-                                          ephm_info = undefined} = Transport,
-                            _Type, _Sz) ->
-    AliveEnd = erlang:monotonic_time(micro_seconds) + AliveTime,
-    T2 = Transport#transport{ephm_info = AliveEnd},
-    TS  = S#state.transports,
-    TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
-    S#state{transports = TS2};
-maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
-                                          ephm      = {alive_time, _AliveTime},
-                                          ephm_info = AliveEnd,
-                                          port_info = PortInfo,
-                                          opts      = Opts} = Transport,
-                            _Type, _Sz) ->
-    TS = erlang:monotonic_time(micro_seconds),
-    if
-        (TS > AliveEnd) ->
-            try
-                begin
-                    {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
-                    (catch gen_udp:close(OldSocket)),
-                    T2 = Transport#transport{socket    = Socket,
-                                             %% This will be set when the transport
-                                             %% is first used
-                                             ephm_info = undefined,
-                                             port_no   = PortNo},
-                    TS  = S#state.transports,
-                    TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
-                    S#state{transports = TS2}
-                end
-            catch
-                _:_:_ ->
-                    %% We need to identify which transport!
-                    error_msg("Failed creating new ephemeral socket for transport"),
-                    S
-            end;
-        true ->
-            S
-    end;
-
-maybe_update_ephm_transport(S, _Transport, _Type, _Sz) ->
-    S.
+%% maybe_update_ephm_transport(S, #transport{ephm = once} = _Transport,
+%%                             'inform-request' = _Type, _Sz) ->
+%%     S; % Figure out the above first!
+
+%% %% Before we close the current socket, create the new.
+%% %% This is done in case we fail to create a new socket
+%% %% (if we first close the current and then fail to create
+%% %%  the new, we are stuck).
+%% %% If we fail to create the new socket, we keep the current.
+%% %% Better then nothing!
+%% maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
+%%                                           ephm      = once,
+%%                                           port_info = PortInfo,
+%%                                           opts      = Opts} = Transport,
+%%                             _Type, _Sz) ->
+%%     try
+%%         begin
+%%             {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
+%%             (catch gen_udp:close(OldSocket)),
+%%             T2 = Transport#transport{socket  = Socket,
+%%                                      port_no = PortNo},
+%%             TS  = S#state.transports,
+%%             TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
+%%             S#state{transports = TS2}
+%%         end
+%%     catch
+%%         _:_:_ ->
+%%             %% We need to identify which transport!
+%%             error_msg("Failed creating new ephemeral socket for transport"),
+%%             S
+%%     end;
+
+%% %% Note that we do not currently handle inform:s, as that adds a whole
+%% %% set of issues. See above for more info.
+%% maybe_update_ephm_transport(S, #transport{socket    = Socket,
+%%                                           ephm      = {sends, MaxSends},
+%%                                           ephm_info = NumSends,
+%%                                           port_info = _PortInfo,
+%%                                           opts      = _Opts} = Transport,
+%%                             _Type, _Sz) when (MaxSends > NumSends) ->
+%%     T2  = Transport#transport{ephm_info = NumSends + 1},
+%%     TS  = S#state.transports,
+%%     TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
+%%     S#state{transports = TS2};
+%% maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
+%%                                           ephm      = {sends, _MaxSends},
+%%                                           ephm_info = _NumSends,
+%%                                           port_info = PortInfo,
+%%                                           opts      = Opts} = Transport,
+%%                             _Type, _Sz) ->
+%%     try
+%%         begin
+%%             {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
+%%             (catch gen_udp:close(OldSocket)),
+%%             T2 = Transport#transport{socket    = Socket,
+%%                                      ephm_info = 0,
+%%                                      port_no   = PortNo},
+%%             TS  = S#state.transports,
+%%             TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
+%%             S#state{transports = TS2}
+%%         end
+%%     catch
+%%         _:_:_ ->
+%%             %% We need to identify which transport!
+%%             error_msg("Failed creating new ephemeral socket for transport"),
+%%             S
+%%     end;
+
+%% %% Note that we do not currently handle inform:s, as that adds a whole
+%% %% set of issues. See above for more info.
+%% maybe_update_ephm_transport(S, #transport{socket    = Socket,
+%%                                           ephm      = {data, MaxData},
+%%                                           ephm_info = AccSent,
+%%                                           port_info = _PortInfo,
+%%                                           opts      = _Opts} = Transport,
+%%                             _Type, Sz) when (MaxData > (AccSent + Sz)) ->
+%%     T2 = Transport#transport{ephm_info = AccSent + Sz},
+%%     TS  = S#state.transports,
+%%     TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
+%%     S#state{transports = TS2};
+%% maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
+%%                                           ephm      = {data, _MaxData},
+%%                                           ephm_info = _AccSent,
+%%                                           port_info = PortInfo,
+%%                                           opts      = Opts} = Transport,
+%%                             _Type, _Sz) ->
+%%     try
+%%         begin
+%%             {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
+%%             (catch gen_udp:close(OldSocket)),
+%%             T2 = Transport#transport{socket    = Socket,
+%%                                      ephm_info = 0,
+%%                                      port_no   = PortNo},
+%%             TS  = S#state.transports,
+%%             TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
+%%             S#state{transports = TS2}
+%%         end
+%%     catch
+%%         _:_:_ ->
+%%             %% We need to identify which transport!
+%%             error_msg("Failed creating new ephemeral socket for transport"),
+%%             S
+%%     end;
+
+%% %% Note that we do not currently handle inform:s, as that adds a whole
+%% %% set of issues. See above for more info.
+%% maybe_update_ephm_transport(S, #transport{socket    = Socket,
+%%                                           ephm      = {alive_time, AliveTime},
+%%                                           ephm_info = undefined} = Transport,
+%%                             _Type, _Sz) ->
+%%     AliveEnd = erlang:monotonic_time(micro_seconds) + AliveTime,
+%%     T2 = Transport#transport{ephm_info = AliveEnd},
+%%     TS  = S#state.transports,
+%%     TS2 = lists:keyreplace(Socket, #transport.socket, TS, T2),
+%%     S#state{transports = TS2};
+%% maybe_update_ephm_transport(S, #transport{socket    = OldSocket,
+%%                                           ephm      = {alive_time, _AliveTime},
+%%                                           ephm_info = AliveEnd,
+%%                                           port_info = PortInfo,
+%%                                           opts      = Opts} = Transport,
+%%                             _Type, _Sz) ->
+%%     TS = erlang:monotonic_time(micro_seconds),
+%%     if
+%%         (TS > AliveEnd) ->
+%%             try
+%%                 begin
+%%                     {Socket, PortNo} = gen_udp_open(PortInfo, Opts),
+%%                     (catch gen_udp:close(OldSocket)),
+%%                     T2 = Transport#transport{socket    = Socket,
+%%                                              %% This will be set when the transport
+%%                                              %% is first used
+%%                                              ephm_info = undefined,
+%%                                              port_no   = PortNo},
+%%                     TS  = S#state.transports,
+%%                     TS2 = lists:keyreplace(OldSocket, #transport.socket, TS, T2),
+%%                     S#state{transports = TS2}
+%%                 end
+%%             catch
+%%                 _:_:_ ->
+%%                     %% We need to identify which transport!
+%%                     error_msg("Failed creating new ephemeral socket for transport"),
+%%                     S
+%%             end;
+%%         true ->
+%%             S
+%%     end;
+
+%% maybe_update_ephm_transport(S, _Transport, _Type, _Sz) ->
+%%     S.
+
+%% </EPHEMERAL-FOR-FUTUR-USE>
 
 
 %% This function is used when logging has already been done!
@@ -1562,30 +1577,6 @@ maybe_udp_send_w_log(
 	    udp_send(Socket, To, Pkg)
     end.
 
-%% udp_send(Socket, To, B) ->
-%%     {IpAddr, IpPort} =
-%% 	case To of
-%% 	    {Domain, Addr} when is_atom(Domain) ->
-%% 		Addr;
-%% 	    {_, P} = Addr when is_integer(P) ->
-%% 		Addr
-%% 	end,
-%%     try gen_udp:send(Socket, IpAddr, IpPort, B) of
-%% 	{error, emsgsize} ->
-%% 	    %% From this message we cannot recover, so exit sending loop
-%% 	    throw({emsgsize, sz(B)});
-%% 	{error, ErrorReason} ->
-%% 	    error_msg("[error] cannot send message "
-%% 		      "(destination: ~p:~p, size: ~p, reason: ~p)",
-%% 		      [IpAddr, IpPort, sz(B), ErrorReason]);
-%% 	ok ->
-%% 	    ok
-%%     catch
-%% 	error:ExitReason:StackTrace ->
-%% 	    error_msg("[exit] cannot send message "
-%% 		      "(destination: ~p:~p, size: ~p, reason: ~p, at: ~p)",
-%% 		      [IpAddr, IpPort, sz(B), ExitReason, StackTrace])
-%%     end.
 
 udp_send(Socket, To, B) ->
     {IpAddr, IpPort} =
@@ -1605,6 +1596,7 @@ udp_send(Socket, To, B) ->
 		      [IpAddr, IpPort, sz(B), ErrorReason]),
             ok;
 	ok ->
+            %% For future use! Ephemeral ports!
 	    {ok, size(B)}
     catch
 	error:ExitReason:StackTrace ->
@@ -1745,19 +1737,6 @@ select_transport2(Domain, Type, [_|Transports]) ->
 
 
 
-%% select_transport_from_domain(Domain, Transports) when is_atom(Domain) ->
-%%     Pos = #transport.domain,
-%%     case lists:keyfind(Domain, Pos, Transports) of
-%% 	#transport{domain = Domain} = Transport ->
-%% 	    Transport;
-%% 	false when Domain == snmpUDPDomain ->
-%% 	    lists:keyfind(transportDomainUdpIpv4, Pos, Transports);
-%% 	false when Domain == transportDomainUdpIpv4 ->
-%% 	    lists:keyfind(snmpUDPDomain, Pos, Transports);
-%% 	false ->
-%% 	    false
-%%     end.
-
 address_to_domain({Domain, _Addr}) when is_atom(Domain) ->
     Domain;
 address_to_domain({_Ip, Port}) when is_integer(Port) ->
@@ -2001,8 +1980,11 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
                           "~n   ~p", [BadESO]),
                 []
         end,
-    Ephm = get_ephemeral(SocketOpts),
-    {Ephm, PortInfo, Opts}.
+    %% <EPHEMERAL-FOR-FUTUR-USE>
+    %% Ephm = get_ephemeral(SocketOpts),
+    %% {Ephm, PortInfo, Opts}.
+    %% </EPHEMERAL-FOR-FUTUR-USE>
+    {none, PortInfo, Opts}.
 
 
 %% ----------------------------------------------------------------
@@ -2059,11 +2041,14 @@ get_no_reuse_address(Opts, DefaultOpts) ->
 get_extra_sock_opts(Opts, DefaultOpts) ->
     get_socket_opt(extra_sock_opts, Opts, DefaultOpts, []).
 
+%% <EPHEMERAL-FOR-FUTUR-USE>
 %% This is not realy a socket option, but rather socket 'meta'
 %% information. Its still put together with the actual socket
 %% options.
-get_ephemeral(SocketOpts) ->
-    snmp_misc:get_option(ephemeral, SocketOpts, none).
+%% get_ephemeral(SocketOpts) ->
+%%     snmp_misc:get_option(ephemeral, SocketOpts, none).
+%% </EPHEMERAL-FOR-FUTUR-USE>
+
 
 get_socket_opt(Opt, Opts, DefaultOpts, DefaultVal) ->
     snmp_misc:get_option(Opt, Opts,
@@ -2073,8 +2058,8 @@ get_socket_opt(Opt, Opts, DefaultOpts, DefaultVal) ->
 
 %% ----------------------------------------------------------------
 
-error_msg(F) ->
-    error_msg(F, []).
+%% error_msg(F) ->
+%%     error_msg(F, []).
 
 error_msg(F, A) -> 
     ?snmpa_error("NET-IF server: " ++ F, A).
diff --git a/lib/snmp/src/agent/snmpa_trap.erl b/lib/snmp/src/agent/snmpa_trap.erl
index c15b19945f..865d507adb 100644
--- a/lib/snmp/src/agent/snmpa_trap.erl
+++ b/lib/snmp/src/agent/snmpa_trap.erl
@@ -920,9 +920,9 @@ send_v1_trap(
     do_send_v1_trap(Enter, Spec, V1Res, NVbs, ExtraInfo, NetIf, SysUpTime).
 
 do_send_v1_trap(Enter, Spec, V1Res, NVbs, ExtraInfo, NetIf, SysUpTime) ->
-    ?vtrace("try get transports"),
+    ?vtrace("do_send_v1_trap -> try get transports"),
     {value, Transports} = snmp_framework_mib:intAgentTransports(get),
-    ?vtrace("transports: "
+    ?vtrace("do_send_v1_trap -> transports: "
             "~n      ~p", [Transports]),
     {_Domain, {AgentIp, _AgentPort}, _Kind, _Opts} =
 	case lists:keyfind(snmpUDPDomain, 1, Transports) of
@@ -930,7 +930,7 @@ do_send_v1_trap(Enter, Spec, V1Res, NVbs, ExtraInfo, NetIf, SysUpTime) ->
 		case lists:keyfind(transportDomainUdpIpv4, 1, Transports) of
 		    false ->
 			?vlog(
-			   "snmpa_trap: cannot send v1 trap "
+			   "do_send_v1_trap -> cannot send v1 trap "
 			   "without IPv4 domain: ~p",
 			   [Transports]),
 			user_err(
@@ -938,13 +938,13 @@ do_send_v1_trap(Enter, Spec, V1Res, NVbs, ExtraInfo, NetIf, SysUpTime) ->
 			   "without IPv4 domain: ~p",
 			   [Transports]);
 		    DomainAddr ->
-                        ?vtrace("found ~w transport:"
+                        ?vtrace("do_send_v1_trap -> found ~w transport:"
                                 "~n      ~p",
                                 [transportDomainUdpIpv4, DomainAddr]),
 			DomainAddr
 		end;
 	    DomainAddr ->
-                ?vtrace("found ~w transport:"
+                ?vtrace("do_send_v1_trap -> found ~w transport:"
                         "~n      ~p",
                         [snmpUDPDomain, DomainAddr]),
 		DomainAddr
@@ -953,7 +953,7 @@ do_send_v1_trap(Enter, Spec, V1Res, NVbs, ExtraInfo, NetIf, SysUpTime) ->
     AddrCommunities = mk_addr_communities(V1Res),
     lists:foreach(
       fun ({Community, Addrs}) ->
-	      ?vtrace("send v1 trap to ~p",[Addrs]),
+	      ?vtrace("do_send_v1_trap -> send v1 trap to ~p",[Addrs]),
 	      NetIf ! {send_pdu, 'version-1', TrapPdu,
 		       {community, Community}, Addrs, ExtraInfo}
       end, AddrCommunities).
diff --git a/lib/snmp/src/misc/snmp_conf.erl b/lib/snmp/src/misc/snmp_conf.erl
index 7fb4992f01..4e11742515 100644
--- a/lib/snmp/src/misc/snmp_conf.erl
+++ b/lib/snmp/src/misc/snmp_conf.erl
@@ -826,23 +826,24 @@ check_transport_kind(BadKind) ->
 
 %% ---------
 
-%% Vad skall vi acceptera? These are our own, but shall we also 
-%% allow plain socket options to pass?
-%%    {bind_to,   bind_to()}  |
-%%    {sndbuf,    sndbuf()}   |
-%%    {recbuf,    recbuf()}   |
-%%    {no_reuse,  no_reuse()} |
-%%    {ephemeral, ephemeral()} |
-%%    {extra,     list()}
+%% The options we accept are the same as for net-if!
+%%    {bind_to,         bind_to()}  |
+%%    {sndbuf,          sndbuf()}   |
+%%    {recbuf,          recbuf()}   |
+%%    {no_reuse,        no_reuse()} |
+%%    {extra_sock_opts, list()}
 %% bind_to()  :: boolean()
 %% sndbuf()   :: pos_integer()
 %% rcvbuf()   :: pos_integer()
 %% no_reuse() :: boolean()
+%% <EPHEMERAL-FOR-FUTUR-USE>
+%%    {ephemeral, ephemeral()} |
 %% ephemeral() :: none |
 %%                once |
 %%                {data, pos_integer()}  |
 %%                {sends, pos_integer()} |
 %%                {alive_time, pos_integer()}
+%% </EPHEMERAL-FOR-FUTUR-USE>
 
 check_transport_opts(Opts) when is_list(Opts) ->
     check_transport_opts(Opts, [], []);
@@ -863,30 +864,34 @@ check_transport_opts([{recbuf, BufSz} = Opt|Opts], Extra, Acc)
 check_transport_opts([{no_reuse, NoReuse} = Opt|Opts], Extra, Acc)
   when is_boolean(NoReuse) ->
     check_transport_opts(Opts, Extra, [Opt|Acc]);
-check_transport_opts([{ephemeral, Ephm} = Opt|Opts], Extra, Acc) ->
-    check_transport_opt_ophm(Ephm),
-    check_transport_opts(Opts, Extra, [Opt|Acc]);
+%% <EPHEMERAL-FOR-FUTUR-USE>
+%% check_transport_opts([{ephemeral, Ephm} = Opt|Opts], Extra, Acc) ->
+%%     check_transport_opt_ophm(Ephm),
+%%     check_transport_opts(Opts, Extra, [Opt|Acc]);
+%% </EPHEMERAL-FOR-FUTUR-USE>
 check_transport_opts([{extra_sock_opts, Extra1} = Opt|Opts], Extra2, Acc)
   when is_list(Extra1) andalso (Extra2 =:= []) ->
     check_transport_opts(Opts, Extra1, [Opt|Acc]);
 check_transport_opts([H|_], _Extra, _Acc) ->
     error({bad_transport_opts, H}).
 
-check_transport_opt_ophm(none) ->
-    ok;
-check_transport_opt_ophm(once) ->
-    ok;
-check_transport_opt_ophm({data, DataSz})
-  when is_integer(DataSz) andalso (DataSz > 0) ->
-    ok;
-check_transport_opt_ophm({sends, Sends})
-  when is_integer(Sends) andalso (Sends > 0) ->
-    ok;
-check_transport_opt_ophm({alive_time, T})
-  when is_integer(T) andalso (T > 0) ->
-    ok;
-check_transport_opt_ophm(BadEphm) ->
-    error({bad_transport_opts, {ephemeral, BadEphm}}).
+%% <EPHEMERAL-FOR-FUTUR-USE>
+%% check_transport_opt_ophm(none) ->
+%%     ok;
+%% check_transport_opt_ophm(once) ->
+%%     ok;
+%% check_transport_opt_ophm({data, DataSz})
+%%   when is_integer(DataSz) andalso (DataSz > 0) ->
+%%     ok;
+%% check_transport_opt_ophm({sends, Sends})
+%%   when is_integer(Sends) andalso (Sends > 0) ->
+%%     ok;
+%% check_transport_opt_ophm({alive_time, T})
+%%   when is_integer(T) andalso (T > 0) ->
+%%     ok;
+%% check_transport_opt_ophm(BadEphm) ->
+%%     error({bad_transport_opts, {ephemeral, BadEphm}}).
+%% </EPHEMERAL-FOR-FUTUR-USE>
 
 
 %% ---------
-- 
2.26.2

openSUSE Build Service is sponsored by