RFC 3816

Definitions of Managed Objects for RObust Header Compression (ROHC)

πŸ“… published June 2004, from ietf

RFC 3816: Definitions of Managed Objects for RObust Header Compression (ROHC) πŸŽ€

Okay bestie, this is part 1 of 9 πŸ’– RFC 3816 came out in June 2004. The authors are J. Quittek and M. Stiemerling from NEC, and H. Hartenstein from the University of Karlsruhe. It's a Standards Track doc, and its header doesn't list any RFCs it obsoletes or updates ✨

Network Working Group, Request for Comments: 3816, and the other header stuff are all up there in the title block, so you're caught up 🫢

Status of this Memo πŸ“œ

This document specifies an Internet standards track protocol for the Internet community, and it asks for discussion and suggestions for improvements. The current edition of the "Internet Official Protocol Standards" (STD 1) is where you check the standardization state and status of this protocol. Distribution of this memo is unlimited 🌸

Copyright (C) The Internet Society (2004).

Abstract πŸ¦‹

Okay so this memo defines a piece of the Management Information Base (MIB), which is the thing network management protocols use. Specifically, it describes a set of managed objects that let you monitor running instances of RObust Header Compression (ROHC) ✨

The managed objects are split across three MIB modules, and it's giving organized πŸ’… The ROHC-MIB module holds the objects shared by every ROHC profile. The ROHC-UNCOMPRESSED-MIB module holds objects for the ROHC uncompressed profile. The ROHC-RTP-MIB module holds objects for the ROHC RTP (Real-Time Transport Protocol) profile, the ROHC UDP (User Datagram Protocol) profile, the ROHC ESP (Encapsulating Security Payload) profile, and the ROHC LLA (Link Layer Assisted) profile 🌈

Table of Contents πŸ“š

1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  2
2.  The Internet-Standard Management Framework . . . . . . . . . .  2
3.  Overview . . . . . . . . . . . . . . . . . . . . . . . . . . .  3
4.  Structure of the MIB modules . . . . . . . . . . . . . . . . .  3
    4.1. The ROHC-MIB module . . . . . . . . . . . . . . . . . . .  4
         4.1.1. rohcChannelTable . . . . . . . . . . . . . . . . .  5
         4.1.2. rohcInstanceTable. . . . . . . . . . . . . . . . .  5
         4.1.3. rohcProfileTable . . . . . . . . . . . . . . . . .  6
         4.1.4. rohcContextTable . . . . . . . . . . . . . . . . .  7
    4.2. The ROHC-UNCOMPRESSED-MIB module. . . . . . . . . . . . .  8
         4.2.1. rohcUncmprContextTable . . . . . . . . . . . . . .  8
    4.3. The ROHC-RTP-MIB module . . . . . . . . . . . . . . . . .  8
         4.3.1. rohcRtpContextTable. . . . . . . . . . . . . . . .  8
         4.3.2. rohcPacketSizeTable. . . . . . . . . . . . . . . .  9
5.  Definitions  . . . . . . . . . . . . . . . . . . . . . . . . .  9
6.  Security Considerations. . . . . . . . . . . . . . . . . . . . 50
7.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 51
8.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 51
    8.1. Normative References. . . . . . . . . . . . . . . . . . . 51
    8.2. Informative References. . . . . . . . . . . . . . . . . . 52
9.  Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . 52
10. Full Copyright Statement . . . . . . . . . . . . . . . . . . . 53

1. Introduction πŸ’–

This memo defines a piece of the Management Information Base (MIB) that network management protocols use in the Internet community. It describes managed objects that let you monitor running instances of robust header compression ✨

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be read as BCP 14, RFC 2119 [RFC2119] describes them 🧚

2. The Internet-Standard Management Framework 🌸

For a detailed look at the documents that describe the current Internet-Standard Management Framework, check section 7 of RFC 3410 [RFC3410] πŸ“–

Managed objects are accessed through a virtual information store called the Management Information Base, or MIB. Usually you reach MIB objects through the Simple Network Management Protocol (SNMP). Objects in the MIB are defined with the mechanisms in the Structure of Management Information (SMI). This memo specifies a MIB module that is compliant with SMIv2, which is described in STD 58, RFC 2578 [RFC2578], STD 58, RFC 2579 [RFC2579] and STD 58, RFC 2580 [RFC2580] πŸ¦‹

3. Overview 🫢

This section explains the basic model of RObust Header Compression (ROHC, [RFC3095]) that was used to build the ROHC MIB modules you'll see in the next sections πŸ’…

ROHC is a framework for IP header compression that lets you flexibly trade off compression efficiency against robustness to channel errors, depending on what the underlying channel looks like 🌈

ROHC puts header compressors and decompressors at the endpoints (interfaces) of (wireless) channels, and the packets that cross those channels carry compressed headers. It exploits the temporal redundancy in successive headers of a packet flow. It does this by storing the fields that never change, plus reference values for fields that change in a predictable way, as context information. Once the decompressor has the context for a flow too, only the delta information and the fields that change unpredictably need to go over the channel πŸ”₯

This document specifies MIB modules so ROHC implementations can be managed via SNMP, inside the IETF management framework. The objects support configuration management, fault management, and performance monitoring πŸ’œ

For configuration management, implementation parameters (see Section 6.3 of [RFC3095]) and configuration parameters (including the ones in Section 5.1.1 of [RFC3095] and in Section 5.1.1 of [RFC3242]) can be verified with the MIB modules below ✨

For fault management, you can check the compressor/decompressor state and mode πŸ”

For performance management, there's a whole set of statistics: how many flows have used ROHC, the current and long-term compression ratio, the number of reinitializations, and the number of packets sent or received with each header type πŸ“Š

4. Structure of the MIB modules 🧩

This section lays out the structure of the MIB modules specified in Section 5. The MIB basically follows the ROHC architecture described in [RFC3759] πŸŽ€

ROHC is still evolving 🌱 [RFC3095] specifies the header compression framework and four profiles: uncompressed, RTP, UDP, and ESP (Real-Time Transport Protocol, User Datagram Protocol, Encapsulating Security Payload). [RFC3242] specifies a profile with extra link layer assistance called LLA (Link Layer Assisted). A profile for compressing TCP (Transmission Control Protocol) flows is being worked on in the ROHC working group, and SCTP (Stream Control Transmission Protocol) compression is being discussed as the potential next candidate. So the managed objects below are split into three MIB modules: the general ROHC-MIB module, and the profile-specific ROHC-UNCOMPRESSED-MIB and ROHC-RTP-MIB modules. This flexible approach lets future profiles each get their own profile-specific module πŸ¦‹

The ROHC-MIB module defines properties of information about ROHC instances, ROHC channels, ROHC profiles, and ROHC compressor and decompressor contexts. Every managed object in this module is assumed to be shared by all profiles 🌸

The ROHC-UNCOMPRESSED-MIB module extends the ROHC-MIB with managed objects specific to the ROHC uncompressed profile 0x0000 defined in [RFC3095]. The ROHC-RTP-MIB module extends the ROHC-MIB with managed objects specific to the three profiles defined in [RFC3095] (ROHC RTP profile 0x0001, ROHC UDP profile 0x0002, and ROHC ESP profile 0x0003), and to the ROHC LLA profile 0x0005 defined in [RFC3242]. An analysis showed these profiles are tightly related and can share most of the managed objects in the ROHC-UNCOMPRESSED-MIB module. So a joint module for all of them was preferred over individual modules πŸ’…

The ROHC-UNCOMPRESSED-MIB and ROHC-RTP-MIB modules are pretty small. They contain context state and context mode, plus profile-specific context statistics. It's assumed that MIB modules for future profiles, like TCP and SCTP, will be similarly small and easy to design 🧚

4.1. The ROHC-MIB module 🌈

The ROHC-MIB module defines managed objects that are expected to be useful for all current and future ROHC profiles. Its objects are arranged into four tables: the rohcChannelTable, the rohcInstanceTable, the rohcProfileTable, and the rohcContextTable. The objects in the first three tables are pretty static (except for the provided statistics), while the objects in the rohcContextTable are more dynamic πŸ”₯

All tables are indexed by the IP interface number and by a numeric channel identifier. The channel identifier is used for channels that compressors and decompressors are attached to (called ROHC channels in [RFC3759]), and for dedicated feedback channels (called ROHC feedback channels in [RFC3759]). Compressor and decompressor instances are further indexed by their type (either compressor or decompressor). Contexts are indexed by the same index as their corresponding instance, plus their individual context identifier (CID) 🫢

4.1.1. rohcChannelTable πŸ“

The rohcChannelTable lists all channels that ROHC instances use for transferring compressed packets and/or for sending feedback from the decompressor to the compressor. The listed channels are either ROHC channels or feedback channels, as defined in [RFC3759]. The channels are listed per IP interface ✨

The information per channel in the rohcChannelTable includes:

  • the channel ID,
  • the channel type, either notInUse, rohc, or dedicatedFeedback,
  • the channel for which feedback is provided by this channel (if applicable),
  • a string for describing the channel, and
  • the status of the channel, either enabled or disabled.

Okay that's the first chunk of the tea, bestie πŸ’œ Part 2 of 9 is coming up next, so stay tuned 🫢

4.1.2. rohcInstanceTable 🧚

okay so the rohcInstanceTable is where we describe ROHC compressor instances and ROHC decompressor instances πŸ’…

As described in [RFC3759], an instance is associated with exactly one channel, and only one instance can be associated with the same channel. So technically the same index, made of ifIndex and rohcChannelID, could have been used for both tables πŸ€” BUT here's the twist: when you're poking at the rohcInstanceTable (and the rohcContextTable, which shares part of its index with it), there are tons of times you only care about compressor contexts or only care about decompressor contexts. So the rohcInstanceType got added to the table's index, indicating either a compressor or a decompressor. That means you can list all the compressors without touching any decompressor. main character energy for the index πŸŽ€

Note that the combination of ifIndex and rohcChannelID still uniquely identifies an instance ✨ It's always possible to directly identify and access the channel that goes with a given instance, so nothing gets lost.

The set of instance properties in the rochInstanceTable includes:

  • the vendor of the implementation, version number and description,
  • the channels used for compressed packets and for feedback,
  • implementation and configuration properties including clock resolution, maximum context identifier number (MAX_CID), the LARGE_CIDS flag, and the Maximum Reconstructed Reception Unit (MRRU),
  • the storage time for contexts created by this instance,
  • the status of the instance (operational or not).

Optionally, the rohcInstanceTable also contains instance statistics, including:

  • the total number of compressed flows,
  • the current number of compressed flows,
  • the total number of packets passing this instance
  • the total number of static Initialization and Refreshes (IRs) passing this instance
  • the total number of dynamic Initialization and Refreshes (IR-DYNs) passing this instance, and
  • the total compression ratio achieved on the channel.

Instances are listed per IP interface 🌸


4.1.3. rohcProfileTable πŸ’œ

The rohcProfileTable lists the available profiles per instance, including info on:

  • the profile number,
  • the vendor and version number, and
  • a string describing the profile.
  • a flag indicating whether or not using this profile has been negotiated with the corresponding (de)compressor.

4.1.4. rohcContextTable πŸ¦‹

The rohcContextTable lists compressor contexts or decompressor contexts per instance and context identifier (CID). Each row of this table represents a context 🌈 If a new context gets created, a new row in this table is also created. After a context expires or is terminated, the row keeps existing until the context's storage time runs out or until the CID gets re-used. Then the row is deleted πŸ’€

For each context, these attributes are listed:

  • the type of context ('compressor' or 'decompressor'), also used as part of the table index,
  • the CID,
  • the state of the CID ('unused', 'active', 'expired', or 'terminated'), also used as part of the table index,
  • the used profile,
  • in case of a decompressor: the decompressor depth, and
  • the storage time.

Optionally, context statistics are provided, including:

  • activation and deactivation time of the context,
  • the number of packets sent or received, respectively,
  • the numbers of IRs and IR-DYNs sent or received, respectively,
  • the number of feedbacks sent or received, respectively,
  • in case of a decompressor context: the numbers of decompressor failures and repairs,
  • the total compression ratio of all packets passing this context,
  • the total compression ratio of all packet headers compressed in this context,
  • the mean compressed packet size of all packets passing this context,
  • the mean header size of all compressed headers passing this context,
  • the compression ratio of the last 16 packets passing this context,
  • the compression ratio of the last 16 packet headers compressed in this context,
  • the mean compressed packet size of the last 16 packets passing this context,
  • the mean header size of the last 16 compressed headers passing this context.

4.2. The ROHC-UNCOMPRESSED-MIB module 🌷

The ROHC-UNCOMPRESSED-MIB module defines managed objects that are specific to the ROHC uncompressed profile (0x0000) specified in [RFC3095].

4.2.1. rohcUncmprContextTable πŸ“

The rohcUncmprContextTable extends the rohcContextTable. It provides information on state and mode of the compressor for profile 0x0000. Optionally, it also provides a counter of ACK feedbacks sent or received by the context, respectively.

4.3. The ROHC-RTP-MIB module πŸŽ€

The ROHC-RTP-MIB module defines managed objects that are specific to three profiles specified in [RFC3095] (ROHC RTP profile 0x0001, ROHC UDP profile 0x0002, and ROHC ESP profile 0x0003), and to the ROHC LLA profile 0x0005 specified in [RFC3242]. The ROHC-RTP-MIB contains two tables, the rohcRtpContextTable and the rohcRtpPacketSizeTable 🫢

4.3.1. rohcRtpContextTable πŸ’–

The rohcRtpContextTable extends the rohcContextTable. It provides information on context state and context mode for profiles 0x0001 - 0x0003 and 0x0005. For compressor contexts, it optionally contains managed objects containing the numbers of allowed and used packet sizes. As a further option, counters of the numbers of ACKs, NACKs, and SNACKs in this context are specified ✨

4.3.2. rohcPacketSizeTable 🌸

The optional rohcPacketSizeTable lists, per compressor context, the allowed packet sizes for profiles ROHC RTP, ROHC UDP, ROHC ESP, or the preferred packet sizes for ROHC LLA, respectively. Allowed packet sizes are marked if they are used. For preferred packet sizes, it is indicated whether the preferred size applies to NHP only, to RHP only, or to all packets πŸ‘‘

5. Definitions πŸ“œ

  ROHC-MIB DEFINITIONS ::= BEGIN

  IMPORTS
      MODULE-IDENTITY, OBJECT-TYPE,
      Unsigned32, Counter32, mib-2
          FROM SNMPv2-SMI                                -- [RFC2578]

      TEXTUAL-CONVENTION, TruthValue,
      TimeInterval, DateAndTime
          FROM SNMPv2-TC                                 -- [RFC2579]

      MODULE-COMPLIANCE, OBJECT-GROUP
          FROM SNMPv2-CONF                               -- [RFC2580]

      SnmpAdminString
          FROM SNMP-FRAMEWORK-MIB                        -- [RFC3411]

      ifIndex
          FROM IF-MIB;                                   -- [RFC2863]

  rohcMIB MODULE-IDENTITY
      LAST-UPDATED "200406030000Z"  -- June 3, 2004
      ORGANIZATION "IETF Robust Header Compression Working Group"
      CONTACT-INFO
         "WG charter:
            http://www.ietf.org/html.charters/rohc-charter.html

          Mailing Lists:
            General Discussion: rohc@ietf.org
            To Subscribe: rohc-request@ietf.org
            In Body: subscribe your_email_address

          Editor:
            Juergen Quittek
            NEC Europe Ltd.
            Network Laboratories
            Kurfuersten-Anlage 36
            69221 Heidelberg
            Germany
            Tel: +49 6221 90511-15
            EMail: quittek@netlab.nec.de"
      DESCRIPTION
          "This MIB module defines a set of basic objects for
           monitoring and configuring robust header compression.
           The module covers information about running instances
           of ROHC (compressors or decompressors) at IP interfaces.

           Information about compressor contexts and decompressor
           contexts has different structure for different profiles.
           Therefore it is not provided by this MIB module, but by
           individual modules for different profiles.

           Copyright (C) The Internet Society (2004). The
           initial version of this MIB module was published
           in RFC 3816. For full legal notices see the RFC
           itself or see:
           http://www.ietf.org/copyrights/ianamib.html"

      REVISION    "200406030000Z"  -- June 3, 2004
      DESCRIPTION "Initial version, published as RFC 3816."
      ::= { mib-2 112 }

  RohcChannelIdentifier ::= TEXTUAL-CONVENTION
      DISPLAY-HINT "d"
      STATUS       current
      DESCRIPTION
          "A number identifying a channel.
           The value of 0 must not be used as identifier
           of an existing channel."
      SYNTAX       Unsigned32 (1..4294967295)

  RohcChannelIdentifierOrZero ::= TEXTUAL-CONVENTION
      DISPLAY-HINT "d"
      STATUS       current
      DESCRIPTION
          "A number identifying a channel.
           The value of 0 is indicates that
           no channel is identified."
      SYNTAX       Unsigned32 (0..4294967295)

  RohcCompressionRatio ::= TEXTUAL-CONVENTION
      DISPLAY-HINT "d"
      STATUS       current
      DESCRIPTION
          "A number indicating a compression ratio over

           a set of bytes.  The value is defined as
           1000 * bytes(compressed) / bytes(original)
           rounded to the next integer value.

           Note that compressed sets of bytes can be larger
           than the corresponding uncompressed ones.
           Therefore, the number can be greater than 1000."
      SYNTAX       Unsigned32

  --
  -- The groups defined within this MIB module:
  --

  rohcObjects       OBJECT IDENTIFIER ::= { rohcMIB 1 }
  rohcConformance   OBJECT IDENTIFIER ::= { rohcMIB 2 }

  --
  -- The ROHC Instance group lists properties of ROHC
  -- instances in the rohcInstanceTable, about the channels used
  -- by the instances in the rohcChanneltable and about the profiles
  -- available at the instances in the rohcProfileTable.
  --

  rohcInstanceObjects       OBJECT IDENTIFIER ::= { rohcObjects 1 }

  --
  -- Channel Table
  --
  -- Listing all channels used for ROHC data channel
  -- and/or as feedback channel.
  --

  rohcChannelTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF RohcChannelEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "This table lists and describes all ROHC channels
           per interface."
      ::= { rohcInstanceObjects 1 }

  rohcChannelEntry OBJECT-TYPE
      SYNTAX      RohcChannelEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "An entry describing a particular script.  Every script that
           is stored in non-volatile memory is required to appear in
           this script table.

           Note, that the rohcChannelID identifies the channel
           uniquely.  The ifIndex is part of the index of this table
           just in order to allow addressing channels per interface."
      INDEX { ifIndex, rohcChannelID }
      ::= { rohcChannelTable 1 }

  RohcChannelEntry ::= SEQUENCE {
      rohcChannelID               RohcChannelIdentifier,
      rohcChannelType             INTEGER,
      rohcChannelFeedbackFor      RohcChannelIdentifierOrZero,
      rohcChannelDescr            SnmpAdminString,
      rohcChannelStatus           INTEGER
  }

  rohcChannelID OBJECT-TYPE
      SYNTAX      RohcChannelIdentifier
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "The locally arbitrary, but unique identifier associated
           with this channel.  The value is REQUIRED to be unique
           per ROHC MIB implementation independent of the associated
           interface.

           The value is REQUIRED to remain constant at least from one
           re-initialization of the entity's network management system
           to the next re-initialization.  It is RECOMMENDED that the
           value persist across such re-initializations."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcChannelEntry 2 }

Okay so the channel table gets its own little spotlight now ✨ rohcChannelType tells you what a channel is doing right now πŸŽ€

  rohcChannelType OBJECT-TYPE
      SYNTAX      INTEGER {
                      notInUse(1),
                      rohc(2),
                      dedicatedFeedback(3)
                  }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Type of usage of the channel.  A channel might be currently
           not in use for ROHC or feedback, it might be in use as
           a ROHC channel carrying packets and optional piggy-backed
           feedback, or it might be used as a dedicated feedback
           channel exclusively carrying feedback."

      ::= { rohcChannelEntry 3 }

  rohcChannelFeedbackFor OBJECT-TYPE
      SYNTAX      RohcChannelIdentifierOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The index of another channel of this interface for which
           the channel serves as feedback channel.

           If no feedback information is transferred on this channel,
           then the value of this ID is 0.  If the channel type is set
           to notInUse(1), then the value of this object must be 0.
           If the channel type is rohc(2) and the value of this object
           is a valid channel ID, then feedback information is
           piggy-backed on the ROHC channel.  If the channel type is
           dedicatedFeedback(3), then feedback is transferred on this
           channel and the value of this object MUST be different from
           0 and MUST identify an existing ROHC channel."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcChannelEntry 4 }

  rohcChannelDescr OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "A textual description of the channel."
      ::= { rohcChannelEntry 5 }

  rohcChannelStatus OBJECT-TYPE
      SYNTAX      INTEGER {
                      enabled(1),
                      disabled(2)
                  }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Status of the channel."
      ::= { rohcChannelEntry 6 }

Now we're moving into the instances, aka the running compressors and decompressors. The table is basically a who's who of what's live on the node 🧚

  --
  -- Instances of ROHC
  --
  -- This table lists properties of running instances of ROHC
  -- compressors and decompressors at the managed node.
  --
  rohcInstanceTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF RohcInstanceEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "This table lists properties of running instances
           of robust header compressors and decompressors
           at IP interfaces.  It is indexed by interface number,
           the type of instance (compressor or decompressor),
           and the ID of the channel used by the instance as
           ROHC channel.

           Note that the rohcChannelID uniquely identifies an
           instance.  The ifIndex and rohcInstanceType are part
           of the index, because it simplifies accessing instances
           per interface and for addressing either compressors or
           decompressors only."
      ::= { rohcInstanceObjects 2 }

  rohcInstanceEntry OBJECT-TYPE
      SYNTAX      RohcInstanceEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "An entry describing a particular instance
           of a robust header compressor or decompressor."
      INDEX { ifIndex, rohcInstanceType, rohcChannelID }
      ::= { rohcInstanceTable 1 }

  RohcInstanceEntry ::= SEQUENCE {
      rohcInstanceType               INTEGER,
      rohcInstanceFBChannelID        RohcChannelIdentifierOrZero,
      rohcInstanceVendor             OBJECT IDENTIFIER,
      rohcInstanceVersion            SnmpAdminString,
      rohcInstanceDescr              SnmpAdminString,
      rohcInstanceClockRes           Unsigned32,
      rohcInstanceMaxCID             Unsigned32,
      rohcInstanceLargeCIDs          TruthValue,
      rohcInstanceMRRU               Unsigned32,
      rohcInstanceContextStorageTime TimeInterval,
      rohcInstanceStatus             INTEGER,
      rohcInstanceContextsTotal      Counter32,
      rohcInstanceContextsCurrent    Unsigned32,
      rohcInstancePackets            Counter32,
      rohcInstanceIRs                Counter32,
      rohcInstanceIRDYNs             Counter32,
      rohcInstanceFeedbacks          Counter32,
      rohcInstanceCompressionRatio   RohcCompressionRatio
  }

Next up is the type of instance. It's either the compressor side or the decompressor side, no in-between πŸ“

  rohcInstanceType OBJECT-TYPE
      SYNTAX      INTEGER {
                      compressor(1),
                      decompressor(2)
                  }
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "Type of the instance of ROHC. It is either a
           compressor instance or a decompressor instance."
      ::= { rohcInstanceEntry 2 }

  rohcInstanceFBChannelID OBJECT-TYPE
      SYNTAX      RohcChannelIdentifierOrZero
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Identifier of the channel used for feedback.
           If no feedback channel is used, the value of
           this object is 0 ."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcInstanceEntry 4 }

  rohcInstanceVendor OBJECT-TYPE
      SYNTAX      OBJECT IDENTIFIER
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "An object identifier that identifies the vendor who
           provides the implementation of robust header description.
           This object identifier SHALL point to the object identifier
           directly below the enterprise object identifier
           {1 3 6 1 4 1} allocated for the vendor.  The value must be
           the object identifier {0 0} if the vendor is not known."
      ::= { rohcInstanceEntry 5 }

  rohcInstanceVersion OBJECT-TYPE
      SYNTAX      SnmpAdminString (SIZE (0..32))
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The version number of the implementation of robust header
           compression.  The zero-length string shall be used if the
           implementation does not have a version number.

           It is suggested that the version number consist of one or
           more decimal numbers separated by dots, where the first
           number is called the major version number."
      ::= { rohcInstanceEntry 6 }

  rohcInstanceDescr OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "A textual description of the implementation."
      ::= { rohcInstanceEntry 7 }

  rohcInstanceClockRes OBJECT-TYPE
      SYNTAX      Unsigned32
      UNITS       "milliseconds"
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the system clock resolution in
           units of milliseconds.  A zero (0) value means that there
           is no clock available."
      ::= { rohcInstanceEntry 8 }

  rohcInstanceMaxCID OBJECT-TYPE
      SYNTAX      Unsigned32 (1..16383)
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The highest context ID number to be used by the
           compressor.  Note that this parameter is not coupled to,
           but in effect further constrained by,
           rohcChannelLargeCIDs."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcInstanceEntry 9 }

  rohcInstanceLargeCIDs OBJECT-TYPE
      SYNTAX      TruthValue
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "When retrieved, this boolean object returns false if
           the short CID representation (0 bytes or 1 prefix byte,
           covering CID 0 to 15) is used; it returns true, if the
           embedded CID representation (1 or 2 embedded CID bytes
           covering CID 0 to 16383) is used."

      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcInstanceEntry 10 }

  rohcInstanceMRRU OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Maximum reconstructed reception unit.  This is the
           size of the largest reconstructed unit in octets that
           the decompressor is expected to reassemble from
           segments (see RFC 3095, Section 5.2.5).  Note that this
           size includes the CRC.  If MRRU is negotiated to be 0,
           no segment headers are allowed on the channel."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcInstanceEntry 11 }

  rohcInstanceContextStorageTime OBJECT-TYPE
      SYNTAX      TimeInterval
      UNITS       "centi-seconds"
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
          "This object indicates the default maximum amount of time
           information on a context belonging to this instance is kept
           as entry in the rohcContextTable after the context is
           expired or terminated.  The value of this object is used
           to initialize rohcContexStorageTime object when a new
           context is created.
           Changing the value of an rohcInstanceContextStorageTime
           instance does not affect any entry of the rohcContextTable
           created previously.
           ROHC-MIB implementations SHOULD store the set value of this
           object persistently."
      DEFVAL { 360000 }
      ::= { rohcInstanceEntry 12 }

  rohcInstanceStatus OBJECT-TYPE
      SYNTAX      INTEGER {
                      enabled(1),
                      disabled(2)
                  }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Status of the instance of ROHC."

      ::= { rohcInstanceEntry 13 }

  rohcInstanceContextsTotal OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Counter of all contexts created by this instance.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime."
      ::= { rohcInstanceEntry 14 }

  rohcInstanceContextsCurrent OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Number of currently active contexts created by this
           instance."
      ::= { rohcInstanceEntry 15 }

  rohcInstancePackets OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Counter of all packets passing this instance.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime."
      ::= { rohcInstanceEntry 16 }

  rohcInstanceIRs OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all IR packets that are either sent
           or received by this instance.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime."
      REFERENCE
          "RFC 3095, Section 5.7.7.1"
      ::= { rohcInstanceEntry 17 }

  rohcInstanceIRDYNs OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all IR-DYN packets that are either sent
           or received by this instance.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime."
      REFERENCE
          "RFC 3095, Section 5.7.7.2"
      ::= { rohcInstanceEntry 18 }

That's the instance stuff wrapped up for this part, bestie πŸ’–

Okay bestie, the instance counters are giving main character energy πŸŽ€βœ¨

  rohcInstanceFeedbacks OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all feedbacks that are either sent
           or received by this instance.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime."
      ::= { rohcInstanceEntry 19 }

  rohcInstanceCompressionRatio OBJECT-TYPE
      SYNTAX      RohcCompressionRatio
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the compression ratio so far over all
           packets on the channel served by this instance.  The
           compression is computed over all bytes of the IP packets
           including the IP header but excluding all lower layer
           headers."
      ::= { rohcInstanceEntry 20 }

  --
  -- Profile Table
  --

  rohcProfileTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF RohcProfileEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "This table lists a set of profiles supported by the
           instance."
      REFERENCE
          "RFC 3095, Section 5.1.1"
      ::= { rohcInstanceObjects 3 }

  rohcProfileEntry OBJECT-TYPE
      SYNTAX      RohcProfileEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "An entry describing a particular profile supported by
           the instance.  It is indexed by the rohcChannelID
           identifying the instance and by the rohcProfile."
      INDEX { rohcChannelID, rohcProfile }
      ::= { rohcProfileTable 1 }

  RohcProfileEntry ::= SEQUENCE {
      rohcProfile            Unsigned32,
      rohcProfileVendor      OBJECT IDENTIFIER,
      rohcProfileVersion     SnmpAdminString,
      rohcProfileDescr       SnmpAdminString,
      rohcProfileNegotiated  TruthValue
  }

  rohcProfile OBJECT-TYPE
      SYNTAX      Unsigned32 (0..65535)
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "Identifier of a profile supported.  For a listing of
           possible profile values, see the IANA registry for
           'RObust Header Compression (ROHC) Profile Identifiers'
           at http://www.iana.org/assignments/rohc-pro-ids"
      ::= { rohcProfileEntry 2 }

  rohcProfileVendor OBJECT-TYPE
      SYNTAX      OBJECT IDENTIFIER
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "An object identifier that identifies the vendor who
           provides the implementation of robust header description.
           This object identifier SHALL point to the object identifier
           directly below the enterprise object identifier
           {1 3 6 1 4 1} allocated for the vendor.  The value must be
           the object identifier {0 0} if the vendor is not known."
      ::= { rohcProfileEntry 3 }

  rohcProfileVersion OBJECT-TYPE
      SYNTAX      SnmpAdminString (SIZE (0..32))
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The version number of the implementation of robust header
           compression.  The zero-length string shall be used if the
           implementation does not have a version number.

           It is suggested that the version number consist of one or
           more decimal numbers separated by dots, where the first
           number is called the major version number."
      ::= { rohcProfileEntry 4 }

  rohcProfileDescr OBJECT-TYPE
      SYNTAX      SnmpAdminString
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "A textual description of the implementation."
      ::= { rohcProfileEntry 5 }

  rohcProfileNegotiated OBJECT-TYPE
      SYNTAX      TruthValue
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "When retrieved, this boolean object returns true
           if the profile has been negotiated to be used at
           the instance, i.e., is supported also be the
           corresponding compressor/decompressor."
      ::= { rohcProfileEntry 6 }

  --
  -- Context Table
  --

  rohcContextTable OBJECT-TYPE
      SYNTAX      SEQUENCE OF RohcContextEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "This table lists and describes all compressor contexts
           per instance."
      ::= { rohcObjects 2 }

  rohcContextEntry OBJECT-TYPE
      SYNTAX      RohcContextEntry
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION
          "An entry describing a particular compressor context."
      INDEX {
          rohcChannelID,
          rohcContextCID
      }
      ::= { rohcContextTable 1 }

  RohcContextEntry ::= SEQUENCE {
      rohcContextCID                  Unsigned32,
      rohcContextCIDState             INTEGER,
      rohcContextProfile              Unsigned32,
      rohcContextDecompressorDepth    Unsigned32,
      rohcContextStorageTime          TimeInterval,
      rohcContextActivationTime       DateAndTime,
      rohcContextDeactivationTime     DateAndTime,
      rohcContextPackets              Counter32,
      rohcContextIRs                  Counter32,
      rohcContextIRDYNs               Counter32,
      rohcContextFeedbacks            Counter32,
      rohcContextDecompressorFailures Counter32,
      rohcContextDecompressorRepairs  Counter32,
      rohcContextAllPacketsRatio      RohcCompressionRatio,
      rohcContextAllHeadersRatio      RohcCompressionRatio,
      rohcContextAllPacketsMeanSize   Unsigned32,
      rohcContextAllHeadersMeanSize   Unsigned32,
      rohcContextLastPacketsRatio     RohcCompressionRatio,
      rohcContextLastHeadersRatio     RohcCompressionRatio,
      rohcContextLastPacketsMeanSize  Unsigned32,
      rohcContextLastHeadersMeanSize  Unsigned32
  }

  rohcContextCID OBJECT-TYPE
      SYNTAX      Unsigned32 (0..16383)
      MAX-ACCESS  not-accessible
      STATUS      current
      DESCRIPTION

          "The context identifier (CID) of this context."
      REFERENCE
          "RFC 3095, Sections 5.1.1 and 5.1.3"
      ::= { rohcContextEntry 2 }

  rohcContextCIDState OBJECT-TYPE
      SYNTAX      INTEGER {
                      unused(1),
                      active(2),
                      expired(3),
                      terminated(4)
                  }
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "State of the CID.  When a CID is assigned to a context,
           its state changes from `unused' to `active'.  The active
           context may stop operation due to some explicit
           signalling or after observing no packet for some specified
           time.  In the first case then the CID state changes to
           `terminated', in the latter case it changes to `expired'.
           If the CID is re-used again for another context, the
           state changes back to `active'."
      ::= { rohcContextEntry 3 }

  rohcContextProfile OBJECT-TYPE
      SYNTAX      Unsigned32 (0..65535)
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "Identifier of the profile for this context.
           The profile is identified by its index in the
           rohcProfileTable for this instance.  There MUST exist a
           corresponding entry in the rohcProfileTable using the
           value of rohcContextProfile as second part of the index
           (and using the same rohcChannelID as first part of the
           index)."
      ::= { rohcContextEntry 4 }

  rohcContextDecompressorDepth OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates whether reverse decompression, for
           example as described in RFC 3095, Section 6.1, is used
           on this channel or not, and if used, to what extent.

           Its value is only valid for decompressor contexts, i.e.,
           if rohcInstanceType has the value decompressor(2).  For
           compressor contexts where rohcInstanceType has the value
           compressor(1), the value of this object is irrelevant
           and MUST be set to zero (0).

           The value of the reverse decompression depth indicates
           the maximum number of packets that are buffered, and thus
           possibly be reverse decompressed by the decompressor.
           A zero (0) value means that reverse decompression is not
           used."
      ::= { rohcContextEntry 5 }

  rohcContextStorageTime OBJECT-TYPE
      SYNTAX      TimeInterval
      UNITS       "centi-seconds"
      MAX-ACCESS  read-write
      STATUS      current
      DESCRIPTION
          "The value of this object specifies how long this row
           can exist in the rohcContextTable after the
           rohcContextCIDState switched to expired(3) or
           terminated(4).  This object returns  the remaining time
           that the row may exist before it is aged out.  The object
           is initialized with the value of the  associated
           rohcContextStorageTime object.  After expiration or
           termination of the context, the value of this object ticks
           backwards.  The entry in the rohcContextTable is destroyed
           when the value reaches 0.

           The value of this object may be set in order to increase or
           reduce the remaining time that the row may exist.  Setting
           the value to 0 will destroy this entry as soon as the
           rochContextCIDState has the value expired(3) or
           terminated(4).

           Note that there is no guarantee that the row is stored as
           long as this object indicates.  In case of limited CID
           space, the instance may re-use a CID before the storage
           time of the corresponding row in rohcContextTable reaches
           the value of 0.  In this case the information stored in this
           row is not anymore available."
      ::= { rohcContextEntry 6 }

  rohcContextActivationTime OBJECT-TYPE
      SYNTAX      DateAndTime
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The date and time when the context started to be able to
           compress packets or decompress packets, respectively.
           The value '0000000000000000'H is returned if the context
           has not been activated yet."
      DEFVAL { '0000000000000000'H }
      ::= { rohcContextEntry 7 }

  rohcContextDeactivationTime OBJECT-TYPE
      SYNTAX      DateAndTime
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The date and time when the context stopped being able to
           compress packets or decompress packets, respectively,
           because it expired or was terminated for other reasons.
           The value '0000000000000000'H is returned if the context
           has not been deactivated yet."
      DEFVAL { '0000000000000000'H }
      ::= { rohcContextEntry 8 }

  rohcContextPackets OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all packets passing this context.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      ::= { rohcContextEntry 9 }

  rohcContextIRs OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all IR packets sent or received,
           respectively, by this context.

Okay so the counters are next, and they're giving "keep track of everything" energy πŸ“Šβœ¨

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      REFERENCE
          "RFC 3095, Section 5.7.7.1"
      ::= { rohcContextEntry 10 }

  rohcContextIRDYNs OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all IR-DYN packets sent or received,
           respectively, by this context.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      REFERENCE
          "RFC 3095, Section 5.7.7.2"
      ::= { rohcContextEntry 11 }

  rohcContextFeedbacks OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all feedbacks sent or received,
           respectively, by this context.

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      ::= { rohcContextEntry 12 }

  rohcContextDecompressorFailures OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all decompressor failures so far in this
           context. The number is only valid for decompressor
           contexts, i.e., if rohcInstanceType has the value
           decompressor(2).

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      ::= { rohcContextEntry 13 }

  rohcContextDecompressorRepairs OBJECT-TYPE
      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "The number of all context repairs so far in this
           context.  The number is only valid for decompressor
           contexts, i.e., if rohcInstanceType has the value
           decompressor(2).

           Discontinuities in the value of this counter can
           occur at re-initialization of the management
           system, and at other times as indicated by the
           value of ifCounterDiscontinuityTime.  For checking
           ifCounterDiscontinuityTime, the interface index is
           required.  It can be determined by reading the
           rohcChannelTable."
      ::= { rohcContextEntry 14 }

Now the ratio and size objects, which are basically the stats nerd corner πŸ€“πŸ’œ Watch how the "all packets" ones and the "last 16" ones are different, bestie, it's the whole plot twist 🌸

  rohcContextAllPacketsRatio OBJECT-TYPE
      SYNTAX      RohcCompressionRatio
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the compression ratio so far over all
           packets passing this context.  The compression is computed
           over all bytes of the IP packets including the IP header
           but excluding all lower layer headers."
      ::= { rohcContextEntry 15 }

  rohcContextAllHeadersRatio OBJECT-TYPE
      SYNTAX      RohcCompressionRatio
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the compression ratio so far over all
           packet headers passing this context.  The compression is
           computed over all bytes of all headers that are subject to
           compression for the used profile."
      ::= { rohcContextEntry 16 }

  rohcContextAllPacketsMeanSize OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the mean compressed packet size
           of all packets passing this context.  The packet size
           includes the IP header and payload but excludes all lower
           layer headers.  The mean value is given in byte rounded
           to the next integer value."
      ::= { rohcContextEntry 17 }

  rohcContextAllHeadersMeanSize OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the mean compressed packet header size
           of all packets passing this context.  The packet header size
           is the sum of the size of all headers of a packet that are
           subject to compression for the used profile.  The mean value
           is given in byte rounded to the next integer value."
      ::= { rohcContextEntry 18 }

  rohcContextLastPacketsRatio OBJECT-TYPE
      SYNTAX      RohcCompressionRatio
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the compression ratio
           concerning the last 16 packets passing this context
           or concerning all packets passing this context
           if they are less than 16, so far.  The compression is
           computed over all bytes of the IP packets including the IP
           header but excluding all lower layer headers."
      ::= { rohcContextEntry 19 }

  rohcContextLastHeadersRatio OBJECT-TYPE
      SYNTAX      RohcCompressionRatio
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the compression ratio concerning the
           headers of the last 16 packets passing this context or
           concerning the headers of all packets passing this context
           if they are less than 16, so far.  The compression is
           computed over all bytes of all headers that are subject to
           compression for the used profile."
      ::= { rohcContextEntry 20 }

  rohcContextLastPacketsMeanSize OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the mean compressed packet size
           concerning the last 16 packets passing this context or
           concerning all packets passing this context if they are
           less than 16, so far.  The packet size includes the IP
           header and payload but excludes all lower layer headers.
           The mean value is given in byte rounded to the next
           integer value."
      ::= { rohcContextEntry 21 }

  rohcContextLastHeadersMeanSize OBJECT-TYPE
      SYNTAX      Unsigned32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
          "This object indicates the mean compressed packet header size
           concerning the last 16 packets passing this context or
           concerning all packets passing this context if they are
           less than 16, so far.  The packet header size is the sum of
           the size of all headers of a packet that are subject to
           compression for the used profile.  The mean value is given
           in byte rounded to the next integer value."
      ::= { rohcContextEntry 22 }

Okay conformance time πŸŽ€ This is the checklist section, and it's where the groups and compliance statements get sorted out. The "does not have to" lines are giving very chill, very optional energy 🫢

  --
  -- conformance information
  --

  rohcCompliances OBJECT IDENTIFIER ::= { rohcConformance 1 }
  rohcGroups      OBJECT IDENTIFIER ::= { rohcConformance 2 }

  --
  -- compliance statements
  --
  rohcCompliance MODULE-COMPLIANCE
      STATUS      current
      DESCRIPTION
          "The compliance statement for SNMP entities that implement
           the ROHC-MIB.

           Note that compliance with this compliance
           statement requires compliance with the
           ifCompliance3 MODULE-COMPLIANCE statement of the
           IF-MIB (RFC2863)."
      MODULE      -- this module
      MANDATORY-GROUPS {
              rohcInstanceGroup, rohcContextGroup
      }
      GROUP   rohcStatisticsGroup
      DESCRIPTION
         "A compliant implementation does not have to implement
          the rohcStatisticsGroup."
      GROUP   rohcTimerGroup
      DESCRIPTION
         "A compliant implementation does not have to implement
          the rohcTimerGroup."
      OBJECT  rohcInstanceContextStorageTime
      MIN-ACCESS  read-only
      DESCRIPTION
          "A compliant implementation does not have to support changing
           the value of object rohcInstanceContextStorageTime."
      OBJECT  rohcContextStorageTime
      MIN-ACCESS  read-only
      DESCRIPTION
          "A compliant implementation does not have to support changing
           the value of object rohcContextStorageTime."
      GROUP   rohcContextStatisticsGroup
      DESCRIPTION
         "A compliant implementation does not have to implement
          the rohcContextStatisticsGroup."
      ::= { rohcCompliances 1 }

  rohcInstanceGroup OBJECT-GROUP
      OBJECTS {
          rohcChannelType,
          rohcChannelFeedbackFor,
          rohcChannelDescr,
          rohcChannelStatus,
          rohcInstanceFBChannelID,
          rohcInstanceVendor,
          rohcInstanceVersion,
          rohcInstanceDescr,
          rohcInstanceClockRes,
          rohcInstanceMaxCID,
          rohcInstanceLargeCIDs,
          rohcInstanceMRRU,
          rohcInstanceStatus,
          rohcProfileVendor,
          rohcProfileVersion,
          rohcProfileDescr,
          rohcProfileNegotiated
      }
      STATUS      current
      DESCRIPTION
          "A collection of objects providing information about
           ROHC instances, used channels and available profiles."
      ::= { rohcGroups 2 }

  rohcStatisticsGroup OBJECT-GROUP
      OBJECTS {
          rohcInstanceContextsTotal,
          rohcInstanceContextsCurrent,
          rohcInstancePackets,
          rohcInstanceIRs,
          rohcInstanceIRDYNs,
          rohcInstanceFeedbacks,
          rohcInstanceCompressionRatio
      }
      STATUS      current
      DESCRIPTION
          "A collection of objects providing ROHC statistics."
      ::= { rohcGroups 4 }

  rohcContextGroup OBJECT-GROUP
      OBJECTS {
          rohcContextCIDState,
          rohcContextProfile,
          rohcContextDecompressorDepth
      }
      STATUS      current
      DESCRIPTION
          "A collection of objects providing information about
           ROHC compressor contexts and decompressor contexts."
      ::= { rohcGroups 5 }

  rohcTimerGroup OBJECT-GROUP
      OBJECTS {
          rohcInstanceContextStorageTime,
          rohcContextStorageTime,
          rohcContextActivationTime,
          rohcContextDeactivationTime

      }
      STATUS      current
      DESCRIPTION
          "A collection of objects providing statistical information
           about ROHC compressor contexts and decompressor contexts."
      ::= { rohcGroups 6 }

Okay so we're picking up right where the ROHC-MIB statistics group left off, and bestie, the MIB modules are where the whole protocol gets its SNMP-readable face πŸŽ€βœ¨

  rohcContextStatisticsGroup OBJECT-GROUP
      OBJECTS {
          rohcContextPackets,
          rohcContextIRs,
          rohcContextIRDYNs,
          rohcContextFeedbacks,
          rohcContextDecompressorFailures,
          rohcContextDecompressorRepairs,
          rohcContextAllPacketsRatio,
          rohcContextAllHeadersRatio,
          rohcContextAllPacketsMeanSize,
          rohcContextAllHeadersMeanSize,
          rohcContextLastPacketsRatio,
          rohcContextLastHeadersRatio,
          rohcContextLastPacketsMeanSize,
          rohcContextLastHeadersMeanSize
      }
      STATUS      current
      DESCRIPTION
          "A collection of objects providing statistical information
           about ROHC compressor contexts and decompressor contexts."
      ::= { rohcGroups 7 }

  END

Next up is the ROHC-UNCOMPRESSED-MIB πŸ¦‹ This one is all about the uncompressed profile, which is profile 0x0000. It's got a context table that extends the ROHC-MIB one, plus a couple of compliance statements and groups. Iconic. πŸ’…

   ROHC-UNCOMPRESSED-MIB DEFINITIONS ::= BEGIN

   IMPORTS
       MODULE-IDENTITY, OBJECT-TYPE, Counter32, mib-2
           FROM SNMPv2-SMI                               -- [RFC2578]

       MODULE-COMPLIANCE, OBJECT-GROUP
           FROM SNMPv2-CONF                              -- [RFC2580]

       rohcChannelID, rohcContextCID
           FROM ROHC-MIB;

   rohcUncmprMIB MODULE-IDENTITY
       LAST-UPDATED "200406030000Z"  -- June 3, 2004
       ORGANIZATION "IETF Robust Header Compression Working Group"
       CONTACT-INFO
          "WG charter:
             http://www.ietf.org/html.charters/rohc-charter.html

           Mailing Lists:
             General Discussion: rohc@ietf.org
             To Subscribe: rohc-request@ietf.org
             In Body: subscribe your_email_address

           Editor:
             Juergen Quittek
             NEC Europe Ltd.
             Network Laboratories
             Kurfuersten-Anlage 36
             69221 Heidelberg
             Germany
             Tel: +49 6221 90511-15
             EMail: quittek@netlab.nec.de"
       DESCRIPTION
           "This MIB module defines a set of objects for monitoring
            and configuring RObust Header Compression (ROHC).
            The objects are specific to ROHC uncompressed
            (profile 0x0000).

            Copyright (C) The Internet Society (2004). The
            initial version of this MIB module was published
            in RFC 3816. For full legal notices see the RFC
            itself or see:
            http://www.ietf.org/copyrights/ianamib.html"

       REVISION    "200406030000Z"  -- June 3, 2004
       DESCRIPTION "Initial version, published as RFC 3816."
       ::= { mib-2 113 }

   --
   -- The groups defined within this MIB module:
   --

   rohcUncmprObjects       OBJECT IDENTIFIER ::= { rohcUncmprMIB 1 }
   rohcUncmprConformance   OBJECT IDENTIFIER ::= { rohcUncmprMIB 2 }

   --
   -- Context Table
   --
   -- The rohcUncmprContextTable lists all contexts per interface
   -- and instance.  It extends the rohcContextTable.
   --

   rohcUncmprContextTable OBJECT-TYPE
       SYNTAX      SEQUENCE OF RohcUncmprContextEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "This table lists and describes ROHC uncompressed profile
            specific properties of compressor contexts and
            decompressor contexts.  It extends the rohcContextTable
            of the ROHC-MIB module."
       ::= { rohcUncmprObjects 1 }

   rohcUncmprContextEntry OBJECT-TYPE
       SYNTAX      RohcUncmprContextEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "An entry describing a particular context."
       INDEX {
           rohcChannelID,
           rohcContextCID
       }
       ::= { rohcUncmprContextTable 1 }

   RohcUncmprContextEntry ::= SEQUENCE {
       rohcUncmprContextState         INTEGER,
       rohcUncmprContextMode          INTEGER,
       rohcUncmprContextACKs          Counter32
   }

   rohcUncmprContextState OBJECT-TYPE
       SYNTAX      INTEGER {
                       initAndRefresh(1),
                       normal(2),
                       noContext(3),
                       fullContext(4)
                   }

       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "State of the context. States initAndRefresh(1) and normal(2)
            are states of compressor contexts, states noContext(3)
            and fullContext(4) are states of decompressor contexts."
       REFERENCE
           "RFC 3095, Section 5.10.3"

       ::= { rohcUncmprContextEntry 3 }

   rohcUncmprContextMode OBJECT-TYPE
       SYNTAX      INTEGER {
                       unidirectional(1),
                       bidirectional(2)
                   }
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "Mode of the context."
       REFERENCE
           "RFC 3095, Section 5.10.3"
       ::= { rohcUncmprContextEntry 4 }

   rohcUncmprContextACKs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The number of all positive feedbacks (ACK) sent or
            received in this context, respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB."
       REFERENCE
           "RFC 3095, Section 5.2.1"
       ::= { rohcUncmprContextEntry 5 }

   --
   -- conformance information
   --

   rohcUncmprCompliances OBJECT IDENTIFIER
       ::= { rohcUncmprConformance 1 }
   rohcUncmprGroups      OBJECT IDENTIFIER
       ::= { rohcUncmprConformance 2 }

   --
   -- compliance statements
   --

   rohcUncmprCompliance MODULE-COMPLIANCE

       STATUS      current
       DESCRIPTION
           "The compliance statement for SNMP entities that implement
            the ROHC-UNCOMPRESSED-MIB.

            Note that compliance with this compliance
            statement requires compliance with the
            rohcCompliance MODULE-COMPLIANCE statement of the
            ROHC-MIB and with the ifCompliance3 MODULE-COMPLIANCE
            statement of the IF-MIB (RFC2863)."
       MODULE      -- this module
       MANDATORY-GROUPS {
               rohcUncmprContextGroup
       }
       GROUP   rohcUncmprStatisticsGroup
       DESCRIPTION
          "A compliant implementation does not have to implement
           the rohcUncmprStatisticsGroup."
       ::= { rohcUncmprCompliances 1 }

   rohcUncmprContextGroup OBJECT-GROUP
       OBJECTS {
           rohcUncmprContextState,
           rohcUncmprContextMode
       }
       STATUS      current
       DESCRIPTION
           "A collection of objects providing information about
            ROHC uncompressed compressors and decompressors."
       ::= { rohcUncmprGroups 1 }

   rohcUncmprStatisticsGroup OBJECT-GROUP
       OBJECTS {
           rohcUncmprContextACKs
       }
       STATUS      current
       DESCRIPTION
           "An object providing context statistics."
       ::= { rohcUncmprGroups 2 }

   END

Now we're on to the ROHC-RTP-MIB 🌸 This one covers the RTP, UDP and ESP profiles from RFC 3095, plus the LLA profile from RFC 3242, so it's a big one with lots of columns. Let's go, bestie πŸš€

   ROHC-RTP-MIB DEFINITIONS ::= BEGIN

   IMPORTS
       MODULE-IDENTITY, OBJECT-TYPE,
       Unsigned32, Counter32, mib-2
           FROM SNMPv2-SMI                               -- [RFC2578]

       TruthValue
           FROM SNMPv2-TC                                -- [RFC2579]

       MODULE-COMPLIANCE, OBJECT-GROUP
           FROM SNMPv2-CONF                              -- [RFC2580]

       rohcChannelID, rohcContextCID
           FROM ROHC-MIB;                                -- [RFC3816]

   rohcRtpMIB MODULE-IDENTITY
       LAST-UPDATED "200406030000Z"  -- June 3, 2004
       ORGANIZATION "IETF Robust Header Compression Working Group"
       CONTACT-INFO
          "WG charter:
             http://www.ietf.org/html.charters/rohc-charter.html

           Mailing Lists:
             General Discussion: rohc@ietf.org
             To Subscribe: rohc-request@ietf.org
             In Body: subscribe your_email_address

           Editor:
             Juergen Quittek
             NEC Europe Ltd.
             Network Laboratories
             Kurfuersten-Anlage 36
             69221 Heidelberg
             Germany
             Tel: +49 6221 90511-15
             EMail: quittek@netlab.nec.de"
       DESCRIPTION
           "This MIB module defines a set of objects for monitoring
            and configuring RObust Header Compression (ROHC).
            The objects are specific to ROHC RTP (profile 0x0001),
            ROHC UDP (profile 0x0002), and ROHC ESP (profile 0x0003)
            defined in RFC 3095 and for the ROHC LLA profile (profile
            0x0005) defined in RFC 3242.

            Copyright (C) The Internet Society (2004). The
            initial version of this MIB module was published
            in RFC 3816. For full legal notices see the RFC
            itself or see:
            http://www.ietf.org/copyrights/ianamib.html"

       REVISION    "200406030000Z"  -- June 3, 2004
       DESCRIPTION "Initial version, published as RFC 3816."
       ::= { mib-2 114 }

   --
   -- The groups defined within this MIB module:
   --

   rohcRtpObjects       OBJECT IDENTIFIER ::= { rohcRtpMIB 1 }
   rohcRtpConformance   OBJECT IDENTIFIER ::= { rohcRtpMIB 2 }

   --
   -- Context Table
   --
   -- The rohcRtpContextTable lists all contexts per interface
   -- and instance.  It extends the rohcContextTable.
   --

   rohcRtpContextTable OBJECT-TYPE
       SYNTAX      SEQUENCE OF RohcRtpContextEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "This table lists and describes RTP profile specific
            properties of compressor contexts and decompressor
            contexts.  It extends the rohcContextTable of the
            ROHC-MIB module."
       ::= { rohcRtpObjects 1 }

   rohcRtpContextEntry OBJECT-TYPE
       SYNTAX      RohcRtpContextEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "An entry describing a particular context."
       INDEX {
           rohcChannelID,
           rohcContextCID
       }
       ::= { rohcRtpContextTable 1 }

   RohcRtpContextEntry ::= SEQUENCE {
       rohcRtpContextState             INTEGER,
       rohcRtpContextMode              INTEGER,
       rohcRtpContextAlwaysPad         TruthValue,
       rohcRtpContextLargePktsAllowed  TruthValue,
       rohcRtpContextVerifyPeriod      Unsigned32,
       rohcRtpContextSizesAllowed      Unsigned32,
       rohcRtpContextSizesUsed         Unsigned32,
       rohcRtpContextACKs              Counter32,
       rohcRtpContextNACKs             Counter32,
       rohcRtpContextSNACKs            Counter32,
       rohcRtpContextNHPs              Counter32,
       rohcRtpContextCSPs              Counter32,
       rohcRtpContextCCPs              Counter32,
       rohcRtpContextPktsLostPhysical  Counter32,
       rohcRtpContextPktsLostPreLink   Counter32
   }

   rohcRtpContextState OBJECT-TYPE
       SYNTAX      INTEGER {
                       initAndRefresh(1),
                       firstOrder(2),
                       secondOrder(3),
                       noContext(4),
                       staticContext(5),
                       fullContext(6)
                   }
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "State of the context as defined in RFC 3095.  States
            initAndRefresh(1), firstOrder(2), and secondOrder(3)
            are states of compressor contexts, states noContext(4),
            staticContext(5) and fullContext(6) are states of
            decompressor contexts."
       REFERENCE
           "RFC 3095"
       ::= { rohcRtpContextEntry 3 }

Okay, bestie, we're picking up right in the middle of the RTP context table, and the first thing on the list is the context mode πŸ¦‹ It's basically the lane the context is driving in: one-way, optimistic, or reliable πŸš—πŸ’¨

   rohcRtpContextMode OBJECT-TYPE
       SYNTAX      INTEGER {
                       unidirectional(1),
                       optimistic(2),
                       reliable(3)
                   }
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "Mode of the context."
       REFERENCE
           "RFC 3095, Section 4.4"
       ::= { rohcRtpContextEntry 4 }

Next up is the always-pad flag πŸŽ€ This one only shows up for the LLA profile (profile 0x0005, if you're keeping score). When it's true, the compressor pads every RHP packet with at least one octet of ROHC padding. For any other profile, the object is a total no-show ✨

   rohcRtpContextAlwaysPad OBJECT-TYPE
       SYNTAX      TruthValue
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "Boolean, only applicable to compressor contexts using the

            LLA profile.  If its value is true, the compressor must
            pad every RHP packet with a minimum of one octet ROHC
            padding.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 5.1.1"
       DEFVAL { false }
       ::= { rohcRtpContextEntry 5 }

Now the large-packets flag 🌸 It also belongs to LLA contexts only, and it decides what happens to packets that don't fit any of the preferred sizes. If it's true, the bigger packet goes out as-is with no segmentation. If it's false, the packet gets split into segments using the ROHC segmentation scheme, and each segment gets padded to fit one of the preferred sizes. Iconic behaviour, honestly πŸ’…

   rohcRtpContextLargePktsAllowed OBJECT-TYPE
       SYNTAX      TruthValue
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "Boolean, only applicable to compressor contexts using the
            LLA profile.  It specifies how to handle packets that do
            not fit any of the preferred packet sizes specified.  If
            its value is true, the compressor must deliver the larger
            packet as-is and must not use segmentation.  If it is set
            to false, the ROHC segmentation scheme must be used to
            split the packet into two or more segments, and each
            segment must further be padded to fit one of the preferred
            packet sizes.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 5.1.1"
       DEFVAL { true }
       ::= { rohcRtpContextEntry 6 }

Next is the verify period ⏰ Again, LLA-only. It sets how often a packet that validates the context has to show up, meaning a packet with a CRC field gets sent at least once every N packets. A value of 0 means the periodic verifications are turned off, so nothing is forced 🫢

   rohcRtpContextVerifyPeriod OBJECT-TYPE
       SYNTAX      Unsigned32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to compressor contexts
            using the LLA profile.  It specifies the minimum frequency
            with which a packet validating the context must be sent.
            This tells the compressor that a packet containing a CRC
            field must be sent at least once every N packets, where N
            is the value of the object.  A value of 0 indicates that
            periodical verifications are disabled.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 5.1.1"
       DEFVAL { 0 }
       ::= { rohcRtpContextEntry 7 }

The next two objects are decompressor-only 🧚 Compressor contexts don't get them at all. The first one counts how many different packet sizes the context is allowed to use.

   rohcRtpContextSizesAllowed  OBJECT-TYPE
       SYNTAX      Unsigned32 (1..4294967295)
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The value of this object is only valid for decompressor
            contexts, i.e., if rohcInstanceType of the corresponding
            rohcContextEntry has the value decompressor(2).  For
            compressor contexts where rohcInstanceType has the value
            compressor(1), this object MUST NOT be instantiated.

            This object contains the number of different packet sizes
            that may be used in the context."
       REFERENCE
           "RFC 3095, Section 6.3.1"
       ::= { rohcRtpContextEntry 8 }

And its sibling counts how many of those sizes are actually in use πŸ“Š

   rohcRtpContextSizesUsed  OBJECT-TYPE
       SYNTAX      Unsigned32 (1..4294967295)
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The value of this object is only valid for decompressor
            contexts, i.e., if rohcInstanceType of the corresponding
            rohcContextEntry has the value decompressor(2).  For
            compressor contexts where rohcInstanceType has the value
            compressor(1), this object MUST NOT be instantiated.

            This object contains the number of different packet sizes
            that are used in the context."
       REFERENCE
           "RFC 3095, Section 6.3.1"
       ::= { rohcRtpContextEntry 9 }

Now the feedback counters πŸ’Œ First up is ACKs, the positive feedback. These are counted per context, and the counter can reset on re-initialization of the management system, or whenever ifCounterDiscontinuityTime says so. To check that, you need the interface index, which you can get from the rohcChannelTable of the ROHC-MIB.

   rohcRtpContextACKs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The number of all positive feedbacks (ACK) sent or
            received in this context, respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB."
       REFERENCE
           "RFC 3095, Section 5.2.1."
       ::= { rohcRtpContextEntry 10 }

NACKs come next, and they're the dynamic negative feedbacks. The same discontinuity rules apply here, so the same interface index trick does too πŸ™ˆ

   rohcRtpContextNACKs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The number of all dynamic negative feedbacks (ACK) sent
            or received in this context, respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB."
       REFERENCE
           "RFC 3095, Section 5.2.1."
       ::= { rohcRtpContextEntry 11 }

SNACKs are the static negative feedbacks, and they follow the exact same counting and discontinuity pattern πŸ’œ

   rohcRtpContextSNACKs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "The number of all static negative feedbacks (ACK) sent
            or received in this context, respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB."
       REFERENCE
           "RFC 3095, Section 5.2.1."
       ::= { rohcRtpContextEntry 12 }

The next batch is all LLA-only again 🌈 NHPs are no-header packets. This counter tallies how many of them were sent or received in the context.

   rohcRtpContextNHPs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to contexts using the
            LLA profile.  It contains the number of all no-header
            packets (NHP) sent or received in this context,
            respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 4.1.1."
       ::= { rohcRtpContextEntry 13 }

CSPs are context synchronization packets, and this counter tracks how many were sent or received πŸ”₯

   rohcRtpContextCSPs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to contexts using the
            LLA profile.  It contains the number of all context
            synchronization packets (CSP) sent or received in this
            context, respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 4.1.2."
       ::= { rohcRtpContextEntry 14 }

CCPs are context check packets, and this one counts those the same way 🧁

   rohcRtpContextCCPs OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to contexts using the
            LLA profile.  It contains the number of all context check
            packets (CCP) sent or received in this context,
            respectively.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 4.1.3."
       ::= { rohcRtpContextEntry 15 }

Last one in this batch, and it's a decompressor-side LLA counter 🌟 It counts the physical packet losses on the link between compressor and decompressor, but only the ones that were indicated to the decompressor.

   rohcRtpContextPktsLostPhysical OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to decompressor contexts

            using the LLA profile.  It contains the number of physical
            packet losses on the link between compressor and
            decompressor, that have been indicated to the decompressor.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 5.1.2."
       ::= { rohcRtpContextEntry 16 }
   rohcRtpContextPktsLostPreLink OBJECT-TYPE
       SYNTAX      Counter32
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to decompressor contexts
            using the LLA profile.  It contains the number of pre-link
            packet losses on the link between compressor and
            decompressor, that have been indicated to the decompressor.

            Discontinuities in the value of this counter can
            occur at re-initialization of the management
            system, and at other times as indicated by the
            value of ifCounterDiscontinuityTime.  For checking
            ifCounterDiscontinuityTime, the interface index is
            required.  It can be determined by reading the
            rohcChannelTable of the ROHC-MIB.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
           "RFC 3242, Section 5.1.2."
       ::= { rohcRtpContextEntry 17 }

Okay so this counter is the pre-link loss tally, and it's only a thing for LLA profile decompressors bestie πŸ¦‹ If your rohcProfile is anything other than 0x0005, this one is a total no-show and the object MUST NOT be instantiated πŸ’…

Now the packet sizes table, which is giving main character energy πŸŽ€ It lists the allowed, preferred and used packet sizes for each compressor context and channel ✨

   --
   -- Packet Sizes Table
   --
   -- The rohcPacketSizeTable lists allowed, preferred, and used
   -- packet sizes per compressor context.

   rohcRtpPacketSizeTable OBJECT-TYPE
       SYNTAX      SEQUENCE OF RohcRtpPacketSizeEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "This table lists all allowed, preferred, and used packet
            sizes per compressor context and channel.

            Note, that the sizes table represents implementation
            parameters that are suggested by RFC 3095 and/or RFC 3242,
            but that are not mandatory."
       ::= { rohcRtpObjects 2 }

   rohcRtpPacketSizeEntry OBJECT-TYPE
       SYNTAX      RohcRtpPacketSizeEntry
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "An entry of a particular packet size."
       INDEX {
           rohcChannelID,
           rohcContextCID,
           rohcRtpPacketSize
       }
       ::= { rohcRtpPacketSizeTable 1 }

   RohcRtpPacketSizeEntry ::= SEQUENCE {
       rohcRtpPacketSize                Unsigned32,
       rohcRtpPacketSizePreferred       TruthValue,
       rohcRtpPacketSizeUsed            TruthValue,
       rohcRtpPacketSizeRestrictedType  INTEGER
   }

   rohcRtpPacketSize OBJECT-TYPE
       SYNTAX      Unsigned32 (1..4294967295)
       MAX-ACCESS  not-accessible
       STATUS      current
       DESCRIPTION
           "A packet size used as index."
       ::= { rohcRtpPacketSizeEntry 3 }

   rohcRtpPacketSizePreferred OBJECT-TYPE

       SYNTAX      TruthValue
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to compressor contexts
            using the LLA profile.  When retrieved, it will have
            the value true(1) if the packet size is preferred.
            Otherwise, its value will be false(2).

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
            "RFC 3242, Section 5.1.1"
       ::= { rohcRtpPacketSizeEntry 4 }

   rohcRtpPacketSizeUsed OBJECT-TYPE
       SYNTAX      TruthValue
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to compressor contexts
            using the UDP, RTP, or ESP profile.  When retrieved,
            it will have the value true(1) if the packet size is
            used.  Otherwise, its value will be false(2).

            The value of this object is only valid for UDP, RTP,
            and ESP profiles, i.e., if the corresponding rohcProfile
            has a value of either 0x0001, 0x0002 or 0x0003.  If
            the corresponding rohcProfile has a value other than
            0x0001, 0x0002 or 0x0003, then this object MUST NOT be
            instantiated."
       REFERENCE
            "RFC 3095, Section 6.3.1"
       ::= { rohcRtpPacketSizeEntry 5 }

   rohcRtpPacketSizeRestrictedType OBJECT-TYPE
       SYNTAX      INTEGER {
                       nhpOnly(1),
                       rhpOnly(2),
                       noRestrictions(3)
                   }
       MAX-ACCESS  read-only
       STATUS      current
       DESCRIPTION
           "This object is only applicable to preferred packet

            sizes of compressor contexts using the LLA profile.
            When retrieved, it will indicate whether the packet
            size is preferred for NHP only, for RHP only, or
            for both of them.

            The value of this object is only valid for LLA profiles,
            i.e., if the corresponding rohcProfile has a value of
            0x0005.  If the corresponding rohcProfile has a value
            other than 0x0005, then this object MUST NOT be
            instantiated."
       REFERENCE
            "RFC 3242, Section 5.1.1"
       ::= { rohcRtpPacketSizeEntry 6 }
   --
   -- conformance information
   --

   rohcRtpCompliances OBJECT IDENTIFIER ::= { rohcRtpConformance 1 }
   rohcRtpGroups      OBJECT IDENTIFIER ::= { rohcRtpConformance 2 }

   --
   -- compliance statements
   --

   rohcRtpCompliance MODULE-COMPLIANCE
       STATUS      current
       DESCRIPTION
           "The compliance statement for SNMP entities that implement
            the ROHC-RTP-MIB.

            Note that compliance with this compliance
            statement requires compliance with the
            rohcCompliance MODULE-COMPLIANCE statement of the
            ROHC-MIB and with the ifCompliance3 MODULE-COMPLIANCE
            statement of the IF-MIB (RFC2863)."
       MODULE      -- this module
       MANDATORY-GROUPS {
               rohcRtpContextGroup
       }
       GROUP   rohcRtpPacketSizesGroup
       DESCRIPTION
          "A compliant implementation does not have to implement
           the rohcRtpPacketSizesGroup."
       GROUP   rohcRtpStatisticsGroup
       DESCRIPTION
          "A compliant implementation does not have to implement
           the rohcRtpStatisticsGroup."
       ::= { rohcRtpCompliances 1 }

   rohcRtpContextGroup OBJECT-GROUP
       OBJECTS {
           rohcRtpContextState,
           rohcRtpContextMode,
           rohcRtpContextAlwaysPad,
           rohcRtpContextLargePktsAllowed,
           rohcRtpContextVerifyPeriod
       }
       STATUS      current
       DESCRIPTION
           "A collection of objects providing information about
            ROHC RTP compressors and decompressors."
       ::= { rohcRtpGroups 1 }

   rohcRtpPacketSizesGroup OBJECT-GROUP
       OBJECTS {
           rohcRtpContextSizesAllowed,
           rohcRtpContextSizesUsed,
           rohcRtpPacketSizePreferred,
           rohcRtpPacketSizeUsed,
           rohcRtpPacketSizeRestrictedType
       }
       STATUS      current
       DESCRIPTION
           "A collection of objects providing information about
            allowed and used packet sizes at a ROHC RTP compressor."
       ::= { rohcRtpGroups 2 }

   rohcRtpStatisticsGroup OBJECT-GROUP
       OBJECTS {
           rohcRtpContextACKs,
           rohcRtpContextNACKs,
           rohcRtpContextSNACKs,
           rohcRtpContextNHPs,
           rohcRtpContextCSPs,
           rohcRtpContextCCPs,
           rohcRtpContextPktsLostPhysical,
           rohcRtpContextPktsLostPreLink
       }
       STATUS      current
       DESCRIPTION
           "A collection of objects providing ROHC compressor and
            decompressor statistics."
       ::= { rohcRtpGroups 3 }

   END

6. Security Considerations πŸ”

Okay bestie, security time and we're taking it seriously 😀 The managed objects in the ROHC-MIB, the ROHC-UNCOMPRESSED-MIB and the ROHC-RTP-MIB don't have a MAX-ACCESS of read-write or read-create, with one exception. rohcInstanceContextStorageTime and rohcContextStorageTime are both read-write, and they control how long context information sticks around after a context terminates. If someone sneaks in and sets them too low, like to zero, past context info might get lost πŸ’€ If they're set super high, nothing ever gets deleted and the agent's memory use could go through the roof. The good news is that unauthorized access to these objects can't hurt existing ROHC connections, and it can't be used to mess with running ROHC instances in a malicious way 🫢

The other thing to watch is unauthorized access to the readable objects, since those reveal info about existing communication sessions. So it's important to lock down even GET and/or NOTIFY access, and possibly encrypt the values when they travel over the network via SNMP πŸ”’ The only thing that might leak is which channels are in use. Users and their addresses aren't visible in the MIB at all. That info can only be misused alongside other information, so it's not the end of the world on its own 🌸

Also, SNMP versions before SNMPv3 didn't have adequate security. Even if the network itself is secure, for example by using IPSec, there's still no control over who on that secure network can access and GET or SET (read, change, create or delete) the objects in this MIB module 😭

It is RECOMMENDED that implementers consider the security features provided by the SNMPv3 framework (see [RFC3410], section 8), including full support for the SNMPv3 cryptographic mechanisms for authentication and privacy πŸŽ€ And deploying SNMP versions prior to SNMPv3 is NOT RECOMMENDED. Instead, it is RECOMMENDED to deploy SNMPv3 and enable cryptographic security. It's then the customer or operator's responsibility to make sure the SNMP entity giving access to an instance of this MIB module is configured so only the principals (users) with legitimate rights can GET or SET (change, create or delete) the objects πŸ‘‘

7. Acknowledgements 🫢

Huge thanks to Lars-Erik Jonsson and Mark West for guiding everyone through the ROHC world 🧚 Thanks also to Ghyslain Pelletier for explaining how the ROHC LLA profile works πŸ’œ Frank Strauss gets a shoutout for his help with the tricky SMI issues ✨ And a special, extra-big thank you to Mike Heard, who acted as MIB doctor, studied every tiny detail, raised a long list of issues and helped make this document so much better 🌈

8. References πŸ“š

8.1. Normative References πŸ“šβœ¨

Okay bestie, here's the must-read list πŸ’…. These are the documents the spec leans on, so you need them to follow the rest.

[RFC2578] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Structure of Management Information Version 2 (SMIv2)", STD 58, RFC 2578, April 1999.

[RFC2579] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.

[RFC2580] McCloghrie, K., Perkins, D., and J. Schoenwaelder, "Conformance Statements for SMIv2", STD 58, RFC 2580, April 1999.

[RFC2863] McCloghrie, K. and F. Kastenholz, "The Interfaces Group MIB", RFC 2863, June 2000.

[RFC3095] Bormann, C., Burmeister, C., Degermark, M., Fukushima, H., Hannu, H., Jonsson, L., Hakenberg, R., Koren, T., Le, K., Liu, Z., Martensson, A., Miyazaki, A., Svanbro, K., Wiebke, T., Yoshimura, T., and H. Zheng, "RObust Header Compression (ROHC): Framework and four profiles: RTP, UDP, ESP, and uncompressed", RFC 3095, July 2001. 🌸

[RFC3242] Jonsson, L. and G. Pelletier, "RObust Header Compression (ROHC): A Link-Layer Assisted Profile for IP/UDP/RTP", RFC 3242, April 2002.

[RFC3411] Harrington, D., Presuhn, R., and B. Wijnen, "An Architecture for Describing Simple Network Management Protocol (SNMP) Management Frameworks", STD 62, RFC 3411, December 2002.

[RFC3759] Jonsson, L., "RObust Header Compression (ROHC): Terminology and Channel Mapping Examples", RFC 3759, April 2004.

8.2. Informative References πŸ¦‹

[RFC3410] Case, J., Mundy, R., Partain, D., and B. Stewart, "Introduction and Applicability Statements for Internet-Standard Management Framework", RFC 3410, December 2002.

9. Authors' Addresses πŸ’Œ

Here's who wrote it, and how to reach them if you're feeling brave 🧚

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

Phone: +49 6221 90511-15
EMail: quittek@netlab.nec.de


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

Phone: +49 6221 90511-13
EMail: stiemerling@netlab.nec.de


Hannes Hartenstein
University of Karlsruhe
Computing Center and Institute of Telematics
76128 Karlsruhe
Germany

Phone: +49 721 608 8104
EMail: hartenstein@rz.uni-karlsruhe.de

Copyright (C) The Internet Society (2004). This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights. πŸ’œ

This document and the information contained herein are provided 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. 😭

Intellectual Property 🌈

Okay so the IETF is not picking a side on whether any Intellectual Property Rights might cover the tech in here, or whether you could get a license for them. It also hasn't checked for any of those rights itself πŸ™ˆ For the rules on rights in RFC documents, look in BCP 78 and BCP 79.

Copies of IPR disclosures sent to the IETF Secretariat, plus any promises of licenses, or the results of any attempt to get a general license or permission to use those rights for implementers or users of this spec, can be found in the IETF's online IPR repository at http://www.ietf.org/ipr. πŸ“‚

The IETF invites anyone to flag any copyrights, patents, patent applications, or other proprietary rights that might cover technology needed to implement this standard. Send that info to the IETF at ietf-ipr@ietf.org. πŸ’…

Acknowledgement 🫢

Funding for the RFC Editor function is currently provided by the Internet Society. ⭐

πŸ“¦ where this page comes from