2012-10-09 7 views
3

Я изучаю net-snmp код базы. Разбор MIB.net-snmp parse code, Как разобрать MIB?

Код parse.c and parse.h хранит хэш-ведро. (indexed bucket (tree list)).
Существует также структура дерева, который содержит следующий указатель, указывающий на 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-ОСНОВА-MIB: snmpFrameworkMIB (10) тип = 24 Далее -> 'ifOutErrors ipSystemStatsHCOctetGroup ipSystemStatsOutFragReqds ifStackGroup2'

Я не мог понять, что такое соотношение между т имя объекта появляется после Next->?

Каковы критерии, на основе которых имена объектов совпадают? Код не ясен для меня на этом этапе.

Что такое modid? Его значение не равно модулю OID!

ПРИМЕЧАНИЕ: Для целей чистоты перемещения в MIB-дереве есть * ребенок, * родительский & * равный! Также 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

Я также работаю с Net-snmp довольно давно, я делюсь своим наблюдением с вами.
Возможно, это поможет вам.

1. struct tree * 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.

Hash Функция:

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

Затем этот хэш-значение передается в макро NBUCKET (х) - индекс возвращается (0-127). Столкновение определяется цепью следующим образом. Ковш [я] -> 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 modid;

  • Модуль, содержащий этот узел.
    • Существует связанный список типа 'struct module'
    • modid - порядковый номер в связанном списке модуля.
    • порядковый номер начать с 0.
    • modid = число, при котором модуль начал читать
    • функции определены в parse.h «find_module (интермедиат 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 
0

Модификация не является модулем OID. Это единое число (включено в OID), определяющее идентичность модуля. Все OID, введенные этим модулем MIB, будут содержать это число как префикс OID. Модид будет постоянным для всех узлов, определенных ниже. Я полагаю, в вашем случае modid равен 31 (ipTrafficStats)?

Как вы, наверное, знаете, MIB имеет древовидную форму. Узлы могут содержать другие узлы и т. Д. Структура, на которую вы ссылаетесь, представляет собой узел. Таким образом, используя «следующий» указатель, вы просматриваете узлы, считываемые вашим парсером.

+0

Нет, modid 'не является частью модуля OID (он слышал, как это). Также «next» - это указатель на узел, а «следующий» - не для перемещения. Для цели чисто пересечения есть * child, * parent & * peer даны! ... next имеет некоторое отношение к ведро хэша (некоторая внутренняя цель algo), и я не могу это понять. –

+0

Это просто внутренний указатель, используемый для разрешения конфликтов, когда mibs хранятся в хеш-таблице. см., например, http://en.wikipedia.org/wiki/Hash_table#Separate_chaining. Таким образом, mibs в '-> next' - это просто другие mib, чья хэш-функция разрешается в том же ведре в хеш-таблице. – nos

 Смежные вопросы

  • Нет связанных вопросов^_^