[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Process for SMIng Syntax Proposal Submissions:



At 11:15 AM 10/9/2001 -0700, Durham, David wrote:

I am attaching a rough proposal for a SMIng syntax, by way
of an example.  I converted the Aggregation Control objects
from the DSMON-MIB module to a proposed SMIng format.
The SMIv2 version is in draft-ietf-rmonmib-dsmon-mib-07.txt.
This new syntax is a cross between SMIv2 and the current SMIng proposal.

I have not written up a formal grammar or an item by item
objectives assessment. I just wanted to get a non-trivial example
out there to encourage discussion of constructs like arrays,
unions, pointers, instance naming for an arbitrary number and type
of containment levels. (I will do this if there's interest on the mailing 
list.)

I am not trying to separate OID naming from the data definitions,
as done with the current SMIng proposal.  I believe this is a horrible
thing to do. There should only be one naming scheme for a
data definition language.

Andy



>As recorded in the SMIng meeting minutes from the 51st IETF and presented on
>the mailing list, with the completion of the objectives I-D the working
>group will now address proposals for the next generation SMI. Submissions
>should ideally be based on grammars that already exist.  These proposals
>will be used to drive the cost vs. benefits analysis of the SMIng Objectives
>and will be discussed on the mailing list as well as at the 52nd IETF.
>
>The proposal process acknowledges the existence of the NMRG proposal for
>SMIng. The purpose now is to determine if anyone:
>     a. Believes there is a suitable existing grammar alternative for SMIng
>the WG should consider.
>     b. Is willing to write an I-D describing the use of this grammar to
>improve the state-of-the-art of the SMI, specifically by addressing the WG
>objectives for the SMIng language.
>That is, it is not acceptable to dismiss our existing contributions without
>formally describing an alternative in the form of an equivalent
>internet-draft so that a full and open cost vs. benefits analysis can be
>pursued by the WG.
>
>Contents of the syntax proposal I-Ds shall:
>     1. Describe the selected grammar and/or provide references to freely
>available documents detailing the grammar
>     2. Describe the grammar's use as a syntax for naming and describing data
>carried by SNMP
>     3. State compliance with the accepted SMIng objectives (section 4.1 of
>draft-ietf-sming-reqs-06.txt) item by item including a syntax example
>showing applicability where compliance is claimed
>
>Proposals must be submitted as Internet Drafts by November 14th, in time for
>the ID-00 cutoff date, for discussion at the 52nd IETF.

MODULE DSMON-MIB { 

IMPORTS {
        MODULE-IDENTITY, OBJECT-TYPE, Integer32,
        Counter32, Gauge32
                FROM SNMPv2-SMI
        MODULE-COMPLIANCE, OBJECT-GROUP
                FROM SNMPv2-CONF
        RowStatus, TimeStamp, TEXTUAL-CONVENTION, TruthValue
                FROM SNMPv2-TC
        OwnerString, rmon
                FROM RMON-MIB
        protocolDirLocalIndex, LastCreateTime,
        DataSource, ZeroBasedCounter32, TimeFilter
                FROM RMON2-MIB
        CounterBasedGauge64, ZeroBasedCounter64
                FROM HCNUM-TC
        SnmpAdminString
                FROM SNMP-FRAMEWORK-MIB
        Dscp
                FROM DIFFSERV-DSCP-TC
};

MODULE-IDENTITY dsmonMIB {
    LAST-UPDATED    "200110190000Z";
    ORGANIZATION    "IETF RMONMIB Working Group";
    CONTACT-INFO 
            "        Andy Bierman
                     Cisco Systems, Inc.
                     RMONMIB WG Chair and DSMON MIB Editor

             Postal: 170 West Tasman Drive
                     San Jose, CA USA 95134
                Tel: +1 408 527-3711
             E-mail: abierman@cisco.com

             Send comments to <rmonmib@ietf.org>
             Mailing list subscription info:
                 http://www.ietf.org/mailman/listinfo/rmonmib ";
    DESCRIPTION
            "This module defines Remote Monitoring MIB extensions for
            Differentiated Services enabled networks.

             RMON DIFFSERV DSCP statistics
              * Per Aggregation Group
              * Per Protocol Per Aggregation Group
              * Per Aggregation Group Per Host
              * Per Aggregation Group Per Host-Pair

            In order to maintain the RMON 'look-and-feel' and semantic
            consistency, some of the text from the RMON-2 and HC-RMON
            MIBs by Steve Waldbusser has been adapted for use in this
            MIB.";
    REVISION  "200110190000Z" {
       DESCRIPTION
            "Initial version of the DSMON MIB module.  This version
            published as RFC xxxx (to be assigned by the RFC Editor).";
    };
} ::= { rmon 26 };


NODES {
    dsmonObjects       OBJECT IDENTIFIER ::= { dsmonMIB 1 }
    dsmonNotifications OBJECT IDENTIFIER ::= { dsmonMIB 2 }
    dsmonConformance   OBJECT IDENTIFIER ::= { dsmonMIB 3 }

    dsmonAggObjects    OBJECT IDENTIFIER ::= { dsmonObjects 1 }
    dsmonStatsObjects  OBJECT IDENTIFIER ::= { dsmonObjects 2 }
    dsmonPdistObjects  OBJECT IDENTIFIER ::= { dsmonObjects 3 }
    dsmonHostObjects   OBJECT IDENTIFIER ::= { dsmonObjects 4 }
    dsmonCapsObjects   OBJECT IDENTIFIER ::= { dsmonObjects 5 }
    dsmonMatrixObjects OBJECT IDENTIFIER ::= { dsmonObjects 6 }
};


TYPEDEF SCALAR DsmonAggGroupIndex {
    SYNTAX Integer32 (0..2147483647);
    STATUS current;
    DESCRIPTION
       "This TC describes a data type which identifies a DSMON
        aggregation group, which is an arbitrary grouping of DSCP
        values, for monitoring purposes only. The range for this
        data type begins with zero (instead of one), to allow for a
        direct mapping between DSCP and aggregation group values.";
};


TYPEDEF SCALAR DsmonAggProfileIndex {
    SYNTAX Integer32 (1..2147483647);
    STATUS current;
    DESCRIPTION
            "This TC describes a data type which identifies a DSMON
            aggregation profile, which is a set of aggregation group
            assignments for each of the 64 DSCP values, for a particular
            statistical collection.";
};


--
-- this object could have been defined as an ARRAY, 
-- or wrappered (as it is) inside CLASS definition, 
-- which can be extended over time.
--

-- converted dsmonAggProfileTable

TYPEDEF CLASS DsmonAggProfile {  
    STATUS      current;
    DESCRIPTION
        "Controls the setup of a single aggregation profile,
         for which every DSCP value MUST be configured
         into exactly one aggregation group.

         This table MUST NOT be modified if the dsmonAggControlLocked
         object is equal to 'true'.

         If the agent supports non-volatile configuration of this
         table, then upon system initialization, this table SHOULD be
         initialized with the saved values.";

    ARRAY aggGroupMapping {
        INDEX  {
            SYNTAX  Dscp;
            SIZE    (64);    -- fixed array of 64 entries
            DESCRIPTION
                "The specific DSCP value which is configured in an
                aggregation group by this entry.";
        };
        -- more INDEX clauses may be present, for multi-dimensional arrays

        SCALAR dsmonAggGroupIndex {
            SYNTAX      DsmonAggGroupIndex;
            MAX-ACCESS  read-write;
            STATUS      current;
            DESCRIPTION
                "The aggregation group which contains this DSCP value.  Upon
                creation of a new sub-tree (set of 64 entries with the same
                dsmonAggControlIndex value) in this table, the agent SHOULD
                initialize all related instances of this object to the value
                zero.
    
                This object MUST NOT be modified if the
                dsmonAggControlLocked object is equal to 'true'.";
            DEFVAL { 0 };
        } ::= 1;
   } ::= 1;
};    -- an abstract class, without a subroot assignment


-- following is done as an inline array instead of a 
-- separate class definition (like DsmonAggProfile) for
-- demonstration purposes 

-- converted dsmonAggGroupTable

TYPEDEF ARRAY DsmonAggGroup {
    STATUS      current;
    DESCRIPTION
        "Controls the setup of a single aggregation profile,
         for which every DSCP value MUST be configured
         into exactly one aggregation group.

         This table MUST NOT be modified if the dsmonAggControlLocked
         object is equal to 'true'.

         If the agent supports non-volatile configuration of this
         table, then upon system initialization, this table SHOULD be
         initialized with the saved values.";
    INDEX  {
        SYNTAX  DsmonAggGroupIndex;  -- range of the INDEX
        SIZE    (0..2147483647);     -- range of the instances
        DESCRIPTION
            "The specific Aggregation Group which is represented
             group by each entry.";
    };

    SCALAR dsmonAggGroupDescr {
        SYNTAX      SnmpAdminString (SIZE(0..64));
        MAX-ACCESS  read-create;
        STATUS      current;
        DESCRIPTION
            "An administratively assigned description of the 
             aggregation group identified by this entry.

             Upon first creation of an instance of this object, 
             the agent SHOULD set this object to the empty string.

             This object MUST NOT be modified if the associated
             dsmonAggGroupStatus object is equal to 'active', or the
             dsmonAggControlLocked object is equal to 'true'.";
    } ::= 1;

    SCALAR dsmonAggGroupStatus {
        SYNTAX      RowStatus;
        MAX-ACCESS  read-create;
        STATUS      current;
        DESCRIPTION
            "The status of this row.

             An entry MUST NOT exist in the active state unless all
             objects in the entry have an appropriate value.

             This object MUST NOT be modified if the
             dsmonAggControlLocked object is equal to 'true'.";
    } ::= 2;
};


-- converted dsmonAggControlTable

TYPEDEF CLASS DsmonAggControl {
    STATUS      current;
    DESCRIPTION
        "Provides an overall description and control
	 point for a single aggregation control configuration.

         This table MUST NOT be modified if the dsmonAggControlLocked
         object is equal to 'true'.";

    SCALAR dsmonAggControlDescr {
        SYNTAX      SnmpAdminString (SIZE(0..64));
        MAX-ACCESS  read-create;
        STATUS      current;
        DESCRIPTION
            "An administratively assigned description of the aggregation
            profile identified by this entry.

            Upon first creation of an instance of this object, the agent
            SHOULD set this object to the empty string.  If the agent
            supports non-volatile storage, then this object SHOULD be
            re-initialized with its stored value after a system reboot.

            This object MUST NOT be modified if the associated
            dsmonAggControlStatus object is equal to 'active', or the
            dsmonAggControlLocked object is equal to 'true'.";
    } ::= 1;

    SCALAR dsmonAggControlOwner {
        SYNTAX     OwnerString;
        MAX-ACCESS read-create;
        STATUS     current;
        DESCRIPTION
            "The entity that configured this entry and is therefore
            using the resources assigned to it.";
    } ::= 2;

    SCALAR dsmonAggControlStatus {
        SYNTAX      RowStatus;
        MAX-ACCESS  read-create;
        STATUS      current;
        DESCRIPTION
            "The status of this aggregation control object.

            An entry MUST NOT exist in the active state unless all
            objects in the entry have an appropriate value.

            This object MUST NOT be modified if the
            dsmonAggControlLocked object is equal to 'true'.";
    } ::= 3;

    CLASS aggProfile {
        SYNTAX DsmonAggProfile;
        MAX-ACCESS  read-write;
        STATUS      current;
        DESCRIPTION
           "A set of DSCP to Aggregation Group mappings";
    } ::= 4;

    ARRAY aggGroup {
        SYNTAX      DsmonAggGroup;
        MAX-ACCESS  read-create;
        STATUS      current;
        DESCRIPTION
            "An array of Aggregation Group descriptions";
    } ::= 5;
};
        

ARRAY dsmonAggProfiles {
    STATUS      current;
    DESCRIPTION
        "A collection of DSMON aggregation control profiles.

         This table MUST NOT be modified if the dsmonAggControlLocked
         object is equal to 'true'.

         If the agent supports non-volatile configuration of this
         table, then upon system initialization, this table SHOULD be
         initialized with the saved values.";
    INDEX  {
        SYNTAX  DsmonAggProfileIndex;
        SIZE    (1..2147483647);     -- variable sized array 
        DESCRIPTION
            "The specific Aggregation Profile which is represented
             group by each entry.";
    };

    CLASS aggControl {
        SYNTAX DsmonAggControl;
        MAX-ACCESS read-create;
        DESCRIPTION
           "The DSMON Aggregation Control entry for each profile.";
    } ::= 1;
} ::= { dsmonAggObjects 1 };

        
CLASS DsmonAggGlobal {
    STATUS      current;
    DESCRIPTION
        "Overall global controls and capabilities for DSMON 
         aggregation configuration.";

    SCALAR dsmonMaxAggGroups {
        SYNTAX Integer32 (2..64);
        MAX-ACCESS read-only;
        STATUS current;
        DESCRIPTION
            "The maximum number of aggregation groups that this agent
             can support. The agent will allow this number of distinct
             groups to be configured in the dsmonAggProfileTable,
             numbered from '0' to 'dsmonMaxAggGroups - 1', for each
             aggregation profile entry supported by the agent.
    
             The agent MUST NOT lower this value during system operation,
             and SHOULD set this object to an appropriate value during
             system initialization.";
    } ::= 1;
     
    SCALAR dsmonAggControlLocked {
        SYNTAX TruthValue;
        MAX-ACCESS read-write;
        STATUS current;
        DESCRIPTION
            "Controls the setup of aggregation groups for this agent.
    
             If this object contains the value 'true', then write access
             to the objects in the dsmonAggControlTable (except the
             dsmonAggControlOwner object), dsmonAggProfileTable, and
             dsmonAggGroupTable is not permitted, and data collection is
             possible.  This object only controls write access to these
             MIB objects. The DSMON data collection control tables (e.g.,
             dsmonHostCtlTable) can be configured at any time, regardless
             of the value of this object.
    
             If this object contains the value 'false', write access to
             the objects in the dsmonAggControlTable,
             dsmonAggProfileTable, and dsmonAggGroupTable is permitted,
             and data collection is not possible.  In addition, all
             objects in all DSMON data tables (e.g., dsmonStatsTable)
             shall be deleted.
    
             An agent is not required to process SNMP Set Requests for
             this object in conjunction with other objects from this MIB.
             This is intended to simplify the processing of Set Requests
             for tables such as the dsmonAggProfileTable, by eliminating
             the possibility that a single Set PDU will contain multiple
             varbinds which are in conflict, such as a PDU which both
             modifies the dsmonAggProfileTable and locks the
             dsmonAggProfileTable at the same time.
    
             Note that the agent is not required to validate the entire
             aggregation configuration when an attempt is made to
             transition an instance of this object from 'true' to
             'false'. That validation is done if and when a DSMON data
             collection is activated.
    
             An agent is required to reactivate any suspended data
             collections when this object transitions to 'true', Each
             active data control entry (e.g., dsmonStatsControlEntry),
             will be validated with respect to the new aggregation
             configuration. If the aggregation profile referenced in the
             data collection is valid, then that collection will be
             restarted. Otherwise, the RowStatus object (e.g.,
             dsmonStatsControlStatus) will be set to 'notReady' for that
             collection control entry.";
    } ::= 2;
    
    SCALAR dsmonAggControlChanges {
        SYNTAX      Counter32;
        MAX-ACCESS  read-only;
        STATUS      current;
        DESCRIPTION
            "This object counts the number of times the value of the
             dsmonAggControlLocked object has changed.  A management
             station can use this object to detect if counters in the
             DSMON data tables (e.g., dsmonStatsEntry) have been deleted
             and recreated between polls.
    
             This object shall be incremented by one each time the
             dsmonAggControlLocked object changes from 'false' to 'true',
             or from 'true' to 'false'.";
    } ::= 3;
    
    SCALAR dsmonAggControlLastChangeTime {
        SYNTAX      TimeStamp;
        MAX-ACCESS  read-only;
        STATUS      current;
        DESCRIPTION
            "This object identifies the value of sysUpTime at the moment
             the dsmonAggControlLocked object was last modified.  A
             management station can use this object to detect if counters
             in the DSMON data tables (e.g., dsmonStatsEntry) have been
             deleted and recreated between polls.
    
             This object shall be updated with the current value of
             sysUpTime, if the dsmonAggControlLocked object changes from
             'false' to 'true', or from 'true' to 'false'.
    
             Upon system initialization, this object shall contain the
             value zero.";
    } ::= 4;
} ::= { dsmonAggObjects 2 };



--
-- Class definitions for all the statistics would be defined as well...
--

};   -- END DSMON-MIB MODULE



Notes
-----

   Pointers are TBD
  
   UNION construct TBD

   MODULE-COMPLIANCE TBD (may not change at all)

   NOTIFICATIONs are TBD (may not change at all)

   Object Instance and Object Definition distinctions
   are not made with the namespace, but rather with
   different pointer types

   Instance Identifiers are variable length, in that
   not all the object instances (accessible via SNMP Get)
   within a high-level object have the same number
   of OID components. 

   Scalar instances do not end in .0. This gets ugly
   when arbitrary containment is introduced, so it's
   better to leave off the last zero on scalars.

   INDEX components are encoded inline, after the object ID,
   but fragmented, depending on the data structure definition.
   This allows for arbitrarily complex nested containment,
   but the instance components are not all grouped together
   at the end.

   For all TYPEDEFs:  TYPEDEF FOO fooName { ...  }; 
   There is no OID assignment between the right brace
   and the semi-colon;

   For all objects within a typedef (except INDEX clauses):
         FOO { ... } ::= N;
   N is the number of the child sub-component, 
   simply relative to the parent object, not hard-assigned
   from the root.

   For all FOO declarations (no TYPEDEF keyword:
        FOO { ... } ::= { <any valid OID expression> }
   This is an objectect instance declaration, and must have
   a valid MIB root assignment.

   Just as with the C language, if the TYPEDEF keyword is 
   present, then the construct is a data structure definition,
   and if it's missing, then the construct is a data structure 
   declaration.
 

 Object Instance Examples   
------------------------------
 O=Old (SMIv2), N=New (SMIng)

dsmonAggControlTable example for row 77:
   dsmonAggControlDescr
     O: dsmonAggObjects.5.1.2.77
     N: dsmonAggObjects.1.1.77.1
   dsmonAggControlOwner
     O: dsmonAggObjects.5.1.3.77
     N: dsmonAggObjects.1.1.77.2
   dsmonAggControlStatus
     O: dsmonAggObjects.5.1.3.77
     N: dsmonAggObjects.1.1.77.3

dsmonAggProfileTable example for row 77.22:
   dsmonAggGroupIndex (e.g., == 44)
     O: dsmonAggObjects.6.1.2.77.22
     N: dsmonAggObjects.1.1.77.4.1.1.22

dsmonAggGroupTable example for row 77.44:
   dsmonAggGroupDescr (e.g., == "Example Group 44")
     O: dsmonAggObjects.7.1.1.77.44
     N: dsmonAggObjects.1.1.77.5.1.44
   dsmonAggGroupStatus (e.g., == active(1))
     O: dsmonAggObjects.7.1.2.77.44
     N: dsmonAggObjects.1.1.77.5.2.44

DSMON MIB scalars:
   dsmonMaxAggGroups    
     O: dsmonAggObjects.1.0
     N: dsmonAggObjects.2.1
   dsmonAggControlLocked    
     O: dsmonAggObjects.2.0
     N: dsmonAggObjects.2.2
   dsmonAggControlChanges
     O: dsmonAggObjects.3.0
     N: dsmonAggObjects.2.3
   dsmonAggControlLastChangeTime
     O: dsmonAggObjects.4.0
     N: dsmonAggObjects.2.4