3

我正在学习net-snmp代码库。解析 MIB。

parse.c and parse.h代码中保留了一个哈希桶。(indexed bucket (tree list)).
还有一个树形结构,其中包含一个指向的 next 指针Next node in hashed list of names.

struct tree{  
    .
    .
    struct tree    *next;       // Next node in hashed list of names 
    int             modid;     // The module containing this node 
}

我打印了 MIB,

SNMP-FRAMEWORK-MIB:snmpFrameworkMIB(10) type=24 Next- > ' ipSystemStatsHCOctetGroup ipSystemStatsOutFragReqds ifStackGroup2 ifOutErrors '

我不明白Next->之后出现的对象名称之间的关系是什么?

基于哪些对象名称在一起的标准是什么?在这一点上,我还不清楚《守则》。

什么是模态?它的值不等于模块 OID!

注意:对于 MIB 树中的纯粹遍历目的,给出了 *child、*parent 和 *peer!也不modid是 OID 的一部分。

parse.h 中名为“模块兼容性”的数据结构:

struct module_compatability {
        const char     *old_module;
        const char     *new_module;
        const char     *tag;    /* NULL implies unconditional replacement,
                                 * otherwise node identifier or prefix */
        size_t          tag_len;        /* 0 implies exact match (or unconditional) */
        struct module_compatability *next;      /* linked list */
    };

这个结构有什么用?什么意义上的兼容?

4

2 回答 2

4

我也和 Net-snmp 一起工作了很长一段时间,我正在和你分享我的观察。
可能这会对你有所帮助。

1.结构树*next;

struct tree    * next; /* Next node in hashed list of names */   

Net-snmp 功能提供通过模块的“名称”进行查询,
当查询的对象名称(字符串)为 ASCII 时,

$ snmptranslate -On -IR bundleSize  
  -   
  -  
  .1.3.6.1.4.1.26149.2.1.2.2.1.9  

它有一个大小为 128 的哈希表(内部)数据结构“桶”。

哈希函数:

name_hash(str*) - return some of ASCII value. 

然后将此哈希值传递给宏NBUCKET(x) - 返回索引 (0-127)。通过如下链接解决冲突。桶[i]->下一个->下一个->下一个........


parse.c中存在此代码——

tree->next并按'bucket'以下方式管理:

 tp->hash = name_hash(tp->name); // Fist find hash value as some of ASCII
 b = BUCKET(tp->hash);           // map hash value into (0-127)
 if (buckets[b])                 // check for collision 
     tp->next = buckets[b];     // collision is resolved ny chan chain 
 buckets[b] = tp;           // new coming node become first node in chain

2. int modid;

  • 包含此节点的模块。
    • 有一个“结构模块”类型的链表
    • modid 是模块链表中的序列号。
    • 序号从 0 开始。
    • modid= 模块开始读取的编号
    • parse.h 'find_module(int modid)' 返回节点地址中定义的函数存储有关模块的信息。

parse.h 中名为“模块兼容性”的数据结构:

This is an array of structre 'module compatability' use to store compatible 
basic MIB name (RFC's defined).   

const char     *old_module;   // snmp-v1  
const char     *new_module;   // snmp-v2
于 2012-10-11T12:55:09.913 回答
0

modid 不是模块 OID。它是定义模块标识的单个数字(包含在 OID 中)。此 MIB 模块引入的所有 OID 都将包含此编号作为 OID 前缀。对于下面定义的所有节点,modid 将是常量。我相信,在您的情况下,modid 是 31(ipTrafficStats)?

您可能知道,MIB 有一个树形结构。节点可能包含其他节点等。您所指的结构代表一个节点。因此,通过使用“下一个”指针,您可以遍历解析器读取的节点。

于 2012-10-09T15:00:40.490 回答