





Network Working Group                               SNMPv2 Working Group
Request for Comments: 1908                                       J. Case
Obsoletes: 1452                                      SNMP Research, Inc.
Category: Standards Track                                  K. McCloghrie
                                                     Cisco Systems, Inc.
                                                                 M. Rose
                                            Dover Beach Consulting, Inc.
                                                           S. Waldbusser
                                          International Network Services
                                                            January 1996


           Coexistence between Version 1 and Version 2 of the
             Internet-standard Network Management Framework

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Table of Contents

   1. Introduction ................................................    2
   2. Management Information ......................................    2
   2.1 Object Definitions .........................................    3
   2.2 Trap Definitions ...........................................    5
   2.3 Compliance Statements ......................................    5
   2.4 Capabilities Statements ....................................    6
   3 Protocol Operations ..........................................    6
   3.1 Proxy Agent Behavior .......................................    6
   3.1.1 SNMPv2 -> SNMPv1 .........................................    7
   3.1.2 SNMPv1 -> SNMPv2 .........................................    7
   3.2 Bi-lingual Manager Behavior ................................    8
   4. Security Considerations .....................................    8
   5. Editor's Address ............................................    8
   6. Acknowledgements ............................................    8
   7. References ..................................................    9











SNMPv2 Working Group        Standards Track                     [Page 1]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


1.  Introduction

   The purpose of this document is to describe coexistence between
   version 2 of the Internet-standard Network Management Framework [1-
   6], termed the SNMP version 2 framework (SNMPv2), and the original
   Internet-standard Network Management Framework (SNMPv1), which
   consists of these three documents:

      STD 16, RFC 1155 [7] which defines the Structure of Management
      Information (SMI), the mechanisms used for describing and naming
      objects for the purpose of management.

      STD 16, RFC 1212 [8] which defines a more concise description
      mechanism, which is wholly consistent with the SMI.

      STD 15, RFC 1157 [9] which defines the Simple Network Management
      Protocol (SNMP), the protocol used for network access to managed
      objects.

2.  Management Information

   The SNMPv2 approach towards describing collections of managed objects
   is nearly a proper superset of the approach defined in the Internet-
   standard Network Management Framework.  For example, both approaches
   use ASN.1 [10] as the basis for a formal descriptive notation.
   Indeed, one might note that the SNMPv2 approach largely codifies the
   existing practice for defining MIB modules, based on extensive
   experience with the current framework.

   The SNMPv2 documents which deal with information modules are:

     Structure of Management Information for SNMPv2 [1], which defines
     concise notations for describing information modules, managed
     objects and notifications;

     Textual Conventions for SNMPv2 [2], which defines a concise
     notation for describing textual conventions, and also defines some
     initial conventions; and,

     Conformance Statements for SNMPv2 [3], which defines concise
     notation for describing compliance and capabilities statements.

   The following sections consider the three areas:  MIB modules,
   compliance statements, and capabilities statements.

   MIB modules defined using the current framework may continue to be
   used with the SNMPv2 protocol.  However, for the MIB modules to
   conform to the SNMPv2 framework, the following changes are required:



SNMPv2 Working Group        Standards Track                     [Page 2]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


2.1.  Object Definitions

   In general, conversion of a MIB module does not require the
   deprecation of the objects contained therein.  Only if the semantics
   of an object truly changes should deprecation be performed.

(1)  The IMPORTS statement must reference SNMPv2-SMI, instead of
     RFC1155-SMI and RFC-1212.

(2)  The MODULE-IDENTITY macro must be invoked immediately after any
     IMPORTs statement.

(3)  For any descriptor which contains the hyphen character, the hyphen
     character is removed.

(4)  For any label for a named-number enumeration which contains the
     hyphen character, the hyphen character is removed.

(5)  For any object with an integer-valued SYNTAX clause, in which the
     corresponding INTEGER does not have a range restriction (i.e., the
     INTEGER has neither a defined set of named-number enumerations nor
     an assignment of lower- and upper-bounds on its value), the object
     must have the value of its SYNTAX clause changed to Integer32.

(6)  For any object with a SYNTAX clause value of an enumerated INTEGER,
     the hyphen character is removed from any named-number labels which
     contain the hyphen character.

(7)  For any object with a SYNTAX clause value of Counter, the object
     must have the value of its SYNTAX clause changed to Counter32.

(8)  For any object with a SYNTAX clause value of Gauge, the object must
     have the value of its SYNTAX clause changed to Gauge32.

(9)  For all objects, the ACCESS clause must be replaced by a MAX-ACCESS
     clause.  The value of the MAX-ACCESS clause is the same as that of
     the ACCESS clause unless some other value makes "protocol sense" as
     the maximal level of access for the object.  In particular, object
     types for which instances can be explicitly created by a protocol
     set operation, will have a MAX-ACCESS clause of "read-create".  If
     the value of the ACCESS clause is "write-only", then the value of
     the MAX-ACCESS clause is "read-write", and the DESCRIPTION clause
     notes that reading this object will result implementation-specific
     results.

(10) For all objects, if the value of the STATUS clause is "mandatory",
     the value must be replaced with "current".




SNMPv2 Working Group        Standards Track                     [Page 3]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


(11) For all objects, if the value of the STATUS clause is "optional",
     the value must be replaced with "obsolete".

(12) For any object not containing a DESCRIPTION clause, the object must
     have a DESCRIPTION clause defined.

(13) For any object corresponding to a conceptual row which does not
     have an INDEX clause, the object must have either an INDEX clause
     or an AUGMENTS clause defined.

(14) For any object with an INDEX clause that references an object with
     a syntax of NetworkAddress, the value of the STATUS clause of both
     objects is changed to "obsolete".

(15) For any object containing a DEFVAL clause with an OBJECT IDENTIFIER
     value which is expressed as a collection of sub-identifiers, change
     the value to reference a single ASN.1 identifier.

Other changes are desirable, but not necessary:

(1)  Creation and deletion of conceptual rows is inconsistent using the
     current framework.  The SNMPv2 framework corrects this.  As such,
     if the MIB module undergoes review early in its lifetime, and it
     contains conceptual tables which allow creation and deletion of
     conceptual rows, then it may be worthwhile to deprecate the objects
     relating to those tables and replace them with objects defined
     using the new approach.

(2)  For any object with a string-valued SYNTAX clause, in which the
     corresponding OCTET STRING does not have a size restriction (i.e.,
     the OCTET STRING has no assignment of lower- and upper-bounds on
     its length), one might consider defining the bounds for the size of
     the object.

(3)  For all textual conventions informally defined in the MIB module,
     one might consider redefining those conventions using the TEXTUAL-
     CONVENTION macro.  Such a change would not necessitate deprecating
     objects previously defined using an informal textual convention.

(4)  For any object which represents a measurement in some kind of
     units, one might consider adding a UNITS clause to the definition
     of that object.

(5)  For any conceptual row which is an extension of another conceptual
     row, i.e., for which subordinate columnar objects both exist and
     are identified via the same semantics as the other conceptual row,
     one might consider using an AUGMENTS clause in place of the INDEX
     clause for the object corresponding to the conceptual row which is



SNMPv2 Working Group        Standards Track                     [Page 4]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


     an extension.

Finally, when encountering common errors in SNMPv1 MIB modules:

(1)  For any non-columnar object that is instanced as if it were
     immediately subordinate to a conceptual row, the value of the
     STATUS clause of that object is changed to "obsolete".

(2)  For any conceptual row object that is not contained immediately
     subordinate to a conceptual table, the value of the STATUS clause
     of that object (and all subordinate objects) is changed to
     "obsolete".

2.2.  Trap Definitions

   If a MIB module is changed to conform to the SNMPv2 framework, then
   each occurrence of the TRAP-TYPE macro must be changed to a
   corresponding invocation of the NOTIFICATION-TYPE macro:

   (1)  The IMPORTS statement must not reference RFC-1215.

   (2)  The ENTERPRISES clause must be removed.

   (3)  The VARIABLES clause must be renamed to the OBJECTS clause.

   (4)  The STATUS clause must be added.

   (5)  The value of an invocation of the NOTIFICATION-TYPE macro is an
        OBJECT IDENTIFIER, not an INTEGER, and must be changed accordingly.
        Specifically, if the value of the ENTERPRISE clause is not 'snmp'
        then the value of the invocation is the value of the ENTERPRISE
        clause extended with two sub-identifiers, the first of which has
        the value 0, and the second has the value of the invocation of the
        TRAP-TYPE.

2.3.  Compliance Statements

   For those information modules which are "standard", a corresponding
   invocation of the MODULE-COMPLIANCE macro must be included within the
   information module (or in a companion information module), and any
   commentary text in the information module which relates to compliance
   must be removed.  Typically this editing can occur when the
   information module undergoes review.








SNMPv2 Working Group        Standards Track                     [Page 5]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


2.4.  Capabilities Statements

   In the current framework, the informational document [11] uses the
   MODULE-CONFORMANCE macro to describe an agent's capabilities with
   respect to one or more MIB modules.  Converting such a description
   for use with the SNMPv2 framework requires these changes:

   (1)  Use the macro name AGENT-CAPABILITIES instead of MODULE-
        CONFORMANCE.

   (2)  The STATUS clause must be added.

   (3)  For all occurrences of the CREATION-REQUIRES clause, note the
        slight change in semantics, and omit this clause if appropriate.

   In order to ease the coexistence between SNMPv1 and SNMPv2, object
   groups defined in an SNMPv1 MIB module may be referenced by the
   INCLUDES clause of an invocation of the AGENT-CAPABILITIES macro:
   upon encountering a reference to an OBJECT IDENTIFIER subtree defined
   in an SNMPv1 MIB module, all leaf objects which are subordinate to
   the subtree and have a STATUS clause value of mandatory are deemed to
   be INCLUDEd.  (Note that this method is ambiguous when different
   revisions of a SNMPv1 MIB have different sets of mandatory objects
   under the same subtree; in such cases, the only solution is to
   rewrite the MIB using the SNMPv2 SMI in order to define the object
   groups unambiguously.)

3.  Protocol Operations

   The SNMPv2 documents which deal with protocol operations are:

     Protocol Operations for SNMPv2 [4], which defines the syntax and
     semantics of the operations conveyed by the protocol; and,

     Transport Mappings for SNMPv2 [5], which defines how the protocol
     operations are carried over different transport services.

   The following section considers two areas:  the proxy behavior
   between a SNMPv2 entity and a SNMPv1 agent; and, the behavior of
   "bi-lingual" protocol entities acting in a manager role.

3.1.  Proxy Agent Behavior

   To achieve coexistence at the protocol-level, a proxy mechanism may
   be used.  A SNMPv2 entity acting in an agent role may be implemented
   and configured to act in the role of a proxy agent.





SNMPv2 Working Group        Standards Track                     [Page 6]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


3.1.1.  SNMPv2 -> SNMPv1

   When converting requests from a SNMPv2 entity acting in a manager
   role into requests sent to a SNMPv1 entity acting in an agent role:

   (1)  If a GetRequest-PDU, GetNextRequest-PDU, or SetRequest-PDU is
        received, then it is passed unaltered by the proxy agent.

   (2)  If a GetBulkRequest-PDU is received, the proxy agent sets the non-
        repeaters and max-repetitions fields to zero, and sets the tag of
        the PDU to GetNextRequest-PDU.

3.1.2.  SNMPv1 -> SNMPv2

   When converting responses received from a SNMPv1 entity acting in an
   agent role into responses sent to a SNMPv2 entity acting in a manager
   role:

(1)  If a GetResponse-PDU is received, then it is passed unaltered by
     the proxy agent.  Note that even though a SNMPv2 entity will never
     generate a Response-PDU with a error-status field having a value of
     `noSuchName', `badValue', or `readOnly', the proxy agent must not
     change this field.  This allows the SNMPv2 entity acting in a
     manager role to interpret the response correctly.

     If a GetResponse-PDU is received with an error-status field having
     a value of `tooBig', the proxy agent will remove the contents of
     the variable-bindings field before propagating the response.  Note
     that even though a SNMPv2 entity will never generate a `tooBig' in
     response to a GetBulkRequest-PDU, the proxy agent must propagate
     such a response.

(2)  If a Trap-PDU is received, then it is mapped into a SNMPv2-Trap-
     PDU.  This is done by prepending onto the variable-bindings field
     two new bindings:  sysUpTime.0 [6], which takes its value from the
     timestamp field of the Trap-PDU; and, snmpTrapOID.0 [6], which is
     calculated thusly:  if the value of generic-trap field is
     `enterpriseSpecific', then the value used is the concatenation of
     the enterprise field from the Trap-PDU with two additional sub-
     identifiers, `0', and the value of the specific-trap field;
     otherwise, the value of the corresponding trap defined in [6] is
     used.  (For example, if the value of the generic-trap field is
     `coldStart', then the coldStart trap [6] is used.)  Then, one new
     binding is appended onto the variable-bindings field:
     snmpTrapEnterprise.0 [6], which takes its value from the enterprise
     field of the Trap-PDU.  The destinations for the SNMPv2-Trap-PDU
     are determined in an implementation-dependent fashion by the proxy
     agent.



SNMPv2 Working Group        Standards Track                     [Page 7]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


3.2.  Bi-lingual Manager Behavior

   To achieve coexistence at the protocol-level, a protocol entity
   acting in a manager role might support both SNMPv1 and SNMPv2.  When
   a management application needs to contact a protocol entity acting in
   an agent role, the entity acting in a manager role consults a local
   database to select the correct management protocol to use.

   In order to provide transparency to management applications, the
   entity acting in a manager role must map operations as if it were
   acting as a proxy agent.

4.  Security Considerations

   Security issues are not discussed in this memo.

5.  Editor's Address

   Keith McCloghrie
   Cisco Systems, Inc.
   170 West Tasman Drive
   San Jose, CA  95134-1706
   US

   Phone: +1 408 526 5260
   EMail: kzm@cisco.com

6.  Acknowledgements

   This document is the result of significant work by the four major
   contributors:

   Jeffrey D. Case (SNMP Research, case@snmp.com)
   Keith McCloghrie (Cisco Systems, kzm@cisco.com)
   Marshall T. Rose (Dover Beach Consulting, mrose@dbc.mtview.ca.us)
   Steven Waldbusser (International Network Services, stevew@uni.ins.com)

   In addition, the contributions of the SNMPv2 Working Group are
   acknowledged.  In particular, a special thanks is extended for the
   contributions of:

     Alexander I. Alten (Novell)
     Dave Arneson (Cabletron)
     Uri Blumenthal (IBM)
     Doug Book (Chipcom)
     Kim Curran (Bell-Northern Research)
     Jim Galvin (Trusted Information Systems)
     Maria Greene (Ascom Timeplex)



SNMPv2 Working Group        Standards Track                     [Page 8]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


     Iain Hanson (Digital)
     Dave Harrington (Cabletron)
     Nguyen Hien (IBM)
     Jeff Johnson (Cisco Systems)
     Michael Kornegay (Object Quest)
     Deirdre Kostick (AT&T Bell Labs)
     David Levi (SNMP Research)
     Daniel Mahoney (Cabletron)
     Bob Natale (ACE*COMM)
     Brian O'Keefe (Hewlett Packard)
     Andrew Pearson (SNMP Research)
     Dave Perkins (Peer Networks)
     Randy Presuhn (Peer Networks)
     Aleksey Romanov (Quality Quorum)
     Shawn Routhier (Epilogue)
     Jon Saperia (BGS Systems)
     Bob Stewart (Cisco Systems, bstewart@cisco.com), chair
     Kaj Tesink (Bellcore)
     Glenn Waters (Bell-Northern Research)
     Bert Wijnen (IBM)

7.  References

[1]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Structure of Management Information for Version 2
     of the Simple Network Management Protocol (SNMPv2)", RFC 1902,
     January 1996.

[2]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Textual Conventions for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1903, January 1996.

[3]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Conformance Statements for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1904, January 1996.

[4]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Protocol Operations for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1905, January 1996.

[5]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Transport Mappings for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1906, January 1996.

[6]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Management Information Base for Version 2 of the
     Simple Network Management Protocol (SNMPv2)", RFC 1907,
     January 1996.



SNMPv2 Working Group        Standards Track                     [Page 9]

RFC 1908         Coexistence between SNMPv1 and SNMPv2      January 1996


[7]  Rose, M., and K. McCloghrie, "Structure and Identification of
     Management Information for TCP/IP-based internets", STD 16, RFC
     1155, May 1990.

[8]  Rose, M., and K. McCloghrie, "Concise MIB Definitions", STD 16,
     RFC 1212, March 1991.

[9]  Case, J., Fedor, M., Schoffstall, M., and J. Davin, "Simple Network
     Management Protocol", STD 15, RFC 1157, SNMP Research, Performance
     Systems International, MIT Laboratory for Computer Science, May
     1990.

[10] Information processing systems - Open Systems Interconnection -
     Specification of Abstract Syntax Notation One (ASN.1),
     International Organization for Standardization.  International
     Standard 8824, (December, 1987).

[11] McCloghrie, K., and M. Rose, "A Convention for Describing SNMP-
     based Agents", RFC 1303, Hughes LAN Systems, Dover Beach
     Consulting, Inc., February 1992.































SNMPv2 Working Group        Standards Track                    [Page 10]

