我正在将SNMP EtherLike MIB变量添加到我们现有的SNMP C ++代码库中,这是第一次。
我面临的困难是理解MIB变量的数据类型并将其映射到C ++数据类型-例如 dot3StatsIndex ,MIB变量的语法是 InterfaceIndex ,那是什么? C ++中等效的数据类型。
由于我是第一次实施,或者正处于学习阶段-请让我知道ASN.1数据类型有哪些不同以及上面是否列出了所有类型以及如何将它们映射到C ++数据类型?
还如何从RFC导出MIB变量的数据类型?
答案 0 :(得分:1)
我认为,如果仅遵循类型继承链,那么最终将获得基本的SNMP类型,该类型应映射到您拥有的类型。
对于InterfaceIndex
,查看从哪个MIB导入(IF-MIB
):
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, OBJECT-IDENTITY,
Integer32, Counter32, Counter64, mib-2, transmission
FROM SNMPv2-SMI
MODULE-COMPLIANCE, OBJECT-GROUP
FROM SNMPv2-CONF
TruthValue
FROM SNMPv2-TC
ifIndex, InterfaceIndex
FROM IF-MIB;
然后找到其定义,该定义应引用基本类型(Integer32
可能映射到ASN1_INT
)。
InterfaceIndex ::= TEXTUAL-CONVENTION
DISPLAY-HINT "d"
STATUS current
DESCRIPTION
"A unique value, greater than zero, for each interface or ...
network management system to the next re-initialization."
SYNTAX Integer32 (1..2147483647)
答案 1 :(得分:1)
在我的C ++ SNMP代理中,我编写了类似以下内容的代码(不幸的是,实际的源代码不再对我可用,并且我确定还有很多选择,但是您明白了):
using varbind_val_t = std::variant<
// ASN.1 INTEGER, SMIv2 Integer32
int32_t,
// ASN.1 OCTET STRING
std::string,
// ASN.1 OBJECT IDENTIFIER
oid_t,
// RFC4001 InetAddressType (TextualConvention)
IpAddress::Type, // enum saying IPv4 or IPv6
// RFC4001 InetAddress (TextualConvention)
IpAddress, // can be an IPv4 or IPv6 address
// SMIv2 IpAddress
ipv4_t,
// ASN.1 MacAddress (TextualConvention)
mac_address_t,
// SMIv2 Counter32/Gauge32/TimeTicks/Unsigned32
uint32_t,
// SMIv2 Counter64
uint64_t
>;
在构建或接收PDU时,此变体的相关访问者将从上面给出的C ++类型的值对给定值的线路表示进行编码或解码。有时这是一个非常薄的包装器(一个整数就是一个整数!),有时它需要更多的工作(oid_t需要展开)。这是非常快速和灵活的。关键是映射完全取决于您-尝试选择具有相同可能值范围的类型,否则可能会丢失信息。但是,没有C ++类型到ASN.1或SMIv2类型的“ the”映射。
像InterfaceIndex
这样的文本约定并不是真正的类型,而是SNMP管理器有关如何表示某些字段的线索。对于上面列表中未包括在内的特殊情况,我只是使用了实际的基础类型,在这种情况下,正如Ilya所说的,Integer32
。您可以阅读MIB来跟踪这些内容的真正含义(或使用类似iReasoning的管理器,它可以很好地告诉您)。
您应参考相关规范以确定需要支持的类型: