Skip to content

Commit

Permalink
Merge branch 'bmk/snmp/agent/wrong_default_transport_domain/OTP-9425'…
Browse files Browse the repository at this point in the history
… into maint-r14

* bmk/snmp/agent/wrong_default_transport_domain/OTP-9425:
  [agent] Did not handle transport domains properly in some cases, for instance trap sending. OTP-9400
  [agent] Wrong default transport domain, snmpUDPDomain, instead of transportDomainUdpIpv4.
  [agent] Did not handle transport domains properly in some cases, for instance trap sending.
  • Loading branch information
Erlang/OTP committed Jul 12, 2011
2 parents d328f45 + 8c4b1a7 commit 9e2b8f8
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 38 deletions.
51 changes: 51 additions & 0 deletions lib/snmp/doc/src/notes.xml
Expand Up @@ -32,6 +32,57 @@
<file>notes.xml</file>
</header>

<section>
<title>SNMP Development Toolkit 4.20.1</title>
<p>Version 4.20.1 supports code replacement in runtime from/to
version 4.20, 4.19 and 4.18.</p>

<section>
<title>Improvements and new features</title>
<p>-</p>
<!--
<list type="bulleted">
<item>
<p>Added type specs for functions that do not return. </p>
<p>Kostis Sagonas</p>
<p>Own Id: OTP-9208</p>
</item>
</list>
-->
</section>

<section>
<title>Fixed Bugs and Malfunctions</title>
<!--
<p>-</p>
-->

<list type="bulleted">
<item>
<p>[agent] Did not handle transport domains properly in some cases,
for instance trap sending. </p>
<p>Own Id: OTP-9400</p>
</item>

<item>
<p>[agent] Wrong default transport domain, snmpUDPDomain, instead
of transportDomainUdpIpv4. </p>
<p>Own Id: OTP-9425</p>
<p>Aux Id: Seq 11874</p>
</item>

</list>
</section>


<section>
<title>Incompatibilities</title>
<p>-</p>
</section>

</section> <!-- 4.20.1 -->


<section>
<title>SNMP Development Toolkit 4.20</title>
<p>Version 4.20 supports code replacement in runtime from/to
Expand Down
5 changes: 3 additions & 2 deletions lib/snmp/src/agent/snmp_target_mib.erl
Expand Up @@ -53,7 +53,7 @@
%%-----------------------------------------------------------------

default_domain() ->
snmpUDPDomain.
transportDomainUdpIpv4.


%%-----------------------------------------------------------------
Expand Down Expand Up @@ -436,7 +436,8 @@ is_valid_tag(TDomain, TAddress, Tag, Key) ->

%% TargAddrs =
%% [{TagList, TargetAddr, TargetAddrName, TargetParams, Timeout, Retry}]
%% TargetAddr = {TDomain, TAddr}; e.g. {?snmpUDPDomain, IpAndUdpPortAsList}
%% TargetAddr = {TDomain, TAddr}; e.g.
%% {?transportDomainUdpIpv4, IpAndUdpPortAsList}
get_target_addrs() ->
get_target_addrs([], db(snmpTargetAddrTable), []).

Expand Down
95 changes: 60 additions & 35 deletions lib/snmp/src/agent/snmpa_mpd.erl
Expand Up @@ -32,6 +32,7 @@
-include("SNMP-MPD-MIB.hrl").
-include("SNMPv2-TM.hrl").
-include("SNMP-FRAMEWORK-MIB.hrl").
-include("TRANSPORT-ADDRESS-MIB.hrl").

-define(VMODULE,"MPD").
-include("snmp_verbosity.hrl").
Expand Down Expand Up @@ -981,12 +982,15 @@ generate_discovery_msg2(NoteStore, Pdu,
discovery_note_timeout(Timeout) ->
(Timeout div 100) + 1.

generate_discovery_msg(NoteStore, {?snmpUDPDomain, [A,B,C,D,U1,U2]},
generate_discovery_msg(NoteStore, {TDomain, TAddress},
Pdu, ScopedPduBytes,
ContextEngineID, ManagerEngineID,
SecModel, SecName, SecLevelFlag,
InitialUserName,
ContextName, Timeout) ->

{ok, {_Domain, Address}} = transform_taddr(TDomain, TAddress),

%% 7.1.7
?vdebug("generate_discovery_msg -> 7.1.7 (~w)", [ManagerEngineID]),
MsgID = generate_msg_id(),
Expand Down Expand Up @@ -1027,7 +1031,7 @@ generate_discovery_msg(NoteStore, {?snmpUDPDomain, [A,B,C,D,U1,U2]},
%% Log(Packet),
inc_snmp_out_vars(Pdu),
?vdebug("generate_discovery_msg -> done", []),
{Packet, {{A,B,C,D}, U1 bsl 8 + U2}};
{Packet, Address};

Error ->
throw(Error)
Expand Down Expand Up @@ -1057,6 +1061,29 @@ generate_sec_discovery_msg(Message, SecModule,
end.


transform_taddr(?snmpUDPDomain, TAddress) ->
transform_taddr(?transportDomainUdpIpv4, TAddress);
transform_taddr(?transportDomainUdpIpv4, [A, B, C, D, P1, P2]) ->
Domain = transportDomainUdpIpv4,
Addr = {A,B,C,D},
Port = P1 bsl 8 + P2,
Address = {Addr, Port},
{ok, {Domain, Address}};
transform_taddr(?transportDomainUdpIpv4, BadAddr) ->
{error, {bad_transportDomainUdpIpv4_address, BadAddr}};
transform_taddr(?transportDomainUdpIpv6,
[A1, A2, A3, A4, A5, A6, A7, A8, P1, P2]) ->
Domain = transportDomainUdpIpv6,
Addr = {A1, A2, A3, A4, A5, A6, A7, A8},
Port = P1 bsl 8 + P2,
Address = {Addr, Port},
{ok, {Domain, Address}};
transform_taddr(?transportDomainUdpIpv6, BadAddr) ->
{error, {bad_transportDomainUdpIpv6_address, BadAddr}};
transform_taddr(BadTDomain, BadTAddress) ->
{error, {bad_domain, BadTDomain, BadTAddress}}.


process_taddrs(Dests) ->
?vtrace("process_taddrs -> entry with"
"~n Dests: ~p", [Dests]),
Expand All @@ -1068,42 +1095,40 @@ process_taddrs([], Acc) ->
lists:reverse(Acc);

%% v3
process_taddrs([{{?snmpUDPDomain, [A,B,C,D,U1,U2]}, SecData} | T], Acc) ->
process_taddrs([{{TDomain, TAddress}, SecData} | T], Acc) ->
?vtrace("process_taddrs -> entry when v3 with"
"~n A: ~p"
"~n B: ~p"
"~n C: ~p"
"~n D: ~p"
"~n U1: ~p"
"~n U2: ~p"
"~n SecData: ~p", [A, B, C, D, U1, U2, SecData]),
Entry = {{snmpUDPDomain, {{A,B,C,D}, U1 bsl 8 + U2}}, SecData},
process_taddrs(T, [Entry | Acc]);
%% Bad v3
process_taddrs([{{TDomain, TAddr}, _SecData} | T], Acc) ->
?vtrace("process_taddrs -> entry when bad v3 with"
"~n TDomain: ~p"
"~n TAddr: ~p", [TDomain, TAddr]),
user_err("Bad TDomain/TAddr: ~w/~w", [TDomain, TAddr]),
process_taddrs(T, Acc);
"~n TDomain: ~p"
"~n TAddress: ~p"
"~n SecData: ~p", [TDomain, TAddress, SecData]),
case transform_taddr(TDomain, TAddress) of
{ok, DestAddr} ->
?vtrace("process_taddrs -> transformed: "
"~n DestAddr: ~p", [DestAddr]),
Entry = {DestAddr, SecData},
process_taddrs(T, [Entry | Acc]);
{error, Reason} ->
?vinfo("Failed transforming v3 domain and address"
"~n Reason: ~p", [Reason]),
user_err("Bad TDomain/TAddress: ~w/~w", [TDomain, TAddress]),
process_taddrs(T, Acc)
end;
%% v1 & v2
process_taddrs([{?snmpUDPDomain, [A,B,C,D,U1,U2]} | T], Acc) ->
process_taddrs([{TDomain, TAddress} | T], Acc) ->
?vtrace("process_taddrs -> entry when v1/v2 with"
"~n A: ~p"
"~n B: ~p"
"~n C: ~p"
"~n D: ~p"
"~n U1: ~p"
"~n U2: ~p", [A, B, C, D, U1, U2]),
Entry = {snmpUDPDomain, {{A,B,C,D}, U1 bsl 8 + U2}},
process_taddrs(T, [Entry | Acc]);
%% Bad v1 or v2
process_taddrs([{TDomain, TAddr} | T], Acc) ->
?vtrace("process_taddrs -> entry when bad v1/v2 with"
"~n TDomain: ~p"
"~n TAddr: ~p", [TDomain, TAddr]),
user_err("Bad TDomain/TAddr: ~w/~w", [TDomain, TAddr]),
process_taddrs(T, Acc);
"~n TDomain: ~p"
"~n TAddress: ~p", [TDomain, TAddress]),
case transform_taddr(TDomain, TAddress) of
{ok, DestAddr} ->
?vtrace("process_taddrs -> transformed: "
"~n DestAddr: ~p", [DestAddr]),
Entry = DestAddr,
process_taddrs(T, [Entry | Acc]);
{error, Reason} ->
?vinfo("Failed transforming v1/v2 domain and address: "
"~n Reason: ~p", [Reason]),
user_err("Bad TDomain/TAddress: ~w/~w", [TDomain, TAddress]),
process_taddrs(T, Acc)
end;
process_taddrs(Crap, Acc) ->
throw({error, {taddrs_crap, Crap, Acc}}).

Expand Down
12 changes: 12 additions & 0 deletions lib/snmp/src/app/snmp.appup.src
Expand Up @@ -22,6 +22,12 @@
%% ----- U p g r a d e -------------------------------------------------------

[
{"4.20",
[
{load_module, snmp_target_mib, soft_purge, soft_purge, []},
{load_module, snmpa_mpd, soft_purge, soft_purge, []}
]
},
{"4.19",
[
{load_module, snmpa, soft_purge, soft_purge, []},
Expand Down Expand Up @@ -109,6 +115,12 @@
%% ------D o w n g r a d e ---------------------------------------------------

[
{"4.20",
[
{load_module, snmp_target_mib, soft_purge, soft_purge, []},
{load_module, snmpa_mpd, soft_purge, soft_purge, []}
]
},
{"4.19",
[
{load_module, snmpa, soft_purge, soft_purge, []},
Expand Down
2 changes: 1 addition & 1 deletion lib/snmp/vsn.mk
Expand Up @@ -17,6 +17,6 @@
#
# %CopyrightEnd%

SNMP_VSN = 4.20
SNMP_VSN = 4.20.1
PRE_VSN =
APP_VSN = "snmp-$(SNMP_VSN)$(PRE_VSN)"

0 comments on commit 9e2b8f8

Please sign in to comment.