RFC 4711

Real-time Application Quality-of-Service Monitoring (RAQMON) MIB

πŸ“… published October 2006, from ietf

Real-time Application Quality-of-Service Monitoring (RAQMON) MIB πŸ’–

Part 1 of 7 πŸŽ€

okay so here's the header tea β˜•

  • Document: RFC 4711 πŸ“œ, from the Network Working Group
  • Authors: A. Siddiqui, D. Romascanu (Avaya), and E. Golovinsky (Alert Logic) 🫢
  • Category: Standards Track ✨
  • Date: October 2006 πŸ“
  • Obsoletes and updates: the header doesn't list any, so this one isn't replacing or patching another RFC πŸ’…

Status of This Memo

bestie, this part is the legal-ish bit but it matters πŸ™ˆ This document is an Internet standards track protocol for the Internet community, and it's asking everyone for discussion and suggestions for improvements πŸ¦‹ For the current standardization state and status, check the "Internet Official Protocol Standards" (STD 1) πŸ“– And distribution of this memo is unlimited 🌈

Copyright (C) The Internet Society (2006) Β©οΈπŸŽ€

Abstract

this memo defines a chunk of the Management Information Base (MIB) for network management protocols in the Internet community 🧚 It's basically an extension to the Remote Monitoring MIB, RFC 2819 πŸ’œ The main vibe: it describes managed objects used for real-time application Quality of Service (QoS) monitoring ✨

Table of Contents

1. Introduction ....................................................2
2. The Internet-Standard Management Framework ......................2
3. RAQMON Framework ................................................2
4. Structure of the RAQMON MIB .....................................2
5. RAQMON MIB Definitions ..........................................3
6. Security Considerations ........................................33
7. IANA Considerations ............................................35
8. Acknowledgements ...............................................35
9. Normative References ...........................................36
10. Informative References ........................................36

1. Introduction ✨

so the intro says it again: this memo defines a chunk of the MIB for network management protocols in the Internet community πŸ¦‹ The big difference is that it extends [RFC2819] with managed objects for real-time application QoS monitoring πŸ”₯

Now the key words. These are the BCP 14 words, and they mean exactly what [RFC2119] says they mean πŸ’…

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].

2. The Internet-Standard Management Framework 🧚

if you want the full overview of the current Internet-Standard Management Framework docs, go read section 7 of RFC 3410 [RFC3410] πŸ“š

Managed objects are accessed through a virtual information store called the Management Information Base, or MIB 🌸 MIB objects usually get accessed through the Simple Network Management Protocol (SNMP) πŸ“‘ Objects in the MIB are defined using the Structure of Management Information (SMI) mechanisms πŸŽ€ This memo specifies a MIB module that is compliant to the SMIv2, which is described in STD 58, RFC 2578 [RFC2578], STD 58, RFC 2579 [RFC2579] and STD 58, RFC 2580 [RFC2580] πŸ’–

3. RAQMON Framework πŸ¦‹

as outlined in [RFC4710], the RAQMON framework is built on three entities πŸ‘‘

  • RAQMON Data Source (RDS)
  • RAQMON Report Collector (RRC)
  • RAQMON MIB Structure

the RAQMON MIB describes the information passed between RRCs and a RAQMON Application ("RAQMON manager") 🫢

4. Structure of the RAQMON MIB 🌈

the RAQMON MIB module is made of three MIB groups: raqmonSession, raqmonException, and raqmonConfig πŸ“

the raqmonSession MIB group has these tables πŸ’…

  • The raqmonParticpantTable holds info about participants in open and closed (terminated) sessions, including the parameters of the sessions they're in, aggregated since the session began ✨
  • The raqmonQosTable holds historical QoS info during sessions. The set of parameters here is more restricted, but it includes historical per-RAQMON-report info πŸ“ˆ
  • The raqmonParticpantAddrTable maps participant addresses into the indices of the raqmonParticpantTable. This lets management apps find entries sorted by raqmonParticipantAddr instead of raqmonParticipantStartDate 🧚

the raqmonException MIB group includes a table of filters that trigger notifications for sessions with poor QoS 😭

the raqmonConfig MIB group includes objects that define the configuration of the RAQMON Report Collector πŸ”₯

this MIB module MUST be implemented by RAQMON Report Collectors πŸ‘‘

a separate MIB module is defined in [RFC4712] for mapping the RAQMON PDUs onto an SNMP transport. The MIB module defined in [RFC4712] is normally implemented by RAQMON Data Sources (RDS) πŸŽ€

5. RAQMON MIB Definitions πŸ’œ

the MIB module here IMPORTS definitions from the following πŸ“₯

SNMPv2-SMI [RFC2578]
SNMPv2-TC [RFC2579]
SNMPv2-CONF [RFC2580]
RMON-MIB [RFC2819]
SNMP-FRAMEWORK-MIB [RFC3411]
INET-ADDRESS-MIB [RFC4001]

it also uses REFERENCE clauses to refer to [RFC4710] 🌸

it also mentions [RFC3737] with respect to the MODULE-IDENTITY OID allocation 🧚

RAQMON-MIB DEFINITIONS ::= BEGIN

    IMPORTS
        OBJECT-GROUP, NOTIFICATION-GROUP, MODULE-COMPLIANCE
            FROM SNMPv2-CONF
        Integer32, Unsigned32,
        Gauge32, Counter32, OBJECT-TYPE,
        MODULE-IDENTITY, NOTIFICATION-TYPE
            FROM SNMPv2-SMI
        InetAddressType, InetAddress, InetPortNumber
            FROM INET-ADDRESS-MIB
                 SnmpAdminString
        FROM SNMP-FRAMEWORK-MIB
        rmon
            FROM RMON-MIB
        RowStatus, TruthValue, DateAndTime, RowPointer
            FROM SNMPv2-TC;

    raqmonMIB MODULE-IDENTITY
        LAST-UPDATED "200610100000Z"     -- October 10, 2006
        ORGANIZATION
            "IETF RMON MIB Working Group"
        CONTACT-INFO
            "WG Charter:
             http://www.ietf.org/html.charters/rmonmib-charter.html

             Mailing lists:
                 General Discussion: rmonmib@ietf.org
                 To Subscribe: rmonmib-requests@ietf.org
                 In Body: subscribe your_email_address

             Chair: Andy Bierman
                    Email: ietf@andybierman.com

             Editor: Dan Romascanu
                     Avaya
                     Email:  dromasca@avaya.com"
        DESCRIPTION
            "Real-Time Application QoS Monitoring MIB.

             Copyright (c) The Internet Society (2006).
             This version of this MIB module is part of
             RFC 4711; See the RFC itself for full legal notices."
        REVISION    "200610100000Z"
        DESCRIPTION
            "Initial version, published as RFC 4711."
        ::= { rmon 31 }
-- This OID allocation conforms to [RFC3737]
--
-- Node definitions
--
    raqmonNotifications OBJECT IDENTIFIER ::= { raqmonMIB 0 }

    raqmonSessionAlarm NOTIFICATION-TYPE
        OBJECTS { raqmonParticipantAddr,
            raqmonParticipantName,
            raqmonParticipantPeerAddrType,
            raqmonParticipantPeerAddr,
            raqmonQoSEnd2EndNetDelay,
            raqmonQoSInterArrivalJitter,
            raqmonQosLostPackets,
            raqmonQosRcvdPackets }
        STATUS current
        DESCRIPTION
            "A notification generated by an entry in the
             raqmonSessionExceptionTable."
        ::= { raqmonNotifications 1 }


    raqmonMIBObjects OBJECT IDENTIFIER ::= { raqmonMIB 1 }

    raqmonSession OBJECT IDENTIFIER ::= { raqmonMIBObjects 1 }

    raqmonParticipantTable OBJECT-TYPE
        SYNTAX SEQUENCE OF RaqmonParticipantEntry
        MAX-ACCESS not-accessible
        STATUS current
        DESCRIPTION
            "This table contains information about participants in
             both active and closed (terminated) sessions."
        ::= { raqmonSession 1 }

    raqmonParticipantEntry OBJECT-TYPE
        SYNTAX RaqmonParticipantEntry
        MAX-ACCESS not-accessible
        STATUS current
        DESCRIPTION
            "Each row contains information for a single session
             (application) run by one participant.
             Indexation by the start time of the session aims
             to ease sorting by management applications.  Agents MUST
             NOT report identical start times for any two sessions
             on the same host.
             Rows are removed for inactive sessions
             when implementation-specific age or space limits are
             reached."

        INDEX { raqmonParticipantStartDate, raqmonParticipantIndex }
        ::= { raqmonParticipantTable 1 }

okay so this part is where the RaqmonParticipantEntry row gets built, and bestie, it is a lot πŸ’… Every field a participant can report lives in this one row, from start date to CPU and memory stats πŸ¦‹

       RaqmonParticipantEntry ::=
           SEQUENCE {
               raqmonParticipantStartDate     DateAndTime,
               raqmonParticipantIndex         Unsigned32,
               raqmonParticipantReportCaps    BITS,
               raqmonParticipantAddrType      InetAddressType,
               raqmonParticipantAddr          InetAddress,
               raqmonParticipantSendPort      InetPortNumber,
               raqmonParticipantRecvPort      InetPortNumber,
               raqmonParticipantSetupDelay    Integer32,
               raqmonParticipantName          SnmpAdminString,
               raqmonParticipantAppName       SnmpAdminString,
               raqmonParticipantQosCount      Gauge32,
               raqmonParticipantEndDate       DateAndTime,
               raqmonParticipantDestPayloadType  Integer32,
               raqmonParticipantSrcPayloadType   Integer32,
               raqmonParticipantActive        TruthValue,
               raqmonParticipantPeer          RowPointer,
               raqmonParticipantPeerAddrType  InetAddressType,
               raqmonParticipantPeerAddr      InetAddress,
               raqmonParticipantSrcL2Priority     Integer32,
               raqmonParticipantDestL2Priority    Integer32,
               raqmonParticipantSrcDSCP       Integer32,
               raqmonParticipantDestDSCP      Integer32,
               raqmonParticipantCpuMean       Integer32,
               raqmonParticipantCpuMin        Integer32,
               raqmonParticipantCpuMax        Integer32,
               raqmonParticipantMemoryMean    Integer32,
               raqmonParticipantMemoryMin     Integer32,
               raqmonParticipantMemoryMax     Integer32,
               raqmonParticipantNetRTTMean    Integer32,
               raqmonParticipantNetRTTMin     Integer32,
               raqmonParticipantNetRTTMax     Integer32,
               raqmonParticipantIAJitterMean  Integer32,
               raqmonParticipantIAJitterMin   Integer32,
               raqmonParticipantIAJitterMax   Integer32,
               raqmonParticipantIPDVMean      Integer32,
               raqmonParticipantIPDVMin       Integer32,
               raqmonParticipantIPDVMax       Integer32,
               raqmonParticipantNetOwdMean    Integer32,
               raqmonParticipantNetOwdMin     Integer32,
               raqmonParticipantNetOwdMax     Integer32,
               raqmonParticipantAppDelayMean  Integer32,
               raqmonParticipantAppDelayMin   Integer32,
               raqmonParticipantAppDelayMax   Integer32,
               raqmonParticipantPacketsRcvd   Integer32,
               raqmonParticipantPacketsSent   Integer32,
               raqmonParticipantOctetsRcvd    Integer32,
               raqmonParticipantOctetsSent    Integer32,
               raqmonParticipantLostPackets   Integer32,
               raqmonParticipantLostPacketsFrct  Integer32,
               raqmonParticipantDiscards      Integer32,
               raqmonParticipantDiscardsFrct  Integer32
            }

       raqmonParticipantStartDate OBJECT-TYPE
           SYNTAX DateAndTime
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "The date and time of this entry.
                It will be the date and time
                of the first report received."
           ::= { raqmonParticipantEntry 1 }

       raqmonParticipantIndex OBJECT-TYPE
           SYNTAX Unsigned32 (1..2147483647)
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "The index of the conceptual row, which is for SNMP
                purposes only and has no relation to any protocol value.

                There is no requirement that these rows be created or
                maintained sequentially.  The index will be unique for a
                particular date and time."
           ::= { raqmonParticipantEntry 2 }

       raqmonParticipantReportCaps   OBJECT-TYPE
           SYNTAX      BITS {
               raqmonPartRepDsrcName(0),
               raqmonPartRepRecvName(1),
               raqmonPartRepDsrcPort(2),
               raqmonPartRepRecvPort(3),
               raqmonPartRepSetupTime(4),
               raqmonPartRepSetupDelay(5),
               raqmonPartRepSessionDuration(6),
               raqmonPartRepSetupStatus(7),
               raqmonPartRepRTEnd2EndNetDelay(8),
               raqmonPartRepOWEnd2EndNetDelay(9),
               raqmonPartApplicationDelay(10),
               raqmonPartRepIAJitter(11),
               raqmonPartRepIPDV(12),
               raqmonPartRepRcvdPackets(13),
               raqmonPartRepRcvdOctets(14),
               raqmonPartRepSentPackets(15),
               raqmonPartRepSentOctets(16),
               raqmonPartRepCumPacketsLoss(17),
               raqmonPartRepFractionPacketsLoss(18),
               raqmonPartRepCumDiscards(19),
               raqmonPartRepFractionDiscards(20),
               raqmonPartRepSrcPayloadType(21),
               raqmonPartRepDestPayloadType(22),
               raqmonPartRepSrcLayer2Priority(23),
               raqmonPartRepSrcTosDscp(24),
               raqmonPartRepDestLayer2Priority(25),
               raqmonPartRepDestTosDscp(26),
               raqmonPartRepCPU(27),
               raqmonPartRepMemory(28),
               raqmonPartRepAppName(29)
               }
           MAX-ACCESS  read-only
           STATUS      current
           DESCRIPTION
               "The Report capabilities of the participant, as perceived
                by the Collector.

                If the participant can report the Data Source Name as
                defined in [RFC4710], Section 5.3, then the
                raqmonPartRepDsrcName bit will be set.

                If the participant can report the Receiver Name as
                defined in [RFC4710], Section 5.4, then the
                raqmonPartRepRecvName bit will be set.

                If the participant can report the Data Source Port as
                defined in [RFC4710], Section 5.5, then the
                raqmonPartRepDsrcPort bit will be set.

                If the participant can report the Receiver Port as
                defined in [RFC4710], Section 5.6, then the
                raqmonPartRepRecvPort bit will be set.

                If the participant can report the Session Setup Time as
                defined in [RFC4710], Section 5.7, then the
                raqmonPartRepSetupTime bit will be set.

                If the participant can report the Session Setup Delay as
                defined in [RFC4710], Section 5.8, then the
                raqmonPartRepSetupDelay bit will be set.

                If the participant can report the Session Duration as
                defined in [RFC4710], Section 5.9, then the
                raqmonPartRepSessionDuration bit will be set.

                If the participant can report the Setup Status as
                defined in [RFC4710], Section 5.10, then the
                raqmonPartRepSetupStatus bit will be set.

                If the participant can report the Round-Trip End-to-end
                Network Delay as defined in [RFC4710], Section 5.11,
                then the raqmonPartRepRTEnd2EndNetDelay bit will be set.

                If the participant can report the One-way End-to-end
                Network Delay as defined in [RFC4710], Section 5.12,
                then the raqmonPartRepOWEnd2EndNetDelay bit will be set.

                If the participant can report the Application Delay as
                defined in [RFC4710], Section 5.13, then the
                raqmonPartApplicationDelay bit will be set.

                If the participant can report the Inter-Arrival Jitter
                as defined in [RFC4710], Section 5.14, then the
                raqmonPartRepIAJitter bit will be set.

                If the participant can report the IP Packet Delay
                Variation as defined in [RFC4710], Section 5.15, then
                the raqmonPartRepIPDV bit will be set.

                If the participant can report the number of application
                packets received as defined in [RFC4710], Section 5.16,
                then the raqmonPartRepRcvdPackets bit will be set.

                If the participant can report the number of application
                octets received as defined in [RFC4710], Section 5.17,
                then the raqmonPartRepRcvdOctets bit will be set.

                If the participant can report the number of application
                packets sent as defined in [RFC4710], Section 5.18, then
                the raqmonPartRepSentPackets bit will be set.

                If the participant can report the number of application
                octets sent as defined in [RFC4710], Section 5.19, then
                the raqmonPartRepSentOctets bit will be set.

                If the participant can report the number of cumulative
                packets lost as defined in [RFC4710], Section 5.20, then
                the raqmonPartRepCumPacketsLoss bit will be set.

                If the participant can report the fraction of packet
                loss as defined in [RFC4710], Section 5.21, then the
                raqmonPartRepFractionPacketsLoss bit will be set.

                If the participant can report the number of cumulative
                discards as defined in [RFC4710], Section 5.22, then the
                raqmonPartRepCumDiscards bit will be set.

                If the participant can report the fraction of discards
                as defined in [RFC4710], Section 5.23, then the
                raqmonPartRepFractionDiscards bit will be set.

                If the participant can report the Source Payload Type as
                defined in [RFC4710], Section 5.24, then the
                raqmonPartRepSrcPayloadType bit will be set.

                If the participant can report the Destination Payload
                Type as defined in [RFC4710], Section 5.25, then the
                raqmonPartRepDestPayloadType bit will be set.

                If the participant can report the Source Layer 2
                Priority as defined in [RFC4710], Section 5.26, then the
                raqmonPartRepSrcLayer2Priority bit will be set.

                If the participant can report the Source DSCP/ToS value
                as defined in [RFC4710], Section 5.27, then the
                raqmonPartRepSrcToSDscp bit will be set.

                If the participant can report the Destination Layer 2
                Priority as defined in [RFC4710], Section 5.28, then the
                raqmonPartRepDestLayer2Priority bit will be set.

                If the participant can report the Destination DSCP/ToS
                Value as defined in [RFC4710], Section 5.29, then the
                raqmonPartRepDestToSDscp bit will be set.

                If the participant can report the CPU utilization as
                defined in [RFC4710], Section 5.30, then the
                raqmonPartRepCPU bit will be set.

                If the participant can report the memory utilization as
                defined in [RFC4710], Section 5.31, then the
                raqmonPartRepMemory bit will be set.

                If the participant can report the Application Name as
                defined in [RFC4710], Section 5.32, then the
                raqmonPartRepAppName bit will be set.

                The capability of reporting of a specific metric does
                not mandate that the metric must be reported permanently
                by the data source to the respective collector.  Some
                data sources MAY be configured not to send a metric, or
                some metrics may not be relevant to the specific
                application."
           ::= { raqmonParticipantEntry 3 }

that's the whole capability bit list, and the big takeaway is that reporting a metric is a capability 🌸 it doesn't mean the metric is sent all the time, since some sources MAY be configured not to send one ✨

raqmonParticipantAddrType OBJECT-TYPE SYNTAX InetAddressType MAX-ACCESS read-only STATUS current DESCRIPTION "The type of the Internet address of the participant for this session." ::= { raqmonParticipantEntry 4 }

raqmonParticipantAddr OBJECT-TYPE SYNTAX InetAddress MAX-ACCESS read-only STATUS current DESCRIPTION "The Internet Address of the participant for this session. Formatting of this object is determined by the value of raqmonParticipantAddrType." ::= { raqmonParticipantEntry 5 }

raqmonParticipantSendPort OBJECT-TYPE SYNTAX InetPortNumber MAX-ACCESS read-only STATUS current DESCRIPTION "Port from which session data is sent. If the value was not reported to the collector, this object will have the value 0." REFERENCE "Section 5.5 of the [RFC4710]" ::= { raqmonParticipantEntry 6 }

raqmonParticipantRecvPort OBJECT-TYPE SYNTAX InetPortNumber MAX-ACCESS read-only STATUS current DESCRIPTION "Port on which session data is received. If the value was not reported to the collector, this object will have the value 0." REFERENCE

"Section 5.6 of the [RFC4710]" ::= { raqmonParticipantEntry 7 }

raqmonParticipantSetupDelay OBJECT-TYPE SYNTAX Integer32 (-1|0..2147483647) UNITS "milliseconds" MAX-ACCESS read-only STATUS current DESCRIPTION "Session setup time. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.8 of the [RFC4710]" ::= { raqmonParticipantEntry 8 }

raqmonParticipantName OBJECT-TYPE SYNTAX SnmpAdminString MAX-ACCESS read-only STATUS current DESCRIPTION "The data source name for the participant." REFERENCE "Section 5.3 of the [RFC4710]" ::= { raqmonParticipantEntry 9 }

raqmonParticipantAppName OBJECT-TYPE SYNTAX SnmpAdminString MAX-ACCESS read-only STATUS current DESCRIPTION "A string giving the name and possibly the version of the application generating the stream, e.g., 'videotool 1.2.'

This information may be useful for debugging purposes and is similar to the Mailer or Mail-System-Version SMTP headers. The tool value is expected to remain constant for the duration of the session." REFERENCE "Section 5.32 of the [RFC4710]" ::= { raqmonParticipantEntry 10 }

raqmonParticipantQosCount OBJECT-TYPE SYNTAX Gauge32 UNITS "entries" MAX-ACCESS read-only STATUS current DESCRIPTION "The current number of entries in the raqmonQosTable for this participant and session." ::= { raqmonParticipantEntry 11 }

raqmonParticipantEndDate OBJECT-TYPE SYNTAX DateAndTime MAX-ACCESS read-only STATUS current DESCRIPTION "The date and time of the most recent report received." ::= { raqmonParticipantEntry 12 }

raqmonParticipantDestPayloadType OBJECT-TYPE SYNTAX Integer32 (-1|0..127) MAX-ACCESS read-only STATUS current DESCRIPTION "Destination Payload Type. If the value was not reported to the collector, this object will have the value -1." REFERENCE "RFC 3551 and Section 5.25 of the [RFC4710]" ::= { raqmonParticipantEntry 13 }

raqmonParticipantSrcPayloadType OBJECT-TYPE SYNTAX Integer32 (-1|0..127) MAX-ACCESS read-only STATUS current DESCRIPTION "Source Payload Type. If the value was not reported to the collector, this object will have the value -1." REFERENCE "RFC 3551 and Section 5.24 of the [RFC4710]" ::= { raqmonParticipantEntry 14 }

raqmonParticipantActive OBJECT-TYPE SYNTAX TruthValue MAX-ACCESS read-only STATUS current DESCRIPTION "Value 'true' indicates that the session for this participant is active (open). Value 'false' indicates that the session is closed (terminated)." ::= { raqmonParticipantEntry 15 }

raqmonParticipantPeer OBJECT-TYPE SYNTAX RowPointer MAX-ACCESS read-only STATUS current DESCRIPTION "The pointer to the corresponding entry in this table for the other peer participant. If there is no such entry in the participant table of the collector represented by this SNMP agent, then the value will be { 0 0 }. " ::= { raqmonParticipantEntry 16 }

raqmonParticipantPeerAddrType OBJECT-TYPE SYNTAX InetAddressType MAX-ACCESS read-only STATUS current DESCRIPTION "The type of the Internet address of the peer participant for this session." ::= { raqmonParticipantEntry 17 }

raqmonParticipantPeerAddr OBJECT-TYPE SYNTAX InetAddress MAX-ACCESS read-only STATUS current DESCRIPTION "The Internet Address of the peer participant for this session. Formatting of this object is determined by the value of raqmonParticipantPeerAddrType." ::= { raqmonParticipantEntry 18 }

raqmonParticipantSrcL2Priority OBJECT-TYPE SYNTAX Integer32 (-1|0..7) MAX-ACCESS read-only STATUS current DESCRIPTION "Source Layer 2 Priority. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.26 of the [RFC4710]" ::= { raqmonParticipantEntry 19 }

raqmonParticipantDestL2Priority OBJECT-TYPE SYNTAX Integer32 (-1|0..7) MAX-ACCESS read-only STATUS current DESCRIPTION

"Destination Layer 2 Priority. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.28 of the [RFC4710]" ::= { raqmonParticipantEntry 20 }

raqmonParticipantSrcDSCP OBJECT-TYPE SYNTAX Integer32 (-1|0..63) MAX-ACCESS read-only STATUS current DESCRIPTION "Source Layer 3 DSCP value. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.27 of the [RFC4710]" ::= { raqmonParticipantEntry 21 }

raqmonParticipantDestDSCP OBJECT-TYPE SYNTAX Integer32 (-1|0..63) MAX-ACCESS read-only STATUS current DESCRIPTION "Destination Layer 3 DSCP value." REFERENCE "Section 5.29 of the [RFC4710]" ::= { raqmonParticipantEntry 22 }

raqmonParticipantCpuMean OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION "Mean CPU utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.30 of the [RFC4710]" ::= { raqmonParticipantEntry 23 }

raqmonParticipantCpuMin OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION

"Minimum CPU utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.30 of the [RFC4710]" ::= { raqmonParticipantEntry 24 }

raqmonParticipantCpuMax OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION "Maximum CPU utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.30 of the [RFC4710]" ::= { raqmonParticipantEntry 25 }

raqmonParticipantMemoryMean OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION "Mean memory utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.31 of the [RFC4710]" ::= { raqmonParticipantEntry 26 }

raqmonParticipantMemoryMin OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION "Minimum memory utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.31 of the [RFC4710]" ::= { raqmonParticipantEntry 27 }

raqmonParticipantMemoryMax OBJECT-TYPE SYNTAX Integer32 (-1|0..100) UNITS "percents" MAX-ACCESS read-only STATUS current DESCRIPTION "Maximum memory utilization. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.31 of the [RFC4710]" ::= { raqmonParticipantEntry 28 }

raqmonParticipantNetRTTMean OBJECT-TYPE SYNTAX Integer32 (-1|0..2147483647) UNITS "milliseconds" MAX-ACCESS read-only STATUS current DESCRIPTION "Mean round-trip end-to-end network delay over the entire session. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.11 of the [RFC4710]" ::= { raqmonParticipantEntry 29 }

raqmonParticipantNetRTTMin OBJECT-TYPE SYNTAX Integer32 (-1|0..2147483647) UNITS "milliseconds" MAX-ACCESS read-only STATUS current DESCRIPTION "Minimum round-trip end-to-end network delay over the entire session. If the value was not reported to the collector, this object will have the value -1." REFERENCE "Section 5.11 of the [RFC4710]" ::= { raqmonParticipantEntry 30 }

Okay so this next batch is all about the per-session participant stats, and honestly it's giving spreadsheet dream πŸ“Šβœ¨ Every one of these is read-only, and if the collector never got a value, it just shows -1 πŸ™ˆ

Round-trip delay first. This is the max round-trip end-to-end network delay over the whole session 🌸

       raqmonParticipantNetRTTMax OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Maximum round-trip end-to-end network delay
                over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.11 of the [RFC4710]"
           ::= { raqmonParticipantEntry 31 }

Next up is inter-arrival jitter. Mean, min, and max all live together here, and they all cite Section 5.14 of [RFC4710] πŸ¦‹

       raqmonParticipantIAJitterMean OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Mean inter-arrival jitter over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.14 of the [RFC4710]"
           ::= { raqmonParticipantEntry 32 }

       raqmonParticipantIAJitterMin OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Minimum inter-arrival jitter over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.14 of the [RFC4710]"
           ::= { raqmonParticipantEntry 33 }

       raqmonParticipantIAJitterMax OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Maximum inter-arrival jitter over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.14 of the [RFC4710]"
           ::= { raqmonParticipantEntry 34 }

IP packet delay variation (IPDV) comes next, with mean, min, and max, all pointing at Section 5.15 of [RFC4710] πŸ’œ

       raqmonParticipantIPDVMean OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Mean IP packet delay variation over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.15 of the [RFC4710]"
           ::= { raqmonParticipantEntry 35 }

       raqmonParticipantIPDVMin OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Minimum IP packet delay variation over the entire
                session.  If the value was not reported to the
                collector, this object will have the value -1."
           REFERENCE
               "Section 5.15 of the [RFC4710]"
           ::= { raqmonParticipantEntry 36 }

       raqmonParticipantIPDVMax OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Maximum IP packet delay variation over the entire
                session.  If the value was not reported to the
                collector, this object will have the value -1."
           REFERENCE
               "Section 5.15 of the [RFC4710]"
           ::= { raqmonParticipantEntry 37 }

Network one-way delay is next. Mean and min cite Section 5.12 of [RFC4710], and the max is the one that points at Section 5.1, so don't mix those up πŸ‘€

       raqmonParticipantNetOwdMean OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Mean Network one-way delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.12 of the [RFC4710]"
           ::= { raqmonParticipantEntry 38 }

       raqmonParticipantNetOwdMin OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Minimum Network one-way delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.12 of the [RFC4710]"
           ::= { raqmonParticipantEntry 39 }

       raqmonParticipantNetOwdMax OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Maximum Network one-way delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.1 of the [RFC4710]"
           ::= { raqmonParticipantEntry 40 }

Application delay is up next. Mean, min, and max all cite Section 5.13 of [RFC4710], so they're a matching set πŸŽ€

       raqmonParticipantAppDelayMean OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Mean application delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.13 of the [RFC4710]"
           ::= { raqmonParticipantEntry 41 }

       raqmonParticipantAppDelayMin OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Minimum application delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."

           REFERENCE
               "Section 5.13 of the [RFC4710]"
           ::= { raqmonParticipantEntry 42 }

       raqmonParticipantAppDelayMax OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Maximum application delay over the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.13 of the [RFC4710]"
           ::= { raqmonParticipantEntry 43 }

Now the counters. These are packets received, packets sent, octets received, and octets sent, and they're all counts for the whole session 🧚 Note that the octet ones say "Octets" with a capital O, and that's exactly how it's written in the original.

       raqmonParticipantPacketsRcvd OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets received for the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.16 of the [RFC4710]"
           ::= { raqmonParticipantEntry 44 }

       raqmonParticipantPacketsSent OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets sent for the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.17 of the [RFC4710]"
           ::= { raqmonParticipantEntry 45 }

       raqmonParticipantOctetsRcvd OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "Octets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of octets received for the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.18 of the [RFC4710]"
           ::= { raqmonParticipantEntry 46 }

       raqmonParticipantOctetsSent OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "Octets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of octets sent for the entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.19 of the [RFC4710]"
           ::= { raqmonParticipantEntry 47 }

Loss and discards are last in this group. Lost packets and discarded packets are both counted by this receiver for the whole session, and each one has a percentage version too πŸ₯Ί

       raqmonParticipantLostPackets OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets lost by this receiver for the entire
                session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.20 of the [RFC4710]"
           ::= { raqmonParticipantEntry 48 }

       raqmonParticipantLostPacketsFrct OBJECT-TYPE
           SYNTAX Integer32 (-1|0..100)
           UNITS  "percents"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Fraction of lost packets out of total packets received.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.21 of the [RFC4710]"
           ::= { raqmonParticipantEntry 49 }

       raqmonParticipantDiscards OBJECT-TYPE
           SYNTAX Integer32 (-1|0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets discarded by this receiver for the
                entire session.
                If the value was not reported to the collector,
                this object will have the value -1."
           REFERENCE
               "Section 5.22 of the [RFC4710]"
           ::= { raqmonParticipantEntry 50 }

       raqmonParticipantDiscardsFrct OBJECT-TYPE
           SYNTAX Integer32 (-1|0..100)
           UNITS  "percents"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Fraction of discarded packets out of total packets
                received.  If the value was not reported to the
                collector, this object will have the value -1."
           REFERENCE
               "Section 5.23 of the [RFC4710]"
           ::= { raqmonParticipantEntry 51 }

Last up is the QoS table. It holds historical quality-of-service data from sessions, and each row is indexed by session start time, participant index, and QoS time. Here's the big rule: agents MUST NOT report identical start times for any two sessions on the same host, so keep that one in mind 🚨

    raqmonQosTable OBJECT-TYPE
           SYNTAX SEQUENCE OF RaqmonQosEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "Table of historical information about quality-of-service
                data during sessions."
           ::= { raqmonSession 2 }

       raqmonQosEntry OBJECT-TYPE
           SYNTAX RaqmonQosEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "Each entry contains information from a single RAQMON
                packet, related to a single session
                (application) run by one participant.
                Indexation by the start time of the session aims
                to ease sorting by management applications.  Agents MUST
                NOT report identical start times for any two sessions
                on the same host.
                Rows are removed for inactive sessions when
                implementation-specific time or space limits are
                reached."
           INDEX { raqmonParticipantStartDate,
                   raqmonParticipantIndex,
                   raqmonQosTime }
           ::= { raqmonQosTable 1 }

Okay so the table gets even more fun here, bestie πŸŽ€ Every OBJECT-TYPE below is literally a little data bucket for one QoS number, and each one gets its own ::= index so the agent knows exactly where to file it πŸ—‚οΈβœ¨

The per-entry QoS objects start here πŸ’–

       RaqmonQosEntry ::=
           SEQUENCE {
               raqmonQosTime          Unsigned32,
               raqmonQoSEnd2EndNetDelay           Integer32,
               raqmonQoSInterArrivalJitter        Integer32,
               raqmonQosRcvdPackets   Integer32,
               raqmonQosRcvdOctets    Integer32,
               raqmonQosSentPackets   Integer32,
               raqmonQosSentOctets    Integer32,
               raqmonQosLostPackets   Integer32,
               raqmonQosSessionStatus SnmpAdminString
               }

       raqmonQosTime OBJECT-TYPE
           SYNTAX Unsigned32 (0..2147483647)
           UNITS  "seconds"
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "Time of this entry measured from the start of the
                corresponding participant session."
           ::= { raqmonQosEntry 1 }

       raqmonQoSEnd2EndNetDelay OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "The round-trip time.
                Will contain the previous value if there was no report
                for this time, or -1 if the value has never been
                reported."
           REFERENCE
               "Section 5.11 of the [RFC4710]"
           ::= { raqmonQosEntry 2 }

       raqmonQoSInterArrivalJitter OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "milliseconds"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "An estimate of delay variation as observed by this
                receiver.  Will contain the previous value if there
                was no report for this time, or -1 if the value
                has never been reported."
           REFERENCE
               "Section 5.14 of the [RFC4710]"
           ::= { raqmonQosEntry 3 }

       raqmonQosRcvdPackets OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets received by this receiver since the
                previous entry.  Will contain the previous value if
                there was no report for this time, or -1 if the value
                has never been reported."
           REFERENCE
               "Section 5.16 of the [RFC4710]"
       ::= { raqmonQosEntry 4 }

       raqmonQosRcvdOctets OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "octets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of octets received by this receiver since the
                previous report.  Will contain the previous value if
                there was no report for this time, or -1 if the value
                has never been reported."
               REFERENCE
                     "Section 5.18 of the [RFC4710]"
           ::= { raqmonQosEntry 5 }

       raqmonQosSentPackets OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of packets sent since the previous report.
                Will contain the previous value if there
                was no report for this time, or -1 if the value
                has never been reported."
          REFERENCE
              "Section 5.17 of the [RFC4710]"
       ::= { raqmonQosEntry 6 }

       raqmonQosSentOctets OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "octets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of octets sent since the previous report.
                Will contain the previous value if there
                was no report for this time, or -1 if the value
                has never been reported."
           REFERENCE
               "Section 5.19 of the [RFC4710]"
           ::= { raqmonQosEntry 7 }

       raqmonQosLostPackets OBJECT-TYPE
           SYNTAX Integer32 (-1 | 0..2147483647)
           UNITS  "packets"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "A count of packets lost as observed by this receiver
                since the previous report.  Will contain the previous
                value if there was no report for this time, or -1 if
                the value has never been reported."
           REFERENCE
               "Section 5.20 of the [RFC4710]"
       ::= { raqmonQosEntry 8 }

       raqmonQosSessionStatus OBJECT-TYPE
           SYNTAX SnmpAdminString
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "The session status.  Will contain the previous value
                if there was no report for this time or the zero-length
                string if no value was ever reported."
           REFERENCE
               "Section 5.10 of the [RFC4710]"
           ::= { raqmonQosEntry 9 }

Next up is the participant address table, which is basically a lookup map πŸ¦‹ It lets management apps sort participants by address instead of by start date, and it's a total mood, honestly 🌸

       raqmonParticipantAddrTable OBJECT-TYPE

           SYNTAX SEQUENCE OF RaqmonParticipantAddrEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "Maps raqmonParticipantAddr to the index of the
                raqmonParticipantTable.  This table allows
                management applications to find entries
                sorted by raqmonParticipantAddr rather than
                raqmonParticipantStartDate."
           ::= { raqmonSession 3 }

       raqmonParticipantAddrEntry OBJECT-TYPE
           SYNTAX RaqmonParticipantAddrEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "Each entry corresponds to exactly one entry in the
                raqmonParticipantEntry: the entry containing the
                index pair raqmonParticipantStartDate,
                raqmonParticipantIndex.

                Note that there is no concern about the indexation of
                this table exceeding the limits defined by RFC 2578,
                Section 3.5.  According to [RFC4710], Section
                5.1, only IPv4 and IPv6 addresses can be reported as
                participant addresses."
           INDEX { raqmonParticipantAddrType,
                   raqmonParticipantAddr,
                   raqmonParticipantStartDate,
                   raqmonParticipantIndex }
           ::= { raqmonParticipantAddrTable 1 }

       RaqmonParticipantAddrEntry ::=
           SEQUENCE { raqmonParticipantAddrEndDate DateAndTime }

       raqmonParticipantAddrEndDate OBJECT-TYPE
           SYNTAX DateAndTime
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "The value of raqmonParticipantEndDate for the
                corresponding raqmonParticipantEntry."
           ::= { raqmonParticipantAddrEntry 1 }

Now we're entering the exception zone 🚨 The raqmonException branch holds the thresholds that tell the management station when a session is having a rough time 😭

       raqmonException OBJECT IDENTIFIER ::= { raqmonMIBObjects 2 }

       raqmonSessionExceptionTable OBJECT-TYPE

           SYNTAX SEQUENCE OF RaqmonSessionExceptionEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "This table defines thresholds for the management
                station to get notifications about sessions that
                encountered poor quality of service.

                The information in this table MUST be persistent
                across agent reboots."
           ::= { raqmonException 2 }

       raqmonSessionExceptionEntry OBJECT-TYPE
           SYNTAX RaqmonSessionExceptionEntry
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "A conceptual row in the raqmonSessionExceptionTable."
           INDEX { raqmonSessionExceptionIndex }
           ::= { raqmonSessionExceptionTable 1 }

       RaqmonSessionExceptionEntry ::=
           SEQUENCE {
               raqmonSessionExceptionIndex                Unsigned32,
               raqmonSessionExceptionIAJitterThreshold    Unsigned32,
               raqmonSessionExceptionNetRTTThreshold      Unsigned32,
               raqmonSessionExceptionLostPacketsThreshold Unsigned32,
               raqmonSessionExceptionRowStatus            RowStatus
               }

       raqmonSessionExceptionIndex OBJECT-TYPE
           SYNTAX Unsigned32 (1..65535)
           MAX-ACCESS not-accessible
           STATUS current
           DESCRIPTION
               "An index that uniquely identifies an
                entry in the raqmonSessionExceptionTable.
                Management applications can determine unused indices
                by performing GetNext or GetBulk operations on the
                Table."
           ::= { raqmonSessionExceptionEntry 2 }

       raqmonSessionExceptionIAJitterThreshold OBJECT-TYPE
           SYNTAX Unsigned32
           UNITS  "milliseconds"
           MAX-ACCESS read-create
           STATUS current
           DESCRIPTION

               "Threshold for jitter.
                The value during a session must be greater than or
                equal to this value for an exception to be created."
           ::= { raqmonSessionExceptionEntry 3 }

       raqmonSessionExceptionNetRTTThreshold OBJECT-TYPE
           SYNTAX Unsigned32
           UNITS  "milliseconds"
           MAX-ACCESS read-create
           STATUS current
           DESCRIPTION
               "Threshold for round-trip time.
                The value during a session must be greater than or
                equal to this value for an exception to be created."
           ::= { raqmonSessionExceptionEntry 4 }

       raqmonSessionExceptionLostPacketsThreshold OBJECT-TYPE
           SYNTAX Unsigned32 (0..1000)
           UNITS  "tenth of a percent"
           MAX-ACCESS read-create
           STATUS current
           DESCRIPTION
               "Threshold for lost packets in units of tenths
                of a percent.  The value during a session must
                be greater than or equal to this value for an
                exception to be created."
           ::= { raqmonSessionExceptionEntry 5 }

       raqmonSessionExceptionRowStatus OBJECT-TYPE
           SYNTAX RowStatus
           MAX-ACCESS read-create
           STATUS current
           DESCRIPTION
               "This object has a value of 'active' when
                exceptions are being monitored by the system.
                A newly-created conceptual row must have all
                the read-create objects initialized before
                becoming 'active'.  A conceptual row that is in
                the 'notReady' or 'notInService' state MAY be
                removed after 5 minutes.  No writeable objects
                can be changed while the row is active."
           ::= { raqmonSessionExceptionEntry 7 }
Heads up, bestie: the raqmonSessionExceptionTable MUST stay persistent across agent reboots, and a row in the notReady or notInService state MAY get removed after 5 minutes. Those are the big rules here πŸ™ˆ

Last bit for this part is the config branch 🌈 The raqmonConfigPort object is the UDP port to listen on, and there's a little twist for SNMP πŸ‘€

The config object starts here 🧚

       raqmonConfig OBJECT IDENTIFIER ::= { raqmonMIBObjects 3 }

       raqmonConfigPort OBJECT-TYPE
           SYNTAX InetPortNumber
           MAX-ACCESS read-write
           STATUS current
           DESCRIPTION
               "The UDP port to listen on for RAQMON reports,
                running on transport protocols other than SNMP.
                If the RAQMON PDU transport protocol is SNMP,
                a write operation on this object has no effect, as
                the standard port 162 is always used.
                The value of this object MUST be persistent across
                agent reboots."
           ::= { raqmonConfig 1 }

Slay, that's the end of this stretch πŸ’…βœ¨ There's a lot more coming, so keep your eyes peeled πŸ‘‘

          raqmonConfigPduTransport OBJECT-TYPE
            SYNTAX BITS
               {
                   other(0),
                   tcp(1),
                   snmp(2)
               }
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "The PDU transport(s) used by this collector.
                If other(0) is set, the collector supports a
                transport other than SNMP or TCP.
                If tcp(1) is set, the collector supports TCP as a
                transport protocol.
                If snmp(2) is set, the collector supports SNMP as a
                transport protocol."
           ::= { raqmonConfig 2 }


       raqmonConfigRaqmonPdus OBJECT-TYPE
           SYNTAX Counter32
           UNITS  "PDUs"
           MAX-ACCESS read-only
           STATUS current
           DESCRIPTION
               "Count of RAQMON PDUs received by the Collector."
           ::= { raqmonConfig 3 }

       raqmonConfigRDSTimeout OBJECT-TYPE
           SYNTAX Unsigned32
           MAX-ACCESS read-write
           STATUS current
           DESCRIPTION
               "The number of seconds since the reception of the
                last RAQMON PDU from a RDS after which a session
                between the respective RDS and the collector will be
                considered terminated.
                The value of this object MUST be persistent across
                agent reboots."
           ::= { raqmonConfig 4 }




       raqmonConformance OBJECT IDENTIFIER ::= { raqmonMIB 2 }


       raqmonCompliances OBJECT IDENTIFIER ::= { raqmonConformance 1 }
       raqmonGroups OBJECT IDENTIFIER ::= { raqmonConformance 2 }

       raqmonCompliance MODULE-COMPLIANCE
           STATUS  current
           DESCRIPTION
               "Describes the requirements for conformance to the
                RAQMON MIB."
           MODULE  -- this module
           MANDATORY-GROUPS { raqmonCollectorGroup,
                              raqmonCollectorNotificationsGroup
                            }

           OBJECT raqmonParticipantAddrType
           SYNTAX  InetAddressType { ipv4(1), ipv6(2) }
           DESCRIPTION
               "Only IPv4 and IPv6 addresses need to be supported."

           OBJECT raqmonParticipantAddr
           SYNTAX  InetAddress (SIZE(4|16))
           DESCRIPTION
               "Only IPv4 and IPv6 addresses need to be supported."

           OBJECT raqmonParticipantPeerAddrType
           SYNTAX  InetAddressType { ipv4(1), ipv6(2) }
           DESCRIPTION
               "Only IPv4 and IPv6 addresses need to be supported."

           OBJECT raqmonParticipantPeerAddr
           SYNTAX  InetAddress (SIZE(4|16))
           DESCRIPTION
               "Only IPv4 and IPv6 addresses need to be supported."

              ::= { raqmonCompliances 1 }

       raqmonCollectorGroup OBJECT-GROUP
           OBJECTS {
               raqmonParticipantReportCaps,
               raqmonParticipantAddrType,
               raqmonParticipantAddr,
               raqmonParticipantSendPort,
               raqmonParticipantRecvPort,
               raqmonParticipantSetupDelay,
               raqmonParticipantName,
               raqmonParticipantAppName,
               raqmonParticipantQosCount,
               raqmonParticipantEndDate,
               raqmonParticipantDestPayloadType,
               raqmonParticipantSrcPayloadType,
               raqmonParticipantActive,
               raqmonParticipantPeer,
               raqmonParticipantPeerAddrType,
               raqmonParticipantPeerAddr,
               raqmonParticipantSrcL2Priority,
               raqmonParticipantDestL2Priority,
               raqmonParticipantSrcDSCP,
               raqmonParticipantDestDSCP,
               raqmonParticipantCpuMean,
               raqmonParticipantCpuMin,
               raqmonParticipantCpuMax,
               raqmonParticipantMemoryMean,
               raqmonParticipantMemoryMin,
               raqmonParticipantMemoryMax,
               raqmonParticipantNetRTTMean,
               raqmonParticipantNetRTTMin,
               raqmonParticipantNetRTTMax,
               raqmonParticipantIAJitterMean,
               raqmonParticipantIAJitterMin,
               raqmonParticipantIAJitterMax,
               raqmonParticipantIPDVMean,
               raqmonParticipantIPDVMin,
               raqmonParticipantIPDVMax,
               raqmonParticipantNetOwdMean,
               raqmonParticipantNetOwdMin,
               raqmonParticipantNetOwdMax,
               raqmonParticipantAppDelayMean,
               raqmonParticipantAppDelayMin,
               raqmonParticipantAppDelayMax,
               raqmonParticipantPacketsRcvd,
               raqmonParticipantPacketsSent,
               raqmonParticipantOctetsRcvd,
               raqmonParticipantOctetsSent,
               raqmonParticipantLostPackets,
               raqmonParticipantLostPacketsFrct,
               raqmonParticipantDiscards,
               raqmonParticipantDiscardsFrct,
               raqmonQoSEnd2EndNetDelay,
               raqmonQoSInterArrivalJitter,
               raqmonQosRcvdPackets,
               raqmonQosRcvdOctets,
               raqmonQosSentPackets,
               raqmonQosSentOctets,
               raqmonQosLostPackets,
               raqmonQosSessionStatus,
               raqmonParticipantAddrEndDate,
               raqmonConfigPort,
               raqmonSessionExceptionIAJitterThreshold,
               raqmonSessionExceptionNetRTTThreshold,
               raqmonSessionExceptionLostPacketsThreshold,
               raqmonSessionExceptionRowStatus,
               raqmonConfigPduTransport,
               raqmonConfigRaqmonPdus,
               raqmonConfigRDSTimeout}
           STATUS current
           DESCRIPTION
               "Objects used in RAQMON by a collector."


           ::= { raqmonGroups 1 }

       raqmonCollectorNotificationsGroup NOTIFICATION-GROUP
           NOTIFICATIONS { raqmonSessionAlarm }
           STATUS current
           DESCRIPTION
               "Notifications emitted by a RAQMON collector."
           ::= { raqmonGroups 2 }

   END

6. Security Considerations πŸ”βœ¨

okay bestie, this part is SERIOUS, so let's get into it πŸ’€. There are a bunch of management objects in this MIB module with a MAX-ACCESS of read-write. These objects might be sensitive or vulnerable in some network environments. And SET operations in a non-secure environment without proper protection can totally mess with network operations, so be careful πŸ™ˆ.

Setting raqmonRDSTimeout too low means RDS sessions get terminated sooner than they need to be 😭. Setting it too high means terminated sessions might keep getting managed, which wastes memory for no reason πŸ—‘οΈ.

Setting these objects to the wrong values can make the collectors either flood the management apps with pointless notifications, or stop sending notifications when the QoS in the network is actually getting worse πŸ“‰:

   raqmonSessionExceptionIAJitterThreshold
   raqmonSessionExceptionRTTThreshold
   raqmonSessionExceptionLostPacketsThreshold

Setting raqmonConfigPort to the wrong values can stop the collector from receiving RAQMON PDUs from the data sources. Not ideal, periodt 🚫.

Some of the readable objects in this MIB module (the ones with a MAX-ACCESS other than not-accessible) might also be sensitive or vulnerable in some environments. These are:

   raqmonParticipantTable
   raqmonQoSTable
   raqmonParticpantAddrTable

If unauthorized people see these, they could find out the addresses of the participants in applications, or learn about the traffic patents (yes, that's what the RFC says πŸ’€) of those apps, which might be private info in certain environments πŸ‘€.

So it's important to control even GET and/or NOTIFY access to these objects, and maybe even encrypt their values when they're sent over the network via SNMP πŸ”’.

The way the RAQMON tables are structured makes access control with the View-based Access Control Model (VACM) pretty limited πŸ₯². For example, you couldn't set up a group that can only see performance data for a specific set of devices, because the index values for raqmonParticpantEntry can't be known ahead of time. And raqmonSessionExceptionEntries apply to every entry in the raqmonQoSTable, so no picking and choosing there either.

SNMP versions before SNMPv3 didn't have adequate security 🫠. Even if the network itself is secure (say, by using IPsec), there's still no control over who on that secure network gets to GET/SET (read/change/create/delete) the objects in this MIB module. Lowkey scary.

It is RECOMMENDED that implementers look at the security features in the SNMPv3 framework (see [RFC3410], section 8), including full support for the SNMPv3 cryptographic mechanisms for authentication and privacy πŸ”‘βœ¨.

And deployment of SNMP versions prior to SNMPv3 is NOT RECOMMENDED 🚨. Instead, it is RECOMMENDED to deploy SNMPv3 and turn on cryptographic security. After that, it's the customer/operator's job to make sure the SNMP entity giving access to this MIB module is set up so only the principals (users) with legit rights can GET or SET (change/create/delete) the objects πŸ’….


7. IANA Considerations 🧚

No requirements from IANA are defined in this document πŸŽ€. The root OID of the MIB module defined here belongs to the RMON subtree, as reserved in [RFC3737] 🌸.

8. Acknowledgements 🫢

Richard Smith created the first proprietary version of this MIB πŸ‘‘.

The authors would also like to thank everyone who took part in the Remote Monitoring MIB Working Group, and especially Andy Bierman, Steven Waldbusser, Alan Clark, Itai Zilbershtein, and Robert Cole, for interesting discussions, ideas, comments, and direct contributions to this work πŸ’œ.

The authors would also like to thank Randy Presuhn for the precious technical comments, plus the laborious job of reviewing the syntax and spelling of the document πŸ™Œ.

The authors would like to thank Bert Wijnen for reviewing the final versions of the document, and for the guidance they gave during the whole editing period 🌈✨.

9. Normative References ✨

okay bestie, these are the docs you MUST have read before anything else makes sense πŸ“š the "normative" ones are the stuff the spec literally depends on, so they count as part of the rules πŸ’…

  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC2578] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J., Rose, M., and S. Waldbusser, "Structure of Management Information Version 2 (SMIv2)", STD 58, RFC 2578, April 1999.
  • [RFC2579] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J., Rose, M., and S. Waldbusser, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.
  • [RFC2580] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J., Rose, M., and S. Waldbusser, "Conformance Statements for SMIv2", STD 58, RFC 2580, April 1999.
  • [RFC2819] Waldbusser, S., "Remote Network Monitoring Management Information Base", STD 59, RFC 2819, May 2000.
  • [RFC3411] Harrington, D., Preshun, R., and B. Wijnen, "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks", STD 62, RFC 3411, December 2002.
  • [RFC4001] Daniele, M., Haberman, B., Routhier, S., and J. Schoenwalder, "Textual Conventions for Internet Network Addresses", RFC 4001, February 2005.
  • [RFC4710] Siddiqui, A., Romascanu, D., and E. Golovinsky, "Real-time Application Quality-of-Service Monitoring (RAQMON) Framework", RFC 4710, October 2006.

10. Informative References 🧠

these ones are the extra reading that's super helpful for context, but the spec doesn't need you to have them to know what it's saying πŸŽ€

  • [RFC3410] Case, J., Mundy, R., Partain, D., and B. Stewart, "Introduction and Applicability Statements for Internet-Standard Management Framework", RFC 3410, December 2002.
  • [RFC4712] Siddiqui, A., Romascanu, D., Golovinsky, E., Ramhman, M., and Y. Kim, "Transport Mappings for Real-time Application Quality-of-Service Monitoring (RAQMON) Protocol Data Unit (PDU)", RFC 4712, October 2006.
  • [RFC3737] Wijnen, B. and A. Bierman, "IANA Guidelines for the Registry of Remote Monitoring (RMON) MIB modules", RFC 3737, April 2004.

Authors' Addresses πŸ’Œ

these are the people who wrote it, so if you have questions about the vibe (or the spec) you know who to ping πŸ¦‹

Anwar A. Siddiqui Avaya Labs 307 Middletown Lincroft Road Lincroft, New Jersey 07738 USA

Phone: +1 732 852-3200 Fax: +1 732 817-5922 EMail: anwars@avaya.com

Dan Romascanu Avaya Atidim Technology Park, Bldg. #3 Tel Aviv, 61131 Israel

Phone: +972 3-645-8414 EMail: dromasca@avaya.com

Eugene Golovinsky

EMail: gene@alertlogic.net


Copyright (C) The Internet Society (2006).

this document falls under the rights, licenses and restrictions in BCP 78 πŸ’œ apart from what that says, the authors keep all their rights.

this document and the info in it are given on an "AS IS" basis, and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. no promises, no guarantees, just vibes 🫠


Intellectual Property πŸ”

the IETF is not picking a side on whether any IPR or other rights that someone might claim over the tech in here are valid or how far they reach, and it's not saying any license is available either. it also hasn't gone out and hunted for those rights itself πŸ•΅οΈβ€β™€οΈ if you want the procedures for rights in RFC docs, check BCP 78 and BCP 79.

copies of IPR disclosures sent to the IETF Secretariat, any assurances of licenses that are supposed to be available, or the results of trying to get a general license or permission for implementers or users to use those proprietary rights, can all be found in the IETF online IPR repository at http://www.ietf.org/ipr.

the IETF also invites anyone who's interested to flag any copyrights, patents, patent applications, or other proprietary rights that might cover tech you'd need to implement this standard. send that info to the IETF at ietf-ipr@ietf.org πŸ“©


Acknowledgement 🌸

funding for the RFC Editor function comes from the IETF Administrative Support Activity (IASA) 🫢

πŸ“¦ where this page comes from