DISMAN-PING-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE, Integer32,
    Unsigned32, Gauge32, mib-2,
    NOTIFICATION-TYPE, OBJECT-IDENTITY
        FROM SNMPv2-SMI                  -- RFC2578
    TEXTUAL-CONVENTION, RowStatus,
    StorageType, DateAndTime, TruthValue
        FROM SNMPv2-TC                   -- RFC2579
    MODULE-COMPLIANCE, OBJECT-GROUP,
    NOTIFICATION-GROUP
        FROM SNMPv2-CONF                 -- RFC2580
    InterfaceIndexOrZero                 -- RFC2863
        FROM IF-MIB
    SnmpAdminString
        FROM SNMP-FRAMEWORK-MIB          -- RFC3411
    InetAddressType, InetAddress
        FROM INET-ADDRESS-MIB;           -- RFC4001

 pingMIB MODULE-IDENTITY
    LAST-UPDATED "200606130000Z"         -- 13 June 2006
    ORGANIZATION "IETF Distributed Management Working Group"
    CONTACT-INFO
        "Juergen Quittek

        NEC Europe Ltd.
        Network Laboratories
        Kurfuersten-Anlage 36
        69115 Heidelberg
        Germany

        Phone: +49 6221 4342-115

        Email: quittek@netlab.nec.de"
    DESCRIPTION
        "The Ping MIB (DISMAN-PING-MIB) provides the capability of
        controlling the use of the ping function at a remote
        host.

        Copyright (C) The Internet Society (2006).  This version of
        this MIB module is part of RFC 4560; see the RFC itself for
        full legal notices."

     --  Revision history

     REVISION     "200606130000Z"         -- 13 June 2006
     DESCRIPTION
         "Updated version, published as RFC 4560.
             - Correctly considered IPv6 in DESCRIPTION
               clause of pingCtlDataSize
             - Replaced references to RFC 2575 by RFC 3415
             - Replaced references to RFC 2571 by RFC 3411
             - Replaced references to RFC 2851 by RFC 4001
             - Added DEFVAL { {} } to definition of
               pingCtlTrapGeneration
             - Changed DEFVAL of object pingCtlDescr from
               DEFVAL { '00'H } to DEFVAL { ''H }
             - Changed DEFVAL of object pingCtlSourceAddressType
               from DEFVAL { ipv4 } to DEFVAL { unknown }
             - Extended DESCRIPTION clause of pingResultsTable
               describing re-initialization of entries
             - Changed SYNTAX of pingResultsProbeResponses and
               pingResultsSentProbes from Unsigned32 to Gauge32
             - Changed status of pingCompliance to deprecated
             - Added pingFullCompliance and pingMinimumCompliance
             - Changed status of pingGroup and pingTimeStampGroup
               to deprecated
             - Added pingMinimumGroup, pingCtlRowStatusGroup,
               and pingHistoryGroup"

     REVISION     "200009210000Z"         -- 21 September 2000
     DESCRIPTION
         "Initial version, published as RFC 2925."
    ::= { mib-2 80 }

 -- Textual Conventions

  OperationResponseStatus ::= TEXTUAL-CONVENTION
    STATUS  current
    DESCRIPTION
        "Used to report the result of an operation:

         responseReceived(1) - Operation is completed successfully.
         unknown(2) - Operation failed due to unknown error.
         internalError(3) - An implementation detected an error
              in its own processing that caused an operation
              to fail.
         requestTimedOut(4) - Operation failed to receive a
              valid reply within the time limit imposed on it.
         unknownDestinationAddress(5) - Invalid destination
              address.
         noRouteToTarget(6) - Could not find a route to target.
         interfaceInactiveToTarget(7) - The interface to be
              used in sending a probe is inactive, and an
              alternate route does not exist.
         arpFailure(8) - Unable to resolve a target address to a
              media-specific address.
         maxConcurrentLimitReached(9) - The maximum number of
              concurrent active operations would have been exceeded
              if the corresponding operation was allowed.
         unableToResolveDnsName(10) - The DNS name specified was
              unable to be mapped to an IP address.
         invalidHostAddress(11) - The IP address for a host
              has been determined to be invalid.  Examples of this
              are broadcast or multicast addresses."
    SYNTAX INTEGER {
                 responseReceived(1),
                 unknown(2),
                 internalError(3),
                 requestTimedOut(4),
                 unknownDestinationAddress(5),
                 noRouteToTarget(6),
                 interfaceInactiveToTarget(7),
                 arpFailure(8),
                 maxConcurrentLimitReached(9),
                 unableToResolveDnsName(10),
                 invalidHostAddress(11)
              }

 -- Top level structure of the MIB

 pingNotifications              OBJECT IDENTIFIER ::= { pingMIB 0 }
 pingObjects                    OBJECT IDENTIFIER ::= { pingMIB 1 }
 pingConformance                OBJECT IDENTIFIER ::= { pingMIB 2 }

 -- The registration node (point) for ping implementation types

 pingImplementationTypeDomains  OBJECT IDENTIFIER ::= { pingMIB 3 }

 pingIcmpEcho OBJECT-IDENTITY
    STATUS      current
    DESCRIPTION
        "Indicates that an implementation is using the Internet
        Control Message Protocol (ICMP) 'ECHO' facility."
    ::= { pingImplementationTypeDomains 1 }

 pingUdpEcho OBJECT-IDENTITY
    STATUS      current
    DESCRIPTION
        "Indicates that an implementation is using the UDP echo
        port (7)."
    REFERENCE
        "RFC 862, 'Echo Protocol'."
    ::= { pingImplementationTypeDomains 2 }

 pingSnmpQuery OBJECT-IDENTITY
    STATUS      current
    DESCRIPTION
        "Indicates that an implementation is using an SNMP query
         to calculate a round trip time."
    ::= { pingImplementationTypeDomains 3 }

 pingTcpConnectionAttempt OBJECT-IDENTITY
    STATUS      current
    DESCRIPTION
        "Indicates that an implementation is attempting to
        connect to a TCP port in order to calculate a round
        trip time."
    ::= { pingImplementationTypeDomains 4 }

 -- Simple Object Definitions

 pingMaxConcurrentRequests OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "requests"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
       "The maximum number of concurrent active ping requests
       that are allowed within an agent implementation.  A value
       of 0 for this object implies that there is no limit for
       the number of concurrent active requests in effect.

       The limit applies only to new requests being activated.
       When a new value is set, the agent will continue processing
       all the requests already active, even if their number
       exceeds the limit just imposed."
    DEFVAL { 10 }
    ::= { pingObjects 1 }

 -- Ping Control Table

 pingCtlTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF PingCtlEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines the ping Control Table for providing, via SNMP,
        the capability of performing ping operations at
        a remote host.  The results of these operations are
        stored in the pingResultsTable and the
        pingProbeHistoryTable."
   ::= { pingObjects 2 }

 pingCtlEntry OBJECT-TYPE
    SYNTAX      PingCtlEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines an entry in the pingCtlTable.  The first index
        element, pingCtlOwnerIndex, is of type SnmpAdminString,
        a textual convention that allows for use of the SNMPv3
        View-Based Access Control Model (RFC 3415, VACM)
        and that allows a management application to identify its
        entries.  The second index, pingCtlTestName (also an
        SnmpAdminString), enables the same management
        application to have multiple outstanding requests."
    INDEX {
             pingCtlOwnerIndex,
             pingCtlTestName
          }
    ::= { pingCtlTable 1 }

 PingCtlEntry ::=
    SEQUENCE {
        pingCtlOwnerIndex             SnmpAdminString,
        pingCtlTestName               SnmpAdminString,
        pingCtlTargetAddressType      InetAddressType,
        pingCtlTargetAddress          InetAddress,
        pingCtlDataSize               Unsigned32,
        pingCtlTimeOut                Unsigned32,
        pingCtlProbeCount             Unsigned32,
        pingCtlAdminStatus            INTEGER,
        pingCtlDataFill               OCTET STRING,
        pingCtlFrequency              Unsigned32,
        pingCtlMaxRows                Unsigned32,
        pingCtlStorageType            StorageType,
        pingCtlTrapGeneration         BITS,
        pingCtlTrapProbeFailureFilter Unsigned32,
        pingCtlTrapTestFailureFilter  Unsigned32,
        pingCtlType                   OBJECT IDENTIFIER,
        pingCtlDescr                  SnmpAdminString,
        pingCtlSourceAddressType      InetAddressType,
        pingCtlSourceAddress          InetAddress,
        pingCtlIfIndex                InterfaceIndexOrZero,
        pingCtlByPassRouteTable       TruthValue,
        pingCtlDSField                Unsigned32,
        pingCtlRowStatus              RowStatus
    }

 pingCtlOwnerIndex OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(0..32))
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
       "To facilitate the provisioning of access control by a
       security administrator using the View-Based Access
       Control Model (RFC 2575, VACM) for tables in which
       multiple users may need to create or
       modify entries independently, the initial index is used
       as an 'owner index'.  Such an initial index has a syntax
       of SnmpAdminString and can thus be trivially mapped to a
       securityName or groupName defined in VACM, in
       accordance with a security policy.

       When used in conjunction with such a security policy, all
       entries in the table belonging to a particular user (or
       group) will have the same value for this initial index.
       For a given user's entries in a particular table, the
       object identifiers for the information in these entries
       will have the same subidentifiers (except for the 'column'
       subidentifier) up to the end of the encoded owner index.
       To configure VACM to permit access to this portion of the
       table, one would create vacmViewTreeFamilyTable entries
       with the value of vacmViewTreeFamilySubtree including
       the owner index portion, and vacmViewTreeFamilyMask
       'wildcarding' the column subidentifier.  More elaborate
       configurations are possible."
    ::= { pingCtlEntry 1 }

 pingCtlTestName OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(0..32))
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "The name of the ping test.  This is locally unique, within
        the scope of a pingCtlOwnerIndex."
    ::= { pingCtlEntry 2 }

 pingCtlTargetAddressType OBJECT-TYPE
    SYNTAX      InetAddressType
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the type of host address to be used at a remote
        host for performing a ping operation."
    DEFVAL { unknown }
    ::= { pingCtlEntry 3 }

 pingCtlTargetAddress OBJECT-TYPE
    SYNTAX      InetAddress
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the host address to be used at a remote host for
        performing a ping operation.  The host address type is
        determined by the value of the corresponding
        pingCtlTargetAddressType.

        A value for this object MUST be set prior to transitioning
        its corresponding pingCtlEntry to active(1) via
        pingCtlRowStatus."
    DEFVAL { ''H }
    ::= { pingCtlEntry 4 }

 pingCtlDataSize OBJECT-TYPE
    SYNTAX      Unsigned32 (0..65507)
    UNITS       "octets"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the size of the data portion to be
        transmitted in a ping operation, in octets.  Whether this
        value can be applied depends on the selected
        implementation method for performing a ping operation,
        indicated by pingCtlType in the same conceptual row.
        If the method used allows applying the value contained

        in this object, then it MUST be applied.  If the specified
        size is not appropriate for the chosen ping method, the
        implementation SHOULD use whatever size (appropriate to
        the method) is closest to the specified size.

        The maximum value for this object was computed by
        subtracting the smallest possible IP header size of
        20 octets (IPv4 header with no options) and the UDP
        header size of 8 octets from the maximum IP packet size.
        An IP packet has a maximum size of 65535 octets
        (excluding IPv6 Jumbograms)."
    DEFVAL { 0 }
    ::= { pingCtlEntry 5 }

 pingCtlTimeOut OBJECT-TYPE
    SYNTAX      Unsigned32 (1..60)
    UNITS       "seconds"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the time-out value, in seconds, for a
        remote ping operation."
    DEFVAL { 3 }
    ::= { pingCtlEntry 6 }

 pingCtlProbeCount OBJECT-TYPE
    SYNTAX      Unsigned32 (1..15)
    UNITS       "probes"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the number of times to perform a ping
        operation at a remote host as part of a single ping test."
    DEFVAL { 1 }
    ::= { pingCtlEntry 7 }

 pingCtlAdminStatus OBJECT-TYPE
    SYNTAX      INTEGER {
                          enabled(1), -- test should be started
                          disabled(2) -- test should be stopped
                        }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Reflects the desired state that a pingCtlEntry should be
        in:

           enabled(1)  - Attempt to activate the test as defined by
                         this pingCtlEntry.
           disabled(2) - Deactivate the test as defined by this
                         pingCtlEntry.

        Refer to the corresponding pingResultsOperStatus to
        determine the operational state of the test defined by
        this entry."
     DEFVAL { disabled }
    ::= { pingCtlEntry 8 }

 pingCtlDataFill  OBJECT-TYPE
    SYNTAX      OCTET STRING (SIZE(0..1024))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The content of this object is used together with the
        corresponding pingCtlDataSize value to determine how to
        fill the data portion of a probe packet.  The option of
        selecting a data fill pattern can be useful when links
        are compressed or have data pattern sensitivities.  The
        contents of pingCtlDataFill should be repeated in a ping
        packet when the size of the data portion of the ping
        packet is greater than the size of pingCtlDataFill."
    DEFVAL { '00'H }
    ::= { pingCtlEntry 9 }

 pingCtlFrequency  OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "seconds"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The number of seconds to wait before repeating a ping test
        as defined by the value of the various objects in the
        corresponding row.

        A single ping test consists of a series of ping probes.
        The number of probes is determined by the value of the
        corresponding pingCtlProbeCount object.  After a single
        test is completed the number of seconds as defined by the
        value of pingCtlFrequency MUST elapse before the
        next ping test is started.

        A value of 0 for this object implies that the test
        as defined by the corresponding entry will not be
        repeated."
    DEFVAL { 0 }
    ::= { pingCtlEntry 10 }

 pingCtlMaxRows OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "rows"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The maximum number of corresponding entries allowed
        in the pingProbeHistoryTable.  An implementation of this
        MIB will remove the oldest corresponding entry in the
        pingProbeHistoryTable to allow the addition of an
        new entry once the number of corresponding rows in the
        pingProbeHistoryTable reaches this value.

        Old entries are not removed when a new test is
        started.  Entries are added to the pingProbeHistoryTable
        until pingCtlMaxRows is reached before entries begin to
        be removed.

        A value of 0 for this object disables creation of
        pingProbeHistoryTable entries."
    DEFVAL      { 50 }
    ::= { pingCtlEntry 11 }

 pingCtlStorageType OBJECT-TYPE
    SYNTAX      StorageType
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The storage type for this conceptual row.
        Conceptual rows having the value 'permanent' need not
        allow write-access to any columnar objects in the row."
    DEFVAL { nonVolatile }
    ::= { pingCtlEntry 12 }

 pingCtlTrapGeneration OBJECT-TYPE
    SYNTAX      BITS {
                   probeFailure(0),
                   testFailure(1),
                   testCompletion(2)
                  }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The value of this object determines when and whether
        to generate a notification for this entry:

        probeFailure(0)   - Generate a pingProbeFailed
            notification subject to the value of
            pingCtlTrapProbeFailureFilter.  The object
            pingCtlTrapProbeFailureFilter can be used
            to specify the number of consecutive probe
            failures that are required before a
            pingProbeFailed notification can be generated.
        testFailure(1)    - Generate a pingTestFailed
            notification.  In this instance the object
            pingCtlTrapTestFailureFilter can be used to
            determine the number of probe failures that
            signal when a test fails.
        testCompletion(2) - Generate a pingTestCompleted
            notification.

        By default, no bits are set, indicating that
        none of the above options is selected."
    DEFVAL { {} }  -- no bits set.
    ::= { pingCtlEntry 13 }

 pingCtlTrapProbeFailureFilter OBJECT-TYPE
    SYNTAX      Unsigned32 (0..15)
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The value of this object is used to determine when
        to generate a pingProbeFailed NOTIFICATION.

        Setting BIT probeFailure(0) of object
        pingCtlTrapGeneration to '1' implies that a
        pingProbeFailed NOTIFICATION is generated only when

        a number of consecutive ping probes equal to the
        value of pingCtlTrapProbeFailureFilter fail within
        a given ping test.  After triggering the notification,
        the probe failure counter is reset to zero."
    DEFVAL { 1 }
    ::= { pingCtlEntry 14 }

 pingCtlTrapTestFailureFilter OBJECT-TYPE
    SYNTAX      Unsigned32 (0..15)
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The value of this object is used to determine when
        to generate a pingTestFailed NOTIFICATION.

        Setting BIT testFailure(1) of object

        pingCtlTrapGeneration to '1' implies that a
        pingTestFailed NOTIFICATION is generated only when
        a number of consecutive ping tests equal to the
        value of pingCtlTrapProbeFailureFilter fail.
        After triggering the notification, the test failure
        counter is reset to zero."
    DEFVAL { 1 }
    ::= { pingCtlEntry 15 }

 pingCtlType OBJECT-TYPE
    SYNTAX      OBJECT IDENTIFIER
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The value of this object is used either to report or
        to select the implementation method to be used for
        calculating a ping response time.  The value of this
        object MAY be selected from pingImplementationTypeDomains.

        Additional implementation types SHOULD be allocated as
        required by implementers of the DISMAN-PING-MIB under
        their enterprise-specific registration point and not
        beneath pingImplementationTypeDomains."
    DEFVAL { pingIcmpEcho }
    ::= { pingCtlEntry 16 }

 pingCtlDescr OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "The purpose of this object is to provide a
        descriptive name of the remote ping test."
    DEFVAL { ''H }
    ::= { pingCtlEntry 17 }

 pingCtlSourceAddressType OBJECT-TYPE
    SYNTAX      InetAddressType
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the type of the source address,
        pingCtlSourceAddress, to be used at a remote host
        when a ping operation is performed."
    DEFVAL { unknown }
    ::= { pingCtlEntry 18 }

  pingCtlSourceAddress OBJECT-TYPE
    SYNTAX      InetAddress
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Use the specified IP address (which must be given in
        numeric form, not as a hostname) as the source address
        in outgoing probe packets.  On hosts with more than one
        IP address, this option can be used to select the address
        to be used.  If the IP address is not one of this
        machine's interface addresses, an error is returned and
        nothing is sent.  A zero-length octet string value for
        this object disables source address specification.

        The address type (InetAddressType) that relates to
        this object is specified by the corresponding value
        of pingCtlSourceAddressType."
    DEFVAL { ''H }
    ::= { pingCtlEntry 19 }

 pingCtlIfIndex OBJECT-TYPE
    SYNTAX      InterfaceIndexOrZero
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Setting this object to an interface's ifIndex prior
        to starting a remote ping operation directs
        the ping probes to be transmitted over the
        specified interface.  A value of zero for this object
        means that this option is not enabled."
    DEFVAL { 0 }
    ::= { pingCtlEntry 20 }

 pingCtlByPassRouteTable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
       "The purpose of this object is to enable optional
       bypassing the route table.  If enabled, the remote
       host will bypass the normal routing tables and send
       directly to a host on an attached network.  If the
       host is not on a directly attached network, an
       error is returned.  This option can be used to perform
       the ping operation to a local host through an
       interface that has no route defined (e.g., after the
       interface was dropped by the routing daemon at the host)."
    DEFVAL { false }
    ::= { pingCtlEntry 21 }

 pingCtlDSField OBJECT-TYPE
    SYNTAX      Unsigned32 (0..255)
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Specifies the value to store in the Type of Service
        (TOS) octet in the IPv4 header or in the Traffic
        Class octet in the IPv6 header, respectively, of the
        IP packet used to encapsulate the ping probe.

        The octet to be set in the IP header contains the
        Differentiated Services (DS) Field in the six most
        significant bits.

        This option can be used to determine what effect an
        explicit DS Field setting has on a ping response.
        Not all values are legal or meaningful.  A value of 0
        means that the function represented by this option is
        not supported.  DS Field usage is often not supported
        by IP implementations, and not all values are supported.
        Refer to RFC 2474 and RFC 3260 for guidance on usage of
        this field."
    REFERENCE
        "Refer to RFC 1812 for the definition of the IPv4 TOS
        octet and to RFC 2460 for the definition of the IPv6
        Traffic Class octet.  Refer to RFC 2474 and RFC 3260
        for the definition of the Differentiated Services Field."
    DEFVAL { 0 }
    ::= { pingCtlEntry 22 }

 pingCtlRowStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "This object allows entries to be created and deleted
        in the pingCtlTable.  Deletion of an entry in this
        table results in the deletion of all corresponding (same
        pingCtlOwnerIndex and pingCtlTestName index values)
        pingResultsTable and pingProbeHistoryTable entries.

        A value MUST be specified for pingCtlTargetAddress
        prior to acceptance of a transition to active(1) state.

        When a value for pingCtlTargetAddress is set,
        the value of object pingCtlRowStatus changes
        from notReady(3) to notInService(2).

        Activation of a remote ping operation is controlled
        via pingCtlAdminStatus, not by changing
        this object's value to active(1).

        Transitions in and out of active(1) state are not
        allowed while an entry's pingResultsOperStatus is
        active(1), with the exception that deletion of
        an entry in this table by setting its RowStatus
        object to destroy(6) will stop an active
        ping operation.

        The operational state of a ping operation
        can be determined by examination of its
        pingResultsOperStatus object."
    REFERENCE
        "See definition of RowStatus in RFC 2579, 'Textual
        Conventions for SMIv2.'"
    ::= { pingCtlEntry 23 }

-- Ping Results Table

 pingResultsTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF PingResultsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines the Ping Results Table for providing
        the capability of performing ping operations at
        a remote host.  The results of these operations are
        stored in the pingResultsTable and the pingProbeHistoryTable.

        An entry is added to the pingResultsTable when an
        pingCtlEntry is started by successful transition
        of its pingCtlAdminStatus object to enabled(1).

        If the object pingCtlAdminStatus already has the value
        enabled(1), and if the corresponding pingResultsOperStatus
        object has the value completed(3), then successfully writing
        enabled(1) to object pingCtlAdminStatus re-initializes the
        already existing entry in the pingResultsTable.  The values
        of objects in the re-initialized entry are the same as the
        values of objects in a new entry would be.

        An entry is removed from the pingResultsTable when
        its corresponding pingCtlEntry is deleted."
   ::= { pingObjects 3 }

 pingResultsEntry OBJECT-TYPE
    SYNTAX      PingResultsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines an entry in the pingResultsTable.  The
        pingResultsTable has the same indexing as the
        pingCtlTable so that a pingResultsEntry
        corresponds to the pingCtlEntry that caused it to
        be created."
    INDEX {
             pingCtlOwnerIndex,
             pingCtlTestName
          }
    ::= { pingResultsTable 1 }

 PingResultsEntry ::=
    SEQUENCE {
        pingResultsOperStatus          INTEGER,
        pingResultsIpTargetAddressType InetAddressType,
        pingResultsIpTargetAddress     InetAddress,
        pingResultsMinRtt              Unsigned32,
        pingResultsMaxRtt              Unsigned32,
        pingResultsAverageRtt          Unsigned32,
        pingResultsProbeResponses      Gauge32,
        pingResultsSentProbes          Gauge32,
        pingResultsRttSumOfSquares     Unsigned32,
        pingResultsLastGoodProbe       DateAndTime
     }

 pingResultsOperStatus OBJECT-TYPE
    SYNTAX      INTEGER {
                          enabled(1),   -- test is in progress
                          disabled(2),  -- test has stopped
                          completed(3)  -- test is completed
                        }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Reflects the operational state of a pingCtlEntry:

           enabled(1)    - Test is active.
           disabled(2)   - Test has stopped.
           completed(3)  - Test is completed."
    ::= { pingResultsEntry 1 }

 pingResultsIpTargetAddressType OBJECT-TYPE
    SYNTAX      InetAddressType
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "This object indicates the type of address stored
        in the corresponding pingResultsIpTargetAddress
        object."
    DEFVAL { unknown }
    ::= { pingResultsEntry 2 }

 pingResultsIpTargetAddress OBJECT-TYPE
    SYNTAX      InetAddress
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "This object reports the IP address associated
        with a pingCtlTargetAddress value when the destination
        address is specified as a DNS name.  The value of
        this object should be a zero-length octet string
        when a DNS name is not specified or when a
        specified DNS name fails to resolve.

        The address type (InetAddressType) that relates to
        this object is specified by the corresponding value
        of pingResultsIpTargetAddressType."
    DEFVAL { ''H }
    ::= { pingResultsEntry 3 }

 pingResultsMinRtt OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The minimum ping round-trip-time (RTT) received.  A value
        of 0 for this object implies that no RTT has been received."
    ::= { pingResultsEntry 4 }

 pingResultsMaxRtt OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The maximum ping round-trip-time (RTT) received.  A value
        of 0 for this object implies that no RTT has been received."
    ::= { pingResultsEntry 5 }

  pingResultsAverageRtt OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The current average ping round-trip-time (RTT)."
    ::= { pingResultsEntry 6 }

  pingResultsProbeResponses OBJECT-TYPE
    SYNTAX      Gauge32
    UNITS       "responses"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Number of responses received for the corresponding
        pingCtlEntry and pingResultsEntry.  The value of this object
        MUST be reported as 0 when no probe responses have been
        received."
    ::= { pingResultsEntry 7 }

  pingResultsSentProbes OBJECT-TYPE
    SYNTAX      Gauge32
    UNITS       "probes"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The value of this object reflects the number of probes sent
        for the corresponding pingCtlEntry and pingResultsEntry.
        The value of this object MUST be reported as 0 when no probes
        have been sent."
    ::= { pingResultsEntry 8 }

  pingResultsRttSumOfSquares OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "This object contains the sum of the squares for all ping
        responses received.  Its purpose is to enable standard
        deviation calculation.  The value of this object MUST
        be reported as 0 when no ping responses have been
        received."
    ::= { pingResultsEntry 9 }

 pingResultsLastGoodProbe OBJECT-TYPE
    SYNTAX      DateAndTime
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Date and time when the last response was received for
        a probe."
    ::= { pingResultsEntry 10 }

 -- Ping Probe History Table

 pingProbeHistoryTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF PingProbeHistoryEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines a table for storing the results of ping
        operations.  The number of entries in this table is
        limited per entry in the pingCtlTable by the value
        of the corresponding pingCtlMaxRows object.

        An entry in this table is created when the result of
        a ping probe is determined.  The initial 2 instance
        identifier index values identify the pingCtlEntry
        that a probe result (pingProbeHistoryEntry) belongs
        to.  An entry is removed from this table when
        its corresponding pingCtlEntry is deleted.

        An implementation of this MIB will remove the oldest
        entry in the pingProbeHistoryTable of the
        corresponding entry in the pingCtlTable to allow
        the addition of an new entry once the number of rows
        in the pingProbeHistoryTable reaches the value
        specified by pingCtlMaxRows for the corresponding
        entry in the pingCtlTable."
   ::= { pingObjects 4 }

 pingProbeHistoryEntry OBJECT-TYPE
    SYNTAX      PingProbeHistoryEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Defines an entry in the pingProbeHistoryTable.
        The first two index elements identify the
        pingCtlEntry that a pingProbeHistoryEntry belongs
        to.  The third index element selects a single
        probe result."
    INDEX {

             pingCtlOwnerIndex,
             pingCtlTestName,
             pingProbeHistoryIndex
           }
    ::= { pingProbeHistoryTable 1 }

 PingProbeHistoryEntry ::=
    SEQUENCE {
        pingProbeHistoryIndex         Unsigned32,
        pingProbeHistoryResponse      Unsigned32,
        pingProbeHistoryStatus        OperationResponseStatus,
        pingProbeHistoryLastRC        Integer32,
        pingProbeHistoryTime          DateAndTime
    }

 pingProbeHistoryIndex OBJECT-TYPE
    SYNTAX      Unsigned32 (1..'ffffffff'h)
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "An entry in this table is created when the result of
        a ping probe is determined.  The initial 2 instance
        identifier index values identify the pingCtlEntry
        that a probe result (pingProbeHistoryEntry) belongs
        to.

        An implementation MUST start assigning
        pingProbeHistoryIndex values at 1 and wrap after
        exceeding the maximum possible value as defined by
        the limit of this object ('ffffffff'h)."
    ::= { pingProbeHistoryEntry 1 }

 pingProbeHistoryResponse OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "milliseconds"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The amount of time measured in milliseconds from when
        a probe was sent to when its response was received or
        when it timed out.  The value of this object is reported
        as 0 when it is not possible to transmit a probe."
    ::= { pingProbeHistoryEntry 2 }

 pingProbeHistoryStatus OBJECT-TYPE
    SYNTAX      OperationResponseStatus
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The result of a particular probe done by a remote host."
    ::= { pingProbeHistoryEntry 3 }

 pingProbeHistoryLastRC        OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The last implementation-method-specific reply code received.
        If the ICMP Echo capability is being used, then a successful
        probe ends when an ICMP response is received that contains
        the code ICMP_ECHOREPLY(0).  The ICMP codes are maintained
        by IANA.  Standardized ICMP codes are listed at
        http://www.iana.org/assignments/icmp-parameters.
        The ICMPv6 codes are listed at
        http://www.iana.org/assignments/icmpv6-parameters."
    ::= { pingProbeHistoryEntry 4 }

 pingProbeHistoryTime OBJECT-TYPE
    SYNTAX      DateAndTime
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Timestamp for when this probe result was determined."
    ::= { pingProbeHistoryEntry 5 }

 -- Notification Definition section

 pingProbeFailed NOTIFICATION-TYPE
      OBJECTS {
        pingCtlTargetAddressType,
        pingCtlTargetAddress,
        pingResultsOperStatus,
        pingResultsIpTargetAddressType,
        pingResultsIpTargetAddress,
        pingResultsMinRtt,
        pingResultsMaxRtt,
        pingResultsAverageRtt,
        pingResultsProbeResponses,
        pingResultsSentProbes,
        pingResultsRttSumOfSquares,
        pingResultsLastGoodProbe
      }
      STATUS  current
      DESCRIPTION
          "Generated when a probe failure is detected, when the

          corresponding pingCtlTrapGeneration object is set to
          probeFailure(0), subject to the value of
          pingCtlTrapProbeFailureFilter.  The object
          pingCtlTrapProbeFailureFilter can be used to specify the
          number of consecutive probe failures that are required
          before this notification can be generated."
      ::= { pingNotifications 1 }

 pingTestFailed NOTIFICATION-TYPE
      OBJECTS {
        pingCtlTargetAddressType,
        pingCtlTargetAddress,
        pingResultsOperStatus,
        pingResultsIpTargetAddressType,
        pingResultsIpTargetAddress,
        pingResultsMinRtt,
        pingResultsMaxRtt,
        pingResultsAverageRtt,
        pingResultsProbeResponses,
        pingResultsSentProbes,
        pingResultsRttSumOfSquares,
        pingResultsLastGoodProbe
      }
      STATUS  current
      DESCRIPTION
          "Generated when a ping test is determined to have failed,
          when the corresponding pingCtlTrapGeneration object is
          set to testFailure(1).  In this instance,
          pingCtlTrapTestFailureFilter should specify the number of
          probes in a test required to have failed in order to
          consider the test failed."
      ::= { pingNotifications 2 }

 pingTestCompleted NOTIFICATION-TYPE
      OBJECTS {
        pingCtlTargetAddressType,
        pingCtlTargetAddress,
        pingResultsOperStatus,
        pingResultsIpTargetAddressType,
        pingResultsIpTargetAddress,
        pingResultsMinRtt,
        pingResultsMaxRtt,
        pingResultsAverageRtt,
        pingResultsProbeResponses,
        pingResultsSentProbes,
        pingResultsRttSumOfSquares,
        pingResultsLastGoodProbe

      }
      STATUS  current
      DESCRIPTION
          "Generated at the completion of a ping test when the
          corresponding pingCtlTrapGeneration object has the
          testCompletion(2) bit set."
      ::= { pingNotifications 3 }

 -- Conformance information

 -- Compliance statements

 pingCompliances OBJECT IDENTIFIER ::= { pingConformance 1 }
 pingGroups      OBJECT IDENTIFIER ::= { pingConformance 2 }

 -- Compliance statements

 pingFullCompliance MODULE-COMPLIANCE
    STATUS  current
    DESCRIPTION
            "The compliance statement for SNMP entities that
            fully implement the DISMAN-PING-MIB."
    MODULE  -- this module
        MANDATORY-GROUPS {
                            pingMinimumGroup,
                            pingCtlRowStatusGroup,
                            pingHistoryGroup,
                            pingNotificationsGroup
                          }

        OBJECT pingMaxConcurrentRequests
        MIN-ACCESS  read-only
        DESCRIPTION
            "The agent is not required to support set
            operations to this object."

        OBJECT pingCtlStorageType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required."

        OBJECT pingCtlType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  In addition, the only
            value that MUST be supported by an implementation is
            pingIcmpEcho."

        OBJECT pingCtlSourceAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access to this object is not required by
            implementations that are not capable of binding the
            send socket with a source address.  An implementation
            is only required to support IPv4 and IPv6 addresses."

        OBJECT pingCtlSourceAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access to this object is not required by
            implementations that are not capable of binding the
            send socket with a source address.  An implementation
            is only required to support IPv4 and IPv6 addresses."

        OBJECT pingCtlIfIndex
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingCtlByPassRouteTable
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access to this object is not required by
            implementations that are not capable of its
            implementation.  The function represented by this
            object is implementable if the setsockopt
            SOL_SOCKET SO_DONTROUTE option is supported."

        OBJECT pingCtlDSField
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingResultsIpTargetAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        DESCRIPTION
            "An implementation is only required to

            support IPv4 and IPv6 addresses."

        OBJECT pingResultsIpTargetAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        DESCRIPTION
            "An implementation is only required to
            support IPv4 and globally unique IPv6 addresses."

        OBJECT pingResultsLastGoodProbe
        DESCRIPTION
            "This object is mandatory for implementations that have
            access to a system clock and that are capable of setting
            the values for DateAndTime objects.  It is RECOMMENDED
            that when this object is not supported its values
            be reported as '0000000000000000'H."

        OBJECT pingProbeHistoryTime
        DESCRIPTION
            "This object is mandatory for implementations that have
            access to a system clock and that are capable of setting
            the values for DateAndTime objects.  It is RECOMMENDED
            that when this object is not supported its values
            be reported as '0000000000000000'H."
    ::= { pingCompliances 2 }

 pingMinimumCompliance MODULE-COMPLIANCE
    STATUS  current
    DESCRIPTION
            "The minimum compliance statement for SNMP entities
            that implement the minimal subset of the
            DISMAN-PING-MIB.  Implementors might choose this
            subset for small devices with limited resources."
    MODULE  -- this module
        MANDATORY-GROUPS { pingMinimumGroup }

        GROUP pingCtlRowStatusGroup
        DESCRIPTION
            "A compliant implementation does not have to implement
            the pingCtlRowStatusGroup."

        GROUP pingHistoryGroup
        DESCRIPTION
            "A compliant implementation does not have to implement
            the pingHistoryGroup."

        GROUP pingNotificationsGroup
        DESCRIPTION
            "A compliant implementation does not have to implement

            the pingNotificationsGroup."

        OBJECT pingMaxConcurrentRequests
        MIN-ACCESS  read-only
        DESCRIPTION
            "The agent is not required to support set
            operations to this object."

        OBJECT pingCtlDataFill
        MIN-ACCESS  read-only
        DESCRIPTION
            "The agent is not required to support set
            operations to this object."

        OBJECT pingCtlFrequency
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingCtlMaxRows
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If the
            pingHistoryGroup is not implemented, then write
            access to this object MUST be disabled, and the object
            MUST return a value of 0 when retrieved."

        OBJECT pingCtlStorageType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required."

        OBJECT pingCtlTrapGeneration
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If the
            pingNotificationsGroup is not implemented, then write
            access to this object MUST be disabled, and the object
            MUST return a value with no bit set when retrieved.
            No bit set indicates that not notification is
            generated."

        OBJECT pingCtlTrapProbeFailureFilter
        MIN-ACCESS  read-only
        DESCRIPTION
            "If write access to pingCtlTrapGeneration is not
            supported, then write access to this object must also
            not be supported.  In this case, return 0 as the value
            of this object."

        OBJECT pingCtlTrapTestFailureFilter
        MIN-ACCESS  read-only
        DESCRIPTION
            "If write access to pingCtlTrapGeneration is not
            supported, then write access to this object must also
            not be supported.  In this case, return 0 as the value
            of this object."

        OBJECT pingCtlType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  In addition, the only
            value that MUST be supported by an implementation is
            pingIcmpEcho."

        OBJECT pingCtlDescr
        MIN-ACCESS  read-only
        DESCRIPTION
            "The agent is not required to support set
            operations to this object."

        OBJECT pingCtlSourceAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access to this object is not required by
            implementations that are not capable of binding the
            send socket with a source address.  An implementation
            is only required to support IPv4 and IPv6 addresses."

        OBJECT pingCtlSourceAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access to this object is not required by
            implementations that are not capable of binding the
            send socket with a source address.  An implementation
            is only required to support IPv4 and IPv6 addresses."

        OBJECT pingCtlIfIndex
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is

            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingCtlByPassRouteTable
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is
            not supported, return false(2) as the value of this
            object.  A value of false(2) means that the function
            represented by this option is not supported."

        OBJECT pingCtlDSField
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  If write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingResultsIpTargetAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        DESCRIPTION
            "An implementation is only required to
            support IPv4 and IPv6 addresses."

        OBJECT pingResultsIpTargetAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        DESCRIPTION
            "An implementation is only required to
            support IPv4 and globally unique IPv6 addresses."

        OBJECT pingResultsLastGoodProbe
        DESCRIPTION
            "This object is mandatory for implementations that have
            access to a system clock and that are capable of setting
            the values for DateAndTime objects.  It is RECOMMENDED
            that when this object is not supported its values
            be reported as '0000000000000000'H."

        OBJECT pingProbeHistoryTime
        DESCRIPTION
            "If the pingHistoryGroup is implemented, then this
            object is mandatory for implementations that have
            access to a system clock and that are capable of setting
            the values for DateAndTime objects.  It is RECOMMENDED
            that when this object is not supported its values

            be reported as '0000000000000000'H."
    ::= { pingCompliances 3 }

 pingCompliance MODULE-COMPLIANCE
    STATUS  deprecated
    DESCRIPTION
            "The compliance statement for the DISMAN-PING-MIB.  This
            compliance statement has been deprecated because the
            group pingGroup and the pingTimeStampGroup have been
            split and deprecated.  The pingFullCompliance statement
            is semantically identical to the deprecated
            pingCompliance statement."

    MODULE  -- this module
        MANDATORY-GROUPS {
                            pingGroup,
                            pingNotificationsGroup
                          }
        GROUP pingTimeStampGroup
        DESCRIPTION
            "This group is mandatory for implementations that have
            access to a system clock and that are capable of setting
            the values for DateAndTime objects.  It is RECOMMENDED
            that when this group is not supported the values
            for the objects in this group be reported as
            '0000000000000000'H."

        OBJECT pingMaxConcurrentRequests
        MIN-ACCESS  read-only
        DESCRIPTION
            "The agent is not required to support set
            operations to this object."

        OBJECT pingCtlStorageType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  It is also allowed
            that implementations support only the volatile
            StorageType enumeration."

        OBJECT pingCtlType
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  In addition, the only
            value that MUST be supported by an implementation is
            pingIcmpEcho."

        OBJECT pingCtlByPassRouteTable
        MIN-ACCESS  read-only
        DESCRIPTION
            "This object is not required by implementations that
            are not capable of its implementation.  The function
            represented by this object is implementable if the
            setsockopt SOL_SOCKET SO_DONTROUTE option is
            supported."

        OBJECT pingCtlSourceAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        MIN-ACCESS  read-only
        DESCRIPTION
            "This object is not required by implementations that
            are not capable of binding the send socket with a
            source address.  An implementation is only required to
            support IPv4 and IPv6 addresses."

        OBJECT pingCtlSourceAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        MIN-ACCESS  read-only
        DESCRIPTION
            "This object is not required by implementations that
            are not capable of binding the send socket with a
            source address.  An implementation is only required to
            support IPv4 and globally unique IPv6 addresses."

        OBJECT pingCtlIfIndex
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  When write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingCtlDSField
        MIN-ACCESS  read-only
        DESCRIPTION
            "Write access is not required.  When write access is
            not supported, return a 0 as the value of this object.
            A value of 0 means that the function represented by
            this option is not supported."

        OBJECT pingResultsIpTargetAddressType
        SYNTAX  InetAddressType { unknown(0), ipv4(1), ipv6(2) }
        DESCRIPTION
            "An implementation is only required to
            support IPv4 and IPv6 addresses."

        OBJECT pingResultsIpTargetAddress
        SYNTAX  InetAddress (SIZE(0|4|16))
        DESCRIPTION
            "An implementation is only required to
            support IPv4 and globally unique IPv6 addresses."
    ::= { pingCompliances 1 }

 -- MIB groupings

 pingMinimumGroup OBJECT-GROUP
   OBJECTS {
             pingMaxConcurrentRequests,
             pingCtlTargetAddressType,
             pingCtlTargetAddress,
             pingCtlDataSize,
             pingCtlTimeOut,
             pingCtlProbeCount,
             pingCtlAdminStatus,
             pingCtlDataFill,
             pingCtlFrequency,
             pingCtlMaxRows,
             pingCtlStorageType,
             pingCtlTrapGeneration,
             pingCtlTrapProbeFailureFilter,
             pingCtlTrapTestFailureFilter,
             pingCtlType,
             pingCtlDescr,
             pingCtlByPassRouteTable,
             pingCtlSourceAddressType,
             pingCtlSourceAddress,
             pingCtlIfIndex,
             pingCtlDSField,
             pingResultsOperStatus,
             pingResultsIpTargetAddressType,
             pingResultsIpTargetAddress,
             pingResultsMinRtt,
             pingResultsMaxRtt,
             pingResultsAverageRtt,
             pingResultsProbeResponses,
             pingResultsSentProbes,
             pingResultsRttSumOfSquares,
             pingResultsLastGoodProbe
           }
   STATUS  current
   DESCRIPTION
       "The group of objects that constitute the remote ping
       capability."
    ::= { pingGroups 4 }

 pingCtlRowStatusGroup OBJECT-GROUP
   OBJECTS {
             pingCtlRowStatus
           }
   STATUS  current
   DESCRIPTION
       "The RowStatus object of the pingCtlTable."
    ::= { pingGroups 5 }

 pingHistoryGroup OBJECT-GROUP
   OBJECTS {
             pingProbeHistoryResponse,
             pingProbeHistoryStatus,
             pingProbeHistoryLastRC,
             pingProbeHistoryTime
           }
   STATUS  current
   DESCRIPTION
       "The group of objects that constitute the history
       capability."
    ::= { pingGroups 6 }

 pingNotificationsGroup NOTIFICATION-GROUP
   NOTIFICATIONS {
             pingProbeFailed,
             pingTestFailed,
             pingTestCompleted
          }
   STATUS        current
   DESCRIPTION
       "The notification that are required to be supported by
       implementations of this MIB."
   ::= { pingGroups 3 }

 pingGroup OBJECT-GROUP
   OBJECTS {
             pingMaxConcurrentRequests,
             pingCtlTargetAddressType,
             pingCtlTargetAddress,
             pingCtlDataSize,
             pingCtlTimeOut,
             pingCtlProbeCount,
             pingCtlAdminStatus,
             pingCtlDataFill,
             pingCtlFrequency,
             pingCtlMaxRows,
             pingCtlStorageType,
             pingCtlTrapGeneration,
             pingCtlTrapProbeFailureFilter,
             pingCtlTrapTestFailureFilter,
             pingCtlType,
             pingCtlDescr,
             pingCtlByPassRouteTable,
             pingCtlSourceAddressType,
             pingCtlSourceAddress,
             pingCtlIfIndex,
             pingCtlDSField,
             pingCtlRowStatus,
             pingResultsOperStatus,
             pingResultsIpTargetAddressType,
             pingResultsIpTargetAddress,
             pingResultsMinRtt,
             pingResultsMaxRtt,
             pingResultsAverageRtt,
             pingResultsProbeResponses,
             pingResultsSentProbes,
             pingResultsRttSumOfSquares,
             pingProbeHistoryResponse,
             pingProbeHistoryStatus,
             pingProbeHistoryLastRC
           }
   STATUS  deprecated
   DESCRIPTION
       "The group of objects that constitute the remote ping
       capability."
    ::= { pingGroups 1 }

 pingTimeStampGroup OBJECT-GROUP

   OBJECTS {
             pingResultsLastGoodProbe,
             pingProbeHistoryTime
           }
   STATUS  deprecated
   DESCRIPTION
       "The group of DateAndTime objects."
    ::= { pingGroups 2 }

END
