





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


              Conformance Statements for Version 2 of the
              Simple Network Management Protocol (SNMPv2)

Status of this Memo

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

Table of Contents

   1. Introduction ................................................    2
   1.1 A Note on Terminology ......................................    3
   2. Definitions .................................................    3
   2.1 The OBJECT-GROUP macro .....................................    3
   2.2 The NOTIFICATION-GROUP macro ...............................    4
   2.3 The MODULE-COMPLIANCE macro ................................    5
   2.4 The AGENT-CAPABILITIES macro ...............................    7
   3. Mapping of the OBJECT-GROUP macro ...........................    9
   3.1 Mapping of the OBJECTS clause ..............................   10
   3.2 Mapping of the STATUS clause ...............................   10
   3.3 Mapping of the DESCRIPTION clause ..........................   10
   3.4 Mapping of the REFERENCE clause ............................   10
   3.5 Mapping of the OBJECT-GROUP value ..........................   10
   3.6 Usage Example ..............................................   11
   4. Mapping of the NOTIFICATION-GROUP macro .....................   11
   4.1 Mapping of the NOTIFICATIONS clause ........................   11
   4.2 Mapping of the STATUS clause ...............................   11
   4.3 Mapping of the DESCRIPTION clause ..........................   12
   4.4 Mapping of the REFERENCE clause ............................   12
   4.5 Mapping of the NOTIFICATION-GROUP value ....................   12
   4.6 Usage Example ..............................................   12
   5. Mapping of the MODULE-COMPLIANCE macro ......................   12
   5.1 Mapping of the STATUS clause ...............................   13



SNMPv2 Working Group        Standards Track                     [Page 1]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   5.2 Mapping of the DESCRIPTION clause ..........................   13
   5.3 Mapping of the REFERENCE clause ............................   13
   5.4 Mapping of the MODULE clause ...............................   13
   5.4.1 Mapping of the MANDATORY-GROUPS clause ...................   13
   5.4.2 Mapping of the GROUP clause ..............................   14
   5.4.3 Mapping of the OBJECT clause .............................   14
   5.4.3.1 Mapping of the SYNTAX clause ...........................   14
   5.4.3.2 Mapping of the WRITE-SYNTAX clause .....................   15
   5.4.3.3 Mapping of the MIN-ACCESS clause .......................   15
   5.4.4 Mapping of the DESCRIPTION clause ........................   15
   5.5 Mapping of the MODULE-COMPLIANCE value .....................   15
   5.6 Usage Example ..............................................   16
   6. Mapping of the AGENT-CAPABILITIES macro .....................   16
   6.1 Mapping of the PRODUCT-RELEASE clause ......................   17
   6.2 Mapping of the STATUS clause ...............................   17
   6.3 Mapping of the DESCRIPTION clause ..........................   17
   6.4 Mapping of the REFERENCE clause ............................   17
   6.5 Mapping of the SUPPORTS clause .............................   18
   6.5.1 Mapping of the INCLUDES clause ...........................   18
   6.5.2 Mapping of the VARIATION clause ..........................   18
   6.5.2.1 Mapping of the SYNTAX clause ...........................   18
   6.5.2.2 Mapping of the WRITE-SYNTAX clause .....................   18
   6.5.2.3 Mapping of the ACCESS clause ...........................   19
   6.5.2.4 Mapping of the CREATION-REQUIRES clause ................   19
   6.5.2.5 Mapping of the DEFVAL clause ...........................   20
   6.5.2.6 Mapping of the DESCRIPTION clause ......................   20
   6.6 Mapping of the AGENT-CAPABILITIES value ....................   20
   6.7 Usage Example ..............................................   20
   7. Extending an Information Module .............................   22
   7.1 Conformance Groups .........................................   22
   7.2 Compliance Definitions .....................................   22
   7.3 Capabilities Definitions ...................................   22
   8. Security Considerations .....................................   23
   9. Editor's Address ............................................   23
   10. Acknowledgements ...........................................   23
   11. References .................................................   24

1.  Introduction

   A management system contains:  several (potentially many) nodes, each
   with a processing entity, termed an agent, which has access to
   management instrumentation; at least one management station; and, a
   management protocol, used to convey management information between
   the agents and management stations.  Operations of the protocol are
   carried out under an administrative framework which defines
   authentication, authorization, access control, and privacy policies.





SNMPv2 Working Group        Standards Track                     [Page 2]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   Management stations execute management applications which monitor and
   control managed elements.  Managed elements are devices such as
   hosts, routers, terminal servers, etc., which are monitored and
   controlled via access to their management information.

   Management information is viewed as a collection of managed objects,
   residing in a virtual information store, termed the Management
   Information Base (MIB).  Collections of related objects are defined
   in MIB modules.  These modules are written using a subset of OSI's
   Abstract Syntax Notation One (ASN.1) [1], termed the Structure of
   Management Information (SMI) [2].

   It may be useful to define the acceptable lower-bounds of
   implementation, along with the actual level of implementation
   achieved.  It is the purpose of this document to define the notation
   used for these purposes.

1.1.  A Note on Terminology

   For the purpose of exposition, the original Internet-standard Network
   Management Framework, as described in RFCs 1155 (STD 16), 1157 (STD
   15), and 1212 (STD 16), is termed the SNMP version 1 framework
   (SNMPv1).  The current framework is termed the SNMP version 2
   framework (SNMPv2).

2.  Definitions

SNMPv2-CONF DEFINITIONS ::= BEGIN

-- definitions for conformance groups

OBJECT-GROUP MACRO ::=
BEGIN
    TYPE NOTATION ::=
                  ObjectsPart
                  "STATUS" Status
                  "DESCRIPTION" Text
                  ReferPart

    VALUE NOTATION ::=
                  value(VALUE OBJECT IDENTIFIER)

    ObjectsPart ::=
                  "OBJECTS" "{" Objects "}"
    Objects ::=
                  Object
                | Objects "," Object
    Object ::=



SNMPv2 Working Group        Standards Track                     [Page 3]

RFC 1904           Conformance Statements for SNMPv2        January 1996


                  value(Name ObjectName)

    Status ::=
                  "current"
                | "deprecated"
                | "obsolete"

    ReferPart ::=
                  "REFERENCE" Text
                | empty

    -- uses the NVT ASCII character set
    Text ::= """" string """"
END


-- more definitions for conformance groups

NOTIFICATION-GROUP MACRO ::=
BEGIN
    TYPE NOTATION ::=
                  NotificationsPart
                  "STATUS" Status
                  "DESCRIPTION" Text
                  ReferPart

    VALUE NOTATION ::=
                  value(VALUE OBJECT IDENTIFIER)

    NotificationsPart ::=
                  "NOTIFICATIONS" "{" Notifications "}"
    Notifications ::=
                  Notification
                | Notifications "," Notification
    Notification ::=
                  value(Name NotificationName)

    Status ::=
                  "current"
                | "deprecated"
                | "obsolete"

    ReferPart ::=
                  "REFERENCE" Text
                | empty

    -- uses the NVT ASCII character set
    Text ::= """" string """"



SNMPv2 Working Group        Standards Track                     [Page 4]

RFC 1904           Conformance Statements for SNMPv2        January 1996


END


-- definitions for compliance statements

MODULE-COMPLIANCE MACRO ::=
BEGIN
    TYPE NOTATION ::=
                  "STATUS" Status
                  "DESCRIPTION" Text
                  ReferPart
                  ModulePart

    VALUE NOTATION ::=
                  value(VALUE OBJECT IDENTIFIER)

    Status ::=
                  "current"
                | "deprecated"
                | "obsolete"

    ReferPart ::=
                "REFERENCE" Text
              | empty

    ModulePart ::=
                  Modules
                | empty
    Modules ::=
                  Module
                | Modules Module
    Module ::=
                  -- name of module --
                  "MODULE" ModuleName
                  MandatoryPart
                  CompliancePart

    ModuleName ::=
                  modulereference ModuleIdentifier
                -- must not be empty unless contained
                -- in MIB Module
                | empty
    ModuleIdentifier ::=
                  value(ModuleID OBJECT IDENTIFIER)
                | empty

    MandatoryPart ::=
                  "MANDATORY-GROUPS" "{" Groups "}"



SNMPv2 Working Group        Standards Track                     [Page 5]

RFC 1904           Conformance Statements for SNMPv2        January 1996


                | empty

    Groups ::=
                  Group
                | Groups "," Group
    Group ::=
                  value(Group OBJECT IDENTIFIER)

    CompliancePart ::=
                  Compliances
                | empty

    Compliances ::=
                  Compliance
                | Compliances Compliance
    Compliance ::=
                  ComplianceGroup
                | Object

    ComplianceGroup ::=
                  "GROUP" value(Name OBJECT IDENTIFIER)
                  "DESCRIPTION" Text

    Object ::=
                  "OBJECT" value(Name ObjectName)
                  SyntaxPart
                  WriteSyntaxPart
                  AccessPart
                  "DESCRIPTION" Text

    -- must be a refinement for object's SYNTAX clause
    SyntaxPart ::=
                  "SYNTAX" type(SYNTAX)
                | empty

    -- must be a refinement for object's SYNTAX clause
    WriteSyntaxPart ::=
                  "WRITE-SYNTAX" type(WriteSYNTAX)
                | empty

    AccessPart ::=
                  "MIN-ACCESS" Access
                | empty
    Access ::=
                  "not-accessible"
                | "accessible-for-notify"
                | "read-only"
                | "read-write"



SNMPv2 Working Group        Standards Track                     [Page 6]

RFC 1904           Conformance Statements for SNMPv2        January 1996


                | "read-create"

    -- uses the NVT ASCII character set
    Text ::= """" string """"
END


-- definitions for capabilities statements

AGENT-CAPABILITIES MACRO ::=
BEGIN
    TYPE NOTATION ::=
                  "PRODUCT-RELEASE" Text
                  "STATUS" Status
                  "DESCRIPTION" Text
                  ReferPart
                  ModulePart

    VALUE NOTATION ::=
                  value(VALUE OBJECT IDENTIFIER)

    Status ::=
                  "current"
                | "obsolete"

    ReferPart ::=
                "REFERENCE" Text
              | empty

    ModulePart ::=
                  Modules
                | empty
    Modules ::=
                  Module
                | Modules Module
    Module ::=
                  -- name of module --
                  "SUPPORTS" ModuleName
                  "INCLUDES" "{" Groups "}"
                  VariationPart

    ModuleName ::=
                  identifier ModuleIdentifier
    ModuleIdentifier ::=
                  value(ModuleID OBJECT IDENTIFIER)
                | empty

    Groups ::=



SNMPv2 Working Group        Standards Track                     [Page 7]

RFC 1904           Conformance Statements for SNMPv2        January 1996


                  Group
                | Groups "," Group
    Group ::=
                  value(Name OBJECT IDENTIFIER)

    VariationPart ::=
                  Variations
                | empty
    Variations ::=
                  Variation
                | Variations Variation

    Variation ::=
                  ObjectVariation
                | NotificationVariation

    NotificationVariation ::=
                  "VARIATION" value(Name NotificationName)
                  AccessPart
                  "DESCRIPTION" Text

    ObjectVariation ::=
                  "VARIATION" value(Name ObjectName)
                  SyntaxPart
                  WriteSyntaxPart
                  AccessPart
                  CreationPart
                  DefValPart
                  "DESCRIPTION" Text

    -- must be a refinement for object's SYNTAX clause
    SyntaxPart ::=
                  "SYNTAX" type(SYNTAX)
                | empty

    -- must be a refinement for object's SYNTAX clause
    WriteSyntaxPart ::=
                  "WRITE-SYNTAX" type(WriteSYNTAX)
                | empty

    AccessPart ::=
                  "ACCESS" Access
                | empty

    Access ::=
                  "not-implemented"
                -- only "not-implemented" for notifications
                | "accessible-for-notify"



SNMPv2 Working Group        Standards Track                     [Page 8]

RFC 1904           Conformance Statements for SNMPv2        January 1996


                | "read-only"
                | "read-write"
                | "read-create"
                -- following is for backward-compatibility only
                | "write-only"

    CreationPart ::=
                  "CREATION-REQUIRES" "{" Cells "}"
                | empty

    Cells ::=
                  Cell
                | Cells "," Cell

    Cell ::=
                  value(Cell ObjectName)

    DefValPart ::=
                  "DEFVAL" "{" value(Defval ObjectSyntax) "}"
                | empty

    -- uses the NVT ASCII character set
    Text ::= """" string """"
END


END

3.  Mapping of the OBJECT-GROUP macro

   For conformance purposes, it is useful to define a collection of
   related managed objects.  The OBJECT-GROUP macro is used to define
   each such collection of related objects.  It should be noted that the
   expansion of the OBJECT-GROUP macro is something which conceptually
   happens during implementation and not during run-time.

   To "implement" an object, a SNMPv2 entity acting in an agent role
   must return a reasonably accurate value for management protocol
   retrieval operations; similarly, if the object is writable, then in
   response to a management protocol set operation, a SNMPv2 entity must
   accordingly be able to reasonably influence the underlying managed
   entity.  If a SNMPv2 entity acting in an agent role can not implement
   an object, the management protocol provides for the SNMPv2 entity to
   return an exception or error, e.g, noSuchObject [4].  Under no
   circumstances shall a SNMPv2 entity return a value for objects which
   it does not implement -- it must always return the appropriate
   exception or error, as described in the protocol specification [4].




SNMPv2 Working Group        Standards Track                     [Page 9]

RFC 1904           Conformance Statements for SNMPv2        January 1996


3.1.  Mapping of the OBJECTS clause

   The OBJECTS clause, which must be present, is used to name each
   object contained in the conformance group.  Each of the named objects
   must be defined in the same information module as the OBJECT-GROUP
   macro appears, and must have a MAX-ACCESS clause value of
   "accessible-for-notify", "read-only", "read-write", or "read-create".

   It is required that every object defined in an information module
   with a MAX-ACCESS clause other than "not-accessible" be contained in
   at least one object group.  This avoids the common error of adding a
   new object to an information module and forgetting to add the new
   object to a group.

3.2.  Mapping of the STATUS clause

   The STATUS clause, which must be present, indicates whether this
   definition is current or historic.

   The values "current", and "obsolete" are self-explanatory.  The
   "deprecated" value indicates that the definition is obsolete, but
   that an implementor may wish to support the group to foster
   interoperability with older implementations.

3.3.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause, which must be present, contains a textual
   definition of that group, along with a description of any relations
   to other groups.  Note that generic compliance requirements should
   not be stated in this clause.  However, implementation relationships
   between this group and other groups may be defined in this clause.

3.4.  Mapping of the REFERENCE clause

   The REFERENCE clause, which need not be present, contains a textual
   cross-reference to a group  defined in some other information module.
   This is useful when de-osifying a MIB module produced by some other
   organization.

3.5.  Mapping of the OBJECT-GROUP value

   The value of an invocation of the OBJECT-GROUP macro is the name of
   the group, which is an OBJECT IDENTIFIER, an administratively
   assigned name.







SNMPv2 Working Group        Standards Track                    [Page 10]

RFC 1904           Conformance Statements for SNMPv2        January 1996


3.6.  Usage Example

   The SNMP Group [3] is described:

snmpGroup OBJECT-GROUP
    OBJECTS { snmpInPkts,
              snmpInBadVersions,
              snmpInASNParseErrs,
              snmpBadOperations,
              snmpSilentDrops,
              snmpProxyDrops,
              snmpEnableAuthenTraps }
    STATUS  current
    DESCRIPTION
            "A collection of objects providing basic instrumentation and
            control of an SNMPv2 entity."
    ::= { snmpMIBGroups 8 }


According to this invocation, the conformance group named

     { snmpMIBGroups 8 }

contains 7 objects.

4.  Mapping of the NOTIFICATION-GROUP macro

   For conformance purposes, it is useful to define a collection of
   notifications.  The NOTIFICATION-GROUP macro serves this purpose.  It
   should be noted that the expansion of the NOTIFICATION-GROUP macro is
   something which conceptually happens during implementation and not
   during run-time.

4.1.  Mapping of the NOTIFICATIONS clause

   The NOTIFICATIONS clause, which must be present, is used to name each
   notification contained in the conformance group.  Each of the named
   notifications must be defined in the same information module as the
   NOTIFICATION-GROUP macro appears.

4.2.  Mapping of the STATUS clause

   The STATUS clause, which must be present, indicates whether this
   definition is current or historic.

   The values "current", and "obsolete" are self-explanatory.  The
   "deprecated" value indicates that the definition is obsolete, but
   that an implementor may wish to support the group to foster



SNMPv2 Working Group        Standards Track                    [Page 11]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   interoperability with older implementations.

4.3.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause, which must be present, contains a textual
   definition of the group, along with a description of any relations to
   other groups.  Note that generic compliance requirements should not
   be stated in this clause.  However, implementation relationships
   between this group and other groups may be defined in this clause.

4.4.  Mapping of the REFERENCE clause

   The REFERENCE clause, which need not be present, contains a textual
   cross-reference to a group defined in some other information module.
   This is useful when de-osifying a MIB module produced by some other
   organization.

4.5.  Mapping of the NOTIFICATION-GROUP value

   The value of an invocation of the NOTIFICATION-GROUP macro is the
   name of the group, which is an OBJECT IDENTIFIER, an administratively
   assigned name.

4.6.  Usage Example

   The SNMP Basic Notifications Group [3] is described:

snmpBasicNotificationsGroup NOTIFICATION-GROUP
    NOTIFICATIONS { coldStart, authenticationFailure }
    STATUS        current
    DESCRIPTION
            "The two notifications which an SNMPv2 entity is required to
            implement."
    ::= { snmpMIBGroups 7 }

According to this invocation, the conformance group named

     { snmpMIBGroups 1 }

contains 2 notifications.

5.  Mapping of the MODULE-COMPLIANCE macro

   The MODULE-COMPLIANCE macro is used to convey a minimum set of
   requirements with respect to implementation of one or more MIB
   modules.  It should be noted that the expansion of the MODULE-
   COMPLIANCE macro is something which conceptually happens during
   implementation and not during run-time.



SNMPv2 Working Group        Standards Track                    [Page 12]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   A requirement on all "standard" MIB modules is that a corresponding
   MODULE-COMPLIANCE specification is also defined, either in the same
   information module or in a companion information module.

5.1.  Mapping of the STATUS clause

   The STATUS clause, which must be present, indicates whether this
   definition is current or historic.

   The values "current", and "obsolete" are self-explanatory.  The
   "deprecated" value indicates that the specification is obsolete, but
   that an implementor may wish to support that object to foster
   interoperability with older implementations.

5.2.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause, which must be present, contains a textual
   definition of this compliance statement and should embody any
   information which would otherwise be communicated in any ASN.1
   commentary annotations associated with the statement.

5.3.  Mapping of the REFERENCE clause

   The REFERENCE clause, which need not be present, contains a textual
   cross-reference to a compliance statement defined in some other
   information module.

5.4.  Mapping of the MODULE clause

   The MODULE clause, which must be present, is repeatedly used to name
   each MIB module for which compliance requirements are being
   specified.  Each MIB module is named by its module name, and
   optionally, by its associated OBJECT IDENTIFIER as well.  The module
   name can be omitted when the MODULE-COMPLIANCE invocation occurs
   inside a MIB module, to refer to the encompassing MIB module.

5.4.1.  Mapping of the MANDATORY-GROUPS clause

   The MANDATORY-GROUPS clause, which need not be present, names the one
   or more object or notification groups within the correspondent MIB
   module which are unconditionally mandatory for implementation.  If a
   SNMPv2 entity acting in an agent role claims compliance to the MIB
   module, then it must implement each and every object and notification
   within each conformance group listed.  That is, if a SNMPv2 entity
   returns a noSuchObject exception in response to a management protocol
   get operation [4] for any object within any mandatory conformance
   group for every MIB view, or if the SNMPv2 entity cannot generate
   each notification listed in any conformance group under the



SNMPv2 Working Group        Standards Track                    [Page 13]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   appropriate circumstances, then that SNMPv2 entity is not a
   conformant implementation of the MIB module.

5.4.2.  Mapping of the GROUP clause

   The GROUP clause, which need not be present, is repeatedly used to
   name each object and notification group which is conditionally
   mandatory or unconditionally optional for compliance to the MIB
   module.  A group named in a GROUP clause must be absent from the
   correspondent MANDATORY-GROUPS clause.

   Conditionally mandatory groups include those which are mandatory only
   if a particular protocol is implemented, or only if another group is
   implemented.  A GROUP clause's DESCRIPTION specifies the conditions
   under which the group is conditionally mandatory.

   A group which is named in neither a MANDATORY-GROUPS clause nor a
   GROUP clause, is unconditionally optional for compliance to the MIB
   module.

5.4.3.  Mapping of the OBJECT clause

   The OBJECT clause, which need not be present, is repeatedly used to
   name each MIB object for which compliance has a refined requirement
   with respect to the MIB module definition.  The MIB object must be
   present in one of the conformance groups named in the correspondent
   MANDATORY-GROUPS clause or GROUP clauses.

   By definition, each object specified in an OBJECT clause follows a
   MODULE clause which names the information module in which that object
   is defined.  Therefore, the use of an IMPORTS statement, to specify
   from where such objects are imported, is redundant and is not
   required in an information module.

5.4.3.1.  Mapping of the SYNTAX clause

   The SYNTAX clause, which need not be present, is used to provide a
   refined SYNTAX for the object named in the correspondent OBJECT
   clause.  Note that if this clause and a WRITE-SYNTAX clause are both
   present, then this clause only applies when instances of the object
   named in the correspondent OBJECT clause are read.

   Consult Section 9 of [2] for more information on refined syntax.








SNMPv2 Working Group        Standards Track                    [Page 14]

RFC 1904           Conformance Statements for SNMPv2        January 1996


5.4.3.2.  Mapping of the WRITE-SYNTAX clause

   The WRITE-SYNTAX clause, which need not be present, is used to
   provide a refined SYNTAX for the object named in the correspondent
   OBJECT clause when instances of that object are written.

   Consult Section 9 of [2] for more information on refined syntax.

5.4.3.3.  Mapping of the MIN-ACCESS clause

   The MIN-ACCESS clause, which need not be present, is used to define
   the minimal level of access for the object named in the correspondent
   OBJECT clause.  If this clause is absent, the minimal level of access
   is the same as the maximal level specified in the correspondent
   invocation of the OBJECT-TYPE macro.  If present, this clause must
   not specify a greater level of access than is specified in the
   correspondent invocation of the OBJECT-TYPE macro.

   The level of access for certain types of objects is fixed according
   to their syntax definition.  These types include: conceptual tables
   and rows, auxiliary objects, and objects with the syntax of
   Counter32, Counter64 (and possibly, certain types of textual
   conventions).  A MIN-ACCESS clause should not be present for such
   objects.

   An implementation is compliant if the level of access it provides is
   greater or equal to the minimal level in the MODULE-COMPLIANCE macro
   and less or equal to the maximal level in the OBJECT-TYPE macro.

5.4.4.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause must be present for each use of the GROUP or
   OBJECT clause.  For an OBJECT clause, it contains a textual
   description of the refined compliance requirement.  For a GROUP
   clause, it contains a textual description of the conditions under
   which the group is conditionally mandatory or unconditionally
   optional.

5.5.  Mapping of the MODULE-COMPLIANCE value

   The value of an invocation of the MODULE-COMPLIANCE macro is an
   OBJECT IDENTIFIER.  As such, this value may be authoritatively used
   when referring to the compliance statement embodied by that
   invocation of the macro.







SNMPv2 Working Group        Standards Track                    [Page 15]

RFC 1904           Conformance Statements for SNMPv2        January 1996


5.6.  Usage Example

   The compliance statement contained in the (hypothetical) XYZv2-MIB
   might be:

xyzMIBCompliance MODULE-COMPLIANCE
    STATUS  current
    DESCRIPTION
            "The compliance statement for XYZv2 entities which implement
            the XYZv2 MIB."
    MODULE  -- compliance to the containing MIB module
        MANDATORY-GROUPS { xyzSystemGroup,
                           xyzStatsGroup, xyzTrapGroup,
                           xyzSetGroup,
                           xyzBasicNotificationsGroup }

        GROUP   xyzV1Group
        DESCRIPTION
            "The xyzV1 group is mandatory only for those
             XYZv2 entities which also implement XYZv1."
::= { xyzMIBCompliances 1 }

   According to this invocation, to claim alignment with the compliance
   statement named

     { xyzMIBCompliances 1 }

   a system must implement the XYZv2-MIB's xyzSystemGroup,
   xyzStatsGroup, xyzTrapGroup, and xyzSetGroup object conformance
   groups, as well as the xyzBasicNotificationsGroup notifications
   group.  Furthermore, if the XYZv2 entity also implements XYZv1, then
   it must also support the XYZv1Group group, if compliance is to be
   claimed.

6.  Mapping of the AGENT-CAPABILITIES macro

   The AGENT-CAPABILITIES macro is used to convey a set of capabilities
   present in a SNMPv2 entity acting in an agent role.  It should be
   noted that the expansion of the AGENT-CAPABILITIES macro is something
   which conceptually happens during implementation and not during run-
   time.

   When a MIB module is written, it is divided into units of conformance
   termed groups.  If a SNMPv2 entity acting in an agent role claims to
   implement a group, then it must implement each and every object
   within that group.  Of course, for whatever reason, a SNMPv2 entity
   might implement only a subset of the groups within a MIB module.  In
   addition, the definition of some MIB objects leave some aspects of



SNMPv2 Working Group        Standards Track                    [Page 16]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   the definition to the discretion of an implementor.

   Practical experience has demonstrated a need for concisely describing
   the capabilities of an agent with respect to one or more MIB modules.
   The AGENT-CAPABILITIES macro allows an agent implementor to describe
   the precise level of support which an agent claims in regards to a
   MIB group, and to bind that description to the value of an instance
   of sysORID [3].  In particular, some objects may have restricted or
   augmented syntax or access-levels.

   If the AGENT-CAPABILITIES invocation is given to a management-station
   implementor, then that implementor can build management applications
   which optimize themselves when communicating with a particular agent.
   For example, the management-station can maintain a database of these
   invocations.  When a management-station interacts with an agent, it
   retrieves from the agent the values of all instances of sysORID [3].
   Based on this, it consults the database to locate each entry matching
   one of the retrieved values of sysORID.  Using the located entries,
   the management application can now optimize its behavior accordingly.

   Note that the AGENT-CAPABILITIES macro specifies refinements or
   variations with respect to OBJECT-TYPE and NOTIFICATION-TYPE macros
   in MIB modules, NOT with respect to MODULE-COMPLIANCE macros in
   compliance statements.

6.1.  Mapping of the PRODUCT-RELEASE clause

   The PRODUCT-RELEASE clause, which must be present, contains a textual
   description of the product release which includes this set of
   capabilities.

6.2.  Mapping of the STATUS clause

   The STATUS clause, which must be present, indicates whether this
   definition is current ("current") or historic ("obsolete").

6.3.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause, which must be present, contains a textual
   description of this set of capabilities.

6.4.  Mapping of the REFERENCE clause

   The REFERENCE clause, which need not be present, contains a textual
   cross-reference to a capability statement defined in some other
   information module.





SNMPv2 Working Group        Standards Track                    [Page 17]

RFC 1904           Conformance Statements for SNMPv2        January 1996


6.5.  Mapping of the SUPPORTS clause

   The SUPPORTS clause, which need not be present, is repeatedly used to
   name each MIB module for which the agent claims a complete or partial
   implementation.  Each MIB module is named by its module name, and
   optionally, by its associated OBJECT IDENTIFIER as well.

6.5.1.  Mapping of the INCLUDES clause

   The INCLUDES clause, which must be present for each use of the
   SUPPORTS clause, is used to name each MIB group associated with the
   SUPPORTS clause, which the agent claims to implement.

6.5.2.  Mapping of the VARIATION clause

   The VARIATION clause, which need not be present, is repeatedly used
   to name each object or notification which the agent implements in
   some variant or refined fashion with respect to the correspondent
   invocation of the OBJECT-TYPE or NOTIFICATION-TYPE macro.

   Note that the variation concept is meant for generic implementation
   restrictions, e.g., if the variation for an object depends on the
   values of other objects, then this should be noted in the appropriate
   DESCRIPTION clause.

   By definition, each object specified in a VARIATION clause follows a
   SUPPORTS clause which names the information module in which that
   object is defined.  Therefore, the use of an IMPORTS statement, to
   specify from where such objects are imported, is redundant and is not
   required in an information module.

6.5.2.1.  Mapping of the SYNTAX clause

   The SYNTAX clause, which need not be present, is used to provide a
   refined SYNTAX for the object named in the correspondent VARIATION
   clause.  Note that if this clause and a WRITE-SYNTAX clause are both
   present, then this clause only applies when instances of the object
   named in the correspondent VARIATION clause are read.

   Consult Section 9 of [2] for more information on refined syntax.

6.5.2.2.  Mapping of the WRITE-SYNTAX clause

   The WRITE-SYNTAX clause, which need not be present, is used to
   provide a refined SYNTAX for the object named in the correspondent
   VARIATION clause when instances of that object are written.

   Consult Section 9 of [2] for more information on refined syntax.



SNMPv2 Working Group        Standards Track                    [Page 18]

RFC 1904           Conformance Statements for SNMPv2        January 1996


6.5.2.3.  Mapping of the ACCESS clause

   The ACCESS clause, which need not be present, is used to indicate the
   agent provides less than the maximal level of access to the object or
   notification named in the correspondent VARIATION clause.

   The only value applicable to notifications is "not-implemented".

   The value "not-implemented" indicates the agent does not implement
   the object or notification, and in the ordering of possible values is
   equivalent to "not-accessible".

   The value "write-only" is provided solely for backward compatibility,
   and shall not be used for newly-defined object types.  In the
   ordering of possible values, "write-only" is less than "not-
   accessible".

6.5.2.4.  Mapping of the CREATION-REQUIRES clause

   The CREATION-REQUIRES clause, which need not be present, is used to
   name the columnar objects of a conceptual row to which values must be
   explicitly assigned, by a management protocol set operation, before
   the agent will allow the instance of the status column of that row to
   be set to `active'.  (Consult the definition of RowStatus [5].)

   If the conceptual row does not have a status column (i.e., the
   objects corresponding to the conceptual table were defined using the
   mechanisms in [6,7]), then the CREATION-REQUIRES clause, which need
   not be present, is used to name the columnar objects of a conceptual
   row to which values must be explicitly assigned, by a management
   protocol set operation, before the agent will create new instances of
   objects in that row.

   This clause must not present unless the object named in the
   correspondent VARIATION clause is a conceptual row, i.e., has a
   syntax which resolves to a SEQUENCE containing columnar objects.  The
   objects named in the value of this clause usually will refer to
   columnar objects in that row.  However, objects unrelated to the
   conceptual row may also be specified.

   All objects which are named in the CREATION-REQUIRES clause for a
   conceptual row, and which are columnar objects of that row, must have
   an access level of "read-create".








SNMPv2 Working Group        Standards Track                    [Page 19]

RFC 1904           Conformance Statements for SNMPv2        January 1996


6.5.2.5.  Mapping of the DEFVAL clause

   The DEFVAL clause, which need not be present, is used to provide a
   refined DEFVAL value for the object named in the correspondent
   VARIATION clause.  The semantics of this value are identical to those
   of the OBJECT-TYPE macro's DEFVAL clause.

6.5.2.6.  Mapping of the DESCRIPTION clause

   The DESCRIPTION clause, which must be present for each use of the
   VARIATION clause, contains a textual description of the variant or
   refined implementation of the object or notification.

6.6.  Mapping of the AGENT-CAPABILITIES value

   The value of an invocation of the AGENT-CAPABILITIES macro is an
   OBJECT IDENTIFIER, which names the value of sysORID [3] for which
   this capabilities statement is valid.

6.7.  Usage Example

   Consider how a capabilities statement for an agent might be
   described:

exampleAgent AGENT-CAPABILITIES
    PRODUCT-RELEASE      "ACME Agent release 1.1 for 4BSD"
    STATUS               current
    DESCRIPTION          "ACME agent for 4BSD"

    SUPPORTS             SNMPv2-MIB
        INCLUDES         { systemGroup, snmpGroup, snmpSetGroup,
                           snmpBasicNotificationsGroup }

        VARIATION        coldStart
            DESCRIPTION  "A coldStart trap is generated on all
                         reboots."

    SUPPORTS             IF-MIB
        INCLUDES         { ifGeneralGroup, ifPacketGroup }

        VARIATION        ifAdminStatus
            SYNTAX       INTEGER { up(1), down(2) }
            DESCRIPTION  "Unable to set test mode on 4BSD"

        VARIATION        ifOperStatus
            SYNTAX       INTEGER { up(1), down(2) }
            DESCRIPTION  "Information limited on 4BSD"




SNMPv2 Working Group        Standards Track                    [Page 20]

RFC 1904           Conformance Statements for SNMPv2        January 1996


    SUPPORTS             IP-MIB
        INCLUDES         { ipGroup, icmpGroup }

        VARIATION        ipDefaultTTL
            SYNTAX       INTEGER (255..255)
            DESCRIPTION  "Hard-wired on 4BSD"

        VARIATION        ipInAddrErrors
            ACCESS       not-implemented
            DESCRIPTION  "Information not available on 4BSD"

        VARIATION        ipNetToMediaEntry
            CREATION-REQUIRES { ipNetToMediaPhysAddress }
            DESCRIPTION  "Address mappings on 4BSD require
                         both protocol and media addresses"

    SUPPORTS             TCP-MIB
        INCLUDES         { tcpGroup }
        VARIATION        tcpConnState
            ACCESS       read-only
            DESCRIPTION  "Unable to set this on 4BSD"

    SUPPORTS             UDP-MIB
        INCLUDES         { udpGroup }

    SUPPORTS             EVAL-MIB
        INCLUDES         { functionsGroup, expressionsGroup }
        VARIATION        exprEntry
            CREATION-REQUIRES { evalString }
            DESCRIPTION "Conceptual row creation supported"

    ::= { acmeAgents 1 }

   According to this invocation, an agent with a sysORID value of

     { acmeAgents 1 }

   supports six MIB modules.

   From SNMPv2-MIB, five conformance groups are supported.

   From IF-MIB, the ifGeneralGroup and ifPacketGroup groups are
   supported.  However, the objects ifAdminStatus and ifOperStatus have
   a restricted syntax.







SNMPv2 Working Group        Standards Track                    [Page 21]

RFC 1904           Conformance Statements for SNMPv2        January 1996


   From IP-MIB, all objects in the ipGroup and icmpGroup are supported
   except ipInAddrErrors, while ipDefaultTTL has a restricted range, and
   when creating a new instance in the ipNetToMediaTable, the set-
   request must create an instance of atPhysAddress.

   From TCP-MIB, the tcpGroup is supported except that tcpConnState is
   available only for reading.

   From UDP-MIB, the udpGroup is fully supported.

   From the EVAL-MIB, all the objects contained in the functionsGroup
   and expressionsGroup conformance groups are supported, without
   variation.  In addition, creation of new instances in the expr table
   is supported.

7.  Extending an Information Module

   As experience is gained with a published information module, it may
   be desirable to revise that information module.

   Section 10 of [2] defines the rules for extending an information
   module.  The remainder of this section defines how conformance
   groups, compliance statements, and capabilities statements may be
   extended.

7.1.  Conformance Groups

   If any non-editorial change is made to any clause of an object group
   then the OBJECT IDENTIFIER value associated with that object group
   must also be changed, along with its associated descriptor.

7.2.  Compliance Definitions

   If any non-editorial change is made to any clause of a compliance
   definition, then the OBJECT IDENTIFIER value associated with that
   compliance definition must also be changed, along with its associated
   descriptor.

7.3.  Capabilities Definitions

   If any non-editorial change is made to any clause of a capabilities
   definition, then the OBJECT IDENTIFIER value associated with that
   capabilities definition must also be changed, along with its
   associated descriptor.







SNMPv2 Working Group        Standards Track                    [Page 22]

RFC 1904           Conformance Statements for SNMPv2        January 1996


8.  Security Considerations

   Security issues are not discussed in this memo.

9.  Editor's Address

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

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

10.  Acknowledgements

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

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

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

     Alexander I. Alten (Novell)
     Dave Arneson (Cabletron)
     Uri Blumenthal (IBM)
     Doug Book (Chipcom)
     Kim Curran (Bell-Northern Research)
     Jim Galvin (Trusted Information Systems)
     Maria Greene (Ascom Timeplex)
     Iain Hanson (Digital)
     Dave Harrington (Cabletron)
     Nguyen Hien (IBM)
     Jeff Johnson (Cisco Systems)
     Michael Kornegay (Object Quest)
     Deirdre Kostick (AT&T Bell Labs)
     David Levi (SNMP Research)
     Daniel Mahoney (Cabletron)
     Bob Natale (ACE*COMM)
     Brian O'Keefe (Hewlett Packard)
     Andrew Pearson (SNMP Research)
     Dave Perkins (Peer Networks)



SNMPv2 Working Group        Standards Track                    [Page 23]

RFC 1904           Conformance Statements for SNMPv2        January 1996


     Randy Presuhn (Peer Networks)
     Aleksey Romanov (Quality Quorum)
     Shawn Routhier (Epilogue)
     Jon Saperia (BGS Systems)
     Bob Stewart (Cisco Systems, bstewart@cisco.com), chair
     Kaj Tesink (Bellcore)
     Glenn Waters (Bell-Northern Research)
     Bert Wijnen (IBM)

11.  References

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

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

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

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

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

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

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











SNMPv2 Working Group        Standards Track                    [Page 24]

