





Network Working Group                                          B. Wijnen
Request for Comments: 2089                                           IBM
Category: Informational                                          D. Levi
                                                      SNMP Research, Inc
                                                            January 1997

                                 V2ToV1
                       Mapping SNMPv2 onto SNMPv1
                     within a bi-lingual SNMP agent

Status of this Memo

   This memo provides information for the Internet community.  This memo
   does not specify an Internet standard of any kind.  Distribution of
   this memo is unlimited.

Abstract

   The goal of this memo is to document a common way of mapping an
   SNMPv2 response into an SNMPv1 response within a bi-lingual SNMP
   agent (one that supports both SNMPv1 and SNMPv2).

Table of Contents

     1.0  Introduction  . . . . . . . . . . . . . . . . . . . . . . .  2
     2.0  Mapping SNMPv2 into SNMPv1  . . . . . . . . . . . . . . . .  2
     2.1  Mapping SNMPv2 error-status into SNMPv1 error-status  . . .  3
     2.2  Mapping SNMPv2 exceptions into SNMPv1   . . . . . . . . . .  3
     2.3  Mapping noSuchObject and noSuchInstance   . . . . . . . . .  4
     2.4  Mapping endOfMibView  . . . . . . . . . . . . . . . . . . .  5
     2.5  Mapping SNMPv2 SMI into SNMPv1  . . . . . . . . . . . . . .  5
     3.0  Processing SNMPv1 requests  . . . . . . . . . . . . . . . .  6
     3.1  Processing an SNMPv1 GET request  . . . . . . . . . . . . .  6
     3.2  Processing an SNMPv1 GETNEXT request  . . . . . . . . . . .  7
     3.3  Processing an outgoing SNMPv2 trap  . . . . . . . . . . . .  8
     4.0  Acknowledgements  . . . . . . . . . . . . . . . . . . . . . 10
     5.0  References  . . . . . . . . . . . . . . . . . . . . . . . . 10
     6.0  Security Considerations   . . . . . . . . . . . . . . . . . 10
     7.0  Authors' Addresses  . . . . . . . . . . . . . . . . . . . . 11
     Appendix A.  Background Information  . . . . . . . . . . . . .   12
     A.1  Mapping of error-status Values  . . . . . . . . . . . . .   12
     A.2  SNMPv1 traps without Counter64 varBinds.  . . . . . . . .   12









Wijnen & Levi                Informational                      [Page 1]

RFC 2089                         V2toV1                     January 1997


1.0  Introduction

   We now have the SNMPv1 protocol (RFC1157 [1]) as a full standard and
   the SNMPv2 protocol (RFC1905 [1]) as a DRAFT standard.  It can be
   expected that many agent implementations will support both SNMPv1 and
   SNMPv2 requests coming from SNMP management entities.  In many cases
   the underlying instrumentation will be implemented using the new
   SNMPv2 SMI and SNMPv2 protocol.  The SNMP engine then gets the task
   to ensure that any SNMPv2 response data coming from such SNMPv2
   compliant instrumentation gets converted to a proper SNMPv1 response
   if the original request came in as an SNMPv1 request.  The SNMP
   engine should also deal with mapping SNMPv2 traps which are generated
   by an application or by the SNMPv2 compliant instrumentation into
   SNMPv1 traps if the agent has been configured to send traps to an
   SNMPv1 manager.

   It seems beneficial if all such agents do this mapping in the same
   way. This document describes such a mapping based on discussions and
   perceived consensus on the various mailing lists.  The authors of
   this document have also compared their own implementations of these
   mappings. They had a few minor differences and decided to make their
   implementation behave the same and document this mapping so others
   can benefit from it.

   We recommend that all agents implement this same mapping.

   Note that the mapping described in this document should also be
   followed by SNMP proxies that provide a mapping between SNMPv1
   management applications and SNMPv2 agents.

2.0  Mapping SNMPv2 into SNMPv1

   These are the type of mappings that we need:

     o   Mapping of the SNMPv2 error-status into SNMPv1 error-status

     o   Mapping of the SNMPv2 exceptions into SNMPv1 error-status

     o   Skipping object instances that have a non-SNMPv1 Syntax
         (specifically Counter64)

     o   Mapping of SNMPv2 traps into SNMPv1 traps









Wijnen & Levi                Informational                      [Page 2]

RFC 2089                         V2toV1                     January 1997


2.1  Mapping SNMPv2 error-status into SNMPv1 error-status

   With the new SNMPv2 protocol (RFC1905 [1]) we get a set of error-
   status values that return the cause of an error in much more detail.
   But an SNMPv1 manager does not understand such error-status values.

   So, when the instrumentation code returns response data and uses an
   SNMPv2 error-status to report on the success or failure of the
   requested operation and if the original SNMP request is an SNMPv1
   request, then we must map such an error-status into an SNMPv1 error-
   status when composing the SNMP response PDU.

   The SNMPv2 error status is mapped to an SNMPv1 error-status using
   this table:

             SNMPv2 error-status    SNMPv1 error-status
             ===================    ===================
             noError                noError
             tooBig                 tooBig
             noSuchName             noSuchName
             badValue               badValue
             readOnly               readOnly
             genErr                 genErr
             wrongValue             badValue
             wrongEncoding          badValue
             wrongType              badValue
             wrongLength            badValue
             inconsistentValue      badValue
             noAccess               noSuchName
             notWritable            noSuchName
             noCreation             noSuchName
             inconsistentName       noSuchName
             resourceUnavailable    genErr
             commitFailed           genErr
             undoFailed             genErr
             authorizationError     noSuchName

2.2  Mapping SNMPv2 exceptions into SNMPv1

   In SNMPv2 we have so called exception values. These will allow an
   SNMPv2 response PDU to return as much management information as
   possible, even if one or more of the requested variables do not
   exist.  SNMPv1 does not support exception values, and thus does not
   return the value of management information when any error occurs.

   When multiple variables do not exist, an SNMPv1 agent can return only
   a single error and index of a single variable.  The agent determines
   by its implementation strategy which variable to identify as the



Wijnen & Levi                Informational                      [Page 3]

RFC 2089                         V2toV1                     January 1997


   cause of the error via the value of the error-index field. Thus, an
   SNMPv1 manager may make no assumption on the validity of the other
   variables in the request.

   So, when an SNMPv1 request is received, we must check the varBinds
   returned from SNMPv2 compliant instrumentation for exception values,
   and convert these exception values into SNMPv1 error codes.

   The type of exception we can get back and the action we must take
   depends on the SNMP operation that is requested.

     o   For SNMP GET requests we can get back noSuchObject and
         noSuchInstance.

     o   For SNMP GETNEXT requests we can get back endOfMibView.

     o   For SNMP SET requests we cannot get back any exceptions.

     o   For SNMP GETBULK requests we can get back endOfMibView, but
         such a request should only come in as an SNMPv2 request, so we
         do not have to worry about any mapping onto SNMPv1.  If a
         GETBULK comes in as an SNMPv1 request, it is treated as an
         error and the packet is dropped.

2.3  Mapping noSuchObject and noSuchInstance

   A noSuchObject or noSuchInstance exception generated by SNMPv2
   compliant instrumentation indicates that the requested object
   instance can not be returned.  The SNMPv1 error code for this
   condition is noSuchName, and so the error-status field of the
   response PDU should be set to noSuchName.  Also, the error-index
   field is set to the index of the varBind for which an exception
   occurred, and the varBind list from the original request is returned
   with the response PDU.

   Note that when the response contains multiple exceptions, that the
   agent may pick any one to be returned.














Wijnen & Levi                Informational                      [Page 4]

RFC 2089                         V2toV1                     January 1997


2.4  Mapping endOfMibView

   When SNMPv2 compliant instrumentation returns a varBind containing an
   endOfMibView exception in response to a GETNEXT request, it indicates
   that there are no object instances available which lexicographically
   follow the object in the request. In an SNMPv1 agent, this condition
   normally results in a noSuchName error, and so the error-status field
   of the response PDU should be set to noSuchName. Also, the error-
   index field is set to the index of the varBind for which an exception
   occurred, and the varBind list from the original request is returned
   with the response PDU.

   Note that when the response contains multiple exceptions, that the
   agent may pick any one to be returned.

2.5  Mapping SNMPv2 SMI into SNMPv1

   The SNMPv2 SMI (RFC1902 [2]) defines basically one new syntax that is
   problematic for SNMPv1 managers. That is the syntax Counter64.  All
   the others can be handled by SNMPv1 managers.

   The net impact on bi-lingual agents is that they should make sure
   that they never return a varBind with a Counter64 value to an SNMPv1
   manager.

   The best accepted practice is to consider such object instances
   implicitly excluded from the view.  So:

     o   On an SNMPv1 GET request, we return an error-status of
         noSuchName and the error-index is set to the varBind that
         causes this error.

     o   On an SNMPv1 GETNEXT request, we skip the object instance and
         fetch the next object instance that follows the one with a
         syntax of Counter64.

     o   Any SET request that has a varBind with a Counter64 value must
         have come from a SNMPv2 manager, and so it should not cause a
         problem.  If we do receive a Counter64 value in an SNMPv1 SET
         packet, it should result in an ASN.1 parse error since
         Counter64 is not valid in the SNMPv1 protocol. When an ASN.1
         parse error occurs, the counter snmpInASNParseErrs is
         incremented and no response is returned.

     o   The GETBULK is an SNMPv2 operation, so it should never come
         from an SNMPv1 manager.  If we do receive a GETBULK PDU from in
         an SNMPv1 packet, then we consider it an invalid PDU-type and
         we drop the packet.



Wijnen & Levi                Informational                      [Page 5]

RFC 2089                         V2toV1                     January 1997


3.0  Processing SNMPv1 requests

   This sections contains a step by step description of how to handle
   SNMPv1 requests in an agent where the underlying instrumentation code
   is SNMPv2 compliant.

3.1  Processing an SNMPv1 GET request

   First, the request is converted into a call to the underlying
   instrumentation. This is implementation specific.

   When such instrumentation returns response data using SNMPv2 syntax
   and error-status values, then:

   1.  If the error-status is anything other than noError,

         a.  The error status is translated to an SNMPv1 error-status
             using the table from 2.1, "Mapping SNMPv2 error-status into
             SNMPv1 error-status" on page 2

         b.  The error-index is set to the position (in the original
             request) of the varBind that caused the error-status.

         c.  The varBindList of the response PDU is made exactly the
             same as the varBindList that was received in the original
             request.

    2.  If the error-status is noError, then find any varBind that
        contains an SNMPv2 exception (noSuchObject or noSuchInstance)
        or an SNMPv2 syntax that is unknown to SNMPv1 (Counter64).
        (Note that if there are more than one, the agent may choose any
        such varBind.)  If there are any such varBinds, then for the
        one chosen:

         a.  Set the error-status to noSuchName

         b.  Set the error-index to the position (in the varBindList of
             the original request) of the varBind that returned such an
             SNMPv2 exception or syntax.

         c.  Make the varBindList of the response PDU exactly the same
             as the varBindList that was received in the original
             request.








Wijnen & Levi                Informational                      [Page 6]

RFC 2089                         V2toV1                     January 1997


     3.  If there are no such varBinds, then:

         a.  Set the error-status to noError

         b.  Set the error-index to zero

         c.  Compose the varBindList of the response, using the data as
             it is returned by the instrumentation code.

3.2  Processing an SNMPv1 GETNEXT request

   First, the request is converted into a call to the underlying
   instrumentation. This is implementation specific.  There may be
   repetitive calls to (possibly different pieces of) instrumentation
   code to try to find the first object which lexicographically follows
   each of the objects in the request.  Again, this is implementation
   specific.

   When the instrumentation finally returns response data using SNMPv2
   syntax and error-status values, then:

     1.  If the error-status is anything other than noError,

         a.  The error status is translated to an SNMPv1 error-status
             using the table from 2.1, "Mapping SNMPv2 error-status into
             SNMPv1 error-status" on page 2

         b.  The error-index is set to the position (in the original
             request) of the varBind that caused the error-status.

         c.  The varBindList of the response PDU is made exactly the
             same as the varBindList that was received in the original
             request.

     2.  If the error-status is noError, then:

         a.  If there are any varBinds containing an SNMPv2 syntax of
             Counter64, then consider these varBinds to be not in view
             and repeat the call to the instrumentation code as often as
             needed till a value other than Counter64 is returned.

         b.  Find any varBind that contains an SNMPv2 exception
             endOfMibView.  (Note that if there are more than one, the
             agent may choose any such varBind.)  If there are any such
             varBinds, then for the one chosen:

             1)  Set the error-status to noSuchName




Wijnen & Levi                Informational                      [Page 7]

RFC 2089                         V2toV1                     January 1997


             2)  Set the error-index to the position (in the varBindList
                 of the original request) of the varBind that returned
                 such an SNMPv2 exception.

             3)  Make the varBindList of the response PDU exactly the
                 same as the varBindList that was received in the
                 original request.

         c.  If there are no such varBinds, then:

             1)  Set the error-status to noError

             2)  Set the error-index to zero

             3)  Compose the varBindList of the response, using the data
                 as it is returned by the instrumentation code.

3.3  Processing an outgoing SNMPv2 TRAP

   If SNMPv2 compliant instrumentation presents an SNMPv2 trap to the
   SNMP engine and such a trap passes all regular checking and then is
   to be sent to an SNMPv1 destination, then the following steps must be
   followed to convert such a trap to an SNMPv1 trap.  This is basically
   the reverse of the SNMPv1 to SNMPv2 mapping as described in RFC1908
   [3].

     1.  If any of the varBinds in the varBindList has an SNMPv2 syntax
         of Counter64, then such varBinds are implicitly considered to
         be not in view, and so they are removed from the varBindList to
         be sent with the SNMPv1 trap.

     2.  The 3 special varBinds in the varBindList of an SNMPv2 trap
         (sysUpTime.0 (TimeTicks), snmpTrapOID.0 (OBJECT IDENTIFIER) and
         optionally snmpTrapEnterprise.0 (OBJECT IDENTIFIER)) are
         removed from the varBindList to be sent with the SNMPv1 trap.
         These 2 (or 3) varBinds are used to decide how to set other
         fields in the SNMPv1 trap PDU as follows:

         a.  The value of sysUpTime.0 is copied into the timestamp field
             of the SNMPv1 trap.











Wijnen & Levi                Informational                      [Page 8]

RFC 2089                         V2toV1                     January 1997


         b.  If the snmpTrapOID.0 value is one of the standard traps the
             specific-trap field is set to zero and the generic trap
             field is set according to this mapping:

                value of snmpTrapOID.0                generic-trap
                ===============================       ============
                1.3.6.1.6.3.1.1.5.1 (coldStart)                  0
                1.3.6.1.6.3.1.1.5.2 (warmStart)                  1
                1.3.6.1.6.3.1.1.5.3 (linkDown)                   2
                1.3.6.1.6.3.1.1.5.4 (linkUp)                     3
                1.3.6.1.6.3.1.1.5.5 (authenticationFailure)      4
                1.3.6.1.6.3.1.1.5.6 (egpNeighborLoss)            5

             The enterprise field is set to the value of
             snmpTrapEnterprise.0 if this varBind is present, otherwise
             it is set to the value snmpTraps as defined in RFC1907 [4].

         c.  If the snmpTrapOID.0 value is not one of the standard
             traps, then the generic-trap field is set to 6 and the
             specific-trap field is set to the last subid of the
             snmpTrapOID.0 value.

             o   If the next to last subid of snmpTrapOID.0 is zero,
                 then the enterprise field is set to snmpTrapOID.0 value
                 and the last 2 subids are truncated from that value.
             o   If the next to last subid of snmpTrapOID.0 is not zero,
                 then the enterprise field is set to snmpTrapOID.0 value
                 and the last 1 subid is truncated from that value.

             In any event, the snmpTrapEnterprise.0 varBind (if present)
             is ignored in this case.

     3.  The agent-addr field is set with the appropriate address of the
         the sending SNMP entity, which is the IP address of the sending
         entity of the trap goes out over UDP; otherwise the agent-addr
         field is set to address 0.0.0.0.















Wijnen & Levi                Informational                      [Page 9]

RFC 2089                         V2toV1                     January 1997


4.0  Acknowledgements

   The authors wish to thank the contributions of the SNMPv2 Working
   Group in general.  Special thanks for their detailed review and
   comments goes to these individuals:

       Mike Daniele (DEC)
       Dave Harrington (Cabletron)
       Brian O'Keefe (Hewlett Packard)
       Keith McCloghrie (Cisco Systems)
       Dave Perkins (independent)
       Shawn Routhier (Epilogue)
       Juergen Schoenwaelder (University of Twente)

5.0  References

     [1]  Jeffrey  D. Case, Mark Fedor, Martin Lee Schoffstall and James
          R. Davin, Simple  Network  Management  Protocol  (SNMP),  SNMP
          Research,  Performance  Systems  International, MIT Laboratory
          for Computer Science, RFC 1157, May 1990.

     [2]  Jeffrey D. Case, Keith McCloghrie, Marshall T. Rose and Steven
          Waldbusser, Structure of Managment Information for  Version  2
          of  the  Simple  Network  Management  Protocol  (SNMPv2), SNMP
          Research Inc, Cisco Systems Inc, Dover Beach  Consulting  Inc,
          International Network Services, RFC1902, January 1996.

     [3]  Jeffrey D. Case, Keith McCloghrie, Marshall T. Rose and Steven
          Waldbusser, Coexistence between Version 1 and Version 2 of the
          Internet-standard  Network Management Framework, SNMP Research
          Inc,  Cisco  Systems  Inc,   Dover   Beach   Consulting   Inc,
          International Network Services, RFC1908, January 1996.

     [4]  Jeffrey D. Case, Keith McCloghrie, Marshall T. Rose and Steven
          Waldbusser,  Management  Information Base for Version 2 of the
          Simple Network Management  Protocol  (SNMPv2),  SNMP  Research
          Inc,   Cisco   Systems   Inc,   Dover  Beach  Consulting  Inc,
          International Network Services, RFC1907, January 1996.

6.0  Security Considerations

   Security considerations are not discussed in this memo.









Wijnen & Levi                Informational                     [Page 10]

RFC 2089                         V2toV1                     January 1997


7.0  Authors' Addresses

          Bert Wijnen
          IBM International Operations
          Watsonweg 2
          1423 ND Uithoorn
          The Netherlands

          Phone: +31-079-322-8316
          E-mail: wijnen@vnet.ibm.com


          David Levi
          SNMP Research, Inc
          3001 Kimberlin Heights Rd.
          Knoxville, TN 37920-9716
          USA

          Phone: +1-615-573-1434
          E-mail: levi@snmp.com































Wijnen & Levi                Informational                     [Page 11]

RFC 2089                         V2toV1                     January 1997


APPENDIX A.  Background Information

   Here follows some reasoning as to why some choices were made.

   A.1  Mapping of error-status values

   The mapping of SNMPv2 error-status values to SNMPv1 error-status
   values is based on the common interpretation of how an SNMPv1 entity
   should create an error-status value based on the elements of
   procedure defined in RFC1157 [1].

   There was a suggestion to map wrongEncoding into genErr, because it
   could be caused by an ASN.1 parsing error.  Such maybe true, but in
   most cases when we detect the ASN.1 parsing error, we do not yet know
   about the PDU data yet.  Most people who responded to our queries
   have implemented the mapping to a badValue. So we "agreed" on the
   mapping to badValue.


   A.2  SNMPv1 Traps without Counter64 varBinds.

   RFC1448 says that if one of the objects in the varBindList is not
   included in the view, then the trap is NOT sent.  Current SNMPv2u and
   SNMPv2* documents make the same statement.  However, the "rough
   consensus" is that it is better to send partial information than no
   information at all. Besides:

     o   RFC1448 does not allow for a TRAP to be sent with the varBinds
         that are not included in the view removed, so it is an all or
         nothing decision.

     o   We do NOT include the Counter64 varBinds... so the "not in
         view" varBinds are not sent to the trap destination.

     o   The Counter64 objects are "implicit" not in view.  If any
         objects are explicit not in view, then this is checked before
         we do the conversion from an SNMPv2 trap to an SNMPv1 trap, and
         so the trap is not sent at all.













Wijnen & Levi                Informational                     [Page 12]

