Editing SNMP MIB Implementation
Jump to navigation
Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 4: | Line 4: | ||
# Create a ASN.1 MIB script '''foo.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''' | # Convert foo.mib to binary file using '''mib2bin''' | ||
− | # Build [http://www.rane.com/note161.html | + | # Build [http://www.rane.com/note161.html snmp's PDU use BER (Base encoding rules)] encoder and decoder library to process data that's transfer between NMS and agents. |
− | # Build | + | # Build snmp API use [http://www.sics.se/~adam/uip/index.php/Main_Page 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 binary MIB file reader library. | ||
# Build functions service oid tree. | # Build functions service oid tree. | ||
Line 24: | Line 24: | ||
==Convert MIB to Binary File== | ==Convert MIB to Binary File== | ||
− | * mib2bin tool is modified from [http://net-snmp.sourceforge.net/ net-snmp] to convert ASN.1 format file to | + | * 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 | + | [http://www.modtronix.com/products/sbc44ec/00870a.pdf foo.mib] (ANS.1 format) -----------------------------------> foo.bin + foo.h + foo_data.h |
* Syntax to use mib2bin tool: | * Syntax to use mib2bin tool: | ||
'''mib2bin <MIBfile>... | '''mib2bin <MIBfile>... | ||
* where MIBfile file is ASN.1 format file. MIBfile = <name>.<type> | * 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 | + | ** '''<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>_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. | ** '''<name>.h''' is C header file storing ID that's reference to function service of OID. | ||
* Note: | * 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. | ** 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 | + | ** If the three files exist, mib2bin tool will overwrite the files. |
− | ===Binary File Format | + | ===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. | * 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 | + | * 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: | * A parent or child is a record. Single record of binary file have format: | ||
<oid>, <nodeInfo>, | <oid>, <nodeInfo>, | ||
[id], [siblingOffset]/[distantSiblingOffset], [dataType], [dataLen], [data], | [id], [siblingOffset]/[distantSiblingOffset], [dataType], [dataLen], [data], | ||
− | [{<IndexNumber>}, {<IndexCount>, <IndexNodeInfo>, <IndexDataType>} ...] | + | [{<IndexNumber>},{<IndexCount>, <IndexNodeInfo>, <IndexDataType>} ...] |
* where: | * where: | ||
** fields indicated by angle brackets (< >) are always present | ** fields indicated by angle brackets (< >) are always present | ||
Line 54: | Line 53: | ||
* The microchip format only supports OIDs upto 255. The following is an workaround to store OID greater than 255. | * The microchip format only supports OIDs upto 255. The following is an workaround to store OID greater than 255. | ||
* Format of OID: | * Format of OID: | ||
− | + | oid_1 <0x10> oid_2 <0x10> .... | |
− | + | *if (oid_i < 0xFF): oid_i = BYTE (oid_i) | |
− | + | *else: oid_i = <0xFF> + BYTE (length) + BYTE (oid_i.B0) + BYTE (oid_i.B1) + ... | |
− | + | * where | |
− | + | ** '''BYTE (x)''' mean the byte representation of x. | |
− | + | ** '''<0x10>''' is the OID separator. | |
+ | ** '''<0xFF>''' is used to indicate that the OID is greater than 254. | ||
+ | ** '''length''' is the number of bytes of oid_i that follows. | ||
+ | ** '''oid_i.Bj''' is j-th byte of oid_i in hexadecimal representation, j = 0 corresponds to the Least Significant Byte (LSB), i.e. little-endian format. | ||
* Example: | * Example: | ||
− | The OID | + | The OID for a node is '''4.1.17095.''' After compiling to binary, the OID is represented as: |
− | 4 | + | The OID: <font color=blue>4</font> . <font color=blue>1</font> . <font color=blue>17095</font> . |
− | + | The result: <font color=blue>0x04</font> 0x10 <font color=blue>0x10</font> 0x10 <font color=green>0xFF</font> <font color=red>0x02</font> <font color=blue>0xC7 0x42</font> 0x10 | |
− | + | where: | |
− | + | <font color=blue>oid_1 = 4 </font> => <font color=blue> BYTE (oid_1) = 0x04</font> | |
+ | <font color=blue>oid_2 = 2 </font> => <font color=blue> BYTE (oid_2) = 0x01</font> | ||
+ | <font color=blue>oid_3 = 17095 = 0x42C7 </font> => <font color=green>0xFF</font> <font color=red>BYTE (length) = 0x02</font> <font color=blue>BYTE (oid_3.B0) BYTE (oid_3.B1) = 0xC7 0x42 (In little-endian format)</font> | ||
+ | Note: When a node have no sibling and only has one child, the node's OID will be merged with its child's OID (reduce data's stored). | ||
+ | For example, in case of '''private (4) -> enterprises (1) -> microchip (17095)''', where '''private''' has no sibling and only has one child, | ||
+ | and '''enterprises''' also has no sibling and only has one child, they can combined to a record has oid field is 4.1.17095. | ||
====<nodeInfo> field==== | ====<nodeInfo> field==== | ||
* information of node | * information of node | ||
bit when (set = 1) | bit when (set = 1) | ||
− | 0 Node | + | 0 Node is a parent (0: node is a leaf) |
− | 1 Node | + | 1 Node is sequence |
− | 2 Node is | + | 2 Node is readable |
− | 3 Node is | + | 3 Node is writable |
− | 4 Node is | + | 4 Node is able to create |
− | 5 Node | + | 5 Node has default data |
− | 6 | + | 6 (if node is sequence, this is mean implied index node) |
− | 7 | + | 7 always set 1 |
====[id] field==== | ====[id] field==== | ||
Line 95: | Line 102: | ||
so it's same value. | so it's same value. | ||
− | ====[dataType] | + | ====[dataType], [dataLen], [data] fields==== |
− | *If this record is a leaf | + | * If this record is a leaf and has default data |
** [dataType] is type of leaf's 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: | * 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. | ** '''INTEGER''': The integer data type is a signed integer in the range of -2,147,483,648 to 2,147,483,647. | ||
Line 109: | Line 118: | ||
** '''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. | ** '''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. | ** '''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==== | ====[{<IndexNumber>}] and [{<IndexCount>, <IndexNodeInfo>, <IndexDataType>}] fields==== | ||
* If this record is sequence (an order list of objects), | * If this record is sequence (an order list of objects), | ||
** <IndexNumber> is the number of INDEXes in sequence. | ** <IndexNumber> is the number of INDEXes in sequence. | ||
− | ** <IndexCount>: is | + | ** <IndexCount>: is OID of index node in table |
** <IndexNodeInfo>: is info of index node | ** <IndexNodeInfo>: is info of index node | ||
** <IndexDataType>: is data type of index node | ** <IndexDataType>: is data type of index node | ||
Line 126: | Line 130: | ||
<IndexNumber> = 0x02 | <IndexNumber> = 0x02 | ||
with the 1st INDEX: | with the 1st INDEX: | ||
− | <IndexCount> = | + | <IndexCount> = 0x04 |
− | <IndexNodeInfo> = | + | <IndexNodeInfo> = 0xCC |
<IndexDataType> = 0x02 | <IndexDataType> = 0x02 | ||
with the 2nd INDEX: | with the 2nd INDEX: | ||
− | <IndexCount> = | + | <IndexCount> = 0x01 |
− | <IndexNodeInfo> = | + | <IndexNodeInfo> = 0x80 |
− | <IndexDataType> = | + | <IndexDataType> = 0x03 |
In this example, '''trap''' is a table which has 4 columns: | In this example, '''trap''' is a table which has 4 columns: | ||
<font color=blue>trapReceiverNumber (1)</font>, trapEnabled (2), trapReceiverIPAddress (3), <font color=blue>trapCommunity(4)</font>. | <font color=blue>trapReceiverNumber (1)</font>, trapEnabled (2), trapReceiverIPAddress (3), <font color=blue>trapCommunity(4)</font>. | ||
Line 141: | Line 145: | ||
This example has two INDEXes: the 1st INDEX node is trapCommunity (4) and the 2nd INDEX node trapReceiverNumber (1) | 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. | Each INDEX is a node, so it has OID, info, data type. | ||
− | The 1st INDEX node is trapCommunity, which has | + | The 1st INDEX node is trapCommunity, which has OID = 4, info is 0xCC and data type is INTEGER (0x02). so |
IndexCount = 0x04 | IndexCount = 0x04 | ||
− | IndexNodeInfo = | + | IndexNodeInfo = 0xCC |
IndexDataType = 0x02 | IndexDataType = 0x02 | ||
− | The 2nd INDEX node is trapReceiverNumber, which has | + | The 2nd INDEX node is trapReceiverNumber, which has OID = 1, info is 0x80 and data type is DisplayString (0x03). so |
IndexCount = 0x01 | IndexCount = 0x01 | ||
− | IndexNodeInfo = | + | IndexNodeInfo = 0x80 |
− | IndexDataType = | + | IndexDataType = 0x03 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Example=== | ===Example=== | ||
Line 204: | Line 160: | ||
[[File:Snmp mib oid tree example.jpg | thumb | center | 900px]] | [[File:Snmp mib oid tree example.jpg | thumb | center | 900px]] | ||
− | ====Binary File | + | ====Binary File==== |
− | * The corresponding binary file is | + | * The corresponding binary file is mchip.bin and it has data describe in table below: |
** '''oid''' is <oid> fields. | ** '''oid''' is <oid> fields. | ||
** '''info''' is <nodeInfo> fields. | ** '''info''' is <nodeInfo> fields. | ||
** '''dist''' is [distantSiblingOffset]/[siblingOffset] fields. | ** '''dist''' is [distantSiblingOffset]/[siblingOffset] fields. | ||
** '''id''' is [id] 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>, ...}]. | ** '''index''' is index fields of sequence, include [{index_number} , {<IndexCount>, <IndexNodeInfo>, <indexDataType>, ...}]. | ||
[[File:Snmp mib binary example.jpg | thumb | center | 900px]] | [[File:Snmp mib binary example.jpg | thumb | center | 900px]] | ||
− | * The detail description of | + | * The detail description of mchip.bin is illustrated in the diagram below: |
** The black arrow lines represent the OID tree structure. | ** The black arrow lines represent the OID tree structure. | ||
** The red and green lines represent pointers to data. | ** The red and green lines represent pointers to data. | ||
** The dist field points to next sibling record. After parent record is it's children. | ** The dist field points to next sibling record. After parent record is it's children. | ||
[[File:Snmp mib binary detail example.jpg | thumb | center | 900px]] | [[File:Snmp mib binary detail example.jpg | thumb | center | 900px]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |