查看源代码 snmpa_mpd (snmp v5.18)
SNMP 代理的消息处理和分发模块
模块 snmpa_mpd
实现了 SNMP 代理中与版本无关的消息处理和分发功能。 它应该从网络接口进程中使用 (请参阅 代理网络接口的定义)。
数据类型
有关更多信息,请参阅 snmpa_conf
中的数据类型。
概要
类型
这是 SNMP 消息中使用的消息特定数据。此值在代理(通过网络接口进程)发送的 send_pdu
或 send_pdu_req
消息中接收。
这是 SNMPv1 和 SNMPv2c 消息中使用的消息特定数据。
这是 SNMPv3 消息中使用的消息特定数据。
处理审计跟踪日志记录的 fun
。
这是 SNMP 消息中使用的消息特定数据。此值在代理(通过网络接口进程)发送的 send_pdu
或 send_pdu_req
消息中接收。
这是 SNMP 消息中使用的消息特定数据。在 SNMPv1 和 SNMPv2c 中,此消息数据是团体字符串。
这是 SNMP 消息中使用的消息特定数据。在 SNMPv3 中,它是上下文信息。
类型
-type acm_data() :: acm_data_cmy() | acm_data_v3().
这是 SNMP 消息中使用的消息特定数据。此值在代理(通过网络接口进程)发送的 send_pdu
或 send_pdu_req
消息中接收。
-opaque acm_data_cmy()
这是 SNMPv1 和 SNMPv2c 消息中使用的消息特定数据。
-opaque acm_data_v3()
这是 SNMPv3 消息中使用的消息特定数据。
-type logger() :: fun((Type :: snmp_pdus:pdu_type(), Data :: binary() | {V3Hdr :: snmp_pdus:v3_hdr(), ScopedPDUBytes :: binary()}) -> snmp:void()).
处理审计跟踪日志记录的 fun
。
-opaque mpd_state()
-type msg_data() :: msg_data_cmy() | msg_data_ctx().
这是 SNMP 消息中使用的消息特定数据。此值在代理(通过网络接口进程)发送的 send_pdu
或 send_pdu_req
消息中接收。
-opaque msg_data_cmy()
这是 SNMP 消息中使用的消息特定数据。在 SNMPv1 和 SNMPv2c 中,此消息数据是团体字符串。
-opaque msg_data_ctx()
这是 SNMP 消息中使用的消息特定数据。在 SNMPv3 中,它是上下文信息。
函数
-spec discarded_pdu(Variable) -> snmp:void() when Variable :: snmpa:name() | false.
递增与丢弃的 PDU 关联的变量。当 net_if 进程收到来自代理的 discarded_pdu
消息时,可以使用此函数。
-spec generate_msg(Vsn, NoteStore, Pdu, MsgData, To) -> {ok, PacketsAndAddresses} | {discarded, Reason} when Vsn :: snmp_pdus:version(), NoteStore :: pid(), Pdu :: snmp_pdus:pdu(), MsgData :: msg_data(), To :: [{Domain, Address}], PacketsAndAddresses :: [{Domain, Address, Packet}], Domain :: snmpa_conf:transportDomain(), Address :: snmpa_conf:transportAddress(), Packet :: binary(), Reason :: term().
等效于 generate_msg/6
。
-spec generate_msg(Vsn, NoteStore, Pdu, MsgData, LocalEngineID, To) -> {ok, PacketsAndAddresses} | {discarded, Reason} when Vsn :: snmp_pdus:version(), NoteStore :: pid(), Pdu :: snmp_pdus:pdu(), MsgData :: msg_data(), LocalEngineID :: snmp_framework_mib:engine_id(), To :: [DestAddr], DestAddr :: {Domain, Address} | {{Domain, Address}, SecData}, SecData :: term(), PacketsAndAddresses :: [{Domain, Address, Packet}], Domain :: snmpa_conf:transportDomain(), Address :: snmpa_conf:transportAddress(), Packet :: binary(), Reason :: term().
生成一个可能加密的请求数据包,以发送到网络。
MsgData
是 SNMP 消息中使用的消息特定数据。此值在代理发送的 send_pdu
或 send_pdu_req
消息中接收。在 SNMPv1 和 SNMPv2c 中,此消息数据是团体字符串。在 SNMPv3 中,它是上下文信息。
To
是目标地址及其相应的安全参数的列表。此值在来自代理的同一消息中接收,然后通过 process_taddrs
进行转换,然后再传递给此函数。
注意
请注意,LocalEngineID 参数的使用仅适用于特殊情况,如果代理要“模拟”多个 EngineID!默认情况下,代理使用
SnmpEngineID
的值(请参阅 SNMP-FRAMEWORK-MIB)。
-spec generate_response_msg(Vsn, RePdu, Type, ACMData, Log) -> {ok, Packet} | {discarded, Reason} when Vsn :: snmp_pdus:version(), RePdu :: snmp_pdus:pdu(), Type :: snmp_pdus:pdu_type(), ACMData :: acm_data(), Log :: logger(), Packet :: binary(), Reason :: term().
-spec generate_response_msg(Vsn, RePdu, Type, ACMData, LocalEngineID, Log) -> {ok, Packet} | {discarded, Reason} when Vsn :: snmp_pdus:version(), RePdu :: snmp_pdus:pdu(), Type :: snmp_pdus:pdu_type(), ACMData :: acm_data(), LocalEngineID :: snmp_framework_mib:engine_id(), Log :: logger(), Packet :: binary(), Reason :: term().
生成一个可能加密的响应数据包,以发送到网络。Type
是原始请求的 #pdu.type
。
注意
请注意,LocalEngineID 参数的使用仅适用于特殊情况,如果代理要“模拟”多个 EngineID!默认情况下,代理使用
SnmpEngineID
的值(请参阅 SNMP-FRAMEWORK-MIB)。
-spec init(Vsns) -> MPDState when Vsns :: [snmp:version()], MPDState :: mpd_state().
此函数可以在启动时从 net_if 进程调用。选项列表定义要使用的版本。
它还会初始化一些 SNMP 计数器。
-spec process_packet(Packet, From, State, NoteStore, Log) -> {ok, Vsn, Pdu, PduMS, ACMData} | {discarded, Reason} | {discovery, DiscoPacket} when Packet :: binary(), From :: {TDomain, TAddress}, TDomain :: snmpa_conf:transportDomain(), TAddress :: {IpAddr, IpPort}, IpAddr :: inet:ip_address(), IpPort :: inet:port_number(), State :: mpd_state(), NoteStore :: pid(), Log :: logger(), Vsn :: snmp_pdus:version(), Pdu :: snmp_pdus:pdu(), PduMS :: pos_integer(), ACMData :: acm_data(), Reason :: term(), DiscoPacket :: binary().
等效于 process_packet/6
。
-spec process_packet(Packet, TDomain, TAddress, State, NoteStore, Log) -> {ok, Vsn, Pdu, PduMS, ACMData} | {discarded, Reason} | {discovery, DiscoPacket} when Packet :: binary(), TDomain :: snmpa_conf:transportDomain(), TAddress :: {IpAddr, IpPort}, IpAddr :: inet:ip_address(), IpPort :: inet:port_number(), State :: mpd_state(), NoteStore :: pid(), Log :: logger(), Vsn :: snmp_pdus:version(), Pdu :: snmp_pdus:pdu(), PduMS :: pos_integer(), ACMData :: acm_data(), Reason :: term(), DiscoPacket :: binary(); (Packet, From, LocalEngineID, State, NoteStore, Log) -> {ok, Vsn, Pdu, PduMS, ACMData} | {discarded, Reason} | {discovery, DiscoPacket} when Packet :: binary(), From :: {TDomain, TAddress}, TDomain :: snmpa_conf:transportDomain(), TAddress :: {IpAddr, IpPort}, IpAddr :: inet:ip_address(), IpPort :: inet:port_number(), LocalEngineID :: snmp_framework_mib:engine_id(), State :: mpd_state(), NoteStore :: pid(), Log :: logger(), Vsn :: snmp_pdus:version(), Pdu :: snmp_pdus:pdu(), PduMS :: pos_integer(), ACMData :: acm_data(), Reason :: term(), DiscoPacket :: binary().
处理传入的数据包。根据需要执行身份验证和解密。返回值应传递给代理。
注意
请注意,LocalEngineID 参数的使用仅适用于特殊情况,如果代理要“模拟”多个 EngineID!默认情况下,代理使用
SnmpEngineID
的值(请参阅 SNMP-FRAMEWORK-MIB)。
-spec process_taddrs(InDests) -> OutDests when InDests :: [InDest], InDest :: {{InDomain, InAddress}, SecData} | {InDomain, InAddress}, InDomain :: term(), InAddress :: term(), SecData :: term(), OutDests :: [OutDest], OutDest :: {{OutDomain, OutAddress}, SecData} | {OutDomain, OutAddress}, OutDomain :: snmpa_conf:transportDomain(), OutAddress :: snmpa_conf:transportAddress().
将地址从内部 MIB 格式转换为对 代理网络接口更有用的格式。
另请参阅 generate_msg
。