Difference between revisions of "SNMP MIB Implementation"

From OpenCircuits
Jump to navigation Jump to search
m
Line 26: Line 26:
 
* mib2bin tool is modified from [http://net-snmp.sourceforge.net/ net-snmp] to convert ASN.1 format file to four 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 four 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:
   '''mib2bin <MIBfile>...
+
   '''mib2bin &lt;MIBfile&gt;...
* where MIBfile file is ASN.1 format file. MIBfile = <name>.<type>
+
* where MIBfile file is ASN.1 format file. MIBfile = &lt;name&gt;.&lt;type&gt;
** '''<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 FAT32 file system.
+
** '''&lt;name&gt;.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 FAT32 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 FAT32 file system.
+
** '''&lt;name&gt;_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 FAT32 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.
+
** '''&lt;name&gt;_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.
+
** '''&lt;name&gt;.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 four files exist, mib2bin tool will overwrite the files.
 
** If the four files exist, mib2bin tool will overwrite the files.
  
===Binary File Format <name>.bin===
+
===Binary File Format &lt;name&gt;.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 first-child to last-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 first-child to last-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>,  
+
   &lt;oid&gt;, &lt;nodeInfo&gt;,  
 
   [id], [siblingOffset]/[distantSiblingOffset], [dataType], [dataLen], [data],  
 
   [id], [siblingOffset]/[distantSiblingOffset], [dataType], [dataLen], [data],  
   [{<IndexNumber>}, {<IndexCount>, <IndexNodeInfo>, <IndexDataType>} ...]
+
   [{&lt;IndexNumber&gt;}, {&lt;IndexCount&gt;, &lt;IndexNodeInfo&gt;, &lt;IndexDataType&gt;} ...]
 
* where:
 
* where:
** fields indicated by angle brackets (< >) are always present
+
** fields indicated by angle brackets (&lt; &gt;) are always present
 
** fields in square brackets ([ ]) are optional depending on characteristics of the current node.
 
** fields in square brackets ([ ]) are optional depending on characteristics of the current node.
 
** fields in braces ({ }) are optional but always occur together.
 
** fields in braces ({ }) are optional but always occur together.
  
====<oid> field====
+
====&lt;oid&gt; field====
 
* 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:
Line 67: Line 67:
 
     The OID = 36061 is decoded by 0x02*0x80*0x80 + 0x19*0x80 + 0x5D
 
     The OID = 36061 is decoded by 0x02*0x80*0x80 + 0x19*0x80 + 0x5D
  
====<nodeInfo> field====
+
====&lt;nodeInfo&gt; field====
 
* information of node
 
* information of node
 
   bit        when (set = 1)
 
   bit        when (set = 1)
Line 115: Line 115:
 
** [data] is data on string.
 
** [data] is data on string.
  
====[{<IndexNumber>}] and [{<IndexCount>, <IndexNodeInfo>, <IndexDataType>}] fields====
+
====[{&lt;IndexNumber&gt;}] and [{&lt;IndexCount&gt;, &lt;IndexNodeInfo&gt;, &lt;IndexDataType&gt;}] 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.
+
** &lt;IndexNumber&gt; is the number of INDEXes in sequence.
** <IndexCount>: is id of index node in table
+
** &lt;IndexCount&gt;: is id of index node in table
** <IndexNodeInfo>: is info of index node
+
** &lt;IndexNodeInfo&gt;: is info of index node
** <IndexDataType>: is data type of index node
+
** &lt;IndexDataType&gt;: is data type of index node
 
* See [http://www.simpleweb.org/w/images/9/91/Tutorial_Slides_Smi.pdf example] of accessing data in a table
 
* See [http://www.simpleweb.org/w/images/9/91/Tutorial_Slides_Smi.pdf example] of accessing data in a table
 
* Example:  
 
* 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:
 
** '''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
+
       &lt;IndexNumber&gt; = 0x02
 
       with the 1st INDEX:
 
       with the 1st INDEX:
           <IndexCount> = 0x05
+
           &lt;IndexCount&gt; = 0x05
           <IndexNodeInfo> = 0x28
+
           &lt;IndexNodeInfo&gt; = 0x28
           <IndexDataType> = 0x02
+
           &lt;IndexDataType&gt; = 0x02
 
       with the 2nd INDEX:
 
       with the 2nd INDEX:
           <IndexCount> = 0x08
+
           &lt;IndexCount&gt; = 0x08
           <IndexNodeInfo> = 0xA4
+
           &lt;IndexNodeInfo&gt; = 0xA4
           <IndexDataType> = 0x04
+
           &lt;IndexDataType&gt; = 0x04
 
   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>.  
+
       &lt;font color=blue&gt;trapReceiverNumber (1)&lt;/font&gt;, trapEnabled (2), trapReceiverIPAddress (3), &lt;font color=blue&gt;trapCommunity(4)&lt;/font&gt;.  
       <font color=blue>trapReceiverNumber (1)</font>, trapEnabled (2), trapReceiverIPAddress (3), <font color=blue>trapCommunity(4)</font>.  
+
       &lt;font color=blue&gt;trapReceiverNumber (1)&lt;/font&gt;, trapEnabled (2), trapReceiverIPAddress (3), &lt;font color=blue&gt;trapCommunity(4)&lt;/font&gt;.  
       <font color=blue>trapReceiverNumber (1)</font>, trapEnabled (2), trapReceiverIPAddress (3), <font color=blue>trapCommunity(4)</font>.  
+
       &lt;font color=blue&gt;trapReceiverNumber (1)&lt;/font&gt;, trapEnabled (2), trapReceiverIPAddress (3), &lt;font color=blue&gt;trapCommunity(4)&lt;/font&gt;.  
 
   Each significant event will be a row defined in the '''trap''' table.  
 
   Each significant event will be a row defined in the '''trap''' table.  
 
    
 
    
Line 150: Line 150:
 
           IndexDataType = 0x04
 
           IndexDataType = 0x04
  
===Binary File Format <name>_trap.bin===
+
===Binary File Format &lt;name&gt;_trap.bin===
 
* The binary file store TRAP information. It is generated by mib2bin tool. Agents will read binary file to get information of TRAP when something bad occurs.
 
* The binary file store TRAP information. It is generated by mib2bin tool. Agents will read binary file to get information of TRAP when something bad occurs.
* In the binary file, An enterprise OID is stored first, followed by its first specific trap number and IDs of first specific trap (those IDs matche with IDs of leaf in <name>.bin; IDs are reference to OIDs of data bindings that be included in this trap) to last specific trap number and IDs of last specific trap. Next, the structure of next this enterprise OID is stored. This structure is repeated until all enterprise OID in MIB file is stored.
+
* In the binary file, An enterprise OID is stored first, followed by its first specific trap number and IDs of first specific trap (those IDs matche with IDs of leaf in &lt;name&gt;.bin; IDs are reference to OIDs of data bindings that be included in this trap) to last specific trap number and IDs of last specific trap. Next, the structure of next this enterprise OID is stored. This structure is repeated until all enterprise OID in MIB file is stored.
* The format of enterprise in <name>_trap.bin
+
* The format of enterprise in &lt;name&gt;_trap.bin
   <enterprise_oid><sibling_enterprise><enterprise_index>[specific_trap_number][sibling_specific_trap][number_varbinds][id_varbind]...
+
   &lt;enterprise_oid&gt;&lt;sibling_enterprise&gt;&lt;enterprise_index&gt;[specific_trap_number][sibling_specific_trap][number_varbinds][id_varbind]...
 
* where:
 
* where:
** fields indicated by angle brackets (< >) are always present.
+
** fields indicated by angle brackets (&lt; &gt;) are always present.
 
** fields in square brackets ([ ]) are optional depending on characteristics of the trap.
 
** fields in square brackets ([ ]) are optional depending on characteristics of the trap.
  
====<enterprise_oid> field====
+
====&lt;enterprise_oid&gt; field====
 
* Enterprise oid is full oid of enterprise trap that want to send in MIB file.
 
* Enterprise oid is full oid of enterprise trap that want to send in MIB file.
 
* The format of enterprise oid.  
 
* The format of enterprise oid.  
   <sub_oid> <info_sub_oid> ...  
+
   &lt;sub_oid&gt; &lt;info_sub_oid&gt; ...  
 
* where:
 
* where:
**  <font color=red><sub_oid>:</font> is same format of <oid> field in MIB file.
+
**  &lt;font color=red&gt;&lt;sub_oid&gt;:&lt;/font&gt; is same format of &lt;oid&gt; field in MIB file.
**  <font color=red><info_sub_oid>:</font> Information of sub_oid.
+
**  &lt;font color=red&gt;&lt;info_sub_oid&gt;:&lt;/font&gt; Information of sub_oid.
   <info_sub_oid> format:
+
   &lt;info_sub_oid&gt; format:
 
       bit        when (set = 1)
 
       bit        when (set = 1)
 
       0          the first sub_oid in enterprise
 
       0          the first sub_oid in enterprise
Line 176: Line 176:
 
       6          no use
 
       6          no use
 
       7          the last sub_oid in enterprise
 
       7          the last sub_oid in enterprise
* If <sub_oid> == BYTE (0x00) and <info_sub_oid> == BYTE(0xFF), this is the end of infomation traps.
+
* If &lt;sub_oid&gt; == BYTE (0x00) and &lt;info_sub_oid&gt; == BYTE(0xFF), this is the end of infomation traps.
  
====<sibling_enterprise> field====
+
====&lt;sibling_enterprise&gt; field====
 
* Point to next enterprise OID.
 
* Point to next enterprise OID.
 
* In little-endian format.
 
* In little-endian format.
====<enterprise_index> field====
+
====&lt;enterprise_index&gt; field====
* Index of enterprise OID traps in <name>_trap.bin file.
+
* Index of enterprise OID traps in &lt;name&gt;_trap.bin file.
* Size of <enterprise_index> is 1 byte.
+
* Size of &lt;enterprise_index&gt; is 1 byte.
 
====[specific_trap_number] field====
 
====[specific_trap_number] field====
 
* If the trap is sent is specific trap, specific trap number is a number indicting specific trap.
 
* If the trap is sent is specific trap, specific trap number is a number indicting specific trap.
Line 195: Line 195:
 
====[id_varbind] field====
 
====[id_varbind] field====
 
* [id_varbind] define data bindings (OID and value of OID leaf) that is included specific trap.
 
* [id_varbind] define data bindings (OID and value of OID leaf) that is included specific trap.
* [id_varbind] is reference to id of the leaf oid in <name>.bin.
+
* [id_varbind] is reference to id of the leaf oid in &lt;name&gt;.bin.
 
* In little-endian format.
 
* In little-endian format.
  
Line 204: Line 204:
 
[[File:Snmp mib oid tree example.jpg | thumb | center | 900px]]
 
[[File:Snmp mib oid tree example.jpg | thumb | center | 900px]]
  
====Binary File <name>.bin====
+
====Binary File &lt;name&gt;.bin====
* The corresponding binary file is <name>.bin and it has data describe in  table below:
+
* The corresponding binary file is &lt;name&gt;.bin and it has data describe in  table below:
** '''oid''' is <oid> fields.
+
** '''oid''' is &lt;oid&gt; fields.
** '''info''' is <nodeInfo> fields.
+
** '''info''' is &lt;nodeInfo&gt; fields.
 
** '''dist''' is [distantSiblingOffset]/[siblingOffset] fields.
 
** '''dist''' is [distantSiblingOffset]/[siblingOffset] fields.
 
** '''id''' is [id] fields.
 
** '''id''' is [id] fields.
 
** '''type''' is [dataType] fields.
 
** '''type''' is [dataType] fields.
** '''index''' is index fields of sequence, include [{index_number} , {<IndexCount>, <IndexNodeInfo>, <indexDataType>, ...}].
+
** '''index''' is index fields of sequence, include [{index_number} , {&lt;IndexCount&gt;, &lt;IndexNodeInfo&gt;, &lt;indexDataType&gt;, ...}].
  
 
[[File:Snmp mib binary example.jpg | thumb | center | 900px]]
 
[[File:Snmp mib binary example.jpg | thumb | center | 900px]]
  
* The detail description of <name>.bin is illustrated in the diagram below:
+
* The detail description of &lt;name&gt;.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.
Line 221: Line 221:
 
[[File:Snmp mib binary detail example.jpg | thumb | center | 900px]]
 
[[File:Snmp mib binary detail example.jpg | thumb | center | 900px]]
  
====Binary File <name>_trap.bin====
+
====Binary File &lt;name&gt;_trap.bin====
* The corresponding binary file is <name>_trap.bin and it has data describe in  table below:
+
* The corresponding binary file is &lt;name&gt;_trap.bin and it has data describe in  table below:
** '''enterp''' is <enterprise_oid> fields.
+
** '''enterp''' is &lt;enterprise_oid&gt; fields.
** '''sibl_ep''' is <sibling_enterprise> fields.
+
** '''sibl_ep''' is &lt;sibling_enterprise&gt; fields.
** '''index_ep''' is <enterprise_index> fields.
+
** '''index_ep''' is &lt;enterprise_index&gt; fields.
 
** '''spec_id''' is [specific_trap_number] fields.
 
** '''spec_id''' is [specific_trap_number] fields.
 
** '''sibl_sid''' is [sibling_specific_trap] fields.
 
** '''sibl_sid''' is [sibling_specific_trap] fields.
Line 243: Line 243:
 
** ASN.1 complex data types are used to build SNMP message are Sequence type, Sequence-of type.
 
** ASN.1 complex data types are used to build SNMP message are Sequence type, Sequence-of type.
  
===[http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBgQFjAA&url=http%3A%2F%2Fwww.itu.int%2FITU-T%2Fstudygroups%2Fcom17%2Flanguages%2FX.690-0207.pdf&rct=j&q=x.690-0207&ei=cde_TcrvJouMvQOm5-jABA&usg=AFQjCNGYmD4USBwcWoeHoRFZ3zdP39kosw&cad=rja=Basic Encoding Rules (BER)]===
+
===[http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBgQFjAA&amp;url=http%3A%2F%2Fwww.itu.int%2FITU-T%2Fstudygroups%2Fcom17%2Flanguages%2FX.690-0207.pdf&amp;rct=j&amp;q=x.690-0207&amp;ei=cde_TcrvJouMvQOm5-jABA&amp;usg=AFQjCNGYmD4USBwcWoeHoRFZ3zdP39kosw&amp;cad=rja=Basic Encoding Rules (BER)]===
 
* BER has three parts: Type, Length and Data field.
 
* BER has three parts: Type, Length and Data field.
 
   BER format:  
 
   BER format:  
Line 330: Line 330:
 
       |      |                |  (Integer)  |    (Octet String)    |          |
 
       |      |                |  (Integer)  |    (Octet String)    |          |
 
       +------+----------------+-------------+-----------------------+----------+
 
       +------+----------------+-------------+-----------------------+----------+
                               |<--------------------Length-------------------->|
+
                               |&lt;--------------------Length--------------------&gt;|
 
* Length is bytes of Data field (SNMP Version, SNMP Community String and SNMP PDU).
 
* Length is bytes of Data field (SNMP Version, SNMP Community String and SNMP PDU).
 
* SNMP Version is an integer that identifies the version of SNMP, SNMP version 1 = 0.
 
* SNMP Version is an integer that identifies the version of SNMP, SNMP version 1 = 0.
Line 353: Line 353:
 
   |      |        |        |        |        |      |        | 0x30 | Len 1 | OID 1 | Value 1 | 0x30 | Len 2 | OID 1 | Value 2 | ... |
 
   |      |        |        |        |        |      |        | 0x30 | Len 1 | OID 1 | Value 1 | 0x30 | Len 2 | OID 1 | Value 2 | ... |
 
   +------+--------+---------+---------+---------+------+--------+------+-------+-------+---------+------+-------+-------+---------+-----+
 
   +------+--------+---------+---------+---------+------+--------+------+-------+-------+---------+------+-------+-------+---------+-----+
                   |                                            |              |<-----Len 1----->|              |<-----Len 2----->|    |
+
                   |                                            |              |&lt;-----Len 1-----&gt;|              |&lt;-----Len 2-----&gt;|    |
                   |                                            |<-------------------------------Length-------------------------------->|
+
                   |                                            |&lt;-------------------------------Length--------------------------------&gt;|
                   |<----------------------------------------------Lenght PDU----------------------------------------------------------->|  
+
                   |&lt;----------------------------------------------Lenght PDU-----------------------------------------------------------&gt;|  
 
* PDU Type is specific type of PDU, PDU Type is a single byte identifier.
 
* PDU Type is specific type of PDU, PDU Type is a single byte identifier.
 
* Length Data is a number bytes of Data of SNMP PDU field.
 
* Length Data is a number bytes of Data of SNMP PDU field.
Line 377: Line 377:
 
* Varbind List is a Sequence of Varbinds.
 
* Varbind List is a Sequence of Varbinds.
 
** Varbind is a Sequence of two fields, an OID and the value of OID.
 
** Varbind is a Sequence of two fields, an OID and the value of OID.
*** OID is an Object Identifier that points to a particular parameter in the SNMP agent. The first two object identifier components in the object identifier value being encoded, using the formula: <font color=red>(X*40) + Y</font>; where X is the value of the first object identifier component and Y is the value of the second object identifier component. The first two object identifier components recognizes that only three values are allocated from the root node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1.
+
*** OID is an Object Identifier that points to a particular parameter in the SNMP agent. The first two object identifier components in the object identifier value being encoded, using the formula: &lt;font color=red&gt;(X*40) + Y&lt;/font&gt;; where X is the value of the first <span class="plainlinks">[http://www.thepiggybackrider.com/ <span style="color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;/*CITATION*/">kid carrier</span>]</span> object identifier component and Y is the value of the second object identifier component. The first two object identifier components recognizes that only three values are allocated from the root node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1.
 
*** Value is the value of OID.
 
*** Value is the value of OID.
 
   +--------------------+-----------------------------------------------------------------+
 
   +--------------------+-----------------------------------------------------------------+
Line 402: Line 402:
 
   |    |      |          |      |      |        |      |      |        |0x30| Len 1 | OID 1 | Value 1 |0x30| Len 2 | OID 1 | Value 2 | ... |
 
   |    |      |          |      |      |        |      |      |        |0x30| Len 1 | OID 1 | Value 1 |0x30| Len 2 | OID 1 | Value 2 | ... |
 
   +----+------+----------+-------+-------+--------+------+------+--------+----+-------+-------+---------+----+-------+-------+---------+-----+
 
   +----+------+----------+-------+-------+--------+------+------+--------+----+-------+-------+---------+----+-------+-------+---------+-----+
                           |                                              |            |<-----Len 1----->|            |<-----Len 2----->|    |
+
                           |                                              |            |&lt;-----Len 1-----&gt;|            |&lt;-----Len 2-----&gt;|    |
                           |                                              |<-----------------------------Length------------------------------>|
+
                           |                                              |&lt;-----------------------------Length------------------------------&gt;|
                           |<--------------------------------------------Lenght PDU----------------------------------------------------------->|
+
                           |&lt;--------------------------------------------Lenght PDU-----------------------------------------------------------&gt;|
 
* PDU type is TRAP PDU = 0xA4.
 
* PDU type is TRAP PDU = 0xA4.
 
* Length Data is a number bytes of Data of SNMP PDU field.  
 
* Length Data is a number bytes of Data of SNMP PDU field.  
Line 442: Line 442:
 
* Time stamp is the time elapsed between the last initialization of the network entity and the generation of the trap.
 
* Time stamp is the time elapsed between the last initialization of the network entity and the generation of the trap.
 
* Varbind List is a Sequence of Varbinds to be included in the trap.
 
* Varbind List is a Sequence of Varbinds to be included in the trap.
** Varbind is a Sequence of two fields, an OID and the value of OID. The OIDs for these variable bindings are often specific to the trap and therefore "underneath" the specific OID for the trap. But this isn't a requirement, and it's often useful to send bindings that aren't defined as part of the trap.  
+
** Varbind is a Sequence of two fields, an OID and the value of OID. The OIDs for these variable bindings are often specific to the trap and therefore &quot;underneath&quot; the specific OID for the trap. But this isn't a requirement, and it's often useful to send bindings that aren't defined as part of the trap.  
 
*** OID is an Object Identifier that points to a particular parameter in the SNMP agent.
 
*** OID is an Object Identifier that points to a particular parameter in the SNMP agent.
 
*** Value is the value of OID
 
*** Value is the value of OID
Line 449: Line 449:
 
====GetRequest PDU====
 
====GetRequest PDU====
 
* The example gets the value of name agent with above MIB file.
 
* The example gets the value of name agent with above MIB file.
* Community String is "public"
+
* Community String is &quot;public&quot;
 
   +---------+-----------+--------------------------------------------------------------------------------------------+-------------------+
 
   +---------+-----------+--------------------------------------------------------------------------------------------+-------------------+
 
   | SNMP    | Type      |                                              0x30                                        | Sequence          |
 
   | SNMP    | Type      |                                              0x30                                        | Sequence          |
Line 496: Line 496:
 
====TRAP PDU====
 
====TRAP PDU====
 
* The example TRAP above MIB file.
 
* The example TRAP above MIB file.
* Community String is "public"
+
* Community String is &quot;public&quot;
 
* Agent's IPAddress is 192.168.1.128
 
* Agent's IPAddress is 192.168.1.128
 
* Timestamp is 123456
 
* Timestamp is 123456
Line 560: Line 560:
 
* Example SNMP operations with net-snmp:
 
* Example SNMP operations with net-snmp:
 
   '''GetRequest command:'''
 
   '''GetRequest command:'''
   >> snmpget -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1
+
   &gt;&gt; snmpget -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1
 
   This command will send GetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   This command will send GetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object.  
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object.  
 
   The effect of this command will get the value of agent's devID .
 
   The effect of this command will get the value of agent's devID .
 
   '''GetNextRequest command:'''
 
   '''GetNextRequest command:'''
   >> snmpgetnext -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1
+
   &gt;&gt; snmpgetnext -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1
 
   This command will send GetNextRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   This command will send GetNextRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1 is OID.
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1 is OID.
 
   The effect of this command will get the value of agent's devID.
 
   The effect of this command will get the value of agent's devID.
 
   '''SetRequest command:'''
 
   '''SetRequest command:'''
   >> snmpset -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1 s "Hello"
+
   &gt;&gt; snmpset -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1 s &quot;Hello&quot;
 
   This command will send SetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   This command will send SetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option ''-v 1'') with community  
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object.  
 
   string is public (the option ''-c public''). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object.  
   The effect of this command will set the value of agent's devID to "Hello".
+
   The effect of this command will set the value of agent's devID to &quot;Hello&quot;.
 
   '''Receiving Traps'''
 
   '''Receiving Traps'''
 
   To receive Traps, snmptrapd.conf file must be configured and snmptrapd must be running.
 
   To receive Traps, snmptrapd.conf file must be configured and snmptrapd must be running.
Line 579: Line 579:
 
       disableAuthorization yes
 
       disableAuthorization yes
 
   The following command will receive and view trap
 
   The following command will receive and view trap
   >>snmptrapd -f -Le
+
   &gt;&gt;snmptrapd -f -Le

Revision as of 02:21, 27 September 2011

This wiki describe how to generate a MIB (Management Information Base) for SNMP agent.

Steps

  1. Create a ASN.1 MIB script foo.mib (an ASCII text file) for the tree structure.
  2. Convert foo.mib to binary file using mib2bin
  3. Build SNMP's PDU using BER (Base encoding rules) encoder and decoder library to process data that's transfer between NMS and agents.
  4. 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).
  5. Build binary MIB file reader library.
  6. Build functions service oid tree.
  7. Merge MIB ANS.1 file to NMS.


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 four 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 FAT32 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 FAT32 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 four 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 first-child to last-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 (e.g. 04 01 82 99 5D). Bit 8 of each octet indicates whether it is the last octet in the series: 
  If bit 8 of is zero, it is the last octet (e.g. 04, 01, 5D), otherwise, bit 8 is set to one (e.g. 82, 99).
  
  Bits 7 to 1 of the octets are used to encode the OID. Conceptually, these bits are concatenated to form an unsigned binary number whose most 
  significant bit (bit 7) of the first octet and the least significant bit (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] field

  • If this record is a leaf
    • [dataType] is type of leaf's data.
  • 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.

[dataLen], [data] fields

  • If this record is a leaf and has default data
    • [dataLen] is length of data.
    • [data] is data on string.

[{<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: 
     <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>. 
     <font color=blue>trapReceiverNumber (1)</font>, trapEnabled (2), trapReceiverIPAddress (3), <font color=blue>trapCommunity(4)</font>. 
  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

Binary File Format <name>_trap.bin

  • The binary file store TRAP information. It is generated by mib2bin tool. Agents will read binary file to get information of TRAP when something bad occurs.
  • In the binary file, An enterprise OID is stored first, followed by its first specific trap number and IDs of first specific trap (those IDs matche with IDs of leaf in <name>.bin; IDs are reference to OIDs of data bindings that be included in this trap) to last specific trap number and IDs of last specific trap. Next, the structure of next this enterprise OID is stored. This structure is repeated until all enterprise OID in MIB file is stored.
  • The format of enterprise in <name>_trap.bin
  <enterprise_oid><sibling_enterprise><enterprise_index>[specific_trap_number][sibling_specific_trap][number_varbinds][id_varbind]...
  • where:
    • fields indicated by angle brackets (< >) are always present.
    • fields in square brackets ([ ]) are optional depending on characteristics of the trap.

<enterprise_oid> field

  • Enterprise oid is full oid of enterprise trap that want to send in MIB file.
  • The format of enterprise oid.
  <sub_oid> <info_sub_oid> ... 
  • where:
    • <font color=red><sub_oid>:</font> is same format of <oid> field in MIB file.
    • <font color=red><info_sub_oid>:</font> Information of sub_oid.
  <info_sub_oid> format:
     bit        when (set = 1)
     0          the first sub_oid in enterprise
     1          no use
     2          no use
     3          no use
     4          sub_oid is a parent
     5          no use
     6          no use
     7          the last sub_oid in enterprise
  • If <sub_oid> == BYTE (0x00) and <info_sub_oid> == BYTE(0xFF), this is the end of infomation traps.

<sibling_enterprise> field

  • Point to next enterprise OID.
  • In little-endian format.

<enterprise_index> field

  • Index of enterprise OID traps in <name>_trap.bin file.
  • Size of <enterprise_index> is 1 byte.

[specific_trap_number] field

  • If the trap is sent is specific trap, specific trap number is a number indicting specific trap.
  • specific trap number is integer in little-endian format.

[sibling_specific_trap] field

  • Point to next specific trap.
  • In little-endian format.

[number_varbinds] field

  • A number of data bindings to be included in the specific trap.
  • Size of [number_varbinds] is 1 byte.

[id_varbind] field

  • [id_varbind] define data bindings (OID and value of OID leaf) that is included specific trap.
  • [id_varbind] is reference to id of the leaf oid in <name>.bin.
  • In little-endian format.

Example

OID Tree

  • An example OID tree is given below:
Snmp mib oid tree example.jpg

Binary File <name>.bin

  • The corresponding binary file is <name>.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.
    • type is [dataType] fields.
    • index is index fields of sequence, include [{index_number} , {<IndexCount>, <IndexNodeInfo>, <indexDataType>, ...}].
Snmp mib binary example.jpg
  • The detail description of <name>.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.
Snmp mib binary detail example.jpg

Binary File <name>_trap.bin

  • The corresponding binary file is <name>_trap.bin and it has data describe in table below:
    • enterp is <enterprise_oid> fields.
    • sibl_ep is <sibling_enterprise> fields.
    • index_ep is <enterprise_index> fields.
    • spec_id is [specific_trap_number] fields.
    • sibl_sid is [sibling_specific_trap] fields.
    • num_var is [number_varbinds] fields.
    • id_var is [id_varbind] fields.
Snmp mib binary trap example.jpg

SNMP's PDU using BER

  • SNMP is the protocol that allows communicate between NMS and agents by exchanging SNMP messages. the SNMP message is a single field, of the Sequence type. SNMP message use data types specified by ASN.1 and use Basic Encoding Rules (BER) to encode data. The entire SNMP message is a Sequence of three smaller fields: the SNMP Version (Integer), the SNMP Community String (Octet String), and the SNMP PDU.
  • The SNMP's PDU is reference to SNMP version 1 (SNMPv1) PDU.
  • SNMPv1 PDU have five different PDU types:GetRequest, GetNextRequest, GetResponse, SetRequest and Trap.
  • Get Request, GetNext Request, Get Response, Set Request are same format PDU. Trap use other format PDU.

ASN.1 data types

  • ASN.1 data types fall into two categories: primitive and complex.
  • ASN.1 data types is used to build SNMP messages.
    • ASN.1 primitive data types include Integer, Octet (byte, character) String, Null, Boolean and Object Identifier.
    • ASN.1 complex data types are used to build SNMP message are Sequence type, Sequence-of type.

Encoding Rules (BER)

  • BER has three parts: Type, Length and Data field.
  BER format: 
     +------+--------+------+
     | Type | Length | Data |
     +------+--------+------+
  • Type field is single byte identifier.
  Constructing byte Data type.
  Format of byte Data type
     +--+-+-----+
     |  | |     +
     +--+-+-----+
      2  1   5
  Bits 8 and 7 shall be encoded to represent the class of Data type follow table:
     +------------------+-------+-------+
     |      Class       | Bit 8 | Bit 7 |
     +------------------+-------+-------+
     | Universal        |   0   |   0   |
     | Application      |   0   |   1   |
     | Context-specific |   1   |   0   |
     | Private          |   1   |   1   |
     +------------------+-------+-------+
  Bit 6 is encoded data is Primitive or Constructed follow table:
     +-------+-------------+
     | Bit 6 |   Type      |
     +-------+-------------+
     |   0   | Primitive   |
     |   1   | Constructed |
     +-------+-------------+ 
  Bits 5 to 1 encode the number of Data type as a integer number.     
  Data type identifier in SNMP
     Data type                 Identifier      Note
     Integer                      0x02         Primitive ASN.1 types
     Octet String                 0x04         Primitive ASN.1 types  
     Null                         0x05         Primitive ASN.1 types
     Object identifier            0x06         Primitive ASN.1 types
     Sequence                     0x30         Constructed ASN.1 types
     IpAddress                    0x40         Primitive SNMP application types
     Counter                      0x41         Primitive SNMP application types
     Gauge                        0x42         Primitive SNMP application types
     TimeTicks                    0x43         Primitive SNMP application types 
     Opaque                       0x44         Primitive SNMP application types
     NsapAddress                  0x45         Primitive SNMP application types
     GetRequest PDU               0xA0         Context-specific Constructed SNMP types
     GetNextRequest PDU           0xA1         Context-specific Constructed SNMP types
     GetResponse PDU              0xA2         Context-specific Constructed SNMP types
     SetRequest PDU               0xA3         Context-specific Constructed SNMP types
     Trap PDU                     0xA4         Context-specific Constructed SNMP types
  • Length field is the number of bytes in Data field.
    • Length field is used either the short form or the long form as a option depend on Data field.
      • The short form, Length field is a single octet in which bit 8 is zero and bits 7 to 1 encode the number of bytes in Data field, as an unsigned binary integer with bit 7 as the most significant bit.
      • The long form, Length field shall consists of an initial octet and one or more subsequent octets.
        • The initial octet is encoded as follows:
          • Bit 8 shall be one.
          • Bits 7 to 1 shall encode the number of subsequent octets in the length field, as an unsigned binary integer with bit 7 as the most significant bit.
          • The value 0xFF shall not be used.
        • Subsequent octets:
          • From the first subsequent octet to the last subsequent octet, shall be the encoding of an unsigned binary integer equal to the number bytes in Data field, with bit 8 of the first subsequent octet as the most significant bit.
  • Data field is actual data content.
  • Example:
  Actual Data is an integer, the value 100 can be encode as:
  The short form:
     +------+--------+-------+
     | Type | Length | Data  |
     +------+--------+-------+
     | 0x02 |  0x01  | 0x64  |
     +------+--------+-------+
  The long form:
     +------+-----------+-------+
     | Type |  Length   | Data  |
     +------+-----------+-------+
     | 0x02 | 0x81 0x01 | 0x64  |
     +------+-----------+-------+

SNMP Message Format

  • SNMP Message is a Sequence of three smaller fields: the SNMP Version (Integer), the SNMP Community String (Octet String), and the SNMP PDU.
  SNMP Message Format use BER.
     +------------------------------------------------------------------------+
     |                      SNMP Message (Sequence type)                      |
     +------+----------------+------------------------------------------------+
     | Type | Length of Data |                      Data                      |
     +------+----------------+-------------+-----------------------+----------+
     | 0x30 |     Length     |SNMP Version | SNMP Community String | SNMP PDU |                      
     |      |                |  (Integer)  |    (Octet String)     |          |
     +------+----------------+-------------+-----------------------+----------+
                             |<--------------------Length-------------------->|
  • Length is bytes of Data field (SNMP Version, SNMP Community String and SNMP PDU).
  • SNMP Version is an integer that identifies the version of SNMP, SNMP version 1 = 0.
  • SNMP Community String is an Octet String to add security to Agents.
  • SNMP PDU is a SNMP verion 1 (SNMPv1) PDU.

SNMP PDU Format

  • SNMP PDU is is reference to SNMP version 1 (SNMPv1) PDU.

GetRequest PDU, GetNextRequest PDU, GetResponse PDU, SetRequest PDU Format

  • GetRequest PDU, GetNextRequest PDU, GetResponse PDU, SetRequest PDU Format is shown here.
  +-------------------------------------------------------------------------------------------------------------------------------------+
  |                               SNMPv1 PDU (GetRequest, GetNextRequest, GetResponse, SetRequest                                       |
  +------+--------+---------------------------------------------------------------------------------------------------------------------+
  | PDU  | Length |                                             Data of SNMP PDU                                                        |
  | type |  Data  |                                                                                                                     |
  +------+--------+---------+---------+---------+---------------------------------------------------------------------------------------+
  | PDU  | Length | Request | Error   | Error   |                             VarBind List (Sequence)                                   |
  | type |  PDU   |   ID    | Status  | Index   +------+--------+--------------------------------+--------------------------------+-----+
  |      |        |         |         |         | 0x30 | Length |           Varbind 1            |           Varbind 2            | ... |
  |      |        |(Integer)|(Integer)|(Integer)|      |        |          (Sequence)            |          (Sequence)            | ... | 
  |      |        |         |         |         |      |        +------+-------+-------+---------+------+-------+-------+---------+-----+
  |      |        |         |         |         |      |        | 0x30 | Len 1 | OID 1 | Value 1 | 0x30 | Len 2 | OID 1 | Value 2 | ... |
  +------+--------+---------+---------+---------+------+--------+------+-------+-------+---------+------+-------+-------+---------+-----+
                  |                                             |              |<-----Len 1----->|              |<-----Len 2----->|     |
                  |                                             |<-------------------------------Length-------------------------------->|
                  |<----------------------------------------------Lenght PDU----------------------------------------------------------->| 
  • PDU Type is specific type of PDU, PDU Type is a single byte identifier.
  • Length Data is a number bytes of Data of SNMP PDU field.
  • Data of SNMP PDU is data content in SNMP PDU.
  • Request ID is an Integer that identifies a particular SNMP request. This index is echoed back in the response from the SNMP agent, allowing the SNMP manager to match an incoming response to the appropriate request.
  • Error Status is an Integer set to 0x00 in the request sent by the NMS. The SNMP agent places an error code in this field in the response message if an error occurred processing the request.
  Some error codes include:
  +-------------------+---------------------------------------------------------------------------+
  |    Error Status   |                                                                           |
  +------------+------+                                Description                                |
  |    Name    | Code |                                                                           |
  +------------+------+---------------------------------------------------------------------------+
  | noError    | 0x00 | No error occurred.                                                        |
  | tooBig     | 0x01 | The response to your request was too big to fit into one response.        |
  | noSuchName | 0x02 | The OID in the request was not found.the OID doesn't exist.               |
  | badValue   | 0x03 | A data type in the request did not match the data type in the SNMP agent. |
  | readOnly   | 0x04 | The SNMP manager attempted to set a read-only parameter.                  |
  | genErr     | 0x05 | General Error (some error other than the ones listed above).              |
  +------------+------+---------------------------------------------------------------------------+
  • Error Index is an Integer. Only the response operation sets this field, if an Error occurs, the Error Index holds a pointer to the Object that caused the error. Other operations set this field to zero.
  • Varbind List is a Sequence of Varbinds.
    • Varbind is a Sequence of two fields, an OID and the value of OID.
      • OID is an Object Identifier that points to a particular parameter in the SNMP agent. The first two object identifier components in the object identifier value being encoded, using the formula: <font color=red>(X*40) + Y</font>; where X is the value of the first kid carrier object identifier component and Y is the value of the second object identifier component. The first two object identifier components recognizes that only three values are allocated from the root node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1.
      • Value is the value of OID.
  +--------------------+-----------------------------------------------------------------+
  |    SNMP PDU type   |                            Value                                |
  +--------------------+-----------------------------------------------------------------+
  | SetRequest PDU     | Value is applied to the specified OID of the SNMP agent.        |
  | GetRequest PDU     | Value is a Null that acts as a placeholder for the return data. |
  | GetNextRequest PDU | Value is a Null that acts as a placeholder for the return data. |
  | GetResponse PDU    | The returned Value from the specified OID of the SNMP agent.    |
  +--------------------+-----------------------------------------------------------------+

Trap PDU Format

  • The format of the Trap PDU is shown below:
  +------------------------------------------------------------------------------------------------------------------------------------------+
  |                                                         TRAP SNMPv1 PDU                                                                  |
  +----+------+------------------------------------------------------------------------------------------------------------------------------+
  |PDU |Length|                                             Data of SNMP PDU                                                                 |
  |type| Data |                                                                                                                              |
  +----+------+----------+-------+-------+--------+------+---------------------------------------------------- ------------------------------+
  |0xA4|Length|Enterprise| Agent |Generic|Specific|Time  |                                VarBind List (Sequence)                            |
  |    | PDU  |   OID    |Address| Trap  |  Trap  |Stamp +------+--------+------------------------------+------------------------------+-----+
  |    |      |          |       | Type  | Number |      | 0x30 | Length |           Varbind 1          |         Varbind 22           | ... |
  |    |      |  (OID)   |       |       |        |      |      |        |          (Sequence)          |         (Sequence)           | ... |
  |    |      |          |       |       |        |      |      |        +----+-------+-------+---------+----+-------+-------+---------+-----+
  |    |      |          |       |       |        |      |      |        |0x30| Len 1 | OID 1 | Value 1 |0x30| Len 2 | OID 1 | Value 2 | ... |
  +----+------+----------+-------+-------+--------+------+------+--------+----+-------+-------+---------+----+-------+-------+---------+-----+
                         |                                               |            |<-----Len 1----->|            |<-----Len 2----->|     |
                         |                                               |<-----------------------------Length------------------------------>|
                         |<--------------------------------------------Lenght PDU----------------------------------------------------------->|
  • PDU type is TRAP PDU = 0xA4.
  • Length Data is a number bytes of Data of SNMP PDU field.
  • Enterprise OID identifies the type of managed object generating the trap.
  • Agent Address is the IP address of the agent that is sending the trap.
  • Generic Trap Type indicates one of a number of generic trap types.
  Generic Trap Type has seven values are defined: 
  +------------------------------+---------------------------------------------------------------------------+
  |       Generic Trap Type      |                                                                           |
  +-----------------------+------+                                Description                                |
  |         Name          | Code |                                                                           |
  +-----------------------+------+---------------------------------------------------------------------------+
  | coldStart             | 0x00 | Indicates that the agent has rebooted. All management variables will be   |
  |                       |      | reset; specifically, Counters and Gauges will be reset to zero (0).       |
  +-----------------------+------+---------------------------------------------------------------------------+
  | warmStart             | 0x01 | Indicates that the agent has reinitialized itself. None of the management |
  |                       |      | variables will be reset.                                                  |
  +-----------------------+------+---------------------------------------------------------------------------+
  | linkDown              | 0x02 | Sent when an interface on a device goes down. The first variable binding  |
  |                       |      | identifies which interface went down.                                     |
  +-----------------------+------+---------------------------------------------------------------------------+
  | linkUp                | 0x03 | Sent when an interface on a device comes back up. The first variable      | 
  |                       |      | binding identifies which interface came back up.                          |
  +-----------------------+------+---------------------------------------------------------------------------+
  | authenticationFailure | 0x04 | Indicates that someone has tried to query your agent with an incorrect    |
  |                       |      | community string; useful in determining if someone is trying to gain      |
  |                       |      | unauthorized access to one of your devices.                               |
  +-----------------------+------+---------------------------------------------------------------------------+
  | egpNeighborLoss       | 0x05 | Indicates that an Exterior Gateway Protocol (EGP) neighbor has gone down. |
  +-----------------------+------+---------------------------------------------------------------------------+
  | enterpriseSpecific    | 0x06 | Indicates that the trap is enterprise-specific. SNMP vendors and users    |
  |                       |      | define their own traps under the private-enterprise branch of the SMI     |
  |                       |      | object tree. To process this trap properly, the NMS has to decode the     |
  |                       |      | specific trap number that is part of the SNMP message.                    |
  +-----------------------+------+---------------------------------------------------------------------------+
  • Specific trap number is a number indicating the specific trap you want to send. If you're sending a generic trap, this parameter is ignored -- you're probably better off setting it to zero.
  • Time stamp is the time elapsed between the last initialization of the network entity and the generation of the trap.
  • Varbind List is a Sequence of Varbinds to be included in the trap.
    • Varbind is a Sequence of two fields, an OID and the value of OID. The OIDs for these variable bindings are often specific to the trap and therefore "underneath" the specific OID for the trap. But this isn't a requirement, and it's often useful to send bindings that aren't defined as part of the trap.
      • OID is an Object Identifier that points to a particular parameter in the SNMP agent.
      • Value is the value of OID

Example SNMP Message

GetRequest PDU

  • The example gets the value of name agent with above MIB file.
  • Community String is "public"
  +---------+-----------+--------------------------------------------------------------------------------------------+-------------------+
  | SNMP    | Type      |                                               0x30                                         | Sequence          |
  | message +-----------+--------------------------------------------------------------------------------------------+-------------------+
  |         |Length     |                                               0x2B                                         | Length: 43        |
  |         +-----------+--------------------------------------------------------------------------------------------+-------------------+
  |         | Version   |                                               0x02                                         | Integer           |
  |         |           |                                               0x01                                         | Length: 1         |
  |         |           |                                               0x00                                         | Value: 0          |
  |         +-----------+--------------------------------------------------------------------------------------------+-------------------+
  |         | Community |                                               0x04                                         | Octet String      |
  |         |           |                                               0x06                                         | Length: 6         |
  |         |           |                                               0x70 0x75 0x62 0x6C 0x69 0x63                | Value: public     |
  |         +-----------+ -------+--------------+--------------------------------------------------------------------+-------------------+
  |         | Data      | SNMPv1 | PDU type     |                       0xA0                                         | GetRequest PDU    |
  |         |           | PDU    +--------------+--------------------------------------------------------------------+-------------------+
  |         |           |        | PDU length   |                       0x1E                                         | Length: 30        |
  |         |           |        + -------------+--------------------------------------------------------------------+-------------------+
  |         |           |        | Request ID   |                       0x02                                         | Integer           |
  |         |           |        |              |                       0x04                                         | Length: 4         |
  |         |           |        |              |                       0x37 0x9C 0x57 0x89                          | Value:            |
  |         |           |        + -------------+--------------------------------------------------------------------+-------------------+
  |         |           |        | Error Status |                       0x02                                         | Integer           |
  |         |           |        |              |                       0x01                                         | Length: 1         |
  |         |           |        |              |                       0x00                                         | Value: 0          |
  |         |           |        + -------------+--------------------------------------------------------------------+-------------------+
  |         |           |        | Error Index  |                       0x02                                         | Integer           |
  |         |           |        |              |                       0x01                                         | Length: 1         |
  |         |           |        |              |                       0x00                                         | Value: 0          |
  |         |           |        + -------------+--------------------------------------------------------------------+-------------------+
  |         |           |        | VarBind List |                       0x30                                         | Sequence          |
  |         |           |        |              +-----------+--------------------------------------------------------+-------------------+
  |         |           |        |              | Length    |           0x10                                         | Length: 16        |
  |         |           |        |              +-----------+--------------------------------------------------------+ ------------------+
  |         |           |        |              | VarBind 1 |           0x30                                         | Sequence          |
  |         |           |        |              |           +---------+----------------------------------------------+-------------------+
  |         |           |        |              |           | Len 1   | 0x0E                                         | Length: 14        |
  |         |           |        |              |           +---------+----------------------------------------------+-------------------+
  |         |           |        |              |           | OID 1   | 0x06                                         | Object identifier |
  |         |           |        |              |           |         | 0x0A                                         | Length: 10        |
  |         |           |        |              |           |         | 0x2B 0x06 0x01 0x04 0x01 0x82 0x99 0x5D 0x02 | Value:            |
  |         |           |        |              |           +---------+----------------------------------------------+-------------------+
  |         |           |        |              |           | Value 1 | 0x05                                         | NULL              |
  |         |           |        |              |           |         | 0x00                                         | Length: 0         |
  +---------+-----------+--------+--------------+-----------+---------+----------------------------------------------+-------------------+

TRAP PDU

  • The example TRAP above MIB file.
  • Community String is "public"
  • Agent's IPAddress is 192.168.1.128
  • Timestamp is 123456
  • The operMasterControl OID is in TRAP that has value is 1
  +---------+-----------+-------------------------------------------------------------------------------------------------------+-------------------+
  | SNMP    | Type      |                                           0x30                                                        |Sequence           |
  | message +-----------+-------------------------------------------------------------------------------------------------------+-------------------+
  |         | Length    |                                           0x82 0x00 0x44                                              |Length: 68         |
  |         +-----------+-------------------------------------------------------------------------------------------------------+-------------------+
  |         | Version   |                                           0x02                                                        |Integer            |
  |         |           |                                           0x01                                                        |Length: 1          |
  |         |           |                                           0x00                                                        |Value: 0           |
  |         +-----------+-------------------------------------------------------------------------------------------------------+-------------------+
  |         | Community |                                           0x04                                                        |Octet String       |
  |         |           |                                           0x06                                                        |Length: 6          |
  |         |           |                                           0x70 0x75 0x62 0x6C 0x69 0x63                               |Value: public      |
  |         +-----------+ -------+------------+---------------------------------------------------------------------------------+-------------------+
  |         | Data      | SNMPv1 | PDU type   |                     0xA4                                                        |TRAP PDU           |
  |         |           | PDU    +------------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | PDU length |                     0x82 0x00 0x35                                              |Length: 53         |
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | Enterprise |                     0x06                                                        |Object identifier  |
  |         |           |        | OID        |                     0x09                                                        |Length: 9          |
  |         |           |        |            |                     0x2B 0x06 0x01 0x04 0x01 0x82 0x99 0x5D 0x00                |Value:             |
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | Agent      |                     0x40                                                        |IpAddress          |
  |         |           |        | Address    |                     0x04                                                        |Length: 4          |
  |         |           |        |            |                     0xC0 0xA8 0x01 0x80                                         |Value:192.168.1.128|
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | Generic    |                     0x02                                                        |Integer            |
  |         |           |        | Trap Type  |                     0x01                                                        |Length: 1          |
  |         |           |        |            |                     0x06                                                        |Value: 6           |
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | Specific   |                     0x02                                                        |Integer            |
  |         |           |        | Trap       |                     0x01                                                        |Length: 1          |
  |         |           |        | Number     |                     0x01                                                        |Value: 1           |
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | Time       |                     0x43                                                        |TimeTicks          |
  |         |           |        | Stamp      |                     0x03                                                        |Length: 3          |
  |         |           |        |            |                     0x01 0xE2 0x40                                              |Value: 123456      |
  |         |           |        + -----------+---------------------------------------------------------------------------------+-------------------+
  |         |           |        | VarBind    |                     0x30                                                        |Sequence           |
  |         |           |        | List       +-----------+---------------------------------------------------------------------+-------------------+
  |         |           |        |            | Length    |         0x82 0x00 0x15                                              |Length: 21         |
  |         |           |        |            +-----------+---------------------------------------------------------------------+ ------------------+
  |         |           |        |            | VarBind 1 |         0x30                                                        |Sequence           |
  |         |           |        |            |           +-------+-------------------------------------------------------------+-------------------+
  |         |           |        |            |           | Len 1 | 0x82 0x00 0x11                                              |Length: 17         |
  |         |           |        |            |           +-------+-------------------------------------------------------------+-------------------+
  |         |           |        |            |           | OID 1 | 0x06                                                        |Object identifier  |
  |         |           |        |            |           |       | 0x0C                                                        |Length: 12         |
  |         |           |        |            |           |       | 0x2B 0x06 0x01 0x04 0x01 0x82 0x99 0x5D 0x03 0x01 0x01 0x01 |Value:             |
  |         |           |        |            |           +-------+-------------------------------------------------------------+-------------------+
  |         |           |        |            |           | Value | 0x02                                                        |Integer            |
  |         |           |        |            |           | 1     | 0x01                                                        |Length: 1          |
  |         |           |        |            |           |       | 0x01                                                        |Length: 1          |
  +---------+-----------+--------+------------+-----------+-------+-------------------------------------------------------------+-------------------+

SNMP operations

  • NMS uses GetRequest command to retrieve the value of objects from agents. Objects that is defined by object identifier in MIB file. It is possible for an NMS to get more than one object at a time. The agent receives the request and processes it. After that, it sends GetResponse back to NMS with current value of objects.
  • NMS uses GetNextRequest command to discover available objects and the value of these objects from agents. The GetNextRequest command traverses a subtree in lexicographic order. Based on the OIDs in GetNextRequest PDU, it's easy for an agent to start at the root of its SMI object tree and work its way down until it finds the OID it is looking for. After the agent found avaible objects, it sends GetResponse back to NMS with current value of objects.
  • NMS uses SetRequest command to change the value of objects from agents. After the agent processes SetRequest, it send GetResponse back to NMS with new value of objects (value of objects that get from SetRequest).
  • The agent sends Trap to NMS when agent's something bad operation conditions. No repspone is sent from the NMS to the agent when NMS receives Trap.
  • Example SNMP operations with net-snmp:
  GetRequest command:
  >> snmpget -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1
  This command will send GetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option -v 1) with community 
  string is public (the option -c public). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object. 
  The effect of this command will get the value of agent's devID .
  GetNextRequest command:
  >> snmpgetnext -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1
  This command will send GetNextRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option -v 1) with community 
  string is public (the option -c public). In above demo MIB file, 1.3.6.1.4.1.36061.1 is OID.
  The effect of this command will get the value of agent's devID.
  SetRequest command:
  >> snmpset -v 1 -c public 192.168.1.128 1.3.6.1.4.1.36061.1.1 s "Hello"
  This command will send SetRequest to the agent (IP address of agent is 192.186.1.128). The SNMP is SNMPv1 (the option -v 1) with community 
  string is public (the option -c public). In above demo MIB file, 1.3.6.1.4.1.36061.1.1 is OID reference to devID object. 
  The effect of this command will set the value of agent's devID to "Hello".
  Receiving Traps
  To receive Traps, snmptrapd.conf file must be configured and snmptrapd must be running.
  The easiest way to configure this is by adding this line to snmptrapd.conf file:
     disableAuthorization yes
  The following command will receive and view trap
  >>snmptrapd -f -Le