2
%% <year>1996-2008</year>
3
%% <holder>Ericsson AB, All Rights Reserved</holder>
4
%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
6
6
%% The contents of this file are subject to the Erlang Public License,
7
7
%% Version 1.1, (the "License"); you may not use this file except in
8
8
%% compliance with the License. You should have received a copy of the
9
9
%% Erlang Public License along with this software. If not, it can be
10
10
%% retrieved online at http://www.erlang.org/.
12
12
%% Software distributed under the License is distributed on an "AS IS"
13
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
14
%% the License for the specific language governing rights and limitations
15
15
%% under the License.
17
%% The Initial Developer of the Original Code is Ericsson AB.
20
19
-module(snmpa_trap).
22
21
%%%-----------------------------------------------------------------
23
%%% This module takes care of all trap handling.
22
%%% This module takes care of all trap(notification handling.
24
23
%%%-----------------------------------------------------------------
25
24
%% External exports
26
-export([construct_trap/2, try_initialise_vars/2, send_trap/6]).
25
-export([construct_trap/2,
26
try_initialise_vars/2, send_trap/6]).
27
-export([send_discovery/5]).
28
29
%% Internal exports
29
30
-export([init_v2_inform/9, init_v3_inform/9, send_inform/6]).
31
-export([init_discovery_inform/12, send_discovery_inform/5]).
31
33
-include("snmp_types.hrl").
32
34
-include("SNMPv2-MIB.hrl").
33
35
-include("SNMPv2-TM.hrl").
36
-include("SNMPv2-TC.hrl").
34
37
-include("SNMP-FRAMEWORK-MIB.hrl").
38
-include("SNMP-TARGET-MIB.hrl").
35
39
-define(enterpriseSpecific, 6).
122
126
user_err("construct_trap got undef Trap: ~w" , [Trap]),
125
{value, TRec} when is_record(TRec, trap) ->
129
{value, #trap{oidobjects = ListOfVars} = TRec} ->
126
130
?vdebug("construct_trap -> trap"
127
131
"~n ~p", [TRec]),
128
ListOfVars = TRec#trap.oidobjects,
129
OidVbs = [alias_to_oid(Vb) || Vb <- Varbinds],
130
LV = initiate_vars(ListOfVars, OidVbs),
132
OidVbs = [alias_to_oid(Vb) || Vb <- Varbinds],
133
LV = initiate_vars(ListOfVars, OidVbs),
131
134
InitiatedVars = try_initialise_vars(get(mibserver), LV),
132
135
{ok, TRec, InitiatedVars};
134
{value, NRec} when is_record(NRec, notification) ->
137
{value, #notification{oidobjects = ListOfVars} = NRec} ->
135
138
?vdebug("construct_trap -> notification"
136
139
"~n ~p", [NRec]),
137
ListOfVars = NRec#notification.oidobjects,
138
OidVbs = [alias_to_oid(Vb) || Vb <- Varbinds],
139
LV = initiate_vars(ListOfVars, OidVbs),
140
OidVbs = [alias_to_oid(Vb) || Vb <- Varbinds],
141
LV = initiate_vars(ListOfVars, OidVbs),
140
142
InitiatedVars = try_initialise_vars(get(mibserver), LV),
141
143
{ok, NRec, InitiatedVars}
442
find_dest(TargetName) ->
443
AddrCols = [?snmpTargetAddrTDomain,
444
?snmpTargetAddrTAddress,
445
?snmpTargetAddrTimeout,
446
?snmpTargetAddrRetryCount,
447
?snmpTargetAddrParams,
448
?snmpTargetAddrRowStatus],
449
case snmp_target_mib:snmpTargetAddrTable(get, TargetName, AddrCols) of
455
{value, ?'RowStatus_active'}] ->
456
?vtrace("find_dest -> found snmpTargetAddrTable info:"
462
[TDomain, TAddress, Timeout, RetryCount, Params]),
463
ParmCols = [?snmpTargetParamsMPModel,
464
?snmpTargetParamsSecurityModel,
465
?snmpTargetParamsSecurityName,
466
?snmpTargetParamsSecurityLevel,
467
?snmpTargetParamsRowStatus],
468
case snmp_target_mib:snmpTargetParamsTable(get, Params, ParmCols) of
473
{value, ?'RowStatus_active'}] ->
474
?vtrace("find_dest -> found snmpTargetParamsTable info:"
478
[SecModel, SecName, SecLevel]),
479
DestAddr = {TDomain, TAddress},
480
TargetParams = {SecModel, SecName, SecLevel},
481
Val = {DestAddr, TargetName, TargetParams, Timeout, RetryCount},
487
{value, RowStatus}] ->
488
{error, {invalid_RowStatus, RowStatus, snmpTargetParamsTable}};
493
{value, ?'RowStatus_active'}] ->
494
{error, {invalid_MpModel, MpModel, snmpTargetParamsTable}};
499
{value, RowStatus}] ->
500
{error, {invalid_RowStatus, RowStatus, snmpTargetParamsTable}};
502
?vlog("find_dest -> "
503
"could not find snmpTargetParamsTable info: "
504
"~n Bad: ~p", [Bad]),
505
{error, {not_found, snmpTargetParamsTable}}
511
{value, _RetryCount},
513
{value, RowStatus}] ->
514
{error, {invalid_RowStatus, RowStatus, snmpTargetAddrTable}};
516
{error, {not_found, snmpTargetAddrTable}}
520
send_discovery_pdu({Dest, TargetName, {SecModel, SecName, SecLevel},
522
Record, ContextName, Vbs, NetIf) ->
523
?vdebug("send_discovery_pdu -> entry with "
524
"~n Destination address: ~p"
532
"~n ContextName: ~p",
533
[Dest, TargetName, SecModel, SecName, SecLevel,
534
Timeout, Retry, Record, ContextName]),
535
case snmpa_vacm:get_mib_view(notify, SecModel, SecName, SecLevel,
538
case check_all_varbinds(Record, Vbs, MibView) of
540
SysUpTime = snmp_standard_mib:sys_up_time(),
541
send_discovery_pdu(Record, Dest, Vbs,
542
SecModel, SecName, SecLevel,
543
TargetName, ContextName,
547
{error, {mibview_validation_failed, Vbs, MibView}}
549
{discarded, Reason} ->
550
{error, {failed_get_mibview, Reason}}
553
send_discovery_pdu(Record, Dest, Vbs,
554
SecModel, SecName, SecLevel, TargetName,
555
ContextName, Timeout, Retry, SysUpTime, NetIf) ->
556
{_Oid, IVbs} = mk_v2_trap(Record, Vbs, SysUpTime), % v2 refers to SMIv2;
557
Sender = proc_lib:spawn_link(?MODULE, init_discovery_inform,
560
SecModel, SecName, SecLevel, TargetName,
565
{ok, Sender, SecLevel}.
567
init_discovery_inform(Parent,
569
SecModel, SecName, SecLevel, TargetName,
570
ContextName, Timeout, Retry, Vbs, NetIf, Verbosity) ->
571
put(verbosity, Verbosity),
573
Pdu = make_discovery_pdu(Vbs),
574
ContextEngineId = snmp_framework_mib:get_engine_id(),
575
SecLevelFlag = mk_flag(SecLevel),
576
SecData = {SecModel, SecName, SecLevelFlag, TargetName},
577
MsgData = {SecData, ContextEngineId, ContextName},
578
%% NoteTimeout = note_timeout(Timeout, Retry),
579
%% Msg = {send_discovery, Pdu, MsgData, NoteTimeout, Dest, self()},
580
Msg = {send_discovery, Pdu, MsgData, Dest, self()},
581
?MODULE:send_discovery_inform(Parent, Timeout*10, Retry, Msg, NetIf).
583
%% note_timeout(Timeout, Retry)
584
%% when ((is_integer(Timeout) andalso (Timeout > 0)) andalso
585
%% (is_integer(Retry) andalso (Retry > 0)))
586
%% note_timeout(Timeout*10, Retry, 0);
587
%% note_timeout(Timeout, Retry)
588
%% when (is_integer(Timeout) andalso (Timeout > 0)) ->
591
%% note_timeout(_Timeout, -1, NoteTimeout) ->
593
%% note_timeout(Timeout, Retry, NoteTimeout) when ->
594
%% note_timeout(Timeout*2, Retry-1, NoteTimeout+Timeout).
596
send_discovery_inform(Parent, _Timeout, -1, _Msg, _NetIf) ->
597
Parent ! {discovery_response, {error, timeout}};
598
send_discovery_inform(Parent, Timeout, Retry, Msg, NetIf) ->
601
{snmp_discovery_response_received, Pdu, undefined} ->
602
?vtrace("received stage 2 discovery response: "
603
"~n Pdu: ~p", [Pdu]),
604
Parent ! {discovery_response, {ok, Pdu}};
605
{snmp_discovery_response_received, Pdu, ManagerEngineId} ->
606
?vtrace("received stage 1 discovery response: "
608
"~n ManagerEngineId: ~p", [Pdu, ManagerEngineId]),
609
Parent ! {discovery_response, {ok, Pdu, ManagerEngineId}}
612
?MODULE:send_discovery_inform(Parent,
613
Timeout*2, Retry-1, Msg, NetIf)
423
617
%%-----------------------------------------------------------------
424
618
%% NOTE: This function is executed in the master agent's context
425
619
%% For each target, check if it has access to the objects in the