Difference between revisions of "SNMP MIB Implementation"
Jump to navigation
Jump to search
Line 26: | Line 26: | ||
* mib2bin tool is modified from [http://net-snmp.sourceforge.net/ net-snmp] to convert ASN.1 format file to three files, because the microchip '''mib2bib''' converter only supports upto 255 OIDs. | * mib2bin tool is modified from [http://net-snmp.sourceforge.net/ net-snmp] to convert ASN.1 format file to three files, because the microchip '''mib2bib''' converter only supports upto 255 OIDs. | ||
MIB compiler tools: '''mib2bin''' | MIB compiler tools: '''mib2bin''' | ||
− | [http://www.modtronix.com/products/sbc44ec/00870a.pdf foo.mib] (ANS.1 format) -----------------------------------> foo.bin + foo_trap.bin+ foo.h + foo_data.h | + | [http://www.modtronix.com/products/sbc44ec/00870a.pdf foo.mib] (ANS.1 format) -----------------------------------> foo.bin + foo_trap.bin + foo.h + foo_data.h |
* Syntax to use mib2bin tool: | * Syntax to use mib2bin tool: | ||
Line 40: | Line 40: | ||
** If the three files exist, mib2bin tool will overwrite the files. | ** If the three files exist, mib2bin tool will overwrite the files. | ||
− | ===Binary File Format=== | + | ===Binary File Format <name>.bin=== |
* The binary file is an image of MIB file. It is generated by mib2bin tool. Agents will read binary file to respond NMS request. | * 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. | * 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. |
Revision as of 10:44, 27 April 2011
This wiki describe how to generate a MIB (Management Information Base) for SNMP agent.
Contents
Steps
- 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 using 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 ASN.1 MIB Script
- Build MIB file's written in ANS.1 notation.
- Tutorial: Understanding SNMP Stack to create ASN.1 MIB Script.
- Tools to create ASN.1 MIB Script
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, because the microchip mib2bib converter only supports upto 255 OIDs.
MIB compiler tools: mib2bin foo.mib (ANS.1 format) -----------------------------------> foo.bin + foo_trap.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>_trap.bin is the binary file storing information of TRAP of MIB. 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.
Binary File Format <name>.bin
- 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], [{<IndexNumber>},{<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
- The microchip format only supports OIDs upto 255. The following is an workaround to store OID greater than 255.
- Format of OID:
An OID is a series of (one or more) octets. Bit 8 of each octet indicates whether it is the last in the series: bit 8 of the last octet is zero; bit 8 of each preceding octet is one. Bits 7 to 1 of the octets in the series collectively encode the OID. Conceptually, these groups of bits are concatenated to form an unsigned binary number whose most significant bit is bit 7 of the first octet and whose least significant bit is bit 1 of the last octet. The OID shall be encoded in the fewest possible octets, that is, the leading octet of the OID shall not have the value 0x80.
- Example:
The OID encode of OID in binary file (hex) 4 BYTE(0x04) 1 BYTE(0x01) 36061 BYTE(0x80+ 0x02) BYTE(0x80 + 0x19) BYTE(0x5D) The OID = 36061 is decoded by 0x02*0x80*0x80 + 0x19*0x80 + 0x5D
<nodeInfo> field
- information of node
bit when (set = 1) 0 Node has sibling node 1 Node has default data 2 Node is sequence 3 Node is readable 4 Node is a parent 5 Node is writable 6 Node is able to modify 7 Node has sibling field (in IndexNodeInfo this bit indicate that Indexes is imply)
[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 enabled. Point to next node sibling.
- In little-endian format.
- The last node's distant offset is set to 0x00000000.
[siblingOffset] field
- If this record is a leaf [siblingOffset] is enabled. Point to next leaf sibling.
siblingOffset and distantSiblingOffset in this format is same function (point to next node sibling). They're only differences: siblingOffset use with leaf node. distantSiblingOffset use with node. so it's same value.
[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.
- The tool supports the following base data types defined in SNMPv1:
- INTEGER: The integer data type is a signed integer in the range of -2,147,483,648 to 2,147,483,647.
- OCTETSTRING: Octet strings are ordered sequences of 0 to 65,535 octets.
- Gauge: Nonnegative integers that can increase or decrease but retain the maximum value reached. The limit of 2^32 -1.
- TimeTicks: A hundredth of a second since some event. The limit of 2^32 -1.
- Counter: Nonnegative integers that increase until they reach a maximum value (2^32 -1); then, the integers return to zero.
- DisplayString: a special case of the octet string type where all the bytes are printable ASCII characters, include formatting characters such as CR and LF, and the C programming language string terminator character zero.
- IpAddress: A four byte octet string in network order.
- NetworkAddress: Used to indicate an address choice from one of the possible protocol families. Currently, only IP addresses are supported.
- Opaque: An arbitrary encoding that is used to pass arbitrary information strings that do not conform to the strict data typing used by the mib.
- SEQUENCE: An ordered list of objects, somewhat like a struct in the C language. Type of objects in sequence is same type of node.
[{<IndexNumber>}] and [{<IndexCount>, <IndexNodeInfo>, <IndexDataType>}] fields
- If this record is sequence (an order list of objects),
- <IndexNumber> is the number of INDEXes in sequence.
- <IndexCount>: is id of index node in table
- <IndexNodeInfo>: is info of index node
- <IndexDataType>: is data type of index node
- See example of accessing data in a table
- Example:
- trap node is a sequence to inform the NMS of a significant event (an extraordinary event has occurred at an agent) asynchronously. This sequence has two INDEXes, so we have:
<IndexNumber> = 0x02 with the 1st INDEX: <IndexCount> = 0x05 <IndexNodeInfo> = 0x28 <IndexDataType> = 0x02 with the 2nd INDEX: <IndexCount> = 0x08 <IndexNodeInfo> = 0xA4 <IndexDataType> = 0x04 In this example, trap is a table which has 4 columns: trapReceiverNumber (1), trapEnabled (2), trapReceiverIPAddress (3), trapCommunity(4). trapReceiverNumber (1), trapEnabled (2), trapReceiverIPAddress (3), trapCommunity(4). trapReceiverNumber (1), trapEnabled (2), trapReceiverIPAddress (3), trapCommunity(4). Each significant event will be a row defined in the trap table. This example has two INDEXes: the 1st INDEX node is trapCommunity (4) and the 2nd INDEX node trapReceiverNumber (1) Each INDEX is a node, so it has OID, info, data type. The 1st INDEX node is trapCommunity, which has id = 5, info is 0x28 and data type is INTEGER (0x02). so IndexCount = 0x04 IndexNodeInfo = 0x28 IndexDataType = 0x02 The 2nd INDEX node is trapReceiverNumber, which has id = 8, info is 0xA4 and data type is DisplayString (0x04). so IndexCount = 0x01 IndexNodeInfo = 0xA4 IndexDataType = 0x04
Example
OID Tree
- An example OID tree is given below:
Binary File
- 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 illustrated in the diagram below:
- The black arrow lines represent the OID tree structure.
- The red and green lines represent pointers to data.
- The dist field points to next sibling record. After parent record is it's children.