DISMAN-EXPRESSION-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE,
    Integer32, Gauge32, Unsigned32,
    Counter32, Counter64, IpAddress,
    TimeTicks, mib-2, zeroDotZero  FROM SNMPv2-SMI
    RowStatus, TruthValue, TimeStamp    FROM SNMPv2-TC
    sysUpTime                 FROM SNMPv2-MIB
    SnmpAdminString           FROM SNMP-FRAMEWORK-MIB
    MODULE-COMPLIANCE, OBJECT-GROUP     FROM SNMPv2-CONF;

dismanExpressionMIB MODULE-IDENTITY
    LAST-UPDATED "200010160000Z" -- 16 October 2000
    ORGANIZATION "IETF Distributed Management Working Group"
    CONTACT-INFO "Ramanathan Kavasseri
                  Cisco Systems, Inc.
                  170 West Tasman Drive,
                  San Jose CA 95134-1706.
                  Phone: +1 408 527 2446
                  Email: ramk@cisco.com"
    DESCRIPTION
     "The MIB module for defining expressions of MIB objects for
     management purposes."
-- Revision History

       REVISION     "200010160000Z" -- 16 October 2000
       DESCRIPTION  "This is the initial version of this MIB.
                    Published as RFC 2982"
    ::= { mib-2 90 }


dismanExpressionMIBObjects OBJECT IDENTIFIER ::=
                                            { dismanExpressionMIB 1 }

expResource    OBJECT IDENTIFIER ::= { dismanExpressionMIBObjects 1 }
expDefine OBJECT IDENTIFIER ::= { dismanExpressionMIBObjects 2 }
expValue  OBJECT IDENTIFIER ::= { dismanExpressionMIBObjects 3 }

--
-- Resource Control
--


expResourceDeltaMinimum OBJECT-TYPE
    SYNTAX      Integer32 (-1 | 1..600)
    UNITS       "seconds"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
     "The minimum expExpressionDeltaInterval this system will
     accept.  A system may use the larger values of this minimum to
     lessen the impact of constantly computing deltas.  For larger
     delta sampling intervals the system samples less often and
     suffers less overhead.  This object provides a way to enforce
     such lower overhead for all expressions created after it is
     set.

     The value -1 indicates that expResourceDeltaMinimum is
     irrelevant as the system will not accept 'deltaValue' as a
     value for expObjectSampleType.

     Unless explicitly resource limited, a system's value for
     this object should be 1, allowing as small as a 1 second
     interval for ongoing delta sampling.

     Changing this value will not invalidate an existing setting
     of expObjectSampleType."
    ::= { expResource 1 }

expResourceDeltaWildcardInstanceMaximum OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "instances"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
     "For every instance of a deltaValue object, one dynamic instance
     entry is needed for holding the instance value from the previous
     sample, i.e. to maintain state.

     This object limits maximum number of dynamic instance entries
     this system will support for wildcarded delta objects in
     expressions. For a given delta expression, the number of
     dynamic instances is the number of values that meet all criteria
     to exist times the number of delta values in the expression.

     A value of 0 indicates no preset limit, that is, the limit
     is dynamic based on system operation and resources.

     Unless explicitly resource limited, a system's value for
     this object should be 0.


     Changing this value will not eliminate or inhibit existing delta
     wildcard instance objects but will prevent the creation of more
     such objects.

     An attempt to allocate beyond the limit results in expErrorCode
     being tooManyWildcardValues for that evaluation attempt."
    ::= { expResource 2 }

expResourceDeltaWildcardInstances OBJECT-TYPE
    SYNTAX      Gauge32
    UNITS       "instances"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The number of currently active instance entries as
     defined for expResourceDeltaWildcardInstanceMaximum."
    ::= { expResource 3 }

expResourceDeltaWildcardInstancesHigh OBJECT-TYPE
    SYNTAX      Gauge32
    UNITS       "instances"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The highest value of expResourceDeltaWildcardInstances
     that has occurred since initialization of the managed
     system."
    ::= { expResource 4 }

expResourceDeltaWildcardInstanceResourceLacks OBJECT-TYPE
    SYNTAX      Counter32
    UNITS       "instances"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The number of times this system could not evaluate an
     expression because that would have created a value instance in
     excess of expResourceDeltaWildcardInstanceMaximum."
    ::= { expResource 5 }

--

-- Definition
--
-- Expression Definition Table
--

expExpressionTable OBJECT-TYPE

    SYNTAX      SEQUENCE OF ExpExpressionEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "A table of expression definitions."
    ::= { expDefine 1 }

expExpressionEntry OBJECT-TYPE
    SYNTAX      ExpExpressionEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "Information about a single expression.  New expressions
     can be created using expExpressionRowStatus.

     To create an expression first create the named entry in this
     table.  Then use expExpressionName to populate expObjectTable.
     For expression evaluation to succeed all related entries in
     expExpressionTable and expObjectTable must be 'active'.  If
     these conditions are not met the corresponding values in
     expValue simply are not instantiated.

     Deleting an entry deletes all related entries in expObjectTable
     and expErrorTable.

     Because of the relationships among the multiple tables for an
     expression (expExpressionTable, expObjectTable, and
     expValueTable) and the SNMP rules for independence in setting
     object values, it is necessary to do final error checking when
     an expression is evaluated, that is, when one of its instances
     in expValueTable is read or a delta interval expires.  Earlier
     checking need not be done and an implementation may not impose
     any ordering on the creation of objects related to an
     expression.

     To maintain security of MIB information, when creating a new row in
     this table, the managed system must record the security credentials
     of the requester.  These security credentials are the parameters
     necessary as inputs to isAccessAllowed from the Architecture for

     Describing SNMP Management Frameworks.  When obtaining the objects
     that make up the expression, the system must (conceptually) use
     isAccessAllowed to ensure that it does not violate security.

     The evaluation of the expression takes place under the
     security credentials of the creator of its expExpressionEntry.

     Values of read-write objects in this table may be changed

     at any time."
    INDEX       { expExpressionOwner, expExpressionName }
    ::= { expExpressionTable 1 }

ExpExpressionEntry ::= SEQUENCE {
    expExpressionOwner           SnmpAdminString,
    expExpressionName             SnmpAdminString,
    expExpression                OCTET STRING,
    expExpressionValueType       INTEGER,
    expExpressionComment         SnmpAdminString,
    expExpressionDeltaInterval   Integer32,
    expExpressionPrefix           OBJECT IDENTIFIER,
    expExpressionErrors          Counter32,
    expExpressionEntryStatus     RowStatus
}

expExpressionOwner OBJECT-TYPE
   SYNTAX      SnmpAdminString (SIZE(0..32))
   MAX-ACCESS  not-accessible
   STATUS      current
   DESCRIPTION
     "The owner of this entry. The exact semantics of this
     string are subject to the security policy defined by the
     security administrator."
    ::= { expExpressionEntry 1 }

expExpressionName OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE (1..32))
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "The name of the expression.  This is locally unique, within
     the scope of an expExpressionOwner."
    ::= { expExpressionEntry 2 }

expExpression OBJECT-TYPE
    SYNTAX      OCTET STRING (SIZE (1..1024))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The expression to be evaluated.  This object is the same
     as a DisplayString (RFC 1903) except for its maximum length.

     Except for the variable names the expression is in ANSI C
     syntax.  Only the subset of ANSI C operators and functions
     listed here is allowed.

     Variables are expressed as a dollar sign ('$') and an

     integer that corresponds to an expObjectIndex.  An
     example of a valid expression is:

          ($1-$5)*100

     Expressions must not be recursive, that is although an expression
     may use the results of another expression, it must not contain
     any variable that is directly or indirectly a result of its own
     evaluation. The managed system must check for recursive
     expressions.

     The only allowed operators are:

          ( )
          - (unary)
          + - * / %
          & | ^ << >> ~
          ! && || == != > >= < <=

     Note the parentheses are included for parenthesizing the
     expression, not for casting data types.

     The only constant types defined are:

          int (32-bit signed)
          long (64-bit signed)
          unsigned int
          unsigned long
          hexadecimal
          character
          string
          oid

     The default type for a positive integer is int unless it is too
     large in which case it is long.

     All but oid are as defined for ANSI C.  Note that a
     hexadecimal constant may end up as a scalar or an array of
     8-bit integers.  A string constant is enclosed in double
     quotes and may contain back-slashed individual characters
     as in ANSI C.

     An oid constant comprises 32-bit, unsigned integers and at
     least one period, for example:

          0.
          .0
          1.3.6.1

     No additional leading or trailing subidentifiers are automatically
     added to an OID constant.  The constant is taken as expressed.

     Integer-typed objects are treated as 32- or 64-bit, signed
     or unsigned integers, as appropriate.  The results of
     mixing them are as for ANSI C, including the type of the
     result.  Note that a 32-bit value is thus promoted to 64 bits
     only in an operation with a 64-bit value.  There is no
     provision for larger values to handle overflow.

     Relative to SNMP data types, a resulting value becomes
     unsigned when calculating it uses any unsigned value,
     including a counter.  To force the final value to be of
     data type counter the expression must explicitly use the
     counter32() or counter64() function (defined below).

     OCTET STRINGS and OBJECT IDENTIFIERs are treated as
     one-dimensioned arrays of unsigned 8-bit integers and
     unsigned 32-bit integers, respectively.

     IpAddresses are treated as 32-bit, unsigned integers in
     network byte order, that is, the hex version of 255.0.0.0 is
     0xff000000.

     Conditional expressions result in a 32-bit, unsigned integer
     of value 0 for false or 1 for true. When an arbitrary value
     is used as a boolean 0 is false and non-zero is true.

     Rules for the resulting data type from an operation, based on
     the operator:

     For << and >> the result is the same as the left hand operand.

     For &&, ||, ==, !=, <, <=, >, and >= the result is always
     Unsigned32.

     For unary - the result is always Integer32.

     For +, -, *, /, %, &, |, and ^ the result is promoted according
     to the following rules, in order from most to least preferred:

          If left hand and right hand operands are the same type,
          use that.

          If either side is Counter64, use that.

          If either side is IpAddress, use that.


          If either side is TimeTicks, use that.

          If either side is Counter32, use that.

          Otherwise use Unsigned32.

     The following rules say what operators apply with what data
     types.  Any combination not explicitly defined does not work.

     For all operators any of the following can be the left hand or
     right hand operand: Integer32, Counter32, Unsigned32, Counter64.

     The operators +, -, *, /, %, <, <=, >, and >= work with
     TimeTicks.

     The operators &, |, and ^ work with IpAddress.

     The operators << and >> work with IpAddress but only as the
     left hand operand.

     The + operator performs a concatenation of two OCTET STRINGs or
     two OBJECT IDENTIFIERs.

     The operators &, | perform bitwise operations on OCTET STRINGs.
     If the OCTET STRING happens to be a DisplayString the results
     may be meaningless, but the agent system does not check this as
     some such systems do not have this information.

     The operators << and >> perform bitwise operations on OCTET
     STRINGs appearing as the left hand operand.

     The only functions defined are:

          counter32
          counter64
          arraySection
          stringBegins
          stringEnds
          stringContains
          oidBegins
          oidEnds
          oidContains
          average
          maximum
          minimum
          sum
          exists


     The following function definitions indicate their parameters by
     naming the data type of the parameter in the parameter's position
     in the parameter list.  The parameter must be of the type indicated
     and generally may be a constant, a MIB object, a function, or an
     expression.

     counter32(integer) - wrapped around an integer value counter32
     forces Counter32 as a data type.

     counter64(integer) - similar to counter32 except that the
     resulting data type is 'counter64'.

     arraySection(array, integer, integer) - selects a piece of an
     array (i.e. part of an OCTET STRING or OBJECT IDENTIFIER).  The
     integer arguments are in the range 0 to 4,294,967,295.  The
     first is an initial array index (one-dimensioned) and the second
     is an ending array index.  A value of 0 indicates first or last
     element, respectively.  If the first element is larger than the
     array length the result is 0 length.  If the second integer is
     less than or equal to the first, the result is 0 length.  If the
     second is larger than the array length it indicates last
     element.

     stringBegins/Ends/Contains(octetString, octetString) - looks for
     the second string (which can be a string constant) in the first
     and returns the one-dimensioned arrayindex where the match began.
     A return value of 0 indicates no match (i.e. boolean false).

     oidBegins/Ends/Contains(oid, oid) - looks for the second OID
     (which can be an OID constant) in the first and returns the
     the one-dimensioned index where the match began. A return value
     of 0 indicates no match (i.e. boolean false).

     average/maximum/minimum(integer) - calculates the average,
     minimum, or maximum value of the integer valued object over
     multiple sample times.  If the object disappears for any
     sample period, the accumulation and the resulting value object
     cease to exist until the object reappears at which point the
     calculation starts over.

     sum(integerObject*) - sums all available values of the
     wildcarded integer object, resulting in an integer scalar.  Must
     be used with caution as it wraps on overflow with no
     notification.

     exists(anyTypeObject) - verifies the object instance exists. A
     return value of 0 indicates NoSuchInstance (i.e. boolean
     false)."

    ::= { expExpressionEntry 3 }

expExpressionValueType OBJECT-TYPE
    SYNTAX      INTEGER { counter32(1), unsigned32(2), timeTicks(3),
                 integer32(4), ipAddress(5), octetString(6),
                 objectId(7), counter64(8) }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The type of the expression value.  One and only one of the
     value objects in expValueTable will be instantiated to match
     this type.

     If the result of the expression can not be made into this type,
     an invalidOperandType error will occur."
    DEFVAL      { counter32 }
    ::= { expExpressionEntry 4 }

expExpressionComment OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "A comment to explain the use or meaning of the expression."
    DEFVAL      { ''H }
    ::= { expExpressionEntry 5 }

expExpressionDeltaInterval OBJECT-TYPE
    SYNTAX      Integer32 (0..86400)
    UNITS       "seconds"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "Sampling interval for objects in this expression with
     expObjectSampleType 'deltaValue'.

     This object has no effect if the the expression has no
     deltaValue objects.

     A value of 0 indicates no automated sampling.  In this case
     the delta is the difference from the last time the expression
     was evaluated.  Note that this is subject to unpredictable
     delta times in the face of retries or multiple managers.

     A value greater than zero is the number of seconds between
     automated samples.

     Until the delta interval has expired once the delta for the

     object is effectively not instantiated and evaluating
     the expression has results as if the object itself were not
     instantiated.

     Note that delta values potentially consume large amounts of
     system CPU and memory.  Delta state and processing must
     continue constantly even if the expression is not being used.
     That is, the expression is being evaluated every delta interval,
     even if no application is reading those values.  For wildcarded
     objects this can be substantial overhead.

     Note that delta intervals, external expression value sampling
     intervals and delta intervals for expressions within other
     expressions can have unusual interactions as they are impossible
     to synchronize accurately.  In general one interval embedded
     below another must be enough shorter that the higher sample
     sees relatively smooth, predictable behavior.  So, for example,
     to avoid the higher level getting the same sample twice, the
     lower level should sample at least twice as fast as the higher
     level does."
    DEFVAL      { 0 }
    ::= { expExpressionEntry 6 }

expExpressionPrefix OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "An object prefix to assist an application in determining
     the instance indexing to use in expValueTable, relieving the
     application of the need to scan the expObjectTable to
     determine such a prefix.

     See expObjectTable for information on wildcarded objects.

     If the expValueInstance portion of the value OID may
     be treated as a scalar (that is, normally, 0) the value of
     expExpressionPrefix is zero length, that is, no OID at all.
     Note that zero length implies a null OID, not the OID 0.0.

     Otherwise, the value of expExpressionPrefix is the expObjectID
     value of any one of the wildcarded objects for the expression.
     This is sufficient, as the remainder, that is, the instance
     fragment relevant to instancing the values, must be the same for
     all wildcarded objects in the expression."
    ::= { expExpressionEntry 7 }

expExpressionErrors OBJECT-TYPE

    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The number of errors encountered while evaluating this
     expression.

     Note that an object in the expression not being accessible,
     is not considered an error. An example of an inaccessible
     object is when the object is excluded from the view of the
     user whose security credentials are used in the expression
     evaluation. In such cases, it is a legitimate condition
     that causes the corresponding expression value not to be
     instantiated."
    ::= { expExpressionEntry 8 }

expExpressionEntryStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The control that allows creation and deletion of entries."
    ::= { expExpressionEntry 9 }

--
-- Expression Error Table
--

expErrorTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF ExpErrorEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "A table of expression errors."
    ::= { expDefine 2 }

expErrorEntry OBJECT-TYPE
    SYNTAX      ExpErrorEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "Information about errors in processing an expression.

     Entries appear in this table only when there is a matching
     expExpressionEntry and then only when there has been an
     error for that expression as reflected by the error codes
     defined for expErrorCode."
    INDEX       { expExpressionOwner, expExpressionName }

    ::= { expErrorTable 1 }

ExpErrorEntry ::= SEQUENCE {
    expErrorTime       TimeStamp,
    expErrorIndex      Integer32,
    expErrorCode       INTEGER,
    expErrorInstance   OBJECT IDENTIFIER
}

expErrorTime OBJECT-TYPE
    SYNTAX      TimeStamp
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value of sysUpTime the last time an error caused a
     failure to evaluate this expression."
    ::= { expErrorEntry 1 }

expErrorIndex OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The one-dimensioned character array index into
     expExpression for where the error occurred.  The value
     zero indicates irrelevance."
    ::= { expErrorEntry 2 }

expErrorCode OBJECT-TYPE
    SYNTAX      INTEGER {
          invalidSyntax(1),
          undefinedObjectIndex(2),
          unrecognizedOperator(3),
          unrecognizedFunction(4),
          invalidOperandType(5),
          unmatchedParenthesis(6),
          tooManyWildcardValues(7),
          recursion(8),
          deltaTooShort(9),
          resourceUnavailable(10),
          divideByZero(11)
          }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The error that occurred.  In the following explanations the
     expected timing of the error is in parentheses.  'S' means
     the error occurs on a Set request.  'E' means the error

     occurs on the attempt to evaluate the expression either due to
     Get from expValueTable or in ongoing delta processing.

     invalidSyntax       the value sent for expExpression is not
                    valid Expression MIB expression syntax
                    (S)
     undefinedObjectIndex     an object reference ($n) in
                    expExpression does not have a matching
                    instance in expObjectTable (E)
     unrecognizedOperator     the value sent for expExpression held an
                    unrecognized operator (S)
     unrecognizedFunction     the value sent for expExpression held an
                    unrecognized function name (S)
     invalidOperandType  an operand in expExpression is not the
                    right type for the associated operator
                    or result (SE)
     unmatchedParenthesis     the value sent for expExpression is not
                    correctly parenthesized (S)
     tooManyWildcardValues    evaluating the expression exceeded the
                    limit set by
                    expResourceDeltaWildcardInstanceMaximum
                    (E)
     recursion      through some chain of embedded
                    expressions the expression invokes itself
                    (E)
     deltaTooShort       the delta for the next evaluation passed
                    before the system could evaluate the
                    present sample (E)
     resourceUnavailable some resource, typically dynamic memory,
                    was unavailable (SE)
     divideByZero        an attempt to divide by zero occurred
                    (E)

     For the errors that occur when the attempt is made to set
     expExpression Set request fails with the SNMP error code
     'wrongValue'.  Such failures refer to the most recent failure to
     Set expExpression, not to the present value of expExpression
     which must be either unset or syntactically correct.

     Errors that occur during evaluation for a Get* operation return
     the SNMP error code 'genErr' except for 'tooManyWildcardValues'
     and 'resourceUnavailable' which return the SNMP error code
     'resourceUnavailable'."
    ::= { expErrorEntry 3 }

expErrorInstance OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-only

    STATUS      current
    DESCRIPTION
     "The expValueInstance being evaluated when the error
     occurred.  A zero-length indicates irrelevance."
    ::= { expErrorEntry 4 }

--
-- Object Table
--

expObjectTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF ExpObjectEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "A table of object definitions for each expExpression.

     Wildcarding instance IDs:

     It is legal to omit all or part of the instance portion for
     some or all of the objects in an expression. (See the
     DESCRIPTION of expObjectID for details.  However, note that
     if more than one object in the same expression is wildcarded
     in this way, they all must be objects where that portion of
     the instance is the same.  In other words, all objects may be
     in the same SEQUENCE or in different SEQUENCEs but with the
     same semantic index value (e.g., a value of ifIndex)
     for the wildcarded portion."
    ::= { expDefine 3 }

expObjectEntry OBJECT-TYPE
    SYNTAX      ExpObjectEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "Information about an object.  An application uses
     expObjectEntryStatus to create entries in this table while
     in the process of defining an expression.

     Values of read-create objects in this table may be
     changed at any time."
    INDEX       { expExpressionOwner, expExpressionName, expObjectIndex }
    ::= { expObjectTable 1 }

ExpObjectEntry ::= SEQUENCE {
    expObjectIndex                     Unsigned32,
    expObjectID                        OBJECT IDENTIFIER,
    expObjectIDWildcard                TruthValue,

    expObjectSampleType                INTEGER,
    expObjectDeltaDiscontinuityID      OBJECT IDENTIFIER,
    expObjectDiscontinuityIDWildcard   TruthValue,
    expObjectDiscontinuityIDType       INTEGER,
    expObjectConditional               OBJECT IDENTIFIER,
    expObjectConditionalWildcard       TruthValue,
    expObjectEntryStatus               RowStatus
}

expObjectIndex OBJECT-TYPE
    SYNTAX      Unsigned32 (1..4294967295)
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "Within an expression, a unique, numeric identification for an
     object.  Prefixed with a dollar sign ('$') this is used to
     reference the object in the corresponding expExpression."
    ::= { expObjectEntry 1 }

expObjectID OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The OBJECT IDENTIFIER (OID) of this object.  The OID may be
     fully qualified, meaning it includes a complete instance
     identifier part (e.g., ifInOctets.1 or sysUpTime.0), or it
     may not be fully qualified, meaning it may lack all or part
     of the instance identifier.  If the expObjectID is not fully
     qualified, then expObjectWildcard must be set to true(1).
     The value of the expression will be multiple
     values, as if done for a GetNext sweep of the object.

     An object here may itself be the result of an expression but
     recursion is not allowed.

     NOTE:  The simplest implementations of this MIB may not allow
     wildcards."
    ::= { expObjectEntry 2 }

expObjectIDWildcard  OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "A true value indicates the expObjecID of this row is a wildcard
        object. False indicates that expObjectID is fully instanced.
        If all expObjectWildcard values for a given expression are FALSE,

        expExpressionPrefix will reflect a scalar object (i.e. will
        be 0.0).

        NOTE:  The simplest implementations of this MIB may not allow
        wildcards."
    DEFVAL      { false }
    ::= { expObjectEntry 3 }

expObjectSampleType OBJECT-TYPE
    SYNTAX      INTEGER { absoluteValue(1), deltaValue(2),
                          changedValue(3) }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The method of sampling the selected variable.

     An 'absoluteValue' is simply the present value of the object.

     A 'deltaValue' is the present value minus the previous value,
     which was sampled expExpressionDeltaInterval seconds ago.
     This is intended primarily for use with SNMP counters, which are
     meaningless as an 'absoluteValue', but may be used with any
     integer-based value.

     A 'changedValue' is a boolean for whether the present value is
     different from the previous value.  It is applicable to any data
     type and results in an Unsigned32 with value 1 if the object's
     value is changed and 0 if not.  In all other respects it is as a
     'deltaValue' and all statements and operation regarding delta
     values apply to changed values.

     When an expression contains both delta and absolute values
     the absolute values are obtained at the end of the delta
     period."
    DEFVAL      { absoluteValue }
    ::= { expObjectEntry 4 }

sysUpTimeInstance OBJECT IDENTIFIER ::= { sysUpTime 0 }

expObjectDeltaDiscontinuityID OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The OBJECT IDENTIFIER (OID) of a TimeTicks, TimeStamp, or
     DateAndTime object that indicates a discontinuity in the value
     at expObjectID.


     This object is instantiated only if expObjectSampleType is
     'deltaValue' or 'changedValue'.

     The OID may be for a leaf object (e.g. sysUpTime.0) or may
     be wildcarded to match expObjectID.

     This object supports normal checking for a discontinuity in a
     counter.  Note that if this object does not point to sysUpTime
     discontinuity checking must still check sysUpTime for an overall
     discontinuity.

     If the object identified is not accessible no discontinuity
     check will be made."
    DEFVAL      { sysUpTimeInstance }
    ::= { expObjectEntry 5 }

expObjectDiscontinuityIDWildcard OBJECT-TYPE
     SYNTAX      TruthValue
     MAX-ACCESS  read-create
     STATUS      current
     DESCRIPTION
     "A true value indicates the expObjectDeltaDiscontinuityID of
     this row is a wildcard object.  False indicates that
     expObjectDeltaDiscontinuityID is fully instanced.

     This object is instantiated only if expObjectSampleType is
     'deltaValue' or 'changedValue'.

     NOTE:  The simplest implementations of this MIB may not allow
     wildcards."
    DEFVAL      { false }
     ::= { expObjectEntry 6 }

expObjectDiscontinuityIDType OBJECT-TYPE
     SYNTAX      INTEGER { timeTicks(1), timeStamp(2), dateAndTime(3) }
     MAX-ACCESS  read-create
     STATUS      current
     DESCRIPTION
     "The value 'timeTicks' indicates the expObjectDeltaDiscontinuityID
     of this row is of syntax TimeTicks.  The value 'timeStamp' indicates
     syntax TimeStamp.  The value 'dateAndTime indicates syntax
     DateAndTime.

     This object is instantiated only if expObjectSampleType is
     'deltaValue' or 'changedValue'."
    DEFVAL      { timeTicks }
     ::= { expObjectEntry 7 }


expObjectConditional OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
     "The OBJECT IDENTIFIER (OID) of an object that overrides
     whether the instance of expObjectID is to be considered
     usable.  If the value of the object at expObjectConditional
     is 0 or not instantiated, the object at expObjectID is
     treated as if it is not instantiated.  In other words,
     expObjectConditional is a filter that controls whether or
     not to use the value at expObjectID.

     The OID may be for a leaf object (e.g. sysObjectID.0) or may be
     wildcarded to match expObjectID.  If expObject is wildcarded and
     expObjectID in the same row is not, the wild portion of
     expObjectConditional must match the wildcarding of the rest of
     the expression.  If no object in the expression is wildcarded
     but expObjectConditional is, use the lexically first instance
     (if any) of expObjectConditional.

     If the value of expObjectConditional is 0.0 operation is
     as if the value pointed to by expObjectConditional is a
     non-zero (true) value.

     Note that expObjectConditional can not trivially use an object
     of syntax TruthValue, since the underlying value is not 0 or 1."
    DEFVAL      { zeroDotZero }
    ::= { expObjectEntry 8 }

 expObjectConditionalWildcard  OBJECT-TYPE
     SYNTAX      TruthValue
     MAX-ACCESS  read-create
     STATUS      current
     DESCRIPTION

     "A true value indicates the expObjectConditional of this row is
     a wildcard object. False indicates that expObjectConditional is
     fully instanced.

     NOTE: The simplest implementations of this MIB may not allow
     wildcards."
    DEFVAL      { false }
     ::= { expObjectEntry 9 }

expObjectEntryStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create

    STATUS      current
    DESCRIPTION
     "The control that allows creation/deletion of entries.

     Objects in this table may be changed while
     expObjectEntryStatus is in any state."
    ::= { expObjectEntry 10 }

--
-- Expression Value Table
--

expValueTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF ExpValueEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "A table of values from evaluated expressions."
    ::= { expValue 1 }

expValueEntry OBJECT-TYPE
    SYNTAX      ExpValueEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "A single value from an evaluated expression.  For a given
     instance, only one 'Val' object in the conceptual row will be
     instantiated, that is, the one with the appropriate type for
     the value.  For values that contain no objects of
     expObjectSampleType 'deltaValue' or 'changedValue', reading a
     value from the table causes the evaluation of the expression
     for that value.  For those that contain a 'deltaValue' or
     'changedValue' the value read is as of the last sampling
     interval.

     If in the attempt to evaluate the expression one or more
     of the necessary objects is not available, the corresponding
     entry in this table is effectively not instantiated.

     To maintain security of MIB information, when creating a new
     row in this table, the managed system must record the security
     credentials of the requester.  These security credentials are
     the parameters necessary as inputs to isAccessAllowed from
     [RFC2571]. When obtaining the objects that make up the
     expression, the system must (conceptually) use isAccessAllowed to
     ensure that it does not violate security.

     The evaluation of that expression takes place under the

     security credentials of the creator of its expExpressionEntry.

     To maintain security of MIB information, expression evaluation must
     take place using security credentials for the implied Gets of the
     objects in the expression as inputs (conceptually) to
     isAccessAllowed from the Architecture for Describing SNMP
     Management Frameworks.  These are the security credentials of the
     creator of the corresponding expExpressionEntry."
    INDEX       { expExpressionOwner, expExpressionName,
                  IMPLIED expValueInstance }
    ::= { expValueTable 1 }

ExpValueEntry ::= SEQUENCE {
    expValueInstance          OBJECT IDENTIFIER,
    expValueCounter32Val      Counter32,
    expValueUnsigned32Val     Unsigned32,
    expValueTimeTicksVal      TimeTicks,
    expValueInteger32Val      Integer32,
    expValueIpAddressVal      IpAddress,
    expValueOctetStringVal    OCTET STRING,
    expValueOidVal            OBJECT IDENTIFIER,
    expValueCounter64Val      Counter64
}

expValueInstance OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
     "The final instance portion of a value's OID according to
     the wildcarding in instances of expObjectID for the
     expression.  The prefix of this OID fragment is 0.0,
     leading to the following behavior.

     If there is no wildcarding, the value is 0.0.0.  In other
     words, there is one value which standing alone would have
     been a scalar with a 0 at the end of its OID.

     If there is wildcarding, the value is 0.0 followed by
     a value that the wildcard can take, thus defining one value
     instance for each real, possible value of the wildcard.
     So, for example, if the wildcard worked out to be an ifIndex,
     there is an expValueInstance for each applicable ifIndex."
    ::= { expValueEntry 1 }

expValueCounter32Val OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only

    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'counter32'."
    ::= { expValueEntry 2 }

expValueUnsigned32Val OBJECT-TYPE
    SYNTAX      Unsigned32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'unsigned32'."
    ::= { expValueEntry 3 }

expValueTimeTicksVal OBJECT-TYPE
    SYNTAX      TimeTicks
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'timeTicks'."
    ::= { expValueEntry 4 }

expValueInteger32Val OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'integer32'."
    ::= { expValueEntry 5 }

expValueIpAddressVal OBJECT-TYPE
    SYNTAX      IpAddress
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'ipAddress'."
    ::= { expValueEntry 6 }

expValueOctetStringVal OBJECT-TYPE
    SYNTAX      OCTET STRING -- (SIZE (0..65536))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'octetString'."
    ::= { expValueEntry 7 }

expValueOidVal OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-only

    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'objectId'."
    ::= { expValueEntry 8 }

expValueCounter64Val OBJECT-TYPE
    SYNTAX      Counter64
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
     "The value when expExpressionValueType is 'counter64'."
    ::= { expValueEntry 9 }

--
-- Conformance
--

dismanExpressionMIBConformance OBJECT IDENTIFIER ::=
    { dismanExpressionMIB 3 }
dismanExpressionMIBCompliances OBJECT IDENTIFIER ::=
    { dismanExpressionMIBConformance 1 }
dismanExpressionMIBGroups      OBJECT IDENTIFIER ::=
    { dismanExpressionMIBConformance 2 }

-- Compliance

dismanExpressionMIBCompliance MODULE-COMPLIANCE
     STATUS current
     DESCRIPTION
          "The compliance statement for entities which implement
          the Expression MIB."
     MODULE    -- this module
          MANDATORY-GROUPS {
               dismanExpressionResourceGroup,
               dismanExpressionDefinitionGroup,
               dismanExpressionValueGroup
          }

     OBJECT         expResourceDeltaMinimum
     SYNTAX         Integer32 (-1 | 60..600)
     DESCRIPTION
          "Implementation need not allow deltas or it may
          implement them and restrict them to higher values."

     OBJECT         expObjectSampleType
     WRITE-SYNTAX   INTEGER { absoluteValue(1) }
     DESCRIPTION
          "Implementation may disallow deltas calculation or

          change detection."

     OBJECT         expObjectIDWildcard
     WRITE-SYNTAX   INTEGER { false(2) }
     DESCRIPTION
          "Implementation may allow wildcards."

     OBJECT         expObjectDiscontinuityIDWildcard
     WRITE-SYNTAX   INTEGER { false(2) }
     DESCRIPTION
          "Implementation need not allow wildcards."

     OBJECT          expObjectConditionalWildcard
     WRITE-SYNTAX   INTEGER { false(2) }
     DESCRIPTION
          "Implementation need not allow deltas wildcards."

     ::= { dismanExpressionMIBCompliances 1 }

-- Units of Conformance

dismanExpressionResourceGroup OBJECT-GROUP
     OBJECTS {
          expResourceDeltaMinimum,
          expResourceDeltaWildcardInstanceMaximum,
          expResourceDeltaWildcardInstances,
          expResourceDeltaWildcardInstancesHigh,
          expResourceDeltaWildcardInstanceResourceLacks
     }
     STATUS current
     DESCRIPTION
          "Expression definition resource management."
     ::= { dismanExpressionMIBGroups 1 }

dismanExpressionDefinitionGroup OBJECT-GROUP
     OBJECTS {
          expExpression,
          expExpressionValueType,
          expExpressionComment,
          expExpressionDeltaInterval,
          expExpressionPrefix,
          expExpressionErrors,
          expExpressionEntryStatus,

          expErrorTime,
          expErrorIndex,
          expErrorCode,
          expErrorInstance,

          expObjectID,
          expObjectIDWildcard,
          expObjectSampleType,
          expObjectDeltaDiscontinuityID,
          expObjectDiscontinuityIDWildcard,
          expObjectDiscontinuityIDType,
          expObjectConditional,
          expObjectConditionalWildcard,
          expObjectEntryStatus
     }
     STATUS current
     DESCRIPTION
          "Expression definition."
     ::= { dismanExpressionMIBGroups 2 }

dismanExpressionValueGroup OBJECT-GROUP
     OBJECTS {
          expValueCounter32Val,
          expValueUnsigned32Val,
          expValueTimeTicksVal,
          expValueInteger32Val,
          expValueIpAddressVal,
          expValueOctetStringVal,
          expValueOidVal,
          expValueCounter64Val
     }
     STATUS current
     DESCRIPTION
          "Expression value."
     ::= { dismanExpressionMIBGroups 3 }

END


