summaryrefslogtreecommitdiff
path: root/lib/snmp/src/agent/snmpa_net_if.erl
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2019-10-23 12:39:30 +0200
committerMicael Karlberg <bmk@erlang.org>2019-10-23 12:39:30 +0200
commit90b0f7f4b3b66e5820cc229b86e9a2450f65cdfd (patch)
tree7830a0782af72aeaa4d79da945604effb204cb4a /lib/snmp/src/agent/snmpa_net_if.erl
parent6611181ae71422a1c66798718b37474641a090a9 (diff)
downloaderlang-90b0f7f4b3b66e5820cc229b86e9a2450f65cdfd.tar.gz
[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
Diffstat (limited to 'lib/snmp/src/agent/snmpa_net_if.erl')
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl25
1 files changed, 23 insertions, 2 deletions
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 -> "