





Network Working Group                                            J. Case
Request for Comments: 3412                           SNMP Research, Inc.
STD: 62                                                    D. Harrington
Obsoletes: 2572                                       Enterasys Networks
Category: Standards Track                                     R. Presuhn
                                                      BMC Software, Inc.
                                                               B. Wijnen
                                                     Lucent Technologies
                                                           December 2002


               Message Processing and Dispatching for the
               Simple Network Management Protocol (SNMP)

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.

Copyright Notice

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

Abstract

   This document describes the Message Processing and Dispatching for
   Simple Network Management Protocol (SNMP) messages within the SNMP
   architecture.  It defines the procedures for dispatching potentially
   multiple versions of SNMP messages to the proper SNMP Message
   Processing Models, and for dispatching PDUs to SNMP applications.
   This document also describes one Message Processing Model - the
   SNMPv3 Message Processing Model.  This document obsoletes RFC 2572.
















Case, et al.                Standards Track                     [Page 1]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


Table of Contents

   1. Introduction ................................................    3
   2. Overview ....................................................    4
   2.1. The Dispatcher ............................................    5
   2.2. Message Processing Subsystem ..............................    5
   3. Elements of Message Processing and Dispatching ..............    6
   3.1. messageProcessingModel ....................................    6
   3.2. pduVersion ................................................    6
   3.3. pduType ...................................................    7
   3.4. sendPduHandle .............................................    7
   4. Dispatcher Elements of Procedure ............................    7
   4.1. Sending an SNMP Message to the Network ....................    7
   4.1.1. Sending a Request or Notification .......................    8
   4.1.2. Sending a Response to the Network .......................    9
   4.2. Receiving an SNMP Message from the Network ................   11
   4.2.1. Message Dispatching of received SNMP Messages ...........   11
   4.2.2. PDU Dispatching for Incoming Messages ...................   12
   4.2.2.1. Incoming Requests and Notifications ...................   13
   4.2.2.2. Incoming Responses ....................................   14
   4.3. Application Registration for Handling PDU types ...........   15
   4.4. Application Unregistration for Handling PDU Types .........   16
   5. Definitions .................................................   16
   5.1. Definitions for SNMP Message Processing and Dispatching ...   16
   6. The SNMPv3 Message Format ...................................   19
   6.1. msgVersion ................................................   20
   6.2. msgID .....................................................   20
   6.3. msgMaxSize ................................................   21
   6.4. msgFlags ..................................................   21
   6.5. msgSecurityModel ..........................................   24
   6.6. msgSecurityParameters .....................................   24
   6.7. scopedPduData .............................................   24
   6.8. scopedPDU .................................................   24
   6.8.1. contextEngineID .........................................   24
   6.8.2. contextName .............................................   25
   6.8.3. data ....................................................   25
   7. Elements of Procedure for v3MP ..............................   25
   7.1. Prepare an Outgoing SNMP Message ..........................   26
   7.2. Prepare Data Elements from an Incoming SNMP Message .......   32
   8. Intellectual Property .......................................   37
   9. Acknowledgements ............................................   38
   10. Security Considerations ....................................   39
   11. References .................................................   40
   11.1. Normative References .....................................   40
   11.2. Informative References ...................................   41
   12. Editors' Addresses .........................................   42
   13. Full Copyright Statement ...................................   43




Case, et al.                Standards Track                     [Page 2]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


1.  Introduction

   The Architecture for describing Internet Management Frameworks
   [RFC3411] describes that an SNMP engine is composed of:

      1) a Dispatcher
      2) a Message Processing Subsystem,
      3) a Security Subsystem, and
      4) an Access Control Subsystem.

   Applications make use of the services of these subsystems.

   It is important to understand the SNMP architecture and its
   terminology to understand where the Message Processing Subsystem and
   Dispatcher described in this document fit into the architecture and
   interact with other subsystems within the architecture.  The reader
   is expected to have read and understood the description of the SNMP
   architecture, defined in [RFC3411].

   The Dispatcher in the SNMP engine sends and receives SNMP messages.
   It also dispatches SNMP PDUs to SNMP applications.  When an SNMP
   message needs to be prepared or when data needs to be extracted from
   an SNMP message, the Dispatcher delegates these tasks to a message
   version-specific Message Processing Model within the Message
   Processing Subsystem.

   A Message Processing Model is responsible for processing an SNMP
   version-specific message and for coordinating the interaction with
   the Security Subsystem to ensure proper security is applied to the
   SNMP message being handled.

   Interactions between the Dispatcher, the Message Processing
   Subsystem, and applications are modeled using abstract data elements
   and abstract service interface primitives defined by the SNMP
   architecture.

   Similarly, interactions between the Message Processing Subsystem and
   the Security Subsystem are modeled using abstract data elements and
   abstract service interface primitives as defined by the SNMP
   architecture.

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in BCP 14, RFC 2119.







Case, et al.                Standards Track                     [Page 3]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


2.  Overview

   The following illustration depicts the Message Processing in relation
   to SNMP applications, the Security Subsystem and Transport Mappings.

   +-------------------------------------------------------------------+
   | SNMP Entity                                                       |
   |                                                                   |
   | +---------------------------------------------------------------+ |
   | | Applications                                                  | |
   | | +-----------+  +--------------+                               | |
   | | | Command   |  | Notification |                               | |
   | | | Generator |  | Originator   | +-----------+ +--------------+| |
   | | +-----------+  +--------------+ | Proxy     | | Other        || |
   | | +-----------+  +--------------+ | Forwarder | |Application(s)|| |
   | | | Command   |  | Notification | +-----------+ +--------------+| |
   | | | Responder |  | Receiver     |                               | |
   | | +-----------+  +--------------+                               | |
   | +---------------------------------------------------------------+ |
   |        ^                ^               ^           ^             |
   |        |                |               |           |             |
   |        v                v               v           v             |
   |        +--------+-------+---------------+-----------+             |
   |                 ^                                                 |
   |                 |    +---------------------+  +-----------------+ |
   |                 |    | Message Processing  |  | Security        | |
   | Dispatcher      v    | Subsystem           |  | Subsystem       | |
   | +------------------+ |     +------------+  |  |                 | |
   | | PDU Dispatcher   | |  +->| v1MP     * |<--->| +-------------+ | |
   | |                  | |  |  +------------+  |  | | Other       | | |
   | |                  | |  |  +------------+  |  | | Security    | | |
   | |                  | |  +->| v2cMP    * |<--->| | Model       | | |
   | | Message          | |  |  +------------+  |  | +-------------+ | |
   | | Dispatcher  <-------->+                  |  |                 | |
   | |                  | |  |  +------------+  |  | +-------------+ | |
   | |                  | |  +->| v3MP     * |<--->| | User-based  | | |
   | | Transport        | |  |  +------------+  |  | | Security    | | |
   | | Mapping          | |  |  +------------+  |  | | Model       | | |
   | | (e.g., RFC 3417) | |  +->| otherMP  * |<--->| +-------------+ | |
   | +------------------+ |     +------------+  |  |                 | |
   |          ^           +---------------------+  +-----------------+ |
   |          |                                                        |
   +----------|--------------------------------------------------------+
              v
     +------------------+
     |   Network        |           * One or more models may be present.
     +------------------+




Case, et al.                Standards Track                     [Page 4]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


2.1.  The Dispatcher

   The Dispatcher is a key piece of an SNMP engine.  There is only one
   in an SNMP engine, and its job is to dispatch tasks to the multiple
   version-specific Message Processing Models, and to dispatch PDUs to
   various applications.

   For outgoing messages, an application provides a PDU to be sent, plus
   the data needed to prepare and send the message, and the application
   specifies which version-specific Message Processing Model will be
   used to prepare the message with the desired security processing.
   Once the message is prepared, the Dispatcher sends the message.

   For incoming messages, the Dispatcher determines the SNMP version of
   the incoming message and passes the message to the version-specific
   Message Processing Model to extract the components of the message and
   to coordinate the processing of security services for the message.
   After version-specific processing, the PDU Dispatcher determines
   which application, if any, should receive the PDU for processing and
   forwards it accordingly.

   The Dispatcher, while sending and receiving SNMP messages, collects
   statistics about SNMP messages and the behavior of the SNMP engine in
   managed objects to make them accessible to remote SNMP entities.
   This document defines these managed objects, the MIB module which
   contains them, and how these managed objects might be used to provide
   useful management.

2.2.  Message Processing Subsystem

   The SNMP Message Processing Subsystem is the part of an SNMP engine
   which interacts with the Dispatcher to handle the version-specific
   SNMP messages.  It contains one or more Message Processing Models.

   This document describes one Message Processing Model, the SNMPv3
   Message Processing Model, in Section 6.  The SNMPv3 Message
   Processing Model is defined in a separate section to show that
   multiple (independent) Message Processing Models can exist at the
   same time and that such Models can be described in different
   documents.  The SNMPv3 Message Processing Model can be replaced or
   supplemented with other Message Processing Models in the future.  Two
   Message Processing Models which are expected to be developed in the
   future are the SNMPv1 message format [RFC1157] and the SNMPv2c
   message format [RFC1901].  Others may be developed as needed.







Case, et al.                Standards Track                     [Page 5]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


3.  Elements of Message Processing and Dispatching

   See [RFC3411] for the definitions of:

      contextEngineID
      contextName
      scopedPDU
      maxSizeResponseScopedPDU
      securityModel
      securityName
      securityLevel
      messageProcessingModel

   For incoming messages, a version-specific message processing module
   provides these values to the Dispatcher.  For outgoing messages, an
   application provides these values to the Dispatcher.

   For some version-specific processing, the values may be extracted
   from received messages; for other versions, the values may be
   determined by algorithm, or by an implementation-defined mechanism.
   The mechanism by which the value is determined is irrelevant to the
   Dispatcher.

   The following additional or expanded definitions are for use within
   the Dispatcher.

3.1.  messageProcessingModel

   The value of messageProcessingModel identifies a Message Processing
   Model.  A Message Processing Model describes the version-specific
   procedures for extracting data from messages, generating messages,
   calling upon a securityModel to apply its security services to
   messages, for converting data from a version-specific message format
   into a generic format usable by the Dispatcher, and for converting
   data from Dispatcher format into a version-specific message format.

3.2.  pduVersion

   The value of pduVersion represents a specific version of protocol
   operation and its associated PDU formats, such as SNMPv1 or SNMPv2
   [RFC3416].  The values of pduVersion are specific to the version of
   the PDU contained in a message, and the PDUs processed by
   applications.  The Dispatcher does not use the value of pduVersion
   directly.







Case, et al.                Standards Track                     [Page 6]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   An application specifies the pduVersion when it requests the PDU
   Dispatcher to send a PDU to another SNMP engine.  The Dispatcher
   passes the pduVersion to a Message Processing Model, so it knows how
   to handle the PDU properly.

   For incoming messages, the pduVersion is provided to the Dispatcher
   by a version-specific Message Processing module.  The PDU Dispatcher
   passes the pduVersion to the application so it knows how to handle
   the PDU properly.  For example, a command responder application needs
   to know whether to use [RFC3416] elements of procedure and syntax
   instead of those specified for SNMPv1.

3.3.  pduType

   A value of the pduType represents a specific type of protocol
   operation.  The values of the pduType are specific to the version of
   the PDU contained in a message.

   Applications register to support particular pduTypes for particular
   contextEngineIDs.

   For incoming messages, pduType is provided to the Dispatcher by a
   version-specific Message Processing module.  It is subsequently used
   to dispatch the PDU to the application which registered for the
   pduType for the contextEngineID of the associated scopedPDU.

3.4.  sendPduHandle

   This handle is generated for coordinating the processing of requests
   and responses between the SNMP engine and an application.  The handle
   must be unique across all version-specific Message Processing Models,
   and is of local significance only.

4.  Dispatcher Elements of Procedure

   This section describes the procedures followed by the Dispatcher when
   generating and processing SNMP messages.

4.1.  Sending an SNMP Message to the Network

   This section describes the procedure followed by an SNMP engine
   whenever it sends an SNMP message.









Case, et al.                Standards Track                     [Page 7]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


4.1.1.  Sending a Request or Notification

   The following procedures are followed by the Dispatcher when an
   application wants to send an SNMP PDU to another (remote)
   application, i.e., to initiate a communication by originating a
   message, such as one containing a request or a notification.

   1) The application requests this using the abstract service
      primitive:

      statusInformation =              -- sendPduHandle if success
                                       -- errorIndication if failure
        sendPdu(
        IN   transportDomain           -- transport domain to be used
        IN   transportAddress          -- destination network address
        IN   messageProcessingModel    -- typically, SNMP version
        IN   securityModel             -- Security Model to use
        IN   securityName              -- on behalf of this principal
        IN   securityLevel             -- Level of Security requested
        IN   contextEngineID           -- data from/at this entity
        IN   contextName               -- data from/in this context
        IN   pduVersion                -- the version of the PDU
        IN   PDU                       -- SNMP Protocol Data Unit
        IN   expectResponse            -- TRUE or FALSE
             )

   2) If the messageProcessingModel value does not represent a Message
      Processing Model known to the Dispatcher, then an errorIndication
      (implementation-dependent) is returned to the calling application.
      No further processing is performed.

   3) The Dispatcher generates a sendPduHandle to coordinate subsequent
      processing.


















Case, et al.                Standards Track                     [Page 8]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) The Message Dispatcher sends the request to the version-specific
      Message Processing module identified by messageProcessingModel
      using the abstract service primitive:

      statusInformation =              -- success or error indication
        prepareOutgoingMessage(
        IN   transportDomain           -- as specified by application
        IN   transportAddress          -- as specified by application
        IN   messageProcessingModel    -- as specified by application
        IN   securityModel             -- as specified by application
        IN   securityName              -- as specified by application
        IN   securityLevel             -- as specified by application
        IN   contextEngineID           -- as specified by application
        IN   contextName               -- as specified by application
        IN   pduVersion                -- as specified by application
        IN   PDU                       -- as specified by application
        IN   expectResponse            -- as specified by application
        IN   sendPduHandle             -- as determined in step 3.
        OUT  destTransportDomain       -- destination transport domain
        OUT  destTransportAddress      -- destination transport address
        OUT  outgoingMessage           -- the message to send
        OUT  outgoingMessageLength     -- the message length
             )

   5) If the statusInformation indicates an error, the errorIndication
      is returned to the calling application.  No further processing is
      performed.

   6) If the statusInformation indicates success, the sendPduHandle is
      returned to the application, and the outgoingMessage is sent.  The
      transport used to send the outgoingMessage is returned via
      destTransportDomain, and the address to which it was sent is
      returned via destTransportAddress.

   Outgoing Message Processing is complete.

4.1.2.  Sending a Response to the Network

   The following procedure is followed when an application wants to
   return a response back to the originator of an SNMP Request.











Case, et al.                Standards Track                     [Page 9]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   1) An application can request this using the abstract service
      primitive:

      result =
      returnResponsePdu(
       IN   messageProcessingModel   -- typically, SNMP version
       IN   securityModel            -- Security Model in use
       IN   securityName             -- on behalf of this principal
       IN   securityLevel            -- same as on incoming request
       IN   contextEngineID          -- data from/at this SNMP entity
       IN   contextName              -- data from/in this context
       IN   pduVersion               -- the version of the PDU
       IN   PDU                      -- SNMP Protocol Data Unit
       IN   maxSizeResponseScopedPDU -- maximum size of Response PDU
       IN   stateReference           -- reference to state information
                                     -- as presented with the request
       IN   statusInformation        -- success or errorIndication
       )                             -- (error counter OID and value
                                     -- when errorIndication)

   2) The Message Dispatcher sends the request to the appropriate
      Message Processing Model indicated by the received value of
      messageProcessingModel using the abstract service primitive:

      result =                       -- SUCCESS or errorIndication
       prepareResponseMessage(
       IN   messageProcessingModel   -- specified by application
       IN   securityModel            -- specified by application
       IN   securityName             -- specified by application
       IN   securityLevel            -- specified by application
       IN   contextEngineID          -- specified by application
       IN   contextName              -- specified by application
       IN   pduVersion               -- specified by application
       IN   PDU                      -- specified by application
       IN   maxSizeResponseScopedPDU -- specified by application
       IN   stateReference           -- specified by application
       IN   statusInformation        -- specified by application
       OUT  destTransportDomain      -- destination transport domain
       OUT  destTransportAddress     -- destination transport address
       OUT  outgoingMessage          -- the message to send
       OUT  outgoingMessageLength    -- the message length
            )

   3) If the result is an errorIndication, the errorIndication is
      returned to the calling application.  No further processing is
      performed.





Case, et al.                Standards Track                    [Page 10]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) If the result is success, the outgoingMessage is sent.  The
      transport used to send the outgoingMessage is returned via
      destTransportDomain, and the address to which it was sent is
      returned via destTransportAddress.

   Message Processing is complete.

4.2.  Receiving an SNMP Message from the Network

   This section describes the procedure followed by an SNMP engine
   whenever it receives an SNMP message.

   Please note, that for the sake of clarity and to prevent the text
   from being even longer and more complicated, some details were
   omitted from the steps below.  In particular, the elements of
   procedure do not always explicitly indicate when state information
   needs to be released.  The general rule is that if state information
   is available when a message is to be "discarded without further
   processing", then the state information must also be released at that
   same time.

4.2.1.  Message Dispatching of received SNMP Messages

   1) The snmpInPkts counter [RFC3418] is incremented.

   2) The version of the SNMP message is determined in an
      implementation-dependent manner.  If the packet cannot be
      sufficiently parsed to determine the version of the SNMP message,
      then the snmpInASNParseErrs [RFC3418] counter is incremented, and
      the message is discarded without further processing.  If the
      version is not supported, then the snmpInBadVersions [RFC3418]
      counter is incremented, and the message is discarded without
      further processing.

   3) The origin transportDomain and origin transportAddress are
      determined.















Case, et al.                Standards Track                    [Page 11]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) The message is passed to the version-specific Message Processing
      Model which returns the abstract data elements required by the
      Dispatcher.  This is performed using the abstract service
      primitive:

      result =                        -- SUCCESS or errorIndication
        prepareDataElements(
        IN   transportDomain          -- origin as determined in step 3.
        IN   transportAddress         -- origin as determined in step 3.
        IN   wholeMsg                 -- as received from the network
        IN   wholeMsgLength           -- as received from the network
        OUT  messageProcessingModel   -- typically, SNMP version
        OUT  securityModel            -- Security Model specified
        OUT  securityName             -- on behalf of this principal
        OUT  securityLevel            -- Level of Security specified
        OUT  contextEngineID          -- data from/at this entity
        OUT  contextName              -- data from/in this context
        OUT  pduVersion               -- the version of the PDU
        OUT  PDU                      -- SNMP Protocol Data Unit
        OUT  pduType                  -- SNMP PDU type
        OUT  sendPduHandle            -- handle for a matched request
        OUT  maxSizeResponseScopedPDU -- maximum size of Response PDU
        OUT  statusInformation        -- success or errorIndication
                                      -- (error counter OID and value
                                      -- when errorIndication)
        OUT  stateReference           -- reference to state information
                                      -- to be used for a possible
             )                        -- Response

   5) If the result is a FAILURE errorIndication, the message is
      discarded without further processing.

   6) At this point, the abstract data elements have been prepared and
      processing continues as described in Section 4.2.2, PDU
      Dispatching for Incoming Messages.

4.2.2.  PDU Dispatching for Incoming Messages

   The elements of procedure for the dispatching of PDUs depends on the
   value of sendPduHandle.  If the value of sendPduHandle is <none>,
   then this is a request or notification and the procedures specified
   in Section 4.2.2.1 apply.  If the value of snmpPduHandle is not
   <none>, then this is a response and the procedures specified in
   Section 4.2.2.2 apply.







Case, et al.                Standards Track                    [Page 12]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


4.2.2.1.  Incoming Requests and Notifications

   The following procedures are followed for the dispatching of PDUs
   when the value of sendPduHandle is <none>, indicating this is a
   request or notification.

   1) The combination of contextEngineID and pduType is used to
      determine which application has registered for this request or
      notification.

   2) If no application has registered for the combination, then:

      a) The snmpUnknownPDUHandlers counter is incremented.

      b) A Response message is generated using the abstract service
         primitive:

         result =                       -- SUCCESS or FAILURE
         prepareResponseMessage(
         IN   messageProcessingModel    -- as provided by MP module
         IN   securityModel             -- as provided by MP module
         IN   securityName              -- as provided by MP module
         IN   securityLevel             -- as provided by MP module
         IN   contextEngineID           -- as provided by MP module
         IN   contextName               -- as provided by MP module
         IN   pduVersion                -- as provided by MP module
         IN   PDU                       -- as provided by MP module
         IN   maxSizeResponseScopedPDU  -- as provided by MP module
         IN   stateReference            -- as provided by MP module
         IN   statusInformation         -- errorIndication plus
                                        -- snmpUnknownPDUHandlers OID
                                        -- value pair.
         OUT  destTransportDomain       -- destination transportDomain
         OUT  destTransportAddress      -- destination transportAddress
         OUT  outgoingMessage           -- the message to send
         OUT  outgoingMessageLength     -- its length
         )

      c) If the result is SUCCESS, then the prepared message is sent to
         the originator of the request as identified by the
         transportDomain and transportAddress.  The transport used to
         send the outgoingMessage is returned via destTransportDomain,
         and the address to which it was sent is returned via
         destTransportAddress.

      d) The incoming message is discarded without further processing.
         Message Processing for this message is complete.




Case, et al.                Standards Track                    [Page 13]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   3) The PDU is dispatched to the application, using the abstract
      service primitive:

      processPdu(                     -- process Request/Notification
        IN   messageProcessingModel   -- as provided by MP module
        IN   securityModel            -- as provided by MP module
        IN   securityName             -- as provided by MP module
        IN   securityLevel            -- as provided by MP module
        IN   contextEngineID          -- as provided by MP module
        IN   contextName              -- as provided by MP module
        IN   pduVersion               -- as provided by MP module
        IN   PDU                      -- as provided by MP module
        IN   maxSizeResponseScopedPDU -- as provided by MP module
        IN   stateReference           -- as provided by MP module
                                      -- needed when sending response
             )

      Message processing for this message is complete.

4.2.2.2.  Incoming Responses

   The following procedures are followed for the dispatching of PDUs
   when the value of sendPduHandle is not <none>, indicating this is a
   response.

   1) The value of sendPduHandle is used to determine, in an
      implementation-defined manner, which application is waiting for a
      response associated with this sendPduHandle.

   2) If no waiting application is found, the message is discarded
      without further processing, and the stateReference is released.
      The snmpUnknownPDUHandlers counter is incremented.  Message
      Processing is complete for this message.

   3) Any cached information, including stateReference, about the
      message is discarded.















Case, et al.                Standards Track                    [Page 14]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) The response is dispatched to the application using the abstract
      service primitive:

      processResponsePdu(              -- process Response PDU
        IN   messageProcessingModel    -- provided by the MP module
        IN   securityModel             -- provided by the MP module
        IN   securityName              -- provided by the MP module
        IN   securityLevel             -- provided by the MP module
        IN   contextEngineID           -- provided by the MP module
        IN   contextName               -- provided by the MP module
        IN   pduVersion                -- provided by the MP module
        IN   PDU                       -- provided by the MP module
        IN   statusInformation         -- provided by the MP module
        IN   sendPduHandle             -- provided by the MP module
             )

      Message Processing is complete for this message.

4.3.  Application Registration for Handling PDU types

   Applications that want to process certain PDUs must register with the
   PDU Dispatcher.  Applications specify the combination of
   contextEngineID and pduType(s) for which they want to take
   responsibility.

   1) An application registers according to the abstract interface
      primitive:

      statusInformation =           -- success or errorIndication
        registerContextEngineID(
        IN   contextEngineID        -- take responsibility for this one
        IN   pduType                -- the pduType(s) to be registered
             )

      Note: Implementations may provide a means of requesting
      registration for simultaneous multiple contextEngineID values,
      e.g., all contextEngineID values, and may also provide a means for
      requesting simultaneous registration for multiple values of the
      pduType.

   2) The parameters may be checked for validity; if they are not, then
      an errorIndication (invalidParameter) is returned to the
      application.

   3) Each combination of contextEngineID and pduType can be registered
      only once.  If another application has already registered for the
      specified combination, then an errorIndication (alreadyRegistered)
      is returned to the application.



Case, et al.                Standards Track                    [Page 15]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) Otherwise, the registration is saved so that SNMP PDUs can be
      dispatched to this application.

4.4.  Application Unregistration for Handling PDU Types

   Applications that no longer want to process certain PDUs must
   unregister with the PDU Dispatcher.

   1) An application unregisters using the abstract service primitive:

      unregisterContextEngineID(
       IN   contextEngineID        -- give up responsibility for this
       IN   pduType                -- the pduType(s) to be unregistered
            )

      Note: Implementations may provide a means for requesting the
      unregistration for simultaneous multiple contextEngineID values,
      e.g., all contextEngineID values, and may also provide a means for
      requesting simultaneous unregistration for multiple values of
      pduType.

   2) If the contextEngineID and pduType combination has been
      registered, then the registration is deleted.

      If no such registration exists, then the request is ignored.

5.  Definitions

5.1.  Definitions for SNMP Message Processing and Dispatching

   SNMP-MPD-MIB DEFINITIONS ::= BEGIN

   IMPORTS
       MODULE-COMPLIANCE, OBJECT-GROUP         FROM SNMPv2-CONF
       MODULE-IDENTITY, OBJECT-TYPE,
       snmpModules, Counter32                  FROM SNMPv2-SMI;

   snmpMPDMIB MODULE-IDENTITY
       LAST-UPDATED "200210140000Z"
       ORGANIZATION "SNMPv3 Working Group"
       CONTACT-INFO "WG-EMail:   snmpv3@lists.tislabs.com
                     Subscribe:  snmpv3-request@lists.tislabs.com

                     Co-Chair:   Russ Mundy
                                 Network Associates Laboratories
                     postal:     15204 Omega Drive, Suite 300
                                 Rockville, MD 20850-4601
                                 USA



Case, et al.                Standards Track                    [Page 16]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


                     EMail:      mundy@tislabs.com
                     phone:      +1 301-947-7107

                     Co-Chair &
                     Co-editor:  David Harrington
                                 Enterasys Networks
                     postal:     35 Industrial Way
                                 P. O. Box 5005
                                 Rochester NH 03866-5005
                                 USA
                     EMail:      dbh@enterasys.com
                     phone:      +1 603-337-2614

                     Co-editor:  Jeffrey Case
                                 SNMP Research, Inc.
                     postal:     3001 Kimberlin Heights Road
                                 Knoxville, TN 37920-9716
                                 USA
                     EMail:      case@snmp.com
                     phone:      +1 423-573-1434

                     Co-editor:  Randy Presuhn
                                 BMC Software, Inc.
                     postal:     2141 North First Street
                                 San Jose, CA 95131
                                 USA
                     EMail:      randy_presuhn@bmc.com
                     phone:      +1 408-546-1006

                     Co-editor:  Bert Wijnen
                                 Lucent Technologies
                     postal:     Schagen 33
                                 3461 GL Linschoten
                                 Netherlands
                     EMail:      bwijnen@lucent.com
                     phone:      +31 348-680-485
                    "
       DESCRIPTION  "The MIB for Message Processing and Dispatching

                     Copyright (C) The Internet Society (2002). This
                     version of this MIB module is part of RFC 3412;
                     see the RFC itself for full legal notices.
                    "
       REVISION     "200210140000Z"            -- 14 October 2002
       DESCRIPTION  "Updated addresses, published as RFC 3412."
       REVISION     "199905041636Z"            -- 4 May 1999
       DESCRIPTION  "Updated addresses, published as RFC 2572."




Case, et al.                Standards Track                    [Page 17]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


       REVISION     "199709300000Z"            -- 30 September 1997
       DESCRIPTION  "Original version, published as RFC 2272."
       ::= { snmpModules 11 }

   -- Administrative assignments ***************************************

   snmpMPDAdmin           OBJECT IDENTIFIER ::= { snmpMPDMIB 1 }
   snmpMPDMIBObjects      OBJECT IDENTIFIER ::= { snmpMPDMIB 2 }
   snmpMPDMIBConformance  OBJECT IDENTIFIER ::= { snmpMPDMIB 3 }

   -- Statistics for SNMP Messages *************************************

   snmpMPDStats           OBJECT IDENTIFIER ::= { snmpMPDMIBObjects 1 }

   snmpUnknownSecurityModels OBJECT-TYPE
       SYNTAX       Counter32
       MAX-ACCESS   read-only
       STATUS       current
       DESCRIPTION "The total number of packets received by the SNMP
                    engine which were dropped because they referenced a
                    securityModel that was not known to or supported by
                    the SNMP engine.
                   "
       ::= { snmpMPDStats 1 }

   snmpInvalidMsgs OBJECT-TYPE
       SYNTAX       Counter32
       MAX-ACCESS   read-only
       STATUS       current
       DESCRIPTION "The total number of packets received by the SNMP
                    engine which were dropped because there were invalid
                    or inconsistent components in the SNMP message.
                   "
       ::= { snmpMPDStats 2 }

   snmpUnknownPDUHandlers OBJECT-TYPE
       SYNTAX       Counter32
       MAX-ACCESS   read-only
       STATUS       current
       DESCRIPTION "The total number of packets received by the SNMP
                    engine which were dropped because the PDU contained
                    in the packet could not be passed to an application
                    responsible for handling the pduType, e.g. no SNMP
                    application had registered for the proper
                    combination of the contextEngineID and the pduType.
                   "
       ::= { snmpMPDStats 3 }




Case, et al.                Standards Track                    [Page 18]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   -- Conformance information ******************************************

   snmpMPDMIBCompliances OBJECT IDENTIFIER ::= {snmpMPDMIBConformance 1}
   snmpMPDMIBGroups      OBJECT IDENTIFIER ::= {snmpMPDMIBConformance 2}

   -- Compliance statements

   snmpMPDCompliance MODULE-COMPLIANCE
       STATUS       current
       DESCRIPTION "The compliance statement for SNMP entities which
                    implement the SNMP-MPD-MIB.
                   "
       MODULE    -- this module
           MANDATORY-GROUPS { snmpMPDGroup }
       ::= { snmpMPDMIBCompliances 1 }

   snmpMPDGroup OBJECT-GROUP
       OBJECTS {
                 snmpUnknownSecurityModels,
                 snmpInvalidMsgs,
                 snmpUnknownPDUHandlers
               }
       STATUS       current
       DESCRIPTION "A collection of objects providing for remote
                    monitoring of the SNMP Message Processing and
                    Dispatching process.
                   "
       ::= { snmpMPDMIBGroups 1 }

   END

6.  The SNMPv3 Message Format

   This section defines the SNMPv3 message format and the corresponding
   SNMP version 3 Message Processing Model (v3MP).

   SNMPv3MessageSyntax DEFINITIONS IMPLICIT TAGS ::= BEGIN

       SNMPv3Message ::= SEQUENCE {
           -- identify the layout of the SNMPv3Message
           -- this element is in same position as in SNMPv1
           -- and SNMPv2c, allowing recognition
           -- the value 3 is used for snmpv3
           msgVersion INTEGER ( 0 .. 2147483647 ),
           -- administrative parameters
           msgGlobalData HeaderData,
           -- security model-specific parameters
           -- format defined by Security Model



Case, et al.                Standards Track                    [Page 19]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


           msgSecurityParameters OCTET STRING,
           msgData  ScopedPduData
       }

       HeaderData ::= SEQUENCE {
           msgID      INTEGER (0..2147483647),
           msgMaxSize INTEGER (484..2147483647),

           msgFlags   OCTET STRING (SIZE(1)),
                      --  .... ...1   authFlag
                      --  .... ..1.   privFlag
                      --  .... .1..   reportableFlag
                      --              Please observe:
                      --  .... ..00   is OK, means noAuthNoPriv
                      --  .... ..01   is OK, means authNoPriv
                      --  .... ..10   reserved, MUST NOT be used.
                      --  .... ..11   is OK, means authPriv

           msgSecurityModel INTEGER (1..2147483647)
       }

       ScopedPduData ::= CHOICE {
           plaintext    ScopedPDU,
           encryptedPDU OCTET STRING  -- encrypted scopedPDU value
       }

       ScopedPDU ::= SEQUENCE {
           contextEngineID  OCTET STRING,
           contextName      OCTET STRING,
           data             ANY -- e.g., PDUs as defined in [RFC3416]
       }
   END

6.1.  msgVersion

   The msgVersion field is set to snmpv3(3) and identifies the message
   as an SNMP version 3 Message.

6.2.  msgID

   The msgID is used between two SNMP entities to coordinate request
   messages and responses, and by the v3MP to coordinate the processing
   of the message by different subsystem models within the architecture.

   Values for msgID SHOULD be generated in a manner that avoids re-use
   of any outstanding values.  Doing so provides protection against some
   replay attacks.  One possible implementation strategy would be to use
   the low-order bits of snmpEngineBoots [RFC3411] as the high-order



Case, et al.                Standards Track                    [Page 20]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   portion of the msgID value and a monotonically increasing integer for
   the low-order portion of msgID.

   Note that the request-id in a PDU may be used by SNMP applications to
   identify the PDU; the msgID is used by the engine to identify the
   message which carries a PDU.  The engine needs to identify the
   message even if decryption of the PDU (and request-id) fails.  No
   assumption should be made that the value of the msgID and the value
   of the request-id are equivalent.

   The value of the msgID field for a response takes the value of the
   msgID field from the message to which it is a response.  By use of
   the msgID value, an engine can distinguish the (potentially multiple)
   outstanding requests, and thereby correlate incoming responses with
   outstanding requests.  In cases where an unreliable datagram service
   is used, the msgID also provides a simple means of identifying
   messages duplicated by the network.  If a request is retransmitted, a
   new msgID value SHOULD be used for each retransmission.

6.3.  msgMaxSize

   The msgMaxSize field of the message conveys the maximum message size
   supported by the sender of the message, i.e., the maximum message
   size that the sender can accept when another SNMP engine sends an
   SNMP message (be it a response or any other message) to the sender of
   this message on the transport in use for this message.

   When an SNMP message is being generated, the msgMaxSize is provided
   by the SNMP engine which generates the message.  At the receiving
   SNMP engine, the msgMaxSize is used to determine the maximum message
   size the sender can accommodate.

6.4.  msgFlags

   The msgFlags field of the message contains several bit fields which
   control processing of the message.

   The reportableFlag is a secondary aid in determining whether a Report
   PDU MUST be sent.  It is only used in cases where the PDU portion of
   a message cannot be decoded, due to, for example, an incorrect
   encryption key.  If the PDU can be decoded, the PDU type forms the
   basis for decisions on sending Report PDUs.

   When the reportableFlag is used, if its value is one, a Report PDU
   MUST be returned to the sender under those conditions which can cause
   the generation of Report PDUs.  Similarly, when the reportableFlag is
   used and its value is zero, then a Report PDU MUST NOT be sent.  The
   reportableFlag MUST always be zero when the message contains a PDU



Case, et al.                Standards Track                    [Page 21]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   from the Unconfirmed Class, such as a Report PDU, a response-type PDU
   (such as a Response PDU), or an unacknowledged notification-type PDU
   (such as an SNMPv2-trap PDU).  The reportableFlag MUST always be one
   for a PDU from the Confirmed Class, including request-type PDUs (such
   as a Get PDU) and acknowledged notification-type PDUs (such as an
   Inform PDU).

   If the reportableFlag is set to one for a message containing a PDU
   from the Unconfirmed Class, such as a Report PDU, a response-type PDU
   (such as a Response PDU), or an unacknowledged notification-type PDU
   (such as an SNMPv2-trap PDU), then the receiver of that message MUST
   process it as though the reportableFlag had been set to zero.

   If the reportableFlag is set to zero for a message containing a
   request-type PDU (such as a Get PDU) or an acknowledged
   notification-type PDU (such as an Inform PDU), then the receiver of
   that message MUST process it as though the reportableFlag had been
   set to one.

   Report PDUs are generated directly by the SNMPv3 Message Processing
   Model, and support engine-to-engine communications, but may be passed
   to applications for processing.

   An SNMP engine that receives a reportPDU may use it to determine what
   kind of problem was detected by the remote SNMP engine.  It can do so
   based on the error counter included as the first (and only) varBind
   of the reportPDU.  Based on the detected error, the SNMP engine may
   try to send a corrected SNMP message.  If that is not possible, it
   may pass an indication of the error to the application on whose
   behalf the failed SNMP request was issued.

   The authFlag and privFlag portions of the msgFlags field are set by
   the sender to indicate the securityLevel that was applied to the
   message before it was sent on the wire.  The receiver of the message
   MUST apply the same securityLevel when the message is received and
   the contents are being processed.

   There are three securityLevels, namely noAuthNoPriv, which is less
   than authNoPriv, which is in turn less than authPriv.  See the SNMP
   architecture document [RFC3411] for details about the securityLevel.

   a) authFlag

      If the authFlag is set to one, then the securityModel used by the
      SNMP engine which sent the message MUST identify the securityName
      on whose behalf the SNMP message was generated and MUST provide,
      in a securityModel-specific manner, sufficient data for the
      receiver of the message to be able to authenticate that



Case, et al.                Standards Track                    [Page 22]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


      identification.  In general, this authentication will allow the
      receiver to determine with reasonable certainty that the message
      was:

      -  sent on behalf of the principal associated with the
         securityName,

      -  was not redirected,

      -  was not modified in transit, and

      -  was not replayed.

      If the authFlag is zero, then the securityModel used by the SNMP
      engine which sent the message MUST identify the securityName on
      whose behalf the SNMP message was generated but it does not need
      to provide sufficient data for the receiver of the message to
      authenticate the identification, as there is no need to
      authenticate the message in this case.

   b) privFlag

      If the privFlag is set, then the securityModel used by the SNMP
      engine which sent the message MUST also protect the scopedPDU in
      an SNMP message from disclosure, i.e., it MUST encrypt/decrypt the
      scopedPDU.  If the privFlag is zero, then the securityModel in use
      does not need to protect the data from disclosure.

      It is an explicit requirement of the SNMP architecture that if
      privacy is selected, then authentication is also required.  That
      means that if the privFlag is set, then the authFlag MUST also be
      set to one.

      The combination of the authFlag and the privFlag comprises a Level
      of Security as follows:

         authFlag zero, privFlag zero -> securityLevel is noAuthNoPriv
         authFlag zero, privFlag one  -> invalid combination, see below
         authFlag one,  privFlag zero -> securityLevel is authNoPriv
         authFlag one,  privFlag one  -> securityLevel is authPriv

   The elements of procedure (see below) describe the action to be taken
   when the invalid combination of authFlag equal to zero and privFlag
   equal to one is encountered.

   The remaining bits in msgFlags are reserved, and MUST be set to zero
   when sending a message and SHOULD be ignored when receiving a
   message.



Case, et al.                Standards Track                    [Page 23]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


6.5.  msgSecurityModel

   The v3MP supports the concurrent existence of multiple Security
   Models to provide security services for SNMPv3 messages.  The
   msgSecurityModel field in an SNMPv3 Message identifies which Security
   Model was used by the sender to generate the message and therefore
   which securityModel MUST be used by the receiver to perform security
   processing for the message.  The mapping to the appropriate
   securityModel implementation within an SNMP engine is accomplished in
   an implementation-dependent manner.

6.6.  msgSecurityParameters

   The msgSecurityParameters field of the SNMPv3 Message is used for
   communication between the Security Model modules in the sending and
   receiving SNMP engines.  The data in the msgSecurityParameters field
   is used exclusively by the Security Model, and the contents and
   format of the data is defined by the Security Model.  This OCTET
   STRING is not interpreted by the v3MP, but is passed to the local
   implementation of the Security Model indicated by the
   msgSecurityModel field in the message.

6.7.  scopedPduData

   The scopedPduData field represents either the plain text scopedPDU if
   the privFlag in the msgFlags is zero, or it represents an
   encryptedPDU (encoded as an OCTET STRING) which MUST be decrypted by
   the securityModel in use to produce a plaintext scopedPDU.

6.8.  scopedPDU

   The scopedPDU contains information to identify an administratively
   unique context and a PDU.  The object identifiers in the PDU refer to
   managed objects which are (expected to be) accessible within the
   specified context.

6.8.1.  contextEngineID

   The contextEngineID in the SNMPv3 message uniquely identifies, within
   an administrative domain, an SNMP entity that may realize an instance
   of a context with a particular contextName.

   For incoming messages, the contextEngineID is used in conjunction
   with the pduType to determine to which application the scopedPDU will
   be sent for processing.

   For outgoing messages, the v3MP sets the contextEngineID to the value
   provided by the application in the request for a message to be sent.



Case, et al.                Standards Track                    [Page 24]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


6.8.2.  contextName

   The contextName field in an SNMPv3 message, in conjunction with the
   contextEngineID field, identifies the particular context associated
   with the management information contained in the PDU portion of the
   message.  The contextName is unique within the SNMP entity specified
   by the contextEngineID, which may realize the managed objects
   referenced within the PDU.  An application which originates a message
   provides the value for the contextName field and this value may be
   used during processing by an application at the receiving SNMP
   Engine.

6.8.3.  data

   The data field of the SNMPv3 Message contains the PDU.  Among other
   things, the PDU contains the PDU type that is used by the v3MP to
   determine the type of the incoming SNMP message.  The v3MP specifies
   that the PDU MUST be one of those specified in [RFC3416].

7.  Elements of Procedure for v3MP

   This section describes the procedures followed by an SNMP engine when
   generating and processing SNMP messages according to the SNMPv3
   Message Processing Model.

   Please note, that for the sake of clarity and to prevent the text
   from being even longer and more complicated, some details were
   omitted from the steps below.

      a) Some steps specify that when some error conditions are
         encountered when processing a received message, a message
         containing a Report PDU is generated and the received message
         is discarded without further processing.  However, a Report-PDU
         MUST NOT be generated unless the PDU causing generation of the
         Report PDU can be determined to be a member of the Confirmed
         Class, or the reportableFlag is set to one and the PDU class
         cannot be determined.

      b) The elements of procedure do not always explicitly indicate
         when state information needs to be released.  The general rule
         is that if state information is available when a message is to
         be "discarded without further processing", then the state
         information should also be released at that same time.








Case, et al.                Standards Track                    [Page 25]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


7.1.  Prepare an Outgoing SNMP Message

   This section describes the procedure followed to prepare an SNMPv3
   message from the data elements passed by the Message Dispatcher.

   1) The Message Dispatcher may request that an SNMPv3 message
      containing a Read Class, Write Class, or Notification Class PDU be
      prepared for sending.

      a) It makes such a request according to the abstract service
         primitive:

         statusInformation =           -- success or errorIndication
           prepareOutgoingMessage(
           IN   transportDomain        -- requested transport domain
           IN   transportAddress       -- requested destination address
           IN   messageProcessingModel -- typically, SNMP version
           IN   securityModel          -- Security Model to use
           IN   securityName           -- on behalf of this principal
           IN   securityLevel          -- Level of Security requested
           IN   contextEngineID        -- data from/at this entity
           IN   contextName            -- data from/in this context
           IN   pduVersion             -- version of the PDU *
           IN   PDU                    -- SNMP Protocol Data Unit
           IN   expectResponse         -- TRUE or FALSE *
           IN   sendPduHandle          -- the handle for matching
                                       -- incoming responses
           OUT  destTransportDomain    -- destination transport domain
           OUT  destTransportAddress   -- destination transport address
           OUT  outgoingMessage        -- the message to send
           OUT  outgoingMessageLength  -- the length of the message
           )

      *  The SNMPv3 Message Processing Model does not use the values of
         expectResponse or pduVersion.

      b) A unique msgID is generated.  The number used for msgID should
         not have been used recently, and MUST NOT be the same as was
         used for any outstanding request.

   2) The Message Dispatcher may request that an SNMPv3 message
      containing a Response Class or Internal Class PDU be prepared for
      sending.








Case, et al.                Standards Track                    [Page 26]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


      a) It makes such a request according to the abstract service
         primitive:

         result =                       -- SUCCESS or FAILURE
         prepareResponseMessage(
          IN   messageProcessingModel   -- typically, SNMP version
          IN   securityModel            -- same as on incoming request
          IN   securityName             -- same as on incoming request
          IN   securityLevel            -- same as on incoming request
          IN   contextEngineID          -- data from/at this SNMP entity
          IN   contextName              -- data from/in this context
          IN   pduVersion               -- version of the PDU
          IN   PDU                      -- SNMP Protocol Data Unit
          IN   maxSizeResponseScopedPDU -- maximum size sender can
                                        -- accept
          IN   stateReference           -- reference to state
                                        -- information presented with
                                        -- the request
          IN   statusInformation        -- success or errorIndication
                                        -- error counter OID and value
                                        -- when errorIndication
          OUT  destTransportDomain      -- destination transport domain
          OUT  destTransportAddress     -- destination transport address
          OUT  outgoingMessage          -- the message to send
          OUT  outgoingMessageLength    -- the length of the message
          )

      b) The cached information for the original request is retrieved
         via the stateReference, including:

               - msgID,
               - contextEngineID,
               - contextName,
               - securityModel,
               - securityName,
               - securityLevel,
               - securityStateReference,
               - reportableFlag,
               - transportDomain, and
               - transportAddress.

         The SNMPv3 Message Processing Model does not allow cached data
         to be overridden, except by error indications as detailed in
         (3) below.







Case, et al.                Standards Track                    [Page 27]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   3) If statusInformation contains values for an OID/value combination
      (potentially also containing a securityLevel value,
      contextEngineID value, or contextName value), then:

      a) If a PDU is provided, it is the PDU from the original request.
         If possible, extract the request-id and pduType.

      b) If the pduType is determined to not be a member of the
         Confirmed Class, or if the reportableFlag is zero and the
         pduType cannot be determined, then the original message is
         discarded, and no further processing is done.  A result of
         FAILURE is returned.  SNMPv3 Message Processing is complete.

      c) A Report PDU is prepared:

         1) the varBindList is set to contain the OID and value from the
            statusInformation.

         2) error-status is set to 0.

         3) error-index is set to 0.

         4) request-id is set to the value extracted in step b).
            Otherwise, request-id is set to 0.

      d) The errorIndication in statusInformation may be accompanied by
         a securityLevel value, a contextEngineID value, or a
         contextName value.

         1) If statusInformation contains a value for securityLevel,
            then securityLevel is set to that value, otherwise it is set
            to noAuthNoPriv.

         2) If statusInformation contains a value for contextEngineID,
            then contextEngineID is set to that value, otherwise it is
            set to the value of this entity's snmpEngineID.

         3) If statusInformation contains a value for contextName, then
            contextName is set to that value, otherwise it is set to the
            default context of "" (zero-length string).

      e) PDU is set to refer to the new Report-PDU.  The old PDU is
         discarded.

      f) Processing continues with step 6) below.






Case, et al.                Standards Track                    [Page 28]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   4) If the contextEngineID is not yet determined, then the
      contextEngineID is determined, in an implementation-dependent
      manner, possibly using the transportDomain and transportAddress.

   5) If the contextName is not yet determined, the contextName is set
      to the default context.

   6) A scopedPDU is prepared from the contextEngineID, contextName, and
      PDU.

   7) msgGlobalData is constructed as follows:

      a) The msgVersion field is set to snmpv3(3).

      b) msgID is set as determined in step 1 or 2 above.

      c) msgMaxSize is set to an implementation-dependent value.

      d) msgFlags are set as follows:

         -  If securityLevel specifies noAuthNoPriv, then authFlag and
            privFlag are both set to zero.

         -  If securityLevel specifies authNoPriv, then authFlag is set
            to one and privFlag is set to zero.

         -  If securityLevel specifies authPriv, then authFlag is set to
            one and privFlag is set to one.

         -  If the PDU is from the Unconfirmed Class, then the
            reportableFlag is set to zero.

         -  If the PDU is from the Confirmed Class then the
            reportableFlag is set to one.

         -  All other msgFlags bits are set to zero.

      e) msgSecurityModel is set to the value of securityModel.













Case, et al.                Standards Track                    [Page 29]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   8) If the PDU is from the Response Class or the Internal Class, then:

      a) The specified Security Model is called to generate the message
         according to the primitive:

         statusInformation =
           generateResponseMsg(
           IN   messageProcessingModel -- SNMPv3 Message Processing
                                       -- Model
           IN   globalData             -- msgGlobalData from step 7
           IN   maxMessageSize         -- from msgMaxSize (step 7c)
           IN   securityModel          -- as determined in step 7e
           IN   securityEngineID       -- the value of snmpEngineID
           IN   securityName           -- on behalf of this principal
           IN   securityLevel          -- for the outgoing message
           IN   scopedPDU              -- as prepared in step 6)
           IN   securityStateReference -- as determined in step 2
           OUT  securityParameters     -- filled in by Security Module
           OUT  wholeMsg               -- complete generated message
           OUT  wholeMsgLength         -- length of generated message
           )

         If, upon return from the Security Model, the statusInformation
         includes an errorIndication, then any cached information about
         the outstanding request message is discarded, and an
         errorIndication is returned, so it can be returned to the
         calling application.  SNMPv3 Message Processing is complete.

      b) A SUCCESS result is returned.  SNMPv3 Message Processing is
         complete.

   9) If the PDU is from the Confirmed Class or the Notification Class,
      then:

      a) If the PDU is from the Unconfirmed Class, then securityEngineID
         is set to the value of this entity's snmpEngineID.

         Otherwise, the snmpEngineID of the target entity is determined,
         in an implementation-dependent manner, possibly using
         transportDomain and transportAddress.  The value of the
         securityEngineID is set to the value of the target entity's
         snmpEngineID.









Case, et al.                Standards Track                    [Page 30]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


      b) The specified Security Model is called to generate the message
         according to the primitive:

         statusInformation =
          generateRequestMsg(
          IN  messageProcessingModel -- SNMPv3 Message Processing Model
          IN  globalData             -- msgGlobalData, from step 7
          IN  maxMessageSize         -- from msgMaxSize in step 7 c)
          IN  securityModel          -- as provided by caller
          IN  securityEngineID       -- authoritative SNMP entity
                                     -- from step 9 a)
          IN  securityName           -- as provided by caller
          IN  securityLevel          -- as provided by caller
          IN  scopedPDU              -- as prepared in step 6
          OUT securityParameters     -- filled in by Security Module
          OUT wholeMsg               -- complete generated message
          OUT wholeMsgLength         -- length of the generated message
          )

         If, upon return from the Security Model, the statusInformation
         includes an errorIndication, then the message is discarded, and
         the errorIndication is returned, so it can be returned to the
         calling application, and no further processing is done.  SNMPv3
         Message Processing is complete.

      c) If the PDU is from the Confirmed Class, information about the
         outgoing message is cached, and an implementation-specific
         stateReference is created.  Information to be cached includes
         the values of:

               - sendPduHandle
               - msgID
               - snmpEngineID
               - securityModel
               - securityName
               - securityLevel
               - contextEngineID
               - contextName

      d) A SUCCESS result is returned.  SNMPv3 Message Processing is
         complete.










Case, et al.                Standards Track                    [Page 31]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


7.2.  Prepare Data Elements from an Incoming SNMP Message

   This section describes the procedure followed to extract data from an
   SNMPv3 message, and to prepare the data elements required for further
   processing of the message by the Message Dispatcher.

   1)  The message is passed in from the Message Dispatcher according to
       the abstract service primitive:

       result =                       -- SUCCESS or errorIndication
         prepareDataElements(
         IN  transportDomain          -- origin transport domain
         IN  transportAddress         -- origin transport address
         IN  wholeMsg                 -- as received from the network
         IN  wholeMsgLength           -- as received from the network
         OUT messageProcessingModel   -- typically, SNMP version
         OUT securityModel            -- Security Model to use
         OUT securityName             -- on behalf of this principal
         OUT securityLevel            -- Level of Security requested
         OUT contextEngineID          -- data from/at this entity
         OUT contextName              -- data from/in this context
         OUT pduVersion               -- version of the PDU
         OUT PDU                      -- SNMP Protocol Data Unit
         OUT pduType                  -- SNMP PDU type
         OUT sendPduHandle            -- handle for matched request
         OUT maxSizeResponseScopedPDU -- maximum size sender can accept
         OUT statusInformation        -- success or errorIndication
                                      -- error counter OID and value
                                      -- when errorIndication
         OUT stateReference           -- reference to state information
                                      -- to be used for a possible
         )                            -- Response

   2)  If the received message is not the serialization (according to
       the conventions of [RFC3417]) of an SNMPv3Message value, then the
       snmpInASNParseErrs counter [RFC3418] is incremented, the message
       is discarded without further processing, and a FAILURE result is
       returned.  SNMPv3 Message Processing is complete.

   3)  The values for msgVersion, msgID, msgMaxSize, msgFlags,
       msgSecurityModel, msgSecurityParameters, and msgData are
       extracted from the message.

   4)  If the value of the msgSecurityModel component does not match a
       supported securityModel, then the snmpUnknownSecurityModels
       counter is incremented, the message is discarded without further
       processing, and a FAILURE result is returned.  SNMPv3 Message
       Processing is complete.



Case, et al.                Standards Track                    [Page 32]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   5)  The securityLevel is determined from the authFlag and the
       privFlag bits of the msgFlags component as follows:

       a) If the authFlag is not set and the privFlag is not set, then
          securityLevel is set to noAuthNoPriv.

       b) If the authFlag is set and the privFlag is not set, then
          securityLevel is set to authNoPriv.

       c) If the authFlag is set and the privFlag is set, then
          securityLevel is set to authPriv.

       d) If the authFlag is not set and privFlag is set, then the
          snmpInvalidMsgs counter is incremented, the message is
          discarded without further processing, and a FAILURE result is
          returned.  SNMPv3 Message Processing is complete.

       e) Any other bits in the msgFlags are ignored.

   6)  The security module implementing the Security Model as specified
       by the securityModel component is called for authentication and
       privacy services.  This is done according to the abstract service
       primitive:

       statusInformation =            -- errorIndication or success
                                      -- error counter OID and
                                      -- value if error
         processIncomingMsg(
         IN  messageProcessingModel   -- SNMPv3 Message Processing Model
         IN  maxMessageSize           -- of the sending SNMP entity
         IN  securityParameters       -- for the received message
         IN  securityModel            -- for the received message
         IN  securityLevel            -- Level of Security
         IN  wholeMsg                 -- as received on the wire
         IN  wholeMsgLength           -- length as received on the wire
         OUT securityEngineID         -- authoritative SNMP entity
         OUT securityName             -- identification of the principal
         OUT scopedPDU,               -- message (plaintext) payload
         OUT maxSizeResponseScopedPDU -- maximum size sender can accept
         OUT securityStateReference   -- reference to security state
         )                            -- information, needed for
                                      -- response

       If an errorIndication is returned by the security module, then:

       a) If statusInformation contains values for an OID/value pair,
          then generation of a Report PDU is attempted (see step 3 in
          section 7.1).



Case, et al.                Standards Track                    [Page 33]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


          1) If the scopedPDU has been returned from processIncomingMsg,
             then determine contextEngineID, contextName, and PDU.

          2) Information about the message is cached and a
             stateReference is created (implementation-specific).
             Information to be cached includes the values of:

                          msgVersion,
                          msgID,
                          securityLevel,
                          msgFlags,
                          msgMaxSize,
                          securityModel,
                          maxSizeResponseScopedPDU,
                          securityStateReference

          3) Request that a Report-PDU be prepared and sent, according
             to the abstract service primitive:

             result =                     -- SUCCESS or FAILURE
             returnResponsePdu(
             IN  messageProcessingModel   -- SNMPv3(3)
             IN  securityModel            -- same as on incoming request
             IN  securityName             -- from processIncomingMsg
             IN  securityLevel            -- same as on incoming request
             IN  contextEngineID          -- from step 6 a) 1)
             IN  contextName              -- from step 6 a) 1)
             IN  pduVersion               -- SNMPv2-PDU
             IN  PDU                      -- from step 6 a) 1)
             IN  maxSizeResponseScopedPDU -- from processIncomingMsg
             IN  stateReference           -- from step 6 a) 2)
             IN  statusInformation        -- from processIncomingMsg
             )

       b) The incoming message is discarded without further processing,
          and a FAILURE result is returned.  SNMPv3 Message Processing
          is complete.

   7)  The scopedPDU is parsed to extract the contextEngineID, the
       contextName and the PDU.  If any parse error occurs, then the
       snmpInASNParseErrs counter [RFC3418] is incremented, the security
       state information is discarded, the message is discarded without
       further processing, and a FAILURE result is returned.  SNMPv3
       Message Processing is complete.  Treating an unknown PDU type is
       treated as a parse error is an implementation option.






Case, et al.                Standards Track                    [Page 34]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   8)  The pduVersion is determined in an implementation-dependent
       manner.  For SNMPv3, the pduVersion would be an SNMPv2-PDU.

   9)  The pduType is determined, in an implementation-dependent manner.
       For [RFC3416], the pduTypes include:

               - GetRequest-PDU,
               - GetNextRequest-PDU,
               - GetBulkRequest-PDU,
               - SetRequest-PDU,
               - InformRequest-PDU,
               - SNMPv2-Trap-PDU,
               - Response-PDU,
               - Report-PDU.

   10) If the pduType is from the Response Class or the Internal Class,
       then:

       a) The value of the msgID component is used to find the cached
          information for a corresponding outstanding Request message.
          If no such outstanding Request message is found, then the
          security state information is discarded, the message is
          discarded without further processing, and a FAILURE result is
          returned.  SNMPv3 Message Processing is complete.

       b) sendPduHandle is retrieved from the cached information.

       Otherwise, sendPduHandle is set to <none>, an implementation
       defined value.

   11) If the pduType is from the Internal Class, then:

       a) statusInformation is created using the contents of the
          Report-PDU, in an implementation-dependent manner.  This
          statusInformation will be forwarded to the application
          associated with the sendPduHandle.

       b) The cached data for the outstanding message, referred to by
          stateReference, is retrieved.  If the securityModel or
          securityLevel values differ from the cached ones, it is
          important to recognize that Internal Class PDUs delivered at
          the security level of noAuthNoPriv open a window of
          opportunity for spoofing or replay attacks.  If the receiver
          of such messages is aware of these risks, the use of such
          unauthenticated messages is acceptable and may provide a
          useful function for discovering engine IDs or for detecting
          misconfiguration at remote nodes.




Case, et al.                Standards Track                    [Page 35]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


          When the securityModel or securityLevel values differ from the
          cached ones, an implementation may retain the cached
          information about the outstanding Request message, in
          anticipation of the possibility that the Internal Class PDU
          received might be illegitimate.  Otherwise, any cached
          information about the outstanding Request message is
          discarded.

       c) The security state information for this incoming message is
          discarded.

       d) stateReference is set to <none>.

       e) A SUCCESS result is returned.  SNMPv3 Message Processing is
          complete.

   12) If the pduType is from the Response Class, then:

       a) The cached data for the outstanding request, referred to by
          stateReference, is retrieved, including:

               - snmpEngineID
               - securityModel
               - securityName
               - securityLevel
               - contextEngineID
               - contextName

       b) If the values extracted from the incoming message differ from
          the cached data, then any cached information about the
          outstanding Request message is discarded, the incoming message
          is discarded without further processing, and a FAILURE result
          is returned.  SNMPv3 Message Processing is complete.

          When the securityModel or securityLevel values differ from the
          cached ones, an implementation may retain the cached
          information about the outstanding Request message, in
          anticipation of the possibility that the Response Class PDU
          received might be illegitimate.

       c) Otherwise, any cached information about the outstanding
          Request message is discarded, and the stateReference is set to
          <none>.

       d) A SUCCESS result is returned.  SNMPv3 Message Processing is
          complete.

   13) If the pduType is from the Confirmed Class, then:



Case, et al.                Standards Track                    [Page 36]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


       a) If the value of securityEngineID is not equal to the value of
          snmpEngineID, then the security state information is
          discarded, any cached information about this message is
          discarded, the incoming message is discarded without further
          processing, and a FAILURE result is returned.  SNMPv3 Message
          Processing is complete.

       b) Information about the message is cached and a stateReference
          is created (implementation-specific).  Information to be
          cached includes the values of:

                msgVersion,
                msgID,
                securityLevel,
                msgFlags,
                msgMaxSize,
                securityModel,
                maxSizeResponseScopedPDU,
                securityStateReference

       c) A SUCCESS result is returned.  SNMPv3 Message Processing is
          complete.

   14) If the pduType is from the Unconfirmed Class, then a SUCCESS
       result is returned.  SNMPv3 Message Processing is complete.

8.  Intellectual Property

   The IETF takes no position regarding the validity or scope of any
   intellectual property or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; neither does it represent that it
   has made any effort to identify any such rights.  Information on the
   IETF's procedures with respect to rights in standards-track and
   standards-related documentation can be found in BCP-11.  Copies of
   claims of rights made available for publication and any assurances of
   licenses to be made available, or the result of an attempt made to
   obtain a general license or permission for the use of such
   proprietary rights by implementors or users of this specification can
   be obtained from the IETF Secretariat.

   The IETF invites any interested party to bring to its attention any
   copyrights, patents or patent applications, or other proprietary
   rights which may cover technology that may be required to practice
   this standard.  Please address the information to the IETF Executive
   Director.




Case, et al.                Standards Track                    [Page 37]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


9.  Acknowledgements

   This document is the result of the efforts of the SNMPv3 Working
   Group.  Some special thanks are in order to the following SNMPv3 WG
   members:

      Harald Tveit Alvestrand (Maxware)
      Dave Battle (SNMP Research, Inc.)
      Alan Beard (Disney Worldwide Services)
      Paul Berrevoets (SWI Systemware/Halcyon Inc.)
      Martin Bjorklund (Ericsson)
      Uri Blumenthal (IBM T. J. Watson Research Center)
      Jeff Case (SNMP Research, Inc.)
      John Curran (BBN)
      Mike Daniele (Compaq Computer Corporation)
      T. Max Devlin (Eltrax Systems)
      John Flick (Hewlett Packard)
      Rob Frye (MCI)
      Wes Hardaker (U.C.Davis, Information Technology - D.C.A.S.)
      David Harrington (Cabletron Systems Inc.)
      Lauren Heintz (BMC Software, Inc.)
      N.C. Hien (IBM T. J. Watson Research Center)
      Michael Kirkham (InterWorking Labs, Inc.)
      Dave Levi (SNMP Research, Inc.)
      Louis A Mamakos (UUNET Technologies Inc.)
      Joe Marzot (Nortel Networks)
      Paul Meyer (Secure Computing Corporation)
      Keith McCloghrie (Cisco Systems)
      Bob Moore (IBM)
      Russ Mundy (TIS Labs at Network Associates)
      Bob Natale (ACE*COMM Corporation)
      Mike O'Dell (UUNET Technologies Inc.)
      Dave Perkins (DeskTalk)
      Peter Polkinghorne (Brunel University)
      Randy Presuhn (BMC Software, Inc.)
      David Reeder (TIS Labs at Network Associates)
      David Reid (SNMP Research, Inc.)
      Aleksey Romanov (Quality Quorum)
      Shawn Routhier (Epilogue)
      Juergen Schoenwaelder (TU Braunschweig)
      Bob Stewart (Cisco Systems)
      Mike Thatcher (Independent Consultant)
      Bert Wijnen (IBM T. J. Watson Research Center)








Case, et al.                Standards Track                    [Page 38]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   The document is based on recommendations of the IETF Security and
   Administrative Framework Evolution for SNMP Advisory Team.  Members
   of that Advisory Team were:

      David Harrington (Cabletron Systems Inc.)
      Jeff Johnson (Cisco Systems)
      David Levi (SNMP Research Inc.)
      John Linn (Openvision)
      Russ Mundy (Trusted Information Systems) chair
      Shawn Routhier (Epilogue)
      Glenn Waters (Nortel)
      Bert Wijnen (IBM T. J. Watson Research Center)

   As recommended by the Advisory Team and the SNMPv3 Working Group
   Charter, the design incorporates as much as practical from previous
   RFCs and drafts.  As a result, special thanks are due to the authors
   of previous designs known as SNMPv2u and SNMPv2*:

      Jeff Case (SNMP Research, Inc.)
      David Harrington (Cabletron Systems Inc.)
      David Levi (SNMP Research, Inc.)
      Keith McCloghrie (Cisco Systems)
      Brian O'Keefe (Hewlett Packard)
      Marshall T. Rose (Dover Beach Consulting)
      Jon Saperia (BGS Systems Inc.)
      Steve Waldbusser (International Network Services)
      Glenn W. Waters (Bell-Northern Research Ltd.)

10.  Security Considerations

   The Dispatcher coordinates the processing of messages to provide a
   level of security for management messages and to direct the SNMP PDUs
   to the proper SNMP application(s).

   A Message Processing Model, and in particular the v3MP defined in
   this document, interacts as part of the Message Processing with
   Security Models in the Security Subsystem via the abstract service
   interface primitives defined in [RFC3411] and elaborated above.

   The level of security actually provided is primarily determined by
   the specific Security Model implementation(s) and the specific SNMP
   application implementation(s) incorporated into this framework.
   Applications have access to data which is not secured.  Applications
   should take reasonable steps to protect the data from disclosure, and
   when they send data across the network, they should obey the
   securityLevel and call upon the services of an Access Control Model
   as they apply access control.




Case, et al.                Standards Track                    [Page 39]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   The values for the msgID element used in communication between SNMP
   entities MUST be chosen to avoid replay attacks.  The values do not
   need to be unpredictable; it is sufficient that they not repeat.

   When exchanges are carried out over an insecure network, there is an
   open opportunity for a third party to spoof or replay messages when
   any message of an exchange is given at the security level of
   noAuthNoPriv.  For most exchanges, all messages exist at the same
   security level.  In the case where the final message is an Internal
   Class PDU, this message may be delivered at a level of noAuthNoPriv
   or authNoPriv, independent of the security level of the preceding
   messages.  Internal Class PDUs delivered at the level of authNoPriv
   are not considered to pose a security hazard.  Internal Class PDUs
   delivered at the security level of noAuthNoPriv open a window of
   opportunity for spoofing or replay attacks.  If the receiver of such
   messages is aware of these risks, the use of such unauthenticated
   messages is acceptable and may provide a useful function for
   discovering engine IDs or for detecting misconfiguration at remote
   nodes.

   This document also contains a MIB definition module.  None of the
   objects defined is writable, and the information they represent is
   not deemed to be particularly sensitive.  However, if they are deemed
   sensitive in a particular environment, access to them should be
   restricted through the use of appropriately configured Security and
   Access Control models.

11.  References

11.1.  Normative References

   [RFC2119]   Bradner, S., "Key words for use in RFCs to Indicate
               Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2578]   McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
               Rose, M. and S. Waldbusser, "Structure of Management
               Information Version 2 (SMIv2)", STD 58, RFC 2578, April
               1999.

   [RFC2580]   McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
               Rose, M. and S. Waldbusser, "Conformance Statements for
               SMIv2", STD 58, RFC 2580, April 1999.

   [RFC3411]   Harrington, D., Presuhn, R. and B. Wijnen, "An
               Architecture for Describing Simple Network Management
               Protocol (SNMP) Management Frameworks", STD 62, RFC 3411,
               December 2002.




Case, et al.                Standards Track                    [Page 40]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


   [RFC3413]   Levi, D., Meyer, P. and B. Stewart, "Simple Network
               Management Protocol (SNMP) Applications", STD 62, RFC
               3413, December 2002.

   [RFC3414]   Blumenthal, U. and B. Wijnen, "The User-Based Security
               Model (USM) for Version 3 of the Simple Network
               Management Protocol (SNMPv3)", STD 62, RFC 3414, December
               2002.

   [RFC3415]   Wijnen, B., Presuhn, R. and K. McCloghrie, "View-based
               Access Control Model (VACM) for the Simple Network
               Management Protocol (SNMP)", STD 62, RFC 3415, December
               2002.

   [RFC3416]   Presuhn, R., Case, J., McCloghrie, K., Rose, M. and S.
               Waldbusser, "Version 2 of the Protocol Operations for the
               Simple Network Management Protocol (SNMP)", STD 62, RFC
               3416, December 2002.

   [RFC3417]   Presuhn, R., Case, J., McCloghrie, K., Rose, M. and S.
               Waldbusser, "Transport Mappings for the Simple Network
               Management Protocol (SNMP)", STD 62, RFC 3417, December
               2002.

   [RFC3418]   Presuhn, R., Case, J., McCloghrie, K., Rose, M. and S.
               Waldbusser, "Management Information Base (MIB) for the
               Simple Network Management Protocol (SNMP)", STD 62, RFC
               3418, December 2002.

11.2.  Informative References

   [RFC1901]   Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
               "Introduction to Community-based SNMPv2", RFC 1901,
               January 1996.

   [RFC2028]   Hovey, R. and S. Bradner, "The Organizations Involved in
               the IETF Standards Process", BCP 11, RFC 2028, October
               1996.

   [RFC2576]   Frye, R., Levi, D., Routhier, S. and B. Wijnen,
               "Coexistence between Version 1, Version 2, and Version 3
               of the Internet-Standard Network Management Framework",
               RFC 2576, March 2000.

   [RFC3410]   Case, J., Mundy, R., Partain, D. and B. Stewart,
               "Introduction and Applicability Statements for Internet-
               Standard Management Framework", RFC 3410, December 2002.




Case, et al.                Standards Track                    [Page 41]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


12.  Editors' Addresses

   Jeffrey Case
   SNMP Research, Inc.
   3001 Kimberlin Heights Road
   Knoxville, TN 37920-9716
   USA

   Phone: +1 423-573-1434
   EMail: case@snmp.com


   David Harrington
   Enterasys Networks
   35 Industrial Way
   Post Office Box 5005
   Rochester, NH 03866-5005
   USA

   Phone: +1 603-337-2614
   EMail: dbh@enterasys.com


   Randy Presuhn
   BMC Software, Inc.
   2141 North First Street
   San Jose, CA 95131
   USA

   Phone: +1 408-546-1006
   EMail: randy_presuhn@bmc.com


   Bert Wijnen
   Lucent Technologies
   Schagen 33
   3461 GL Linschoten
   Netherlands

   Phone: +31 348-680-485
   EMail: bwijnen@lucent.com










Case, et al.                Standards Track                    [Page 42]

RFC 3412      Message Processing and Dispatching for SNMP  December 2002


13.  Full Copyright Statement

   Copyright (C) The Internet Society (2002).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.



















Case, et al.                Standards Track                    [Page 43]

