SNMP MIB Implementation
This wiki describe how to generate a MIB (Management Information Base) for SNMP agent.
Contents
Steps
- Create a Microchip Custom MIB script snmp.mib (an ASCII text file) for the tree structure.
- Create a ASN.1 MIB script foo.mib (an ASCII text file) for the tree structure.
- Convert foo.mib to binary file using mib2bin
- Build snmp's PDU use BER (Base encoding rules) encoder and decoder library to process data that's transfer between NMS and agents.
- Build snmp API use uIP-stack to communicate between NMS and Agents (open two ports: The manager speak to agents on one port, the agent responds manager on the other port).
- Build binary MIB file reader library.
- Build functions service oid tree.
- Merge MIB ANS.1 file to NMS.
Create Microchip Custom MIB Script
- Is this file needed?
- If so any tutorial to create this file?
Create ASN.1 MIB Script
- Build MIB file's written in ANS.1 notation.
- Any tutorial to create this file?
Abstract Syntax Notation
- Each MIB variable contains several attributes, such as data type, access type and object identifier.
- Abstract Syntax Notation version 1 (ASN.1) is a language to define these attributes in SNMP.
Convert MIB to Binary File
- mib2bin tool is modified from net-snmp to convert ASN.1 format file to three files.
MIB compiler tools: mib2bin foo.mib (ANS.1 format) -----------------------------------> foo.bin + foo.h + foo_data.h
- Syntax to use mib2bin tool:
mib2bin <MIBfile>...
- where MIBfile file is ASN.1 format file. MIBfile = <name>.<type>
- <name>.bin is the binary file storing information of OID tree. This file can be placed on an SD media card to be read by the FAT16 file system.
- <name>_data.h is C header file storing information of OID tree. This file is generated by converting mchip.bin file to the C header file. It's only used when a system don't have system file and place on program memory.
- <name>.h is C header file storing ID that's reference to function service of OID.
- Note:
- Subfolder mibs containing the basics MIB files (e.g.: RFC1155-SMI, RFC1213-MIB, RFC-1215, SNMPv2-MIB ... for us MIB file), must be present under the directory of execution.
- If the three files exist, mib2bin tool will overwrite the files.
- Example:
mib2bin mchip.txt mib2bin will generate three files: mchip.bin, mchip_data.h and mchip.h
Binary File Format
- The binary file is an image of MIB file. It is generated by mib2bin tool. Agents will read binary file to respond NMS request.
- In the binary file, A parent is stored first, followed by its last-child to first-child. Next, the structure of next this parent is stored. This structure is repeated until the entire tree is stored.
- A parent or child is a record. Single record of binary file have format:
<oid>, <nodeInfo>, [id], [siblingOffset], [distantSiblingOffset], [dataType], [dataLen], [data], [{<index_number>},{<IndexCount>, <IndexNodeInfo>, <indexDataType>} ...] where: fields indicated by angle brackets (< >) are always present fields in square brackets ([ ]) are optional depending on characteristics of the current node. fields in braces ({}) are optional but always occur together.
<oid> field
- Format of OID:
oid1 char(16) oid2 char(16) ....
- if oid_i < 254: oid_i = char (oid_i)
- else oid_i = char(255) + char(length of oid_i) + oid_i (base on 255) + char(16)
<nodeInfo> field
- information of node
bit when (set = 1) 0 Node is a parent (0: node is a child) 1 Node is sequence 2 Node is readable 3 Node is writable 4 Node is able to create 5 Node has default data 6 (if node is sequence, this is mean implied index node) 7 always set 1
[id] field
- If this record is leaf, id that's reference to function services the record.
[distantSiblingOffset] field
- If this record is a node [distantSiblingOffset] is enable. Point to next node sibling.
[siblingOffset] field
- If this record is a leaf [siblingOffset] is enable. Point to next leaf sibling.
[dataType], [dataLen], [data] fields
- If this record is a leaf and has default data
- [dataType] is type of leaf's data.
- [dataLen] is length of data.
- [data] is data on string.
[{<index_number>}]
- If this record is sequence, index_number is number of INDEXes in sequence.
- [{<IndexCount>, <IndexNodeInfo>, <indexDataType>}]
- If this record is sequence
- <IndexCount>: is index of INDEX in table
- <IndexNodeInfo>: is info of index_node
- <indexDataType>: is data type of index_node
Example
- The example mchip.txt describe the OID tree given below:
- The corresponding binary file is mchip.bin and it has data describe in table below:
OID is <oid> fields. Info is <nodeInfo> fields. Dist is [distantSiblingOffset]/[siblingOffset] fields. Id is [id] fields. Defval is data fields, include [dataType], [dataLen], [data] fields. Index is index fields of sequence, include [{index_number} , {<IndexCount>, <IndexNodeInfo>, <indexDataType>, ...}].
- The detail description of mchip.bin is illuminated by structure diagram blow:
The hidden linear is oid tree structure. The red and green continue linear is pointer of data. The dist field point to next sibling record. After parent record is it's children.