如何在SNMP通知中复用表格行SEQUENCE?现有实现是否合规?
为SNMP表格单行数据添加通知的实现方案
需求背景
我需要给一个包含表格数据的SNMP MIB新增一条通知,用来传递表格中单行的完整数据。下面以NET-SNMP-EXAMPLES-MIB中的netSnmpHostsTable作为示例场景:
netSnmpHostsTable OBJECT-TYPE SYNTAX SEQUENCE OF NetSnmpHostsEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "An example table that implements a wrapper around the /etc/hosts file on a machine using the iterator helper API." ::= { netSnmpExampleTables 2 } netSnmpHostsEntry OBJECT-TYPE SYNTAX NetSnmpHostsEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "A host name mapped to an ip address" INDEX { netSnmpHostName } ::= { netSnmpHostsTable 1 } NetSnmpHostsEntry ::= SEQUENCE { netSnmpHostName OCTET STRING, netSnmpHostAddressType InetAddressType, netSnmpHostAddress InetAddress, netSnmpHostStorage StorageType, netSnmpHostRowStatus RowStatus } --- Definitions of objects in the sequence omitted
理想状态是新增一条通知,直接传递单个NetSnmpHostsEntry的完整数据。
尝试过程与问题分析
首次尝试
直接在通知中引用行对象:
netSnmpHostsEntryNotification NOTIFICATION-TYPE OBJECTS { netSnmpHostsEntry } STATUS current DESCRIPTION "First crack at the notification." ::= { netSnmpExampleNotificationPrefix 2 }
运行smilint检查时出现以下错误:
object `netSnmpHostsEntry' of notification `netSnmpHostsEntryNotification' must be a scalar or column object `netSnmpHostsEntry' of notification `netSnmpHostsEntryNotification' must not be `not-accessible'
原因很明确:SNMP通知绑定的对象必须是标量或列对象,而代表表格行的netSnmpHostsEntry既不属于这两类,且其访问权限为not-accessible,不符合通知的要求。
第二次尝试
尝试定义一个新的只读对象,复用行的SEQUENCE类型:
netSnmpHostWithEvent OBJECT-TYPE SYNTAX NetSnmpHostsEntry MAX-ACCESS read-only STATUS current DESCRIPTION "Host associated with the notification" ::= { netSnmpExampleNotificationPrefix 3 } netSnmpHostsEntryNotification NOTIFICATION-TYPE OBJECTS { netSnmpHostWithEvent } STATUS current DESCRIPTION "Second crack at the notification." ::= { netSnmpExampleNotificationPrefix 2 }
检查工具返回错误:
type `NetSnmpHostsEntry' of node `netSnmpHostWithEvent' does not resolve to a known base type
这个错误合理:NetSnmpHostsEntry是绑定到表格行的SEQUENCE类型,无法脱离表格上下文单独作为对象类型使用。
第三次尝试(可行方案)
直接在通知中列出该行的所有列对象:
netSnmpHostsEntryNotification NOTIFICATION-TYPE OBJECTS { netSnmpHostName, netSnmpHostAddressType, netSnmpHostAddress, netSnmpHostStorage, netSnmpHostRowStatus } STATUS current DESCRIPTION "Third crack at the notification." ::= { netSnmpExampleNotificationPrefix 2 }
这次检查工具没有报错,该实现可以正常使用。
疑问解答
1. 是否有办法在通知中复用SEQUENCE?
目前SNMP的MIB规范(SMIv2)不支持直接在通知中复用表格行的SEQUENCE类型。因为表格行的SEQUENCE是专门为表格结构设计的,属于表格行类型,不能作为独立的标量对象类型使用。
如果想要减少重复定义,可以考虑:
- 将行的单个属性定义为TEXTUAL-CONVENTION(仅适用于单一类型,无法覆盖整个SEQUENCE)
- 单独定义一个与表格行SEQUENCE结构完全一致的、专用于通知的SEQUENCE,但本质上还是重复定义,无法直接复用表格的SEQUENCE。
2. 最终实现的通知是否存在未被检查工具发现的问题?
你的最终实现符合SMIv2规范,没有隐藏问题,但需要注意以下几点:
- 确保所有列对象的
MAX-ACCESS权限允许被包含在通知中(比如你提到的netSnmpHostName需要改为read-create或read-only,原权限not-accessible不符合要求) - 通知中列对象的顺序不影响功能,但建议和表格行SEQUENCE的顺序保持一致,方便接收方解析
- 接收方需要同步MIB定义,确保能识别所有包含的列对象
内容的提问来源于stack exchange,提问作者Matt K
相关产品推荐
相关产品推荐

