File 0510-snmp-agent-Improvements-of-discovery-process.patch of Package erlang

From 90b0f7f4b3b66e5820cc229b86e9a2450f65cdfd Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Wed, 23 Oct 2019 12:39:30 +0200
Subject: [PATCH] [snmp|agent] Improvements of discovery process

A couple of issues with the agent discovery process
(when authoritative engine was snmptrapd) found and
corrected by (Asko Husso).

OTP-16207
---
 lib/snmp/src/agent/snmpa_mpd.erl    |  2 +-
 lib/snmp/src/agent/snmpa_net_if.erl | 25 +++++++++++++++++++++++--
 lib/snmp/src/agent/snmpa_trap.erl   |  3 ++-
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/lib/snmp/src/agent/snmpa_mpd.erl b/lib/snmp/src/agent/snmpa_mpd.erl
index 2ec5dcb5e6..552b9671af 100644
--- a/lib/snmp/src/agent/snmpa_mpd.erl
+++ b/lib/snmp/src/agent/snmpa_mpd.erl
@@ -397,7 +397,7 @@ v3_proc(NoteStore, Packet, LocalEngineID, V3Hdr, Data, Log) ->
                 #note{sec_engine_id = SecEngineID,
                       sec_model     = _MsgSecModel,
                       sec_name      = SecName,
-                      sec_level     = SecLevel,
+                      sec_level     = _SecLevel,   % OTP-16207
                       ctx_engine_id = _CtxEngineID,
                       ctx_name      = _CtxName,
                       disco         = true,
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index 58c01146be..eefe864ac6 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -738,6 +738,26 @@ handle_discovery_response(
 	    %% should be redundant.
 	    NReqs = lists:keydelete(ReqId, 1, Reqs),
 	    S#state{reqs = NReqs};
+
+        %% <OTP-16207>
+        %% For some reason 'snmptrapd' response in stage 2 with request-id
+        %% of zero.
+        false when (ReqId =:= 0) ->
+            DiscoReqs = [X|| {0, From1}     <- S#state.reqs,
+                             {_, From2} = X <- S#state.reqs, From1 =:= From2],
+            case (length(DiscoReqs) =:= 2) of
+                true ->
+                    [{_, Pid}, _] = DiscoReqs,
+                    active_once(Socket),
+                    Pid ! {snmp_discovery_response_received, Pdu,
+                           ManagerEngineId},
+                    NReqs = S#state.reqs -- DiscoReqs,
+                    S#state{reqs = NReqs};
+                false ->
+                    S
+            end;
+        %% </OTP-16207>
+
 	false ->
 	    %% Ouch, timeout? resend?
 	    S
@@ -1013,8 +1033,9 @@ handle_send_discovery(
 		    log(Log, Type, Packet, {Domain, Address}),
 		    udp_send(Socket, {Domain, Address}, Packet),
 		    ?vtrace("handle_send_discovery -> sent (~w)", [ReqId]),
-		    NReqs = snmp_misc:keyreplaceadd(From, 2, Reqs, {ReqId, From}),
-		    S#state{reqs = NReqs}
+		    NReqs  = snmp_misc:keyreplaceadd(From, 2, Reqs, {ReqId, From}),
+                    NReqs2 = (NReqs -- [{0, From}]) ++ [{0, From}], % OTP-16207
+		    S#state{reqs = NReqs2}
 	    end;
 	{discarded, Reason} ->
 	    ?vlog("handle_send_discovery -> "
diff --git a/lib/snmp/src/agent/snmpa_trap.erl b/lib/snmp/src/agent/snmpa_trap.erl
index 119207c76b..62f35cdaf9 100644
--- a/lib/snmp/src/agent/snmpa_trap.erl
+++ b/lib/snmp/src/agent/snmpa_trap.erl
@@ -388,7 +388,8 @@ send_discovery(TargetName, Record, ContextName, Vbs, NetIf) ->
 send_discovery(TargetName, Record, ContextName, Vbs, NetIf, ExtraInfo) ->
     case find_dest(TargetName) of
 	{ok, Dest} ->
-	    send_discovery_pdu(Dest, Record, ContextName, Vbs, NetIf, 
+            Vbs2 = make_varbind_list(Vbs), % OTP-16207
+	    send_discovery_pdu(Dest, Record, ContextName, Vbs2, NetIf, 
 			       ExtraInfo);
 	Error ->
 	    Error
-- 
2.16.4

openSUSE Build Service is sponsored by