





Network Working Group                                            J. Case
Request for Comments:  1157                                SNMP Research
Obsoletes:  RFC 1098                                            M. Fedor
                                       Performance Systems International
                                                          M. Schoffstall
                                       Performance Systems International
                                                                J. Davin
                                     MIT Laboratory for Computer Science
                                                                May 1990


              A Simple Network Management Protocol (SNMP)

                           Table of Contents

   1. Status of this Memo ...................................    2
   2. Introduction ..........................................    2
   3. The SNMP Architecture .................................    5
   3.1 Goals of the Architecture ............................    5
   3.2 Elements of the Architecture .........................    5
   3.2.1 Scope of Management Information ....................    6
   3.2.2 Representation of Management Information ...........    6
   3.2.3 Operations Supported on Management Information .....    7
   3.2.4 Form and Meaning of Protocol Exchanges .............    8
   3.2.5 Definition of Administrative Relationships .........    8
   3.2.6 Form and Meaning of References to Managed Objects ..   12
   3.2.6.1 Resolution of Ambiguous MIB References ...........   12
   3.2.6.2 Resolution of References across MIB Versions......   12
   3.2.6.3 Identification of Object Instances ...............   12
   3.2.6.3.1 ifTable Object Type Names ......................   13
   3.2.6.3.2 atTable Object Type Names ......................   13
   3.2.6.3.3 ipAddrTable Object Type Names ..................   14
   3.2.6.3.4 ipRoutingTable Object Type Names ...............   14
   3.2.6.3.5 tcpConnTable Object Type Names .................   14
   3.2.6.3.6 egpNeighTable Object Type Names ................   15
   4. Protocol Specification ................................   16
   4.1 Elements of Procedure ................................   17
   4.1.1 Common Constructs ..................................   19
   4.1.2 The GetRequest-PDU .................................   20
   4.1.3 The GetNextRequest-PDU .............................   21
   4.1.3.1 Example of Table Traversal .......................   23
   4.1.4 The GetResponse-PDU ................................   24
   4.1.5 The SetRequest-PDU .................................   25
   4.1.6 The Trap-PDU .......................................   27
   4.1.6.1 The coldStart Trap ...............................   28
   4.1.6.2 The warmStart Trap ...............................   28
   4.1.6.3 The linkDown Trap ................................   28
   4.1.6.4 The linkUp Trap ..................................   28



Case, Fedor, Schoffstall, & Davin                               [Page 1]

RFC 1157                          SNMP                          May 1990


   4.1.6.5 The authenticationFailure Trap ...................   28
   4.1.6.6 The egpNeighborLoss Trap .........................   28
   4.1.6.7 The enterpriseSpecific Trap ......................   29
   5. Definitions ...........................................   30
   6. Acknowledgements ......................................   33
   7. References ............................................   34
   8. Security Considerations................................   35
   9. Authors' Addresses.....................................   35

1.  Status of this Memo

   This RFC is a re-release of RFC 1098, with a changed "Status of this
   Memo" section plus a few minor typographical corrections.  This memo
   defines a simple protocol by which management information for a
   network element may be inspected or altered by logically remote
   users.  In particular, together with its companion memos which
   describe the structure of management information along with the
   management information base, these documents provide a simple,
   workable architecture and system for managing TCP/IP-based internets
   and in particular the Internet.

   The Internet Activities Board recommends that all IP and TCP
   implementations be network manageable.  This implies implementation
   of the Internet MIB (RFC-1156) and at least one of the two
   recommended management protocols SNMP (RFC-1157) or CMOT (RFC-1095).
   It should be noted that, at this time, SNMP is a full Internet
   standard and CMOT is a draft standard.  See also the Host and Gateway
   Requirements RFCs for more specific information on the applicability
   of this standard.

   Please refer to the latest edition of the "IAB Official Protocol
   Standards" RFC for current information on the state and status of
   standard Internet protocols.

   Distribution of this memo is unlimited.

2.  Introduction

   As reported in RFC 1052, IAB Recommendations for the Development of
   Internet Network Management Standards [1], a two-prong strategy for
   network management of TCP/IP-based internets was undertaken.  In the
   short-term, the Simple Network Management Protocol (SNMP) was to be
   used to manage nodes in the Internet community.  In the long-term,
   the use of the OSI network management framework was to be examined.
   Two documents were produced to define the management information: RFC
   1065, which defined the Structure of Management Information (SMI)
   [2], and RFC 1066, which defined the Management Information Base
   (MIB) [3].  Both of these documents were designed so as to be



Case, Fedor, Schoffstall, & Davin                               [Page 2]

RFC 1157                          SNMP                          May 1990


   compatible with both the SNMP and the OSI network management
   framework.

   This strategy was quite successful in the short-term: Internet-based
   network management technology was fielded, by both the research and
   commercial communities, within a few months.  As a result of this,
   portions of the Internet community became network manageable in a
   timely fashion.

   As reported in RFC 1109, Report of the Second Ad Hoc Network
   Management Review Group [4], the requirements of the SNMP and the OSI
   network management frameworks were more different than anticipated.
   As such, the requirement for compatibility between the SMI/MIB and
   both frameworks was suspended.  This action permitted the operational
   network management framework, the SNMP, to respond to new operational
   needs in the Internet community by producing documents defining new
   MIB items.

   The IAB has designated the SNMP, SMI, and the initial Internet MIB to
   be full "Standard Protocols" with "Recommended" status.  By this
   action, the IAB recommends that all IP and TCP implementations be
   network manageable and that the implementations that are network
   manageable are expected to adopt and implement the SMI, MIB, and
   SNMP.

   As such, the current network management framework for TCP/IP- based
   internets consists of:  Structure and Identification of Management
   Information for TCP/IP-based Internets, which describes how managed
   objects contained in the MIB are defined as set forth in RFC 1155
   [5]; Management Information Base for Network Management of TCP/IP-
   based Internets, which describes the managed objects contained in the
   MIB as set forth in RFC 1156 [6]; and, the Simple Network Management
   Protocol, which defines the protocol used to manage these objects, as
   set forth in this memo.

   As reported in RFC 1052, IAB Recommendations for the Development of
   Internet Network Management Standards [1], the Internet Activities
   Board has directed the Internet Engineering Task Force (IETF) to
   create two new working groups in the area of network management.  One
   group was charged with the further specification and definition of
   elements to be included in the Management Information Base (MIB).
   The other was charged with defining the modifications to the Simple
   Network Management Protocol (SNMP) to accommodate the short-term
   needs of the network vendor and operations communities, and to align
   with the output of the MIB working group.

   The MIB working group produced two memos, one which defines a
   Structure for Management Information (SMI) [2] for use by the managed



Case, Fedor, Schoffstall, & Davin                               [Page 3]

RFC 1157                          SNMP                          May 1990


   objects contained in the MIB.  A second memo [3] defines the list of
   managed objects.

   The output of the SNMP Extensions working group is this memo, which
   incorporates changes to the initial SNMP definition [7] required to
   attain alignment with the output of the MIB working group.  The
   changes should be minimal in order to be consistent with the IAB's
   directive that the working groups be "extremely sensitive to the need
   to keep the SNMP simple."  Although considerable care and debate has
   gone into the changes to the SNMP which are reflected in this memo,
   the resulting protocol is not backwardly-compatible with its
   predecessor, the Simple Gateway Monitoring Protocol (SGMP) [8].
   Although the syntax of the protocol has been altered, the original
   philosophy, design decisions, and architecture remain intact.  In
   order to avoid confusion, new UDP ports have been allocated for use
   by the protocol described in this memo.



































Case, Fedor, Schoffstall, & Davin                               [Page 4]

RFC 1157                          SNMP                          May 1990


3.  The SNMP Architecture

   Implicit in the SNMP architectural model is a collection of network
   management stations and network elements.  Network management
   stations execute management applications which monitor and control
   network elements.  Network elements are devices such as hosts,
   gateways, terminal servers, and the like, which have management
   agents responsible for performing the network management functions
   requested by the network management stations.  The Simple Network
   Management Protocol (SNMP) is used to communicate management
   information between the network management stations and the agents in
   the network elements.

3.1.  Goals of the Architecture

   The SNMP explicitly minimizes the number and complexity of management
   functions realized by the management agent itself.  This goal is
   attractive in at least four respects:

      (1)  The development cost for management agent software
           necessary to support the protocol is accordingly reduced.

      (2)  The degree of management function that is remotely
           supported is accordingly increased, thereby admitting
           fullest use of internet resources in the management task.

      (3)  The degree of management function that is remotely
           supported is accordingly increased, thereby imposing the
           fewest possible restrictions on the form and
           sophistication of management tools.

      (4)  Simplified sets of management functions are easily
           understood and used by developers of network management
           tools.

   A second goal of the protocol is that the functional paradigm for
   monitoring and control be sufficiently extensible to accommodate
   additional, possibly unanticipated aspects of network operation and
   management.

   A third goal is that the architecture be, as much as possible,
   independent of the architecture and mechanisms of particular hosts or
   particular gateways.

3.2.  Elements of the Architecture

   The SNMP architecture articulates a solution to the network
   management problem in terms of:



Case, Fedor, Schoffstall, & Davin                               [Page 5]

RFC 1157                          SNMP                          May 1990


      (1)  the scope of the management information communicated by
           the protocol,

      (2)  the representation of the management information
           communicated by the protocol,

      (3)  operations on management information supported by the
           protocol,

      (4)  the form and meaning of exchanges among management
           entities,

      (5)  the definition of administrative relationships among
           management entities, and

      (6)  the form and meaning of references to management
           information.

3.2.1.  Scope of Management Information

   The scope of the management information communicated by operation of
   the SNMP is exactly that represented by instances of all non-
   aggregate object types either defined in Internet-standard MIB or
   defined elsewhere according to the conventions set forth in
   Internet-standard SMI [5].

   Support for aggregate object types in the MIB is neither required for
   conformance with the SMI nor realized by the SNMP.

3.2.2.  Representation of Management Information

   Management information communicated by operation of the SNMP is
   represented according to the subset of the ASN.1 language [9] that is
   specified for the definition of non-aggregate types in the SMI.

   The SGMP adopted the convention of using a well-defined subset of the
   ASN.1 language [9].  The SNMP continues and extends this tradition by
   utilizing a moderately more complex subset of ASN.1 for describing
   managed objects and for describing the protocol data units used for
   managing those objects.  In addition, the desire to ease eventual
   transition to OSI-based network management protocols led to the
   definition in the ASN.1 language of an Internet-standard Structure of
   Management Information (SMI) [5] and Management Information Base
   (MIB) [6].  The use of the ASN.1 language, was, in part, encouraged
   by the successful use of ASN.1 in earlier efforts, in particular, the
   SGMP.  The restrictions on the use of ASN.1 that are part of the SMI
   contribute to the simplicity espoused and validated by experience
   with the SGMP.



Case, Fedor, Schoffstall, & Davin                               [Page 6]

RFC 1157                          SNMP                          May 1990


   Also for the sake of simplicity, the SNMP uses only a subset of the
   basic encoding rules of ASN.1 [10].  Namely, all encodings use the
   definite-length form.  Further, whenever permissible, non-constructor
   encodings are used rather than constructor encodings.  This
   restriction applies to all aspects of ASN.1 encoding, both for the
   top-level protocol data units and the data objects they contain.

3.2.3.  Operations Supported on Management Information

   The SNMP models all management agent functions as alterations or
   inspections of variables.  Thus, a protocol entity on a logically
   remote host (possibly the network element itself) interacts with the
   management agent resident on the network element in order to retrieve
   (get) or alter (set) variables.  This strategy has at least two
   positive consequences:

      (1)  It has the effect of limiting the number of essential
           management functions realized by the management agent to
           two:  one operation to assign a value to a specified
           configuration or other parameter and another to retrieve
           such a value.

      (2)  A second effect of this decision is to avoid introducing
           into the protocol definition support for imperative
           management commands:  the number of such commands is in
           practice ever-increasing, and the semantics of such
           commands are in general arbitrarily complex.

   The strategy implicit in the SNMP is that the monitoring of network
   state at any significant level of detail is accomplished primarily by
   polling for appropriate information on the part of the monitoring
   center(s).  A limited number of unsolicited messages (traps) guide
   the timing and focus of the polling.  Limiting the number of
   unsolicited messages is consistent with the goal of simplicity and
   minimizing the amount of traffic generated by the network management
   function.

   The exclusion of imperative commands from the set of explicitly
   supported management functions is unlikely to preclude any desirable
   management agent operation.  Currently, most commands are requests
   either to set the value of some parameter or to retrieve such a
   value, and the function of the few imperative commands currently
   supported is easily accommodated in an asynchronous mode by this
   management model.  In this scheme, an imperative command might be
   realized as the setting of a parameter value that subsequently
   triggers the desired action.  For example, rather than implementing a
   "reboot command," this action might be invoked by simply setting a
   parameter indicating the number of seconds until system reboot.



Case, Fedor, Schoffstall, & Davin                               [Page 7]

RFC 1157                          SNMP                          May 1990


3.2.4.  Form and Meaning of Protocol Exchanges

   The communication of management information among management entities
   is realized in the SNMP through the exchange of protocol messages.
   The form and meaning of those messages is defined below in Section 4.

   Consistent with the goal of minimizing complexity of the management
   agent, the exchange of SNMP messages requires only an unreliable
   datagram service, and every message is entirely and independently
   represented by a single transport datagram.  While this document
   specifies the exchange of messages via the UDP protocol [11], the
   mechanisms of the SNMP are generally suitable for use with a wide
   variety of transport services.

3.2.5.  Definition of Administrative Relationships

   The SNMP architecture admits a variety of administrative
   relationships among entities that participate in the protocol.  The
   entities residing at management stations and network elements which
   communicate with one another using the SNMP are termed SNMP
   application entities.  The peer processes which implement the SNMP,
   and thus support the SNMP application entities, are termed protocol
   entities.

   A pairing of an SNMP agent with some arbitrary set of SNMP
   application entities is called an SNMP community.  Each SNMP
   community is named by a string of octets, that is called the
   community name for said community.

   An SNMP message originated by an SNMP application entity that in fact
   belongs to the SNMP community named by the community component of
   said message is called an authentic SNMP message.  The set of rules
   by which an SNMP message is identified as an authentic SNMP message
   for a particular SNMP community is called an authentication scheme.
   An implementation of a function that identifies authentic SNMP
   messages according to one or more authentication schemes is called an
   authentication service.

   Clearly, effective management of administrative relationships among
   SNMP application entities requires authentication services that (by
   the use of encryption or other techniques) are able to identify
   authentic SNMP messages with a high degree of certainty.  Some SNMP
   implementations may wish to support only a trivial authentication
   service that identifies all SNMP messages as authentic SNMP messages.

   For any network element, a subset of objects in the MIB that pertain
   to that element is called a SNMP MIB view.  Note that the names of
   the object types represented in a SNMP MIB view need not belong to a



Case, Fedor, Schoffstall, & Davin                               [Page 8]

RFC 1157                          SNMP                          May 1990


   single sub-tree of the object type name space.

   An element of the set { READ-ONLY, READ-WRITE } is called an SNMP
   access mode.

   A pairing of a SNMP access mode with a SNMP MIB view is called an
   SNMP community profile.  A SNMP community profile represents
   specified access privileges to variables in a specified MIB view. For
   every variable in the MIB view in a given SNMP community profile,
   access to that variable is represented by the profile according to
   the following conventions:

      (1)  if said variable is defined in the MIB with "Access:" of
           "none," it is unavailable as an operand for any operator;

      (2)  if said variable is defined in the MIB with "Access:" of
           "read-write" or "write-only" and the access mode of the
           given profile is READ-WRITE, that variable is available
           as an operand for the get, set, and trap operations;

      (3)  otherwise, the variable is available as an operand for
           the get and trap operations.

      (4)  In those cases where a "write-only" variable is an
           operand used for the get or trap operations, the value
           given for the variable is implementation-specific.

   A pairing of a SNMP community with a SNMP community profile is called
   a SNMP access policy. An access policy represents a specified
   community profile afforded by the SNMP agent of a specified SNMP
   community to other members of that community.  All administrative
   relationships among SNMP application entities are architecturally
   defined in terms of SNMP access policies.

   For every SNMP access policy, if the network element on which the
   SNMP agent for the specified SNMP community resides is not that to
   which the MIB view for the specified profile pertains, then that
   policy is called a SNMP proxy access policy. The SNMP agent
   associated with a proxy access policy is called a SNMP proxy agent.
   While careless definition of proxy access policies can result in
   management loops, prudent definition of proxy policies is useful in
   at least two ways:

      (1)  It permits the monitoring and control of network elements
           which are otherwise not addressable using the management
           protocol and the transport protocol.  That is, a proxy
           agent may provide a protocol conversion function allowing
           a management station to apply a consistent management



Case, Fedor, Schoffstall, & Davin                               [Page 9]

RFC 1157                          SNMP                          May 1990


           framework to all network elements, including devices such
           as modems, multiplexors, and other devices which support
           different management frameworks.

      (2)  It potentially shields network elements from elaborate
           access control policies.  For example, a proxy agent may
           implement sophisticated access control whereby diverse
           subsets of variables within the MIB are made accessible
           to different management stations without increasing the
           complexity of the network element.

   By way of example, Figure 1 illustrates the relationship between
   management stations, proxy agents, and management agents.  In this
   example, the proxy agent is envisioned to be a normal Internet
   Network Operations Center (INOC) of some administrative domain which
   has a standard managerial relationship with a set of management
   agents.


































Case, Fedor, Schoffstall, & Davin                              [Page 10]

RFC 1157                          SNMP                          May 1990


   +------------------+       +----------------+      +----------------+
   |  Region #1 INOC  |       |Region #2 INOC  |      |PC in Region #3 |
   |                  |       |                |      |                |
   |Domain=Region #1  |       |Domain=Region #2|      |Domain=Region #3|
   |CPU=super-mini-1  |       |CPU=super-mini-1|      |CPU=Clone-1     |
   |PCommunity=pub    |       |PCommunity=pub  |      |PCommunity=slate|
   |                  |       |                |      |                |
   +------------------+       +----------------+      +----------------+
          /|\                      /|\                     /|\
           |                        |                       |
           |                        |                       |
           |                       \|/                      |
           |               +-----------------+              |
           +-------------->| Region #3 INOC  |<-------------+
                           |                 |
                           |Domain=Region #3 |
                           |CPU=super-mini-2 |
                           |PCommunity=pub,  |
                           |         slate   |
                           |DCommunity=secret|
           +-------------->|                 |<-------------+
           |               +-----------------+              |
           |                       /|\                      |
           |                        |                       |
           |                        |                       |
          \|/                      \|/                     \|/
   +-----------------+     +-----------------+       +-----------------+
   |Domain=Region#3  |     |Domain=Region#3  |       |Domain=Region#3  |
   |CPU=router-1     |     |CPU=mainframe-1  |       |CPU=modem-1      |
   |DCommunity=secret|     |DCommunity=secret|       |DCommunity=secret|
   +-----------------+     +-----------------+       +-----------------+


   Domain:  the administrative domain of the element
   PCommunity:  the name of a community utilizing a proxy agent
   DCommunity:  the name of a direct community


                                 Figure 1
                 Example Network Management Configuration











Case, Fedor, Schoffstall, & Davin                              [Page 11]

RFC 1157                          SNMP                          May 1990


3.2.6.  Form and Meaning of References to Managed Objects

   The SMI requires that the definition of a conformant management
   protocol address:

      (1)  the resolution of ambiguous MIB references,

      (2)  the resolution of MIB references in the presence multiple
           MIB versions, and

      (3)  the identification of particular instances of object
           types defined in the MIB.

3.2.6.1.  Resolution of Ambiguous MIB References

   Because the scope of any SNMP operation is conceptually confined to
   objects relevant to a single network element, and because all SNMP
   references to MIB objects are (implicitly or explicitly) by unique
   variable names, there is no possibility that any SNMP reference to
   any object type defined in the MIB could resolve to multiple
   instances of that type.

3.2.6.2.  Resolution of References across MIB Versions

   The object instance referred to by any SNMP operation is exactly that
   specified as part of the operation request or (in the case of a get-
   next operation) its immediate successor in the MIB as a whole.  In
   particular, a reference to an object as part of some version of the
   Internet-standard MIB does not resolve to any object that is not part
   of said version of the Internet-standard MIB, except in the case that
   the requested operation is get-next and the specified object name is
   lexicographically last among the names of all objects presented as
   part of said version of the Internet-Standard MIB.

3.2.6.3.  Identification of Object Instances

   The names for all object types in the MIB are defined explicitly
   either in the Internet-standard MIB or in other documents which
   conform to the naming conventions of the SMI.  The SMI requires that
   conformant management protocols define mechanisms for identifying
   individual instances of those object types for a particular network
   element.

   Each instance of any object type defined in the MIB is identified in
   SNMP operations by a unique name called its "variable name." In
   general, the name of an SNMP variable is an OBJECT IDENTIFIER of the
   form x.y, where x is the name of a non-aggregate object type defined
   in the MIB and y is an OBJECT IDENTIFIER fragment that, in a way



Case, Fedor, Schoffstall, & Davin                              [Page 12]

RFC 1157                          SNMP                          May 1990


   specific to the named object type, identifies the desired instance.

   This naming strategy admits the fullest exploitation of the semantics
   of the GetNextRequest-PDU (see Section 4), because it assigns names
   for related variables so as to be contiguous in the lexicographical
   ordering of all variable names known in the MIB.

   The type-specific naming of object instances is defined below for a
   number of classes of object types.  Instances of an object type to
   which none of the following naming conventions are applicable are
   named by OBJECT IDENTIFIERs of the form x.0, where x is the name of
   said object type in the MIB definition.

   For example, suppose one wanted to identify an instance of the
   variable sysDescr The object class for sysDescr is:

             iso org dod internet mgmt mib system sysDescr
              1   3   6     1      2    1    1       1

   Hence, the object type, x, would be 1.3.6.1.2.1.1.1 to which is
   appended an instance sub-identifier of 0.  That is, 1.3.6.1.2.1.1.1.0
   identifies the one and only instance of sysDescr.

3.2.6.3.1.  ifTable Object Type Names

   The name of a subnet interface, s, is the OBJECT IDENTIFIER value of
   the form i, where i has the value of that instance of the ifIndex
   object type associated with s.

   For each object type, t, for which the defined name, n, has a prefix
   of ifEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
   the form n.s, where s is the name of the subnet interface about which
   i represents information.

   For example, suppose one wanted to identify the instance of the
   variable ifType associated with interface 2.  Accordingly, ifType.2
   would identify the desired instance.

3.2.6.3.2.  atTable Object Type Names

   The name of an AT-cached network address, x, is an OBJECT IDENTIFIER
   of the form 1.a.b.c.d, where a.b.c.d is the value (in the familiar
   "dot" notation) of the atNetAddress object type associated with x.

   The name of an address translation equivalence e is an OBJECT
   IDENTIFIER value of the form s.w, such that s is the value of that
   instance of the atIndex object type associated with e and such that w
   is the name of the AT-cached network address associated with e.



Case, Fedor, Schoffstall, & Davin                              [Page 13]

RFC 1157                          SNMP                          May 1990


   For each object type, t, for which the defined name, n, has a prefix
   of atEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
   the form n.y, where y is the name of the address translation
   equivalence about which i represents information.

   For example, suppose one wanted to find the physical address of an
   entry in the address translation table (ARP cache) associated with an
   IP address of 89.1.1.42 and interface 3.  Accordingly,
   atPhysAddress.3.1.89.1.1.42 would identify the desired instance.

3.2.6.3.3.  ipAddrTable Object Type Names

   The name of an IP-addressable network element, x, is the OBJECT
   IDENTIFIER of the form a.b.c.d such that a.b.c.d is the value (in the
   familiar "dot" notation) of that instance of the ipAdEntAddr object
   type associated with x.

   For each object type, t, for which the defined name, n, has a prefix
   of ipAddrEntry, an instance, i, of t is named by an OBJECT IDENTIFIER
   of the form n.y, where y is the name of the IP-addressable network
   element about which i represents information.

   For example, suppose one wanted to find the network mask of an entry
   in the IP interface table associated with an IP address of 89.1.1.42.
   Accordingly, ipAdEntNetMask.89.1.1.42 would identify the desired
   instance.

3.2.6.3.4.  ipRoutingTable Object Type Names

   The name of an IP route, x, is the OBJECT IDENTIFIER of the form
   a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
   notation) of that instance of the ipRouteDest object type associated
   with x.

   For each object type, t, for which the defined name, n, has a prefix
   of ipRoutingEntry, an instance, i, of t is named by an OBJECT
   IDENTIFIER of the form n.y, where y is the name of the IP route about
   which i represents information.

   For example, suppose one wanted to find the next hop of an entry in
   the IP routing table associated  with the destination of 89.1.1.42.
   Accordingly, ipRouteNextHop.89.1.1.42 would identify the desired
   instance.

3.2.6.3.5.  tcpConnTable Object Type Names

   The name of a TCP connection, x, is the OBJECT IDENTIFIER of the form
   a.b.c.d.e.f.g.h.i.j such that a.b.c.d is the value (in the familiar



Case, Fedor, Schoffstall, & Davin                              [Page 14]

RFC 1157                          SNMP                          May 1990


   "dot" notation) of that instance of the tcpConnLocalAddress object
   type associated with x and such that f.g.h.i is the value (in the
   familiar "dot" notation) of that instance of the tcpConnRemoteAddress
   object type associated with x and such that e is the value of that
   instance of the tcpConnLocalPort object type associated with x and
   such that j is the value of that instance of the tcpConnRemotePort
   object type associated with x.

   For each object type, t, for which the defined name, n, has a prefix
   of  tcpConnEntry, an instance, i, of t is named by an OBJECT
   IDENTIFIER of the form n.y, where y is the name of the TCP connection
   about which i represents information.

   For example, suppose one wanted to find the state of a TCP connection
   between the local address of 89.1.1.42 on TCP port 21 and the remote
   address of 10.0.0.51 on TCP port 2059.  Accordingly,
   tcpConnState.89.1.1.42.21.10.0.0.51.2059 would identify the desired
   instance.

3.2.6.3.6.  egpNeighTable Object Type Names

   The name of an EGP neighbor, x, is the OBJECT IDENTIFIER of the form
   a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
   notation) of that instance of the egpNeighAddr object type associated
   with x.

   For each object type, t, for which the defined name, n, has a prefix
   of egpNeighEntry, an instance, i, of t is named by an OBJECT
   IDENTIFIER of the form n.y, where y is the name of the EGP neighbor
   about which i represents information.

   For example, suppose one wanted to find the neighbor state for the IP
   address of 89.1.1.42.  Accordingly, egpNeighState.89.1.1.42 would
   identify the desired instance.

















Case, Fedor, Schoffstall, & Davin                              [Page 15]

RFC 1157                          SNMP                          May 1990


4.  Protocol Specification

   The network management protocol is an application protocol by which
   the variables of an agent's MIB may be inspected or altered.

   Communication among protocol entities is accomplished by the exchange
   of messages, each of which is entirely and independently represented
   within a single UDP datagram using the basic encoding rules of ASN.1
   (as discussed in Section 3.2.2).  A message consists of a version
   identifier, an SNMP community name, and a protocol data unit (PDU).
   A protocol entity receives messages at UDP port 161 on the host with
   which it is associated for all messages except for those which report
   traps (i.e., all messages except those which contain the Trap-PDU).
   Messages which report traps should be received on UDP port 162 for
   further processing.  An implementation of this protocol need not
   accept messages whose length exceeds 484 octets.  However, it is
   recommended that implementations support larger datagrams whenever
   feasible.

   It is mandatory that all implementations of the SNMP support the five
   PDUs:  GetRequest-PDU, GetNextRequest-PDU, GetResponse-PDU,
   SetRequest-PDU, and Trap-PDU.

    RFC1157-SNMP DEFINITIONS ::= BEGIN

     IMPORTS
          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
                  FROM RFC1155-SMI;


     -- top-level message

             Message ::=
                     SEQUENCE {
                          version        -- version-1 for this RFC
                             INTEGER {
                                 version-1(0)
                             },

                         community      -- community name
                             OCTET STRING,

                         data           -- e.g., PDUs if trivial
                             ANY        -- authentication is being used
                     }






Case, Fedor, Schoffstall, & Davin                              [Page 16]

RFC 1157                          SNMP                          May 1990


     -- protocol data units

             PDUs ::=
                     CHOICE {
                         get-request
                             GetRequest-PDU,

                         get-next-request
                             GetNextRequest-PDU,

                         get-response
                             GetResponse-PDU,

                         set-request
                             SetRequest-PDU,

                         trap
                             Trap-PDU
                          }

     -- the individual PDUs and commonly used
     -- data types will be defined later

     END


4.1.  Elements of Procedure

   This section describes the actions of a protocol entity implementing
   the SNMP. Note, however, that it is not intended to constrain the
   internal architecture of any conformant implementation.

   In the text that follows, the term transport address is used.  In the
   case of the UDP, a transport address consists of an IP address along
   with a UDP port.  Other transport services may be used to support the
   SNMP.  In these cases, the definition of a transport address should
   be made accordingly.

   The top-level actions of a protocol entity which generates a message
   are as follows:

        (1)  It first constructs the appropriate PDU, e.g., the
             GetRequest-PDU, as an ASN.1 object.

        (2)  It then passes this ASN.1 object along with a community
             name its source transport address and the destination
             transport address, to the service which implements the
             desired authentication scheme.  This authentication



Case, Fedor, Schoffstall, & Davin                              [Page 17]

RFC 1157                          SNMP                          May 1990


             service returns another ASN.1 object.

        (3)  The protocol entity then constructs an ASN.1 Message
             object, using the community name and the resulting ASN.1
             object.

        (4)  This new ASN.1 object is then serialized, using the basic
             encoding rules of ASN.1, and then sent using a transport
             service to the peer protocol entity.

   Similarly, the top-level actions of a protocol entity which receives
   a message are as follows:

        (1)  It performs a rudimentary parse of the incoming datagram
             to build an ASN.1 object corresponding to an ASN.1
             Message object. If the parse fails, it discards the
             datagram and performs no further actions.

        (2)  It then verifies the version number of the SNMP message.
             If there is a mismatch, it discards the datagram and
             performs no further actions.

        (3)  The protocol entity then passes the community name and
             user data found in the ASN.1 Message object, along with
             the datagram's source and destination transport addresses
             to the service which implements the desired
             authentication scheme.  This entity returns another ASN.1
             object, or signals an authentication failure.  In the
             latter case, the protocol entity notes this failure,
             (possibly) generates a trap, and discards the datagram
             and performs no further actions.

        (4)  The protocol entity then performs a rudimentary parse on
             the ASN.1 object returned from the authentication service
             to build an ASN.1 object corresponding to an ASN.1 PDUs
             object.  If the parse fails, it discards the datagram and
             performs no further actions.  Otherwise, using the named
             SNMP community, the appropriate profile is selected, and
             the PDU is processed accordingly.  If, as a result of
             this processing, a message is returned then the source
             transport address that the response message is sent from
             shall be identical to the destination transport address
             that the original request message was sent to.








Case, Fedor, Schoffstall, & Davin                              [Page 18]

RFC 1157                          SNMP                          May 1990


4.1.1.  Common Constructs

   Before introducing the six PDU types of the protocol, it is
   appropriate to consider some of the ASN.1 constructs used frequently:

                  -- request/response information

                  RequestID ::=
                          INTEGER

                  ErrorStatus ::=
                          INTEGER {
                              noError(0),
                              tooBig(1),
                              noSuchName(2),
                              badValue(3),
                              readOnly(4)
                              genErr(5)
                          }

                  ErrorIndex ::=
                          INTEGER


                  -- variable bindings

                  VarBind ::=
                          SEQUENCE {
                              name
                                  ObjectName,

                              value
                                  ObjectSyntax
                          }

                  VarBindList ::=
                          SEQUENCE OF
                              VarBind


   RequestIDs are used to distinguish among outstanding requests.  By
   use of the RequestID, an SNMP application entity can correlate
   incoming responses with outstanding requests.  In cases where an
   unreliable datagram service is being used, the RequestID also
   provides a simple means of identifying messages duplicated by the
   network.

   A non-zero instance of ErrorStatus is used to indicate that an



Case, Fedor, Schoffstall, & Davin                              [Page 19]

RFC 1157                          SNMP                          May 1990


   exception occurred while processing a request.  In these cases,
   ErrorIndex may provide additional information by indicating which
   variable in a list caused the exception.

   The term variable refers to an instance of a managed object.  A
   variable binding, or VarBind, refers to the pairing of the name of a
   variable to the variable's value.  A VarBindList is a simple list of
   variable names and corresponding values.  Some PDUs are concerned
   only with the name of a variable and not its value (e.g., the
   GetRequest-PDU).  In this case, the value portion of the binding is
   ignored by the protocol entity.  However, the value portion must
   still have valid ASN.1 syntax and encoding.  It is recommended that
   the ASN.1 value NULL be used for the value portion of such bindings.

4.1.2.  The GetRequest-PDU

             The form of the GetRequest-PDU is:
                  GetRequest-PDU ::=
                      [0]
                          IMPLICIT SEQUENCE {
                              request-id
                                  RequestID,

                              error-status        -- always 0
                                  ErrorStatus,

                              error-index         -- always 0
                                  ErrorIndex,

                              variable-bindings
                                  VarBindList
                          }


   The GetRequest-PDU is generated by a protocol entity only at the
   request of its SNMP application entity.

   Upon receipt of the GetRequest-PDU, the receiving protocol entity
   responds according to any applicable rule in the list below:

        (1)  If, for any object named in the variable-bindings field,
             the object's name does not exactly match the name of some
             object available for get operations in the relevant MIB
             view, then the receiving entity sends to the originator
             of the received message the GetResponse-PDU of identical
             form, except that the value of the error-status field is
             noSuchName, and the value of the error-index field is the
             index of said object name component in the received



Case, Fedor, Schoffstall, & Davin                              [Page 20]

RFC 1157                          SNMP                          May 1990


             message.

        (2)  If, for any object named in the variable-bindings field,
             the object is an aggregate type (as defined in the SMI),
             then the receiving entity sends to the originator of the
             received message the GetResponse-PDU of identical form,
             except that the value of the error-status field is
             noSuchName, and the value of the error-index field is the
             index of said object name component in the received
             message.

        (3)  If the size of the GetResponse-PDU generated as described
             below would exceed a local limitation, then the receiving
             entity sends to the originator of the received message
             the GetResponse-PDU of identical form, except that the
             value of the error-status field is tooBig, and the value
             of the error-index field is zero.

        (4)  If, for any object named in the variable-bindings field,
             the value of the object cannot be retrieved for reasons
             not covered by any of the foregoing rules, then the
             receiving entity sends to the originator of the received
             message the GetResponse-PDU of identical form, except
             that the value of the error-status field is genErr and
             the value of the error-index field is the index of said
             object name component in the received message.

   If none of the foregoing rules apply, then the receiving protocol
   entity sends to the originator of the received message the
   GetResponse-PDU such that, for each object named in the variable-
   bindings field of the received message, the corresponding component
   of the GetResponse-PDU represents the name and value of that
   variable.  The value of the error- status field of the GetResponse-
   PDU is noError and the value of the error-index field is zero.  The
   value of the request-id field of the GetResponse-PDU is that of the
   received message.

4.1.3.  The GetNextRequest-PDU

   The form of the GetNextRequest-PDU is identical to that of the
   GetRequest-PDU except for the indication of the PDU type.  In the
   ASN.1 language:

                  GetNextRequest-PDU ::=
                      [1]
                          IMPLICIT SEQUENCE {
                              request-id
                                  RequestID,



Case, Fedor, Schoffstall, & Davin                              [Page 21]

RFC 1157                          SNMP                          May 1990


                              error-status        -- always 0
                                  ErrorStatus,

                              error-index         -- always 0
                                  ErrorIndex,

                              variable-bindings
                                  VarBindList
                          }


   The GetNextRequest-PDU is generated by a protocol entity only at the
   request of its SNMP application entity.

   Upon receipt of the GetNextRequest-PDU, the receiving protocol entity
   responds according to any applicable rule in the list below:

        (1)  If, for any object name in the variable-bindings field,
             that name does not lexicographically precede the name of
             some object available for get operations in the relevant
             MIB view, then the receiving entity sends to the
             originator of the received message the GetResponse-PDU of
             identical form, except that the value of the error-status
             field is noSuchName, and the value of the error-index
             field is the index of said object name component in the
             received message.

        (2)  If the size of the GetResponse-PDU generated as described
             below would exceed a local limitation, then the receiving
             entity sends to the originator of the received message
             the GetResponse-PDU of identical form, except that the
             value of the error-status field is tooBig, and the value
             of the error-index field is zero.

        (3)  If, for any object named in the variable-bindings field,
             the value of the lexicographical successor to the named
             object cannot be retrieved for reasons not covered by any
             of the foregoing rules, then the receiving entity sends
             to the originator of the received message the
             GetResponse-PDU of identical form, except that the value
             of the error-status field is genErr and the value of the
             error-index field is the index of said object name
             component in the received message.

   If none of the foregoing rules apply, then the receiving protocol
   entity sends to the originator of the received message the
   GetResponse-PDU such that, for each name in the variable-bindings
   field of the received message, the corresponding component of the



Case, Fedor, Schoffstall, & Davin                              [Page 22]

RFC 1157                          SNMP                          May 1990


   GetResponse-PDU represents the name and value of that object whose
   name is, in the lexicographical ordering of the names of all objects
   available for get operations in the relevant MIB view, together with
   the value of the name field of the given component, the immediate
   successor to that value.  The value of the error-status field of the
   GetResponse-PDU is noError and the value of the errorindex field is
   zero.  The value of the request-id field of the GetResponse-PDU is
   that of the received message.

4.1.3.1.  Example of Table Traversal

   One important use of the GetNextRequest-PDU is the traversal of
   conceptual tables of information within the MIB. The semantics of
   this type of SNMP message, together with the protocol-specific
   mechanisms for identifying individual instances of object types in
   the MIB, affords  access to related objects in the MIB as if they
   enjoyed a tabular organization.

   By the SNMP exchange sketched below, an SNMP application entity might
   extract the destination address and next hop gateway for each entry
   in the routing table of a particular network element. Suppose that
   this routing table has three entries:

         Destination                     NextHop         Metric

         10.0.0.99                       89.1.1.42       5
         9.1.2.3                         99.0.0.3        3
         10.0.0.51                       89.1.1.42       5


   The management station sends to the SNMP agent a GetNextRequest-PDU
   containing the indicated OBJECT IDENTIFIER values as the requested
   variable names:

   GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )


   The SNMP agent responds with a GetResponse-PDU:

                 GetResponse (( ipRouteDest.9.1.2.3 =  "9.1.2.3" ),
                         ( ipRouteNextHop.9.1.2.3 = "99.0.0.3" ),
                         ( ipRouteMetric1.9.1.2.3 = 3 ))


   The management station continues with:

                 GetNextRequest ( ipRouteDest.9.1.2.3,
                         ipRouteNextHop.9.1.2.3,



Case, Fedor, Schoffstall, & Davin                              [Page 23]

RFC 1157                          SNMP                          May 1990


                         ipRouteMetric1.9.1.2.3 )


   The SNMP agent responds:

                 GetResponse (( ipRouteDest.10.0.0.51 = "10.0.0.51" ),
                         ( ipRouteNextHop.10.0.0.51 = "89.1.1.42" ),
                         ( ipRouteMetric1.10.0.0.51 = 5 ))


   The management station continues with:

                 GetNextRequest ( ipRouteDest.10.0.0.51,
                         ipRouteNextHop.10.0.0.51,
                         ipRouteMetric1.10.0.0.51 )


   The SNMP agent responds:

                 GetResponse (( ipRouteDest.10.0.0.99 = "10.0.0.99" ),
                         ( ipRouteNextHop.10.0.0.99 = "89.1.1.42" ),
                         ( ipRouteMetric1.10.0.0.99 = 5 ))


   The management station continues with:

                 GetNextRequest ( ipRouteDest.10.0.0.99,
                         ipRouteNextHop.10.0.0.99,
                         ipRouteMetric1.10.0.0.99 )


   As there are no further entries in the table, the SNMP agent returns
   those objects that are next in the lexicographical ordering of the
   known object names.  This response signals the end of the routing
   table to the management station.

4.1.4.  The GetResponse-PDU

   The form of the GetResponse-PDU is identical to that of the
   GetRequest-PDU except for the indication of the PDU type.  In the
   ASN.1 language:

                  GetResponse-PDU ::=
                      [2]
                          IMPLICIT SEQUENCE {
                              request-id
                                  RequestID,




Case, Fedor, Schoffstall, & Davin                              [Page 24]

RFC 1157                          SNMP                          May 1990


                              error-status
                                  ErrorStatus,

                              error-index
                                  ErrorIndex,

                              variable-bindings
                                  VarBindList
                          }


   The GetResponse-PDU is generated by a protocol entity only upon
   receipt of the GetRequest-PDU, GetNextRequest-PDU, or SetRequest-PDU,
   as described elsewhere in this document.

   Upon receipt of the GetResponse-PDU, the receiving protocol entity
   presents its contents to its SNMP application entity.

4.1.5.  The SetRequest-PDU

   The form of the SetRequest-PDU is identical to that of the
   GetRequest-PDU except for the indication of the PDU type.  In the
   ASN.1 language:

                  SetRequest-PDU ::=
                      [3]
                          IMPLICIT SEQUENCE {
                              request-id
                                  RequestID,

                              error-status        -- always 0
                                  ErrorStatus,

                              error-index         -- always 0
                                  ErrorIndex,

                              variable-bindings
                                  VarBindList
                          }


   The SetRequest-PDU is generated by a protocol entity only at the
   request of its SNMP application entity.

   Upon receipt of the SetRequest-PDU, the receiving entity responds
   according to any applicable rule in the list below:

        (1)  If, for any object named in the variable-bindings field,



Case, Fedor, Schoffstall, & Davin                              [Page 25]

RFC 1157                          SNMP                          May 1990


             the object is not available for set operations in the
             relevant MIB view, then the receiving entity sends to the
             originator of the received message the GetResponse-PDU of
             identical form, except that the value of the error-status
             field is noSuchName, and the value of the error-index
             field is the index of said object name component in the
             received message.

        (2)  If, for any object named in the variable-bindings field,
             the contents of the value field does not, according to
             the ASN.1 language, manifest a type, length, and value
             that is consistent with that required for the variable,
             then the receiving entity sends to the originator of the
             received message the GetResponse-PDU of identical form,
             except that the value of the error-status field is
             badValue, and the value of the error-index field is the
             index of said object name in the received message.

        (3)  If the size of the Get Response type message generated as
             described below would exceed a local limitation, then the
             receiving entity sends to the originator of the received
             message the GetResponse-PDU of identical form, except
             that the value of the error-status field is tooBig, and
             the value of the error-index field is zero.

        (4)  If, for any object named in the variable-bindings field,
             the value of the named object cannot be altered for
             reasons not covered by any of the foregoing rules, then
             the receiving entity sends to the originator of the
             received message the GetResponse-PDU of identical form,
             except that the value of the error-status field is genErr
             and the value of the error-index field is the index of
             said object name component in the received message.

   If none of the foregoing rules apply, then for each object named in
   the variable-bindings field of the received message, the
   corresponding value is assigned to the variable.  Each variable
   assignment specified by the SetRequest-PDU should be effected as if
   simultaneously set with respect to all other assignments specified in
   the same message.

   The receiving entity then sends to the originator of the received
   message the GetResponse-PDU of identical form except that the value
   of the error-status field of the generated message is noError and the
   value of the error-index field is zero.






Case, Fedor, Schoffstall, & Davin                              [Page 26]

RFC 1157                          SNMP                          May 1990


4.1.6.  The Trap-PDU

   The form of the Trap-PDU is:

     Trap-PDU ::=
         [4]

              IMPLICIT SEQUENCE {
                 enterprise          -- type of object generating
                                     -- trap, see sysObjectID in [5]
                     OBJECT IDENTIFIER,

                 agent-addr          -- address of object generating
                     NetworkAddress, -- trap

                 generic-trap        -- generic trap type
                     INTEGER {
                         coldStart(0),
                         warmStart(1),
                         linkDown(2),
                         linkUp(3),
                         authenticationFailure(4),
                         egpNeighborLoss(5),
                         enterpriseSpecific(6)
                     },

                 specific-trap     -- specific code, present even
                     INTEGER,      -- if generic-trap is not
                                   -- enterpriseSpecific

                 time-stamp        -- time elapsed between the last
                   TimeTicks,      -- (re)initialization of the network
                                   -- entity and the generation of the
                                      trap

                 variable-bindings   -- "interesting" information
                      VarBindList
             }


   The Trap-PDU is generated by a protocol entity only at the request of
   the SNMP application entity.  The means by which an SNMP application
   entity selects the destination addresses of the SNMP application
   entities is implementation-specific.

   Upon receipt of the Trap-PDU, the receiving protocol entity presents
   its contents to its SNMP application entity.




Case, Fedor, Schoffstall, & Davin                              [Page 27]

RFC 1157                          SNMP                          May 1990


   The significance of the variable-bindings component of the Trap-PDU
   is implementation-specific.

   Interpretations of the value of the generic-trap field are:

4.1.6.1.  The coldStart Trap

   A coldStart(0) trap signifies that the sending protocol entity is
   reinitializing itself such that the agent's configuration or the
   protocol entity implementation may be altered.

4.1.6.2.  The warmStart Trap

   A warmStart(1) trap signifies that the sending protocol entity is
   reinitializing itself such that neither the agent configuration nor
   the protocol entity implementation is altered.

4.1.6.3.  The linkDown Trap

   A linkDown(2) trap signifies that the sending protocol entity
   recognizes a failure in one of the communication links represented in
   the agent's configuration.

   The Trap-PDU of type linkDown contains as the first element of its
   variable-bindings, the name and value of the ifIndex instance for the
   affected interface.

4.1.6.4.  The linkUp Trap

   A linkUp(3) trap signifies that the sending protocol entity
   recognizes that one of the communication links represented in the
   agent's configuration has come up.

   The Trap-PDU of type linkUp contains as the first element of its
   variable-bindings, the name and value of the ifIndex instance for the
   affected interface.

4.1.6.5.  The authenticationFailure Trap

   An authenticationFailure(4) trap signifies that the sending protocol
   entity is the addressee of a protocol message that is not properly
   authenticated.  While implementations of the SNMP must be capable of
   generating this trap, they must also be capable of suppressing the
   emission of such traps via an implementation-specific mechanism.

4.1.6.6.  The egpNeighborLoss Trap

   An egpNeighborLoss(5) trap signifies that an EGP neighbor for whom



Case, Fedor, Schoffstall, & Davin                              [Page 28]

RFC 1157                          SNMP                          May 1990


   the sending protocol entity was an EGP peer has been marked down and
   the peer relationship no longer obtains.

   The Trap-PDU of type egpNeighborLoss contains as the first element of
   its variable-bindings, the name and value of the egpNeighAddr
   instance for the affected neighbor.

4.1.6.7.  The enterpriseSpecific Trap

   A enterpriseSpecific(6) trap signifies that the sending protocol
   entity recognizes that some enterprise-specific event has occurred.
   The specific-trap field identifies the particular trap which
   occurred.






































Case, Fedor, Schoffstall, & Davin                              [Page 29]

RFC 1157                          SNMP                          May 1990


5.  Definitions

     RFC1157-SNMP DEFINITIONS ::= BEGIN

      IMPORTS
          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
              FROM RFC1155-SMI;


          -- top-level message

          Message ::=
                  SEQUENCE {
                      version          -- version-1 for this RFC
                          INTEGER {
                              version-1(0)
                          },

                      community        -- community name
                          OCTET STRING,

                      data             -- e.g., PDUs if trivial
                          ANY          -- authentication is being used
                  }


          -- protocol data units

          PDUs ::=
                  CHOICE {
                              get-request
                                  GetRequest-PDU,

                              get-next-request
                                  GetNextRequest-PDU,

                              get-response
                                  GetResponse-PDU,

                              set-request
                                  SetRequest-PDU,

                              trap
                                  Trap-PDU
                          }






Case, Fedor, Schoffstall, & Davin                              [Page 30]

RFC 1157                          SNMP                          May 1990


          -- PDUs

          GetRequest-PDU ::=
              [0]
                  IMPLICIT PDU

          GetNextRequest-PDU ::=
              [1]
                  IMPLICIT PDU

          GetResponse-PDU ::=
              [2]
                  IMPLICIT PDU

          SetRequest-PDU ::=
              [3]
                  IMPLICIT PDU

          PDU ::=
                  SEQUENCE {
                     request-id
                          INTEGER,

                      error-status      -- sometimes ignored
                          INTEGER {
                              noError(0),
                              tooBig(1),
                              noSuchName(2),
                              badValue(3),
                              readOnly(4),
                              genErr(5)
                          },

                      error-index       -- sometimes ignored
                         INTEGER,

                      variable-bindings -- values are sometimes ignored
                          VarBindList
                  }

          Trap-PDU ::=
              [4]
                 IMPLICIT SEQUENCE {
                      enterprise        -- type of object generating
                                        -- trap, see sysObjectID in [5]


                          OBJECT IDENTIFIER,



Case, Fedor, Schoffstall, & Davin                              [Page 31]

RFC 1157                          SNMP                          May 1990


                      agent-addr        -- address of object generating
                          NetworkAddress, -- trap

                      generic-trap      -- generic trap type
                          INTEGER {
                              coldStart(0),
                              warmStart(1),
                              linkDown(2),
                              linkUp(3),
                              authenticationFailure(4),
                              egpNeighborLoss(5),
                              enterpriseSpecific(6)
                          },

                      specific-trap  -- specific code, present even
                          INTEGER,   -- if generic-trap is not
                                     -- enterpriseSpecific

                      time-stamp     -- time elapsed between the last
                          TimeTicks, -- (re)initialization of the
                                        network
                                     -- entity and the generation of the
                                        trap

                       variable-bindings -- "interesting" information
                          VarBindList
                  }


          -- variable bindings

          VarBind ::=
                  SEQUENCE {
                      name
                          ObjectName,

                      value
                          ObjectSyntax
                  }

         VarBindList ::=
                  SEQUENCE OF
                     VarBind

         END






Case, Fedor, Schoffstall, & Davin                              [Page 32]

RFC 1157                          SNMP                          May 1990


6.  Acknowledgements

   This memo was influenced by the IETF SNMP Extensions working
   group:

             Karl Auerbach, Epilogue Technology
             K. Ramesh Babu, Excelan
             Amatzia Ben-Artzi, 3Com/Bridge
             Lawrence Besaw, Hewlett-Packard
             Jeffrey D. Case, University of Tennessee at Knoxville
             Anthony Chung, Sytek
             James Davidson, The Wollongong Group
             James R. Davin, MIT Laboratory for Computer Science
             Mark S. Fedor, NYSERNet
             Phill Gross, The MITRE Corporation
             Satish Joshi, ACC
             Dan Lynch, Advanced Computing Environments
             Keith McCloghrie, The Wollongong Group
             Marshall T. Rose, The Wollongong Group (chair)
             Greg Satz, cisco
             Martin Lee Schoffstall, Rensselaer Polytechnic Institute
             Wengyik Yeong, NYSERNet





























Case, Fedor, Schoffstall, & Davin                              [Page 33]

RFC 1157                          SNMP                          May 1990


7.  References

   [1] Cerf, V., "IAB Recommendations for the Development of
       Internet Network Management Standards", RFC 1052, IAB,
       April 1988.

   [2] Rose, M., and K. McCloghrie, "Structure and Identification
       of Management Information for TCP/IP-based internets",
       RFC 1065, TWG, August 1988.

   [3] McCloghrie, K., and M. Rose, "Management Information Base
       for Network Management of TCP/IP-based internets",
       RFC 1066, TWG, August 1988.

   [4] Cerf, V., "Report of the Second Ad Hoc Network Management
       Review Group", RFC 1109, IAB, August 1989.

   [5] Rose, M., and K. McCloghrie, "Structure and Identification
       of Management Information for TCP/IP-based Internets",
       RFC 1155, Performance Systems International and Hughes LAN
       Systems, May 1990.

   [6] McCloghrie, K., and M. Rose, "Management Information Base
       for Network Management of TCP/IP-based Internets",
       RFC 1156, Hughes LAN Systems and Performance Systems
       International, May 1990.

   [7] Case, J., M. Fedor, M. Schoffstall, and J. Davin,
       "A Simple Network Management Protocol", Internet
       Engineering Task Force working note, Network Information
       Center, SRI International, Menlo Park, California,
       March 1988.

   [8] Davin, J., J. Case, M. Fedor, and M. Schoffstall,
       "A Simple Gateway Monitoring Protocol", RFC 1028,
       Proteon, University of Tennessee at Knoxville,
       Cornell University, and Rensselaer Polytechnic
       Institute, November 1987.

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

  [10] Information processing systems - Open Systems
       Interconnection, "Specification of Basic Encoding Rules
       for Abstract Notation One (ASN.1)", International



Case, Fedor, Schoffstall, & Davin                              [Page 34]

RFC 1157                          SNMP                          May 1990


       Organization for Standardization, International Standard
       8825, December 1987.

  [11] Postel, J., "User Datagram Protocol", RFC 768,
       USC/Information Sciences Institute, November 1980.

Security Considerations

   Security issues are not discussed in this memo.

Authors' Addresses

   Jeffrey D. Case
   SNMP Research
   P.O. Box 8593
   Knoxville, TN 37996-4800

   Phone:  (615) 573-1434

   Email:  case@CS.UTK.EDU


   Mark Fedor
   Performance Systems International
   Rensselaer Technology Park
   125 Jordan Road
   Troy, NY 12180

   Phone:  (518) 283-8860

   Email:  fedor@patton.NYSER.NET


   Martin Lee Schoffstall
   Performance Systems International
   Rensselaer Technology Park
   165 Jordan Road
   Troy, NY 12180

   Phone:  (518) 283-8860

   Email:  schoff@NISC.NYSER.NET









Case, Fedor, Schoffstall, & Davin                              [Page 35]

RFC 1157                          SNMP                          May 1990


   James R. Davin
   MIT Laboratory for Computer Science, NE43-507
   545 Technology Square
   Cambridge, MA 02139

   Phone:  (617) 253-6020

   EMail:  jrd@ptt.lcs.mit.edu











































Case, Fedor, Schoffstall, & Davin                              [Page 36]
