Skip to content

Commit

Permalink
[agent] Did not handle transport domains properly in some cases,
Browse files Browse the repository at this point in the history
for instance trap sending.

OTP-9400
  • Loading branch information
bmk committed Jul 8, 2011
1 parent 32fc16e commit 0ad3801
Showing 1 changed file with 60 additions and 35 deletions.
95 changes: 60 additions & 35 deletions lib/snmp/src/agent/snmpa_mpd.erl
Original file line number Diff line number Diff line change
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

0 comments on commit 0ad3801

Please sign in to comment.