Преобразование SNMP ASN.1 в типы данных C ++ - PullRequest
0 голосов
/ 20 сентября 2018

Я добавляю переменные SNMP EtherLike MIB в нашу существующую кодовую базу SNMP C ++ и делаю это впервые.

Сложность, с которой я сталкиваюсь, заключается в понимании типов данных переменных MIB и сопоставлении их с типами данных C ++- например dot3StatsIndex Синтаксис переменной MIB равен InterfaceIndex , так что же такое эквивалентный тип данных в C ++.

Поскольку я реализую в первый раз или, скорее, в процессе обученияфаза - пожалуйста, дайте мне знать, каковы различные типы данных ASN.1 и перечислены ли все типы выше и как они сопоставлены с типами данных C ++?

Также, как извлечь из RFC тип данных MIBпеременная

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

В моем 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.

Любые текстовые соглашения , такие как InterfaceIndex, на самом деле не являются типами, но подсказки для менеджеров SNMP относительнокак представлять определенные поля.Для тех, кто не включен в приведенный выше список в качестве особых случаев, я просто использовал фактический базовый тип, который в данном случае, как показал Илья, Integer32.Вы можете прочитать MIB, чтобы отследить, что на самом деле означают эти вещи (или использовать менеджер, такой как iReasoning , который довольно неплохо говорит вам).

Вам следует обратиться к соответствующим спецификациямчтобы определить, какие типы вам нужно поддерживать:

0 голосов
/ 20 сентября 2018

Я думаю, что если вы просто будете следовать цепочке наследования типов, вы получите базовый тип 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)
...