查看源代码 Agent Net if 的定义
网络接口 (Net If) 进程将 SNMP PDU 传递给主代理,并从主代理接收 SNMP PDU。Net if 进程最常见的行为是从网络接收字节,将其解码为 SNMP PDU,然后发送给主代理。当主代理处理完 PDU 后,它会向 Net if 进程发送响应 PDU,该进程将 PDU 编码为字节并将字节传输到网络上。
然而,这种简单的行为可以通过多种方式进行修改。例如,Net if 进程可以在字节上应用某种加密/解密方案,或者充当代理过滤器,将一些数据包发送到代理代理,而将一些数据包发送到主代理。
也可以编写您自己的 Net if 进程。默认的 Net if 进程在模块 snmpa_net_if
中实现,它使用 UDP 作为传输协议,即传输域 transportDomainUdpIpv4
和/或 transportDomainUdpIpv6
。
本节介绍如何编写 Net if 进程。
强制性函数
Net if 进程必须实现 SNMP 代理网络接口行为。
消息
消息部分描述了 Net If 必须发送和能够接收的强制性消息。
在本节中,Address
字段是一个 {Domain, Addr}
元组,其中 Domain
是 transportDomainUdpIpv4
或 transportDomainUdpIpv4
,并且 Addr
是一个 {
IpAddr
,IpPort}
元组。
传出消息
当 Net if 从网络接收到发送给 MasterAgent 的 SNMP PDU 时,必须发送以下消息
MasterAgent ! {snmp_pdu, Vsn, Pdu, PduMS, ACMData, From, Extra}
Vsn
是'version-1'
、'version-2'
或'version-3'
。Pdu
是 SNMP PDU 记录,如snmp_types.hrl
中定义的那样,包含 SNMP 请求。PduMS
是允许的响应 PDU 的最大大小。通常,这是从snmpa_mpd:process_packet
返回的(请参阅参考手册)。ACMData
是正在使用的访问控制模块使用的数据。通常,这是从snmpa_mpd:process_packet
返回的(请参阅参考手册)。From
是源Address
。Extra
是 Net if 进程希望发送给代理的任何项。可以通过调用snmp:current_net_if_data()
来检索此项。当代理生成对请求的响应时,此数据也会发送回 Net if 进程。
以下消息用于报告已收到对请求的响应。代理可以发送的唯一请求是 Inform-Request。
Pid ! {snmp_response_received, Vsn, Pdu, From}
Pid
是等待请求响应的进程。Pid 在send_pdu_req
消息中指定(见下文)。Vsn
是'version-1'
、'version-2'
或'version-3'
。Pdu
是接收到的 SNMP PduFrom
是源Address
。
传入消息
本节介绍 Net if 进程必须能够接收的传入消息。
{snmp_response, Vsn, Pdu, Type, ACMData, To, Extra}
此消息从主代理发送到 Net if 进程,作为对先前接收到的请求的响应。
Vsn
是'version-1'
、'version-2'
或'version-3'
。Pdu
是一个 SNMP PDU 记录(如 snmp_types.hrl 中定义的那样),包含 SNMP 响应。Type
是原始请求的#pdu.type
。ACMData
是正在使用的访问控制模块使用的数据。通常,这只是发送到snmpa_mpd:generate_response_message
(请参阅参考手册)。To
是目标Address
,来自先前发送给 MasterAgent 的相应snmp_pdu
消息中的From
字段。Extra
是 Net if 进程在请求发送给代理时发送给代理的项。
{discarded_pdu, Vsn, ReqId, ACMData, Variable, Extra}
如果主代理由于某种原因决定丢弃 pdu,则会发送此消息。
Vsn
是'version-1'
、'version-2'
或'version-3'
。ReqId
是原始请求的请求 ID。ACMData
是正在使用的访问控制模块使用的数据。通常,这只是发送到snmpa_mpd:generate_response_message
(请参阅参考手册)。Variable
是表示错误的 snmp 计数器的名称,例如snmpInBadCommunityUses
。Extra
是 Net if 进程在请求发送给代理时发送给代理的项。
{send_pdu, Vsn, Pdu, MsgData, To, Extra}
当要发送 trap 时,此消息从主代理发送。
Vsn
是'version-1'
、'version-2'
或'version-3'
。Pdu
是一个 SNMP PDU 记录(如 snmp_types.hrl 中定义的那样),包含 SNMP 响应。MsgData
是 SNMP 消息中使用的特定于消息的数据。此值通常发送到snmpa_mpd:generate_msg/5
。在 SNMPv1 和 SNMPv2c 中,此消息数据是团体字符串。在 SNMPv3 中,它是上下文信息。To
是{Address, SecData}
元组的列表,即目标地址及其相应的安全参数。此值通常发送到snmpa_mpd:generate_msg/5
。Extra
是通知发送者希望在发送通知时传递给 Net if 进程的任何项(有关更多信息,请参阅send notification
)。
{send_pdu_req, Vsn, Pdu, MsgData, To, Pid, Extra}
当要发送请求时,此消息从主代理发送。代理可以发送的唯一请求是 Inform-Request。net if 进程需要记住请求 ID 和 Pid,并且当接收到对请求 ID 的响应时,使用
snmp_response_received
消息将其发送到 Pid。Vsn
是'version-1'
、'version-2'
或'version-3'
。Pdu
是一个 SNMP PDU 记录(如 snmp_types.hrl 中定义的那样),包含 SNMP 响应。MsgData
是 SNMP 消息中使用的特定于消息的数据。此值通常发送到snmpa_mpd:generate_msg/5
。在 SNMPv1 和 SNMPv2c 中,此消息数据是团体字符串。在 SNMPv3 中,它是上下文信息。To
是{Address, SecData}
元组的列表,即目标地址及其相应的安全参数。此值通常发送到snmpa_mpd:generate_msg/5
。Pid
是进程标识符。Extra
是通知发送者希望在发送通知时传递给 Net if 进程的任何项(有关更多信息,请参阅send notification
)。
注意
由于 Net if 进程负责 SNMP 消息的编码和解码,它还必须更新 MIB-II 中 SNMP 组的相关计数器。它可以为此目的使用模块 snmpa_mpd
中的函数(有关详细信息,请参阅参考手册,snmp
部分,模块snmpa_mpd)。
模块 snmp_pdus
中还有一些有用的函数用于 SNMP 消息的编码和解码。