3

I am learning net-snmp code-base. To parsing MIB.

In parse.c and parse.h code keeps a hash bucket. (indexed bucket (tree list)).
There is also a tree structure, Which contains a next pointer pointing to 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 
}

I printed the MIB,

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

I couldn't understand what is the relation among the name of objects appears after Next-> ?

What is the criteria on the basis of which object names are together? The Code is unclear to me at this point.

What is modid? Its value not equal to module OID!

NOTE: For purely traversing purpose in MIB-tree there is *child, *parent & *peer are given! Also modid is not part of OID.

A Data-Structure named 'module compatability' in 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 */
    };

What is the use of this structure? Compatible in What sense ?

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]->next->next->next........


このコードは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 mod;

  • このノードを含むモジュール。
    • タイプ「構造体モジュール」のリンクされたリストがあります
    • 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 ではありません。これは、モジュール ID を定義する単一の番号 (OID に含まれる) です。この MIB モジュールによって導入されたすべての OID には、この番号が OID プレフィックスとして含まれます。modid は、下に定義されているすべてのノードで一定です。あなたの場合、modid は 31 (ipTrafficStats) だと思いますか?

ご存じのとおり、MIB にはツリー形式があります。ノードには他のノードなどが含まれる場合があります。参照する構造はノードを表します。したがって、「次の」ポインターを使用することで、パーサーによって読み取られたノードをトラバースします。

于 2012-10-09T15:00:40.490 に答える