SNMP OID tree walk



我正在尝试编写SNMP代理,坦率地说,整个过程就像阅读翻译的立体声指令一样。 但是我已经很接近了,除了一个问题:实现 GETNEXT 操作。

请考虑系统 OID 空间的以下块:

.1.3.6.1.2.1 .1.5.0
             .1.6.0
             .1.8.0
             .1.9.1 .2.1
                    .2.2
                    .2.3

为了确定性,假设我想做

 $ snmpwalk -On -v 2c -c public localhost .1.3.6.1.2.1.1.8.0

net-snmp 通过首先在 .1.8.0 上执行 GET 然后执行 GETNEXT 来实现这一点。 GETNEXT 应该从 .1.8.0 到 .1.9.1.2.1,然后是 .1.9.1.2.2,依此类推。

我认识到这在概念上只是一个深度优先行走,但出于某种原因 - 也许是年龄 - 当它必须找到GET节点时,我只是找不到一种干净的方法来实现该搜索,然后在下一次调用时备份并找到"下一个"节点。

随意向我展示它非常简单。

更新

我在26小时的编程回合后写了这篇文章,所以我可以想象它不清楚。 问题来了:

我需要一个函数继承器,它将 OID 作为输入并返回下一个 OID——其中下一个是 SNMP 工具实现的深度优先顺序。 我有几个解决方案,可以通过以深度优先顺序枚举 OID 并等待正确的 OID 出现来工作;我正在寻找一个比 O(l+n) 更好的优雅,其中 l 是 OID 的长度,n 是 OID 的数量。

对照您正在行走的根 OID 检查响应 PDU 中的每个 OID。如果你找到一个匹配项,那么你就知道停止遍历树。如果找不到匹配项,请发送下一个GET_MSG_BULK请求 PDU。

最新更新