【问题标题】:Mapping SNMP ASN.1 to C++ Datatypes将 SNMP ASN.1 映射到 C++ 数据类型
【发布时间】:2018-09-20 13:34:25
【问题描述】:

我正在将 SNMP EtherLike MIB 变量添加到我们现有的 SNMP C++ 代码库中,并且是第一次这样做。

我面临的困难是理解 MIB 变量的数据类型并将其映射到 C++ 数据类型 - 例如 dot3StatsIndex MIB 变量语法是 InterfaceIndex 那么它是什么C++ 中的等效数据类型。

由于我是第一次实现,或者更确切地说是处于学习阶段 - 请让我知道有哪些不同的 ASN.1 数据类型以及这些类型是否都在上面列出以及它们如何映射到 C++ 数据类型?

还有如何从 RFC 导出 MIB 变量的数据类型?

【问题讨论】:

    标签: snmp net-snmp pysnmp snmp4j


    【解决方案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 这样的经理,它可以很好地告诉您)。

    您应该参考相关规范来确定您需要支持哪些类型:

    【讨论】:

    • 亲爱的匿名编辑:你吓了我一跳!我已经获得了对真实代码的访问权限,所以我检查了它,看来我只是在为 SO 重新创建一个简单版本时引入了这个“错误”。对于 ASN.1 TimeTicks,我实际上使用了类型 asn_timeticks_t,它是 uint32_t 的强别名,对于 SMIv2 Counter32,我使用了类型 asn_counter_t,它是... uint32_t 的强别名。呸!感谢您的更改。
    【解决方案2】:

    我认为如果你只遵循类型继承链,你最终会得到一个基本的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多