我正在调试一些用于整数溢出问题的 snmp 代码。基本上,我们使用一个整数来存储磁盘/RAID 容量(以 KB 为单位)。但是,当使用超过 2TB 的磁盘/RAID 时,它会溢出。
我从一些互联网论坛读到 snmp v2c 支持 integer64 或 unsigned64。在我的测试中,即使我将类型设置为 integer64 或 unsigned64,它仍然只会发送低 32 位。
这是我的做法:
独立程序将获取容量并将数据写入文件。RAID 容量示例行
my-sub-oid Counter64 7813857280
/etc/snmp/snmpd.conf 有一个通过 oid 的子句:
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 获取 sub-oid,它返回:
mysuboid = Counter32: 3518889984
我使用 tcpdump,值部分的最后一段是:
41 0500 d1be 0000
41应该是标签,05应该是长度,该值只携带容量的低32位。(注 7813857280 是 0x1.d1.be.00.00)
我确实发现使用字符串类型会发送正确的值(以八进制字符串格式)。但我想知道是否有办法在 snmp v2c 中使用 64 位整数。
我正在运行 NET-SNMP 5.4.2.1。多谢。
更新:
从 snmpd.conf 中找到有关 net-snmp doc page中的 pass(可能还有 pass_persist)的以下内容。我猜它迫使 Counter64 到 Counter32。
Note:
The SMIv2 type counter64 and SNMPv2 noSuchObject exception are not supported.