OTP-SNMPEA-MIB(7)

πŸ“¦
version 25.3.2.8 Β· 3 versions
, in debian bookworm, ubuntu jammy, ubuntu noble

πŸ’– NAME πŸ’–

OTP-SNMPEA-MIB β€” the Erlang/OTP MIB module for the SNMPEA component in OTP. 🫢 This is the MIB manual page for OTP-SNMPEA-MIB(7), and I'm folding that header info right here so we can skip the triple-repeat title line, iykyk.


✨ DESCRIPTION ✨

okay so bestie, this page is literally the MIB module definition for the SNMPEA component in OTP. It's giving DEFINITIONS ::= BEGIN energy, and because this is literal MIB code, I'm keeping every token, OID, revision, and DESCRIPTION string exactly as-is in code blocks. No cap. The commentary is me; the code is sacred. πŸŽ€

πŸ¦‹ imports, module identity, and revision lore πŸ¦‹

OTP-SNMPEA-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE,
    Integer32, IpAddress
        FROM SNMPv2-SMI
    DisplayString, RowStatus, StorageType
        FROM SNMPv2-TC
    MODULE-COMPLIANCE, OBJECT-GROUP
        FROM SNMPv2-CONF
    otpModules, otpApplications
        FROM OTP-REG
    ;

otpSnmpeaModule MODULE-IDENTITY
    LAST-UPDATED  "0305130000Z"
    ORGANIZATION  "Ericsson"
    CONTACT-INFO
        "Contact:  Erlang Support see license agreement for Erlang/OTP."
    DESCRIPTION
        "This MIB module defines MIB objects for the SNMPEA
        component in OTP."

    REVISION    "0305130000Z"
    DESCRIPTION
        "Changed CONTACT-INFO as it was outdated, made it more generic
     to avoid such changes in the future."

    REVISION    "9808280000Z"
    DESCRIPTION
        "Since there are standard MIBs in the SNMPv3 framework that
        implements the functionality defined in this MIB, all objects in
        this MIB is now obsolete.  There are still a few OID assignments
        defined in this MIB.

        Removed intCommunityTable; replaced by snmpCommunityTable in
        SNMP-COMMUNITY-MIB.

        Removed intAddressTable; replaced by SNMP-TARGET-MIB.

     Removed intAgentMaxPacketSize, replaced by snmpEngineMaxPacketSize
        in SNMP-FRAMEWORK-MIB.

        Removed intAgentIpAddress and intAgentUDPPort.

        Removed intViewTable, replaced by SNMP-VIEW-BASED-ACM-MIB."

    REVISION    "9804160000Z"
    DESCRIPTION
        "Updated to support MIBs from SNMPv3.  Since SNMPv3 standardizes
        some of the functionality provided by this MIB, we're using the
        standard instead.

        Removed intTrapDestTable; replaced by SNMP-TARGET-MIB and
     SNMP-NOTIFICATION-MIB."

    REVISION    "9709220900Z"
    DESCRIPTION
        "The initial version of this MIB module.  It is the old
        INTERNAL-MIB renamed."
    ::= { otpModules 5 }

otpSnmpeaMIB    OBJECT IDENTIFIER ::= { otpApplications 3 }
otpSnmpeaMIBConformance
                OBJECT IDENTIFIER ::= { otpSnmpeaMIB 1 }
otpSnmpeaMIBObjects
                OBJECT IDENTIFIER ::= { otpSnmpeaMIB 2 }

snmpeaAdm       OBJECT IDENTIFIER ::= { otpSnmpeaMIBObjects 1}
community       OBJECT IDENTIFIER ::= { snmpeaAdm 1 }
trap            OBJECT IDENTIFIER ::= { snmpeaAdm 2 }
view            OBJECT IDENTIFIER ::= { snmpeaAdm 3 }

okay so the module identity is doing the absolute most: LAST-UPDATED is 0305130000Z, ORGANIZATION is Ericsson, and CONTACT-INFO says Contact: Erlang Support see license agreement for Erlang/OTP. The revision stack is right there in the code, including the 9808280000Z note that all objects in this MIB are now obsolete because SNMPv3 has standard MIBs for the same functionality β€” but there are still a few OID assignments defined here. It also lists the removals/replacements: intCommunityTable got replaced by snmpCommunityTable in SNMP-COMMUNITY-MIB; intAddressTable got replaced by SNMP-TARGET-MIB; intAgentMaxPacketSize got replaced by snmpEngineMaxPacketSize in SNMP-FRAMEWORK-MIB; intAgentIpAddress and intAgentUDPPort got removed; and intViewTable got replaced by SNMP-VIEW-BASED-ACM-MIB. The 9804160000Z revision says intTrapDestTable got replaced by SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB. And 9709220900Z is the initial version β€” the old INTERNAL-MIB renamed. Periodt. πŸ’…

πŸŽ€ the obsolete Administration Group: intCommunityTable πŸŽ€

-- Obsolete objects

-- The Administration Group
--
-- This group consists of objects to configure the access for
-- managers to the MIB tree.
--
-- These objects were previously defined in INTERNAL-MIB

intCommunityTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF IntCommunityEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "This table defines access for the different
        communities.

        When a request comes from a certain ip address,
        referring to a community string, the mib view
        and access corresponding to these are looked up
        in this table. Then the operation is validatated against
        the access, and all requested objects validated against
        the mib view."
    ::= { community 1 }

intCommunityEntry OBJECT-TYPE
    SYNTAX      IntCommunityEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        ""
    INDEX   { intCommunityDestination, intCommunityString }
    ::= { intCommunityTable 1 }

IntCommunityEntry ::=
    SEQUENCE {
      intCommunityDestination   IpAddress,
      intCommunityString        DisplayString,
      intCommunityViewIndex     Integer32,
      intCommunityAccess        INTEGER,
      intCommunityStatus        RowStatus
    }

intCommunityDestination OBJECT-TYPE
    SYNTAX      IpAddress
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "The ip address of a management station. The special
        ip address {0.0.0.0} is a wildcard, meaning all possible
        ip addresses. In this way, access can be granted to all
        ip addressed for some communities."
    ::= { intCommunityEntry 1 }

intCommunityString OBJECT-TYPE
    SYNTAX      DisplayString
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "The community string, defining the community."
    ::= { intCommunityEntry 2 }

intCommunityViewIndex OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "Identifies a mib view.  Index into the
        intViewTable."
    ::= { intCommunityEntry 3 }

intCommunityAccess OBJECT-TYPE
    SYNTAX      INTEGER { read(1), readWrite(2) }
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "Defines which operations the manager can perform
        on the objects in the mib view."
    ::= { intCommunityEntry 4 }

intCommunityStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The status of this conceptual row in the
        intCommunityTable."
    ::= { intCommunityEntry 5 }

This whole -- Obsolete objects chunk is the Administration Group, and every row is STATUS obsolete, bestie. It's the old intCommunityTable setup: intCommunityDestination, intCommunityString, intCommunityViewIndex, intCommunityAccess with read(1) / readWrite(2), and intCommunityStatus. The wildcard IP is literally {0.0.0.0}, meaning all possible IP addresses; the table description says requests get looked up by IP address + community string, then the operation is validated against the access and all requested objects are validated against the MIB view. (Yes, validatated is in the original and I'm keeping it. Character-for-character, no cap.) πŸŽ€

🌸 agent + address table era 🌸

intAgentIpAddress OBJECT-TYPE
    SYNTAX      IpAddress
    MAX-ACCESS  read-only
    STATUS      obsolete
    DESCRIPTION
        "The IP address of this agent."
    ::= { community 2 }

intAgentUDPPort OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-only
    STATUS      obsolete
    DESCRIPTION
        "The UDP port the agent listens to."
    ::= { community 3 }

intAgentMaxPacketSize OBJECT-TYPE
    SYNTAX      Integer32 (484..65535)
    MAX-ACCESS  read-only
    STATUS      obsolete
    DESCRIPTION
        "The maximum packet size in bytes this agent will send to a
        manager."
    ::= { community 4 }

intAddressTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF IntAddressEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "This table holds UDP related information on each known
        management station."
    ::= { community 5 }

intAddressEntry OBJECT-TYPE
    SYNTAX      IntAddressEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        ""
    INDEX   { intAddressDestination }
    ::= { intAddressTable 1 }

IntAddressEntry ::=
    SEQUENCE {
      intAddressDestination     IpAddress,
      intAddressUDPPort         Integer32,
      intAddressMaxPacketSize   Integer32 (484..65535),
      intAddressStatus          RowStatus
    }

intAddressDestination OBJECT-TYPE
    SYNTAX      IpAddress
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "The ip address of the management station."
    ::= { intAddressEntry 1 }

intAddressUDPPort OBJECT-TYPE
    SYNTAX      Integer32
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The UDP port to which traps will be sent to
        this destination."
    DEFVAL { 162 }
    ::= { intAddressEntry 2 }

intAddressMaxPacketSize OBJECT-TYPE
    SYNTAX      Integer32 (484..65535)
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The maximum packet size in bytes for Messages
        sent to this destination.  The max size of a packet
        sent to this destination will be the minumim of
        this variable and agentMaxPacketSize.0."
    ::= { intAddressEntry 3 }

intAddressStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The status of this conceptual row in the
        intAddressTable."
    ::= { intAddressEntry 4 }

Next up: intAgentIpAddress, intAgentUDPPort, and intAgentMaxPacketSize (range 484..65535), then the intAddressTable crew. intAddressUDPPort has DEFVAL { 162 }, and intAddressMaxPacketSize is also 484..65535 with that note that the max packet size to a destination is the minumim (spelling preserved, not me fixing it) of this variable and agentMaxPacketSize.0. Iconic. ✨

πŸ”₯ trap destination table πŸ”₯

intTrapDestTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF IntTrapDestEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "The intTrapDestTable defines to which destination all traps
        for a specific community should be sent."
    ::= { trap 1 }

intTrapDestEntry OBJECT-TYPE
    SYNTAX      IntTrapDestEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        ""
    INDEX   { intTrapDestCommunityString, intTrapDestDestination }
    ::= { intTrapDestTable 1 }

IntTrapDestEntry ::=
    SEQUENCE {
      intTrapDestCommunityString    DisplayString,
      intTrapDestDestination        IpAddress,
      intTrapDestStatus             RowStatus,
      intTrapDestSnmpVersion        INTEGER
    }

intTrapDestCommunityString OBJECT-TYPE
    SYNTAX      DisplayString (SIZE (0..255))
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        ""
    ::= { intTrapDestEntry 1 }

intTrapDestDestination OBJECT-TYPE
    SYNTAX      IpAddress
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        ""
    ::= { intTrapDestEntry 2 }

intTrapDestStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The status of this conceptual row in the
        intTrapDestTable."
    ::= { intTrapDestEntry 3 }

intTrapDestSnmpVersion OBJECT-TYPE
    SYNTAX      INTEGER { v1(1), v2(2) }
    MAX-ACCESS  read-create
    STATUS      obsolete
    DESCRIPTION
        "The SNMP version of the manager.  If it is v1,
        SNMPv1Traps are sent.  If it is v2, SNMPv2Traps are sent"
    ::= { intTrapDestEntry 4 }

intTrapDestTable defines to which destination all traps for a specific community should be sent. The index is intTrapDestCommunityString + intTrapDestDestination, and intTrapDestSnmpVersion is INTEGER { v1(1), v2(2) } β€” if it's v1, SNMPv1Traps are sent; if it's v2, SNMPv2Traps are sent. There is literally no period at the end of that MIB sentence, and I am not adding one. Respect the code. πŸ™ˆ

🧚 intViewTable starts here 🧚

intViewTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF IntViewEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    DESCRIPTION
        "Locally held information about the MIB views
        known to this agent.

        Each MIB view is defined by two
        collections of view subtrees: the included view
        subtrees, and the excluded view subtrees.  Every
        such subtree, both included and excluded, is
        defined in this table.

and this is where part 1 stops: intViewTable is starting to explain locally held information about the MIB views known to this agent, with each MIB view defined by included view subtrees and excluded view subtrees, and then the chunk ends at defined in this table. Part 2 is literally the next chunk, bestie. πŸ¦‹

...and honestly bestie, this is the part where the matching actually happens, so lock in. πŸ”

To figure out if a particular object instance is in a particular MIB view, you compare the object instance's OBJECT IDENTIFIER with each of the MIB view's entries in this table. If none of them match β€” congrats, that object instance is not in the MIB view. If one or more match, then the object instance is either included in or excluded from the MIB view depending on the value of viewType in the entry whose viewSubtree value has the most sub-identifiers. And if multiple entries match and have the same number of sub-identifiers? Then the lexicographically greatest instance of viewType calls it. Tiebreaker drama, but make it lexicographic. πŸ‘‘

An object instance's OBJECT IDENTIFIER X matches an entry in this table when:

  • the number of sub-identifiers in X is at least as many as in the value of viewSubtree for the entry, and
  • each sub-identifier in the value of viewSubtree matches its corresponding sub-identifier in X.

Two sub-identifiers match either if the corresponding bit of viewMask is zero (the 'wild card' value), or if they're equal. That's it, that's the whole vibe check. βœ…

Because of this 'wild card' capability, we introduce the term a 'family' of view subtrees, meaning the set of subtrees defined by a particular combination of values of viewSubtree and viewMask. In the case where no 'wild card' is defined in viewMask, the family of view subtrees reduces to a single view subtree. Shrinks down to one, no cap.

::= { view 1 }

🫢 intViewEntry

intViewEntry OBJECT-TYPE
    SYNTAX      IntViewEntry
    MAX-ACCESS  not-accessible
    STATUS      obsolete
    INDEX   { intViewIndex, intViewSubtree }
    ::= { intViewTable 1 }

The description on this one is literally: "Information on a particular family of view subtrees included in or excluded from a particular MIB view." Which is giving very much core concept energy. πŸ’…

And then a rule for implementers, pay attention: implementations must not restrict the number of families of view subtrees for a given MIB view, except as dictated by resource constraints on the overall number of entries in the viewTable. So like, no artificial limits β€” only the actual physical ones, bestie.

IntViewEntry ::=
    SEQUENCE {
      intViewIndex          Integer32,
      intViewSubtree        OBJECT IDENTIFIER,
      intViewMask           OCTET STRING,
      intViewType           INTEGER,
      intViewStorageType    StorageType,
      intViewStatus         RowStatus
    }

🌸 intViewIndex

SYNTAX      Integer32 (1..65535)
MAX-ACCESS  not-accessible
STATUS      obsolete
::= { intViewEntry 1 }

A unique value for each MIB view. And it has to stay constant at least from one re-initialization of the entity's network management system to the next re-initialization. Consistency era. πŸŽ€

πŸ¦‹ intViewSubtree

SYNTAX      OBJECT IDENTIFIER
MAX-ACCESS  not-accessible
STATUS      obsolete
::= { intViewEntry 2 }

A MIB subtree. That's the whole description. Short king. πŸ‘‘

🧚 intViewMask

SYNTAX      OCTET STRING (SIZE (0..16))
MAX-ACCESS  read-create
STATUS      obsolete
DEFVAL      { ''H }
::= { intViewEntry 3 }

Okay this one is the main character of the table, and its description is a whole essay, so listen up. πŸ“–

The bit mask which, in combination with the corresponding instance of viewSubtree, defines a family of view subtrees.

Every single bit of this bit mask corresponds to a sub-identifier of viewSubtree, and the mapping is:

  • the most significant bit of the i-th octet of this octet string value (extended if necessary, see below) corresponds to the (8*i - 7)-th sub-identifier
  • the least significant bit of the i-th octet of this octet string corresponds to the (8*i)-th sub-identifier
  • where i is in the range 1 through 16

Each bit specifies whether or not the corresponding sub-identifiers must match when determining if an OBJECT IDENTIFIER is in this family of view subtrees:

  • a '1' means an exact match must occur
  • a '0' means 'wild card', i.e., any sub-identifier value matches

So, the OBJECT IDENTIFIER X of an object instance is contained in a family of view subtrees if the following criteria are met β€” for each sub-identifier of the value of viewSubtree, either:

 the i-th bit of viewMask is 0, or

 the i-th sub-identifier of X is equal to
 the i-th sub-identifier of the value of
 viewSubtree.

One extension rule, don't miss it: if the value of this bit mask is M bits long and there are more than M sub-identifiers in the corresponding instance of viewSubtree, then the bit mask is extended with 1's to be the required length. Pad it out with ones, periodt. ✨

Note: when the value of this object is the zero-length string, this extension rule results in a mask of all-1's being used (i.e., no 'wild card'), and the family of view subtrees is the one view subtree uniquely identified by the corresponding instance of viewSubtree. So the empty string is secretly the strictest option. Bet you didn't expect that. 😭

πŸ’œ intViewType

SYNTAX      INTEGER {
    included(1),
    excluded(2)
    }
MAX-ACCESS  read-create
STATUS      obsolete
DEFVAL      { included }
::= { intViewEntry 4 }

The status of a particular family of view subtrees within the particular MIB view:

  • included(1) β€” the corresponding instances of viewSubtree and viewMask define a family of view subtrees included in the MIB view
  • excluded(2) β€” the corresponding instances of viewSubtree and viewMask define a family of view subtrees excluded from the MIB view

In or out, bestie, there is no third option. πŸšͺ

🌈 intViewStorageType

SYNTAX      StorageType
MAX-ACCESS  read-create
STATUS      obsolete
DEFVAL      { nonVolatile }
::= { intViewEntry 5 }

The storage type for this conceptual row in the intViewTable. Default is nonVolatile, so it survives the reboot. Durable queen. 🫢

⭐ intViewStatus

SYNTAX      RowStatus
MAX-ACCESS  read-create
STATUS      obsolete
::= { intViewEntry 6 }

The status of this conceptual row in the intViewTable. That's it. Sometimes a description is just a description. πŸ’…


πŸ‘‘ CONFORMANCE INFORMATION

otpSnmpeaMIBCompliances
                OBJECT IDENTIFIER ::= { otpSnmpeaMIBConformance 1 }
otpSnmpeaMIBGroups
                OBJECT IDENTIFIER ::= { otpSnmpeaMIBConformance 2 }

πŸŽ€ COMPLIANCE STATEMENTS

otpSnmpeaBasicCompliance MODULE-COMPLIANCE
    STATUS  obsolete
    MODULE  -- this module
        MANDATORY-GROUPS { addressGroup }
    ::= { otpSnmpeaMIBCompliances 1 }

The description literally says: "The compliance statement for SNMPv2 entities which implement the OTP-SNMPEA-MIB." Official business. 🫑

πŸ¦‹ UNITS OF CONFORMANCE

Now the object groups β€” four of them, all obsolete, and yes, all four share the exact same description, we're not going to pretend otherwise. 😭

communityGroup

OBJECTS { intCommunityViewIndex,
          intCommunityAccess,
          intCommunityStatus }
STATUS  obsolete
::= { otpSnmpeaMIBGroups 1 }

"A collection of objects providing basic instrumentation of the load of the OTP system." (Yes, same sentence as the other three. The MIB authors found their line and they stuck with it. Consistency icon. ✨)

addressGroup

OBJECTS { intAgentIpAddress,
          intAgentUDPPort,
          intAgentMaxPacketSize,
          intAddressUDPPort,
          intAddressMaxPacketSize,
          intAddressStatus }
STATUS  obsolete
::= { otpSnmpeaMIBGroups 2 }

"A collection of objects providing basic instrumentation of the load of the OTP system." β€” and reminder, this is the group that otpSnmpeaBasicCompliance makes mandatory. So if you're implementing this MIB, this one's not optional, bestie. πŸ’…

trapGroup

OBJECTS { intTrapDestStatus,
          intTrapDestSnmpVersion }
STATUS  obsolete
::= { otpSnmpeaMIBGroups 3 }

"A collection of objects providing basic instrumentation of the load of the OTP system." Same energy, different OIDs. 🎯

viewGroup

OBJECTS { intViewMask,
          intViewType,
          intViewStorageType,
          intViewStatus }
STATUS  obsolete
::= { otpSnmpeaMIBGroups 4 }

"A collection of objects providing basic instrumentation of the load of the OTP system." Fourth time's the charm. 🌸

END

And that's the whole module β€” END and everything, we made it. πŸŽ‰


Okay that's a wrap on OTP-SNMPEA-MIB, bestie. This one ships from Erlang/OTP, lives in section SNMP, and answers to the name OTP-SNMPEA-MIB(7) β€” huge thanks to the OTP girlies who kept all this historical obsolete material around so we could all learn from it. πŸ’– No date stamp on this copy, so treat it like a vintage find: source and version only, iconic either way. Go forth and view-check responsibly. πŸ§šβ€β™€οΈπŸ¦‹πŸŒΈ