1

我正在调试一些用于整数溢出问题的 snmp 代码。基本上,我们使用一个整数来存储磁盘/RAID 容量(以 KB 为单位)。但是,当使用超过 2TB 的磁盘/RAID 时,它会溢出。

我从一些互联网论坛读到 snmp v2c 支持 integer64 或 unsigned64。在我的测试中,即使我将类型设置为 integer64 或 unsigned64,它仍然只会发送低 32 位。

这是我的做法:

  1. 独立程序将获取容量并将数据写入文件。RAID 容量示例行

    my-sub-oid
    Counter64
    7813857280
    
  2. /etc/snmp/snmpd.conf 有一个通过 oid 的子句:

    pass_persist mymiboid /path/to/snmpagent
    
  3. 在 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);
    
  4. 使用 snmpget 获取 sub-oid,它返回:

    mysuboid = Counter32: 3518889984
    
  5. 我使用 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.
4

2 回答 2

2

您应该使用两个 Unsigned32 作为大数的低字节和高字节。

Counter64 并不打算以这种方式用于大量数字。

供参考:17个常见的MIB设计错误(最后一个)

于 2015-09-01T14:56:36.140 回答
1

SNMP SMIv2 定义了一个新类型 Counter64,

https://www.rfc-editor.org/rfc/rfc2578#page-24

这实际上是无符号的 64 位整数。所以如果你的数据在这个范围内,使用 Counter64 是合适的。

“在我的测试中,即使我已将类型设置为 integer64 或 unsigned64,它仍然只会发送低 32 位”听起来像是一个问题,但除非你展示更多关于你如何测试它的细节(比如显示一些代码)和收到结果,没有人可以进一步帮助。

于 2013-11-13T05:51:35.390 回答