Используя тип int64 для snmp v2c oid?
Я отлаживаю некоторый код snmp для целочисленной проблемы переполнения. В основном мы используем целое число для хранения емкости диска / рейда в килобайтах. Однако при использовании диска / рейда более 2 ТБ он переполнится.
Я читал на некоторых интернет-форумах, что snmp v2c поддерживает integer64 или unsigned64. В моем тесте он все равно просто отправит младшие 32 бита, хотя я установил тип integer64 или unsigned64.
Вот как я это сделал:
отдельная программа получит емкость и запишет данные в файл. пример строки для рейдов
my-sub-oid Counter64 7813857280
/etc/snmp/snmpd.conf содержит предложение для передачи через oids:
pass_persist mymiboid /path/to/snmpagent
в источнике mysnmpagent прочитайте oidmap в структуру oid/type/value из файла и напечатайте в stdout.
printf("%s\n", it->first.c_str()); printf("%s\n", it->second.type.c_str()); printf("%s\n", it->second.value.c_str()); fflush(stdout);
используйте snmpget, чтобы получить подчиненный идентификатор, и он возвращает:
mysuboid = Counter32: 3518889984
Я использую tcpdump и последний сегмент части значения:
41 0500 d1be 0000
41 должен быть тегом, 05 должен быть длиной, а значение переносится только на 32 младших бита емкости. (примечание 7813857280 - 0x1.d1.be.00.00)
Я считаю, что использование строкового типа будет отправлять правильное значение (в формате октетной строки). Но я хочу знать, есть ли способ использовать 64-разрядное целое число в snmp v2c.
Я использую NET-SNMP 5.4.2.1. большое спасибо.
Обновить:
Находя следующее из snmpd.conf относительно pass (и, вероятно, также pass_persist) на странице документации net-snmp. Я предполагаю, что это заставляет Counter64 к Counter32.
Note:
The SMIv2 type counter64 and SNMPv2 noSuchObject exception are not supported.
2 ответа
Вы должны использовать два Unsigned32 для младшего и старшего байтов вашего большого числа.
Counter64 не предназначен для использования таким образом для больших чисел.
Для справки: 17 распространенных ошибок проектирования MIB (последняя)
SNMP SMIv2 определяет новый тип Counter64,
http://tools.ietf.org/html/rfc2578
который на самом деле является 64-разрядным целым числом без знака. Так что, если ваши данные попадают в диапазон, использование Counter64 является правильным.
"В моем тесте он все равно будет просто отправлять младшие 32 бита, даже если я установил тип на integer64 или unsigned64", звучит как проблема, но если вы не покажете больше подробностей (например, показ кода), как вы его тестировали и Получив результат, никто не может помочь дальше.