RFC1213-MIB(7)

๐Ÿ“ฆ
version 25.3.2.8 ยท 3 versions
, in debian bookworm, ubuntu jammy, ubuntu noble

๐Ÿ’– NAME ๐Ÿ’–

Okay so real talk: this page is RFC1213-MIB(7), and it lives in the MIB manual section โ€” that's the header situation, folded in all cute so you don't have to squint at it. And what is it? It's the Erlang/OTP MIB module for RFC-1213. That's the whole name, bestie, no cap. โœจ


๐Ÿฆ‹ DESCRIPTION ๐Ÿฆ‹

Alright so grab your iced coffee ๐Ÿ“, because this section is just... the actual MIB module, pasted in all its ASN.1 glory, and we are going to walk through it together. It's giving "spec document but make it a group chat." ๐Ÿ’…

๐ŸŒธ the preamble ๐ŸŒธ

It starts with the module header and the IMPORTS bit โ€” classic opening move, setting up where all the types come from. mgmt, NetworkAddress, IpAddress, Counter, Gauge, and TimeTicks are all pulled in FROM RFC1155-SMI, and OBJECT-TYPE comes FROM RFC-1212. The comments spell out the receipts: this module uses the extended OBJECT-TYPE macro as defined in [14], and MIB-II shares the same prefix as MIB-I. Then mib-2 gets its object identifier under mgmt. ๐ŸŽ€

                 RFC1213-MIB DEFINITIONS ::= BEGIN

                 IMPORTS
                         mgmt, NetworkAddress, IpAddress, Counter, Gauge,
                                 TimeTicks
                             FROM RFC1155-SMI
                         OBJECT-TYPE
                                 FROM RFC-1212;

                 --  This MIB module uses the extended OBJECT-TYPE macro as
                 --  defined in [14];

                 --  MIB-II (same prefix as MIB-I)

          mib-2      OBJECT IDENTIFIER ::= { mgmt 1 }

๐ŸŽ€ textual conventions ๐ŸŽ€

Two custom types, and honestly they're iconic in the most low-key way. DisplayString is an OCTET STRING used to model textual info taken from the NVT ASCII character set, and by convention objects with this syntax are declared as having SIZE (0..255). Then PhysAddress โ€” also an OCTET STRING โ€” models media addresses; for lots of media types it's a binary representation, so, for example, an ethernet address would be a string of 6 octets. ๐Ÿฆ‹

                 -- textual conventions

                 DisplayString ::=
                     OCTET STRING
                 -- This data type is used to model textual information taken
                 -- from the NVT ASCII character set.  By convention, objects
                 -- with this syntax are declared as having

                 --
                 --      SIZE (0..255)

                 PhysAddress ::=
                     OCTET STRING
                 -- This data type is used to model media addresses.  For many
                 -- types of media, this will be in a binary representation.
                 -- For example, an ethernet address would be represented as
                 -- a string of 6 octets.

๐Ÿ’… groups in MIB-II ๐Ÿ’…

Here's the group lineup โ€” every one of these gets an object identifier under mib-2, numbered 1 through 11. Note the vibe: cmot is commented out and the comment literally says historical (some say hysterical) โ€” the RFC said it, not me. ๐Ÿ™ˆ transmission sits at 10, because 9 is the ghost.

                 -- groups in MIB-II

                 system       OBJECT IDENTIFIER ::= { mib-2 1 }

           interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }

                 at           OBJECT IDENTIFIER ::= { mib-2 3 }

                 ip           OBJECT IDENTIFIER ::= { mib-2 4 }

                 icmp         OBJECT IDENTIFIER ::= { mib-2 5 }

                 tcp          OBJECT IDENTIFIER ::= { mib-2 6 }

                 udp          OBJECT IDENTIFIER ::= { mib-2 7 }

                 egp          OBJECT IDENTIFIER ::= { mib-2 8 }

                 -- historical (some say hysterical)
                 -- cmot      OBJECT IDENTIFIER ::= { mib-2 9 }

                 transmission OBJECT IDENTIFIER ::= { mib-2 10 }

                 snmp         OBJECT IDENTIFIER ::= { mib-2 11 }

๐Ÿ”ฅ the System group ๐Ÿ”ฅ

Heads up bestie, this part is mandatory: implementation of the System group is mandatory for all systems. And the caveat โ€” if an agent isn't configured to have a value for any of these variables, a string of length 0 is returned. Not an error, not a crash, just a cute little empty string. ๐Ÿ˜ญ

So let's meet the seven of them:

  • sysDescr โ€” a DisplayString (SIZE (0..255)), read-only, mandatory โ€” the textual description of the entity. It should include the full name and version identification of the system's hardware type, software operating-system, and networking software. And it is mandatory that it only contain printable ASCII characters.
  • sysObjectID โ€” OBJECT IDENTIFIER, read-only, mandatory โ€” the vendor's authoritative identification of the network management subsystem in the entity. Allocated within the SMI enterprises subtree 1.3.6.1.4.1 so there's an easy, unambiguous way to figure out what kind of box is being managed. The example: if vendor Flintstones, Inc. was assigned the subtree 1.3.6.1.4.1.4242, it could assign 1.3.6.1.4.1.4242.1.1 to its Fred Router. Obsessed. ๐Ÿ˜ญ
  • sysUpTime โ€” TimeTicks, read-only, mandatory โ€” the time in hundredths of a second since the network management portion of the system was last re-initialized.
  • sysContact โ€” DisplayString (SIZE (0..255)), read-write, mandatory โ€” who to contact for this managed node, plus how to contact them.
  • sysName โ€” DisplayString (SIZE (0..255)), read-write, mandatory โ€” an administratively-assigned name; by convention the node's fully-qualified domain name.
  • sysLocation โ€” DisplayString (SIZE (0..255)), read-write, mandatory โ€” the physical location, e.g. telephone closet, 3rd floor.
  • sysServices โ€” INTEGER (0..127), read-only, mandatory โ€” the set of services this entity primarily offers. The value is a sum: it starts at zero, and then for each layer L in the range 1 through 7 that this node performs transactions for, 2 raised to (L - 1) gets added. A primarily routing node would be 4 (2^(3-1)); a host offering application services would be 72 (2^(4-1) + 2^(7-1)). Layers 5 and 6 may also be counted for systems including OSI protocols. The layer chart is right there in the definition below โ€” 1 physical (e.g., repeaters), 2 datalink/subnetwork (e.g., bridges), 3 internet (e.g., IP gateways), 4 end-to-end (e.g., IP hosts), 7 applications (e.g., mail relays). Math but make it slay. ๐Ÿ’…
                 -- the System group

                 -- Implementation of the System group is mandatory for all
                 -- systems.  If an agent is not configured to have a value
                 -- for any of these variables, a string of length 0 is
                 -- returned.

                 sysDescr OBJECT-TYPE
                     SYNTAX  DisplayString (SIZE (0..255))
                     ACCESS  read-only
                     STATUS  mandatory

                     DESCRIPTION
                             "A textual description of the entity.  This value
                             should include the full name and version
                             identification of the system's hardware type,
                             software operating-system, and networking
                             software.  It is mandatory that this only contain
                             printable ASCII characters."
                     ::= { system 1 }

                 sysObjectID OBJECT-TYPE
                     SYNTAX  OBJECT IDENTIFIER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The vendor's authoritative identification of the
                             network management subsystem contained in the
                             entity.  This value is allocated within the SMI
                             enterprises subtree (1.3.6.1.4.1) and provides an
                             easy and unambiguous means for determining `what
                             kind of box' is being managed.  For example, if
                             vendor `Flintstones, Inc.' was assigned the
                             subtree 1.3.6.1.4.1.4242, it could assign the
                             identifier 1.3.6.1.4.1.4242.1.1 to its `Fred
                             Router'."
                     ::= { system 2 }

                 sysUpTime OBJECT-TYPE
                     SYNTAX  TimeTicks
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The time (in hundredths of a second) since the
                             network management portion of the system was last
                             re-initialized."
                     ::= { system 3 }

                 sysContact OBJECT-TYPE
                     SYNTAX  DisplayString (SIZE (0..255))
                     ACCESS  read-write
                     STATUS  mandatory
                     DESCRIPTION
                             "The textual identification of the contact person
                             for this managed node, together with information
                             on how to contact this person."
                     ::= { system 4 }

                 sysName OBJECT-TYPE
                     SYNTAX  DisplayString (SIZE (0..255))

                     ACCESS  read-write
                     STATUS  mandatory
                     DESCRIPTION
                             "An administratively-assigned name for this
                             managed node.  By convention, this is the node's
                             fully-qualified domain name."
                     ::= { system 5 }

                 sysLocation OBJECT-TYPE
                     SYNTAX  DisplayString (SIZE (0..255))
                     ACCESS  read-write
                     STATUS  mandatory
                     DESCRIPTION
                             "The physical location of this node (e.g.,
                             `telephone closet, 3rd floor')."
                     ::= { system 6 }

                 sysServices OBJECT-TYPE
                     SYNTAX  INTEGER (0..127)
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "A value which indicates the set of services that
                             this entity primarily offers.

                             The value is a sum.  This sum initially takes the
                             value zero, Then, for each layer, L, in the range
                             1 through 7, that this node performs transactions
                             for, 2 raised to (L - 1) is added to the sum.  For
                             example, a node which performs primarily routing
                             functions would have a value of 4 (2^(3-1)).  In
                             contrast, a node which is a host offering
                             application services would have a value of 72
                             (2^(4-1) + 2^(7-1)).  Note that in the context of
                             the Internet suite of protocols, values should be
                             calculated accordingly:

                                  layer  functionality
                                      1  physical (e.g., repeaters)
                                      2  datalink/subnetwork (e.g., bridges)
                                      3  internet (e.g., IP gateways)
                                      4  end-to-end  (e.g., IP hosts)
                                      7  applications (e.g., mail relays)

                             For systems including OSI protocols, layers 5 and
                             6 may also be counted."
                     ::= { system 7 }

๐Ÿฆ‹ the Interfaces group ๐Ÿฆ‹

Also mandatory for all systems โ€” no skipping, bestie. ๐Ÿ™…โ€โ™€๏ธ Same drill as before:

  • ifNumber โ€” INTEGER, read-only, mandatory โ€” the number of network interfaces present on this system, regardless of their current state.
  • ifTable โ€” SEQUENCE OF IfEntry, not-accessible, mandatory โ€” a list of interface entries; the number of entries is given by the value of ifNumber.
  • ifEntry โ€” IfEntry, not-accessible, mandatory, with INDEX { ifIndex } โ€” one interface entry containing objects at the subnetwork layer and below for a particular interface.
  • ifIndex โ€” INTEGER, read-only, mandatory โ€” a unique value for each interface, ranging between 1 and the value of ifNumber. Its value for each interface must stay constant at least from one re-initialization of the entity's network management system to the next re-initialization. Consistency queen ๐Ÿ‘‘

Oh and โ€” important terminology check, the comments call it out: each interface is thought of as being attached to a subnetwork, and do not confuse that with subnet, which refers to an addressing partitioning scheme used in the Internet suite of protocols. They are not the same word, do not @ me. ๐Ÿ’€

Then there's the IfEntry SEQUENCE โ€” the full cast list of twenty-two columns, from ifIndex all the way down to ifSpecific, which is an OBJECT IDENTIFIER. Whole squad's there. ๐ŸŒˆ

                 -- the Interfaces group

                 -- Implementation of the Interfaces group is mandatory for
                 -- all systems.

                 ifNumber OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of network interfaces (regardless of
                             their current state) present on this system."
                     ::= { interfaces 1 }

                 -- the Interfaces table

                 -- The Interfaces table contains information on the entity's
                 -- interfaces.  Each interface is thought of as being
                 -- attached to a `subnetwork'.  Note that this term should
                 -- not be confused with `subnet' which refers to an
                 -- addressing partitioning scheme used in the Internet suite
                 -- of protocols.

                 ifTable OBJECT-TYPE
                     SYNTAX  SEQUENCE OF IfEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "A list of interface entries.  The number of
                             entries is given by the value of ifNumber."
                     ::= { interfaces 2 }

                 ifEntry OBJECT-TYPE
                     SYNTAX  IfEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "An interface entry containing objects at the
                             subnetwork layer and below for a particular
                             interface."
                     INDEX   { ifIndex }
                     ::= { ifTable 1 }

                 IfEntry ::=
                     SEQUENCE {
                         ifIndex
                             INTEGER,
                          ifDescr
                             DisplayString,
                         ifType
                             INTEGER,
                         ifMtu
                             INTEGER,
                         ifSpeed
                             Gauge,
                         ifPhysAddress
                             PhysAddress,
                         ifAdminStatus
                             INTEGER,
                         ifOperStatus
                             INTEGER,
                         ifLastChange
                             TimeTicks,
                         ifInOctets
                             Counter,
                         ifInUcastPkts
                             Counter,
                         ifInNUcastPkts
                             Counter,
                         ifInDiscards
                             Counter,
                         ifInErrors
                             Counter,
                         ifInUnknownProtos
                             Counter,
                         ifOutOctets
                             Counter,
                         ifOutUcastPkts
                             Counter,
                         ifOutNUcastPkts
                             Counter,
                         ifOutDiscards
                             Counter,
                         ifOutErrors
                             Counter,
                         ifOutQLen
                             Gauge,
                         ifSpecific
                             OBJECT IDENTIFIER
                     }

                 ifIndex OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory

                     DESCRIPTION
                             "A unique value for each interface.  Its value
                             ranges between 1 and the value of ifNumber.  The
                             value for each interface must remain constant at
                             least from one re-initialization of the entity's
                             network management system to the next re-
                             initialization."
                     ::= { ifEntry 1 }

okay that's where this chunk of the page stops ๐Ÿซถ the rest is coming in the next part, don't go anywhere ๐Ÿ’œ

okay so we're still deep in the ifEntry table and it's giving inventory realness ๐Ÿ’… every single one of these is an OBJECT-TYPE, and yes bestie, we're keeping every field, every number, every tiny comment. no cap.

  • ifDescr โ€” OBJECT-TYPE, SYNTAX DisplayString (SIZE (0..255)), ACCESS read-only, STATUS mandatory. It's literally a textual string with info about the interface โ€” include the name of the manufacturer, the product name, and the version of the hardware interface. ::= { ifEntry 2 }
  • ifType โ€” OBJECT-TYPE, SYNTAX:
INTEGER {
    other(1),          -- none of the following
    regular1822(2),
    hdh1822(3erl),
    ddn-x25(5),
    rfc877-x25(5),
    ethernet-csmacd(7),
    iso88023-csmacd(7),
    iso88024-tokenBus(8),
    iso88025-tokenRing(9),
    iso88026-man(10),
    starLan(11),
    proteon-10Mbit(12),
    proteon-80Mbit(13),
    hyperchannel(14),
    fddi(15),
    lapb(16),
    sdlc(17),
    ds1(18),           -- T-1
    e1(19),            -- european equiv. of T-1
    basicISDN(20),
    primaryISDN(21),   -- proprietary serial
    propPointToPointSerial(22),
    ppp(23),
    softwareLoopback(24),
    eon(25),            -- CLNP over IP [11]
    ethernet-3Mbit(26),

    nsip(27),           -- XNS over IP
    slip(28),           -- generic SLIP
    ultra(29),          -- ULTRA technologies
    ds3(30),            -- T-3
    sip(31),            -- SMDS
    frame-relay(32)
}

ACCESS read-only, STATUS mandatory. The type of interface, distinguished according to the physical/link protocol(s) immediately below the network layer in the protocol stack. ::= { ifEntry 3 }

  • ifMtu โ€” OBJECT-TYPE, SYNTAX INTEGER, ACCESS read-only, STATUS mandatory. The size of the largest datagram which can be sent/received on the interface, specified in octets. For interfaces that are used for transmitting network datagrams, this is the size of the largest network datagram that can be sent on the interface. ::= { ifEntry 4 }
  • ifSpeed โ€” OBJECT-TYPE, SYNTAX Gauge, ACCESS read-only, STATUS mandatory. An estimate of the interface's current bandwidth in bits per second. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. ::= { ifEntry 5 }
  • ifPhysAddress โ€” OBJECT-TYPE, SYNTAX PhysAddress, ACCESS read-only, STATUS mandatory. The interface's address at the protocol layer immediately below the network layer in the protocol stack. For interfaces which do not have such an address (e.g., a serial line), this object should contain an octet string of zero length. ::= { ifEntry 6 }
  • ifAdminStatus โ€” OBJECT-TYPE, SYNTAX:
INTEGER {
    up(1),       -- ready to pass packets
    down(2),
    testing(3erl)   -- in some test mode
}

ACCESS read-write, STATUS mandatory. The desired state of the interface. The testing(3erl) state indicates that no operational packets can be passed. ::= { ifEntry 7 }

  • ifOperStatus โ€” OBJECT-TYPE, SYNTAX:
INTEGER {
    up(1),       -- ready to pass packets
    down(2),
    testing(3erl)   -- in some test mode
}

ACCESS read-only, STATUS mandatory. The current operational state of the interface. The testing(3erl) state indicates that no operational packets can be passed. ::= { ifEntry 8 }

  • ifLastChange โ€” OBJECT-TYPE, SYNTAX TimeTicks, ACCESS read-only, STATUS mandatory. The value of sysUpTime at the time the interface entered its current operational state. If the current state was entered prior to the last re-initialization of the local network management subsystem, then this object contains a zero value. ::= { ifEntry 9 }
  • ifInOctets โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The total number of octets received on the interface, including framing characters. ::= { ifEntry 10 }
  • ifInUcastPkts โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of subnetwork-unicast packets delivered to a higher-layer protocol. ::= { ifEntry 11 }
  • ifInNUcastPkts โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of non-unicast (i.e., subnetwork-broadcast or subnetwork-multicast) packets delivered to a higher-layer protocol. ::= { ifEntry 12 }
  • ifInDiscards โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being deliverable to a higher-layer protocol. One possible reason for discarding such a packet could be to free up buffer space. ::= { ifEntry 13 }
  • ifInErrors โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of inbound packets that contained errors preventing them from being deliverable to a higher-layer protocol. ::= { ifEntry 14 }
  • ifInUnknownProtos โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of packets received via the interface which were discarded because of an unknown or unsupported protocol. ::= { ifEntry 15 }
  • ifOutOctets โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The total number of octets transmitted out of the interface, including framing characters. ::= { ifEntry 16 }
  • ifOutUcastPkts โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The total number of packets that higher-level protocols requested be transmitted to a subnetwork-unicast address, including those that were discarded or not sent. ::= { ifEntry 17 }
  • ifOutNUcastPkts โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The total number of packets that higher-level protocols requested be transmitted to a non-unicast (i.e., a subnetwork-broadcast or subnetwork-multicast) address, including those that were discarded or not sent. ::= { ifEntry 18 }
  • ifOutDiscards โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted. One possible reason for discarding such a packet could be to free up buffer space. ::= { ifEntry 19 }
  • ifOutErrors โ€” OBJECT-TYPE, SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of outbound packets that could not be transmitted because of errors. ::= { ifEntry 20 }

โœจ ifOutQLen โœจ

  • SYNTAX โ€” Gauge
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

Okay so this one is literally just the length of the output packet queue โ€” measured in packets, bestie. That's it. That's the whole vibe. ๐ŸŽ€

::= { ifEntry 21 }

๐ŸŒˆ ifSpecific ๐ŸŒˆ

  • SYNTAX โ€” OBJECT IDENTIFIER
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

This is a reference to MIB definitions that are specific to whatever media is being used to realize the interface. So like โ€” say the interface is realized by an ethernet, then the value of this object refers to a document that defines objects specific to ethernet. iykyk. ๐Ÿฆ‹

And if that info justโ€ฆ isn't present? Then its value should be set to the OBJECT IDENTIFIER { 0 0 }, which is a syntatically valid object identifier, and any conformant implementation of ASN.1 and BER must be able to generate and recognize this value. No cap, it's mandatory-mandatory.

::= { ifEntry 22 }

๐Ÿซถ the Address Translation group ๐Ÿซถ

Okay bestie, this comment block is important, don't skip it:

Implementation of the Address Translation group is mandatory for all systems. BUT โ€” and this is a big but โ€” note that this group is deprecated by MIB-II. That is, it is being included solely for compatibility with MIB-I nodes, and will most likely be excluded from MIB-III nodes. From MIB-II and onwards, each network protocol group contains its own address translation tables. So it's giving legacy-support main character energy only. ๐Ÿ’€

The Address Translation group contains one table, and that table is the union across all interfaces of the translation tables for converting a NetworkAddress (e.g., an IP address) into a subnetwork-specific address. For lack of a better term, this document refers to such a subnetwork-specific address as a physical address. (Yes, in quotes. Yes, it's a vibe.)

Examples of such translation tables, per the page:

  • for broadcast media where ARP is in use, the translation table is equivalent to the ARP cache;
  • or, on an X.25 network where non-algorithmic translation to X.121 addresses is required, the translation table contains the NetworkAddress to X.121 address equivalences.

๐ŸŒธ atTable ๐ŸŒธ

  • SYNTAX โ€” SEQUENCE OF AtEntry
  • ACCESS โ€” not-accessible
  • STATUS โ€” deprecated

The Address Translation tables contain the NetworkAddress to physical address equivalences. Some interfaces do not use translation tables for determining address equivalences (e.g., DDN-X.25 has an algorithmic method); if all interfaces are of this type, then the Address Translation table is empty, i.e., has zero entries. Empty table, zero notes, we move. ๐Ÿ™ˆ

::= { at 1 }

๐Ÿงš atEntry ๐Ÿงš

  • SYNTAX โ€” AtEntry
  • ACCESS โ€” not-accessible
  • STATUS โ€” deprecated
  • INDEX โ€” { atIfIndex, atNetAddress }

Each entry contains one NetworkAddress to physical address equivalence. One entry, one equivalence, periodt. โœจ

::= { atTable 1 }

๐Ÿ’œ the AtEntry SEQUENCE ๐Ÿ’œ

Copy this exactly, bestie, character for character:

AtEntry ::=
    SEQUENCE {
        atIfIndex
            INTEGER,

        atPhysAddress
            PhysAddress,
        atNetAddress
            NetworkAddress
    }

๐Ÿ“ atIfIndex ๐Ÿ“

  • SYNTAX โ€” INTEGER
  • ACCESS โ€” read-write
  • STATUS โ€” deprecated

The interface on which this entry's equivalence is effective. And here's the cute part: the interface identified by a particular value of this index is the same interface as identified by the same value of ifIndex. They match, they're linked, it's a whole thing. ๐Ÿ”ฅ

::= { atEntry 1 }

๐ŸŽ€ atPhysAddress ๐ŸŽ€

  • SYNTAX โ€” PhysAddress
  • ACCESS โ€” read-write
  • STATUS โ€” deprecated

The media-dependent physical address.

Setting this object to a null string (one of zero length) has the effect of invalidating the corresponding entry in the atTable object. That is, it effectively dissasociates the interface identified with said entry from the mapping identified with said entry. (Yes, "dissasociates" โ€” that's the spelling on the page, leave it alone. ๐Ÿ˜ญ)

And it is an implementation-specific matter as to whether the agent removes an invalidated entry from the table. So accordingly, management stations must be prepared to receive tabular information from agents that corresponds to entries not currently in use. Proper interpretation of such entries requires examination of the relevant atPhysAddress object. Read carefully, bestie. ๐Ÿ‘‘

::= { atEntry 2 }

โญ atNetAddress โญ

  • SYNTAX โ€” NetworkAddress
  • ACCESS โ€” read-write
  • STATUS โ€” deprecated

The NetworkAddress (e.g., the IP address) corresponding to the media-dependent physical address. That's the pairing. That's the whole point. ๐Ÿ’…

::= { atEntry 3 }

๐Ÿ‘‘ the IP group ๐Ÿ‘‘

Implementation of the IP group is mandatory for all systems. Every single one. No exceptions, no vibes-based opt-outs. ๐ŸŒŸ


๐Ÿฆ‹ ipForwarding ๐Ÿฆ‹

  • SYNTAX โ€” INTEGER { forwarding(1), not-forwarding(2) }

Copy these values exactly, they're load-bearing:

INTEGER {
    forwarding(1),    -- acting as a gateway
    not-forwarding(2) -- NOT acting as a gateway
}
  • ACCESS โ€” read-write
  • STATUS โ€” mandatory

The indication of whether this entity is acting as an IP gateway in respect to the forwarding of datagrams received by, but not addressed to, this entity. IP gateways forward datagrams. IP hosts do not (except those source-routed via the host). Simple as that. โœจ

Note that for some managed nodes, this object may take on only a subset of the values possible. Accordingly, it is appropriate for an agent to return a badValue response if a management station attempts to change this object to an inappropriate value. So don't try it. ๐Ÿ™ˆ
::= { ip 1 }

๐ŸŒˆ ipDefaultTTL ๐ŸŒˆ

  • SYNTAX โ€” INTEGER
  • ACCESS โ€” read-write
  • STATUS โ€” mandatory

The default value inserted into the Time-To-Live field of the IP header of datagrams originated at this entity, whenever a TTL value is not supplied by the transport layer protocol. It's the fallback TTL โ€” a little default safety net. ๐ŸŽ€

::= { ip 2 }

๐Ÿ’– ipInReceives ๐Ÿ’–

  • SYNTAX โ€” Counter
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

The total number of input datagrams received from interfaces โ€” including those received in error. Yeah, the messy ones count too. ๐Ÿ’€

::= { ip 3 }

๐Ÿ”ฅ ipInHdrErrors ๐Ÿ”ฅ

  • SYNTAX โ€” Counter
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

The number of input datagrams discarded due to errors in their IP headers, including:

  • bad checksums
  • version number mismatch
  • other format errors
  • time-to-live exceeded
  • errors discovered in processing their IP options
  • etc.

RIP to those packets, they did not slay. ๐Ÿซถ

::= { ip 4 }

๐ŸŒธ ipInAddrErrors ๐ŸŒธ

  • SYNTAX โ€” Counter
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

The number of input datagrams discarded because the IP address in their IP header's destination field was not a valid address to be received at this entity. This count includes invalid addresses (e.g., 0.0.0.0) and addresses of unsupported Classes (e.g., Class E). ๐Ÿ“Œ

And for entities which are not IP Gateways and therefore do not forward datagrams, this counter includes datagrams discarded because the destination address was not a local address. So it's doing double duty, lowkey iconic of it. ๐Ÿ’…

::= { ip 5 }

๐Ÿ’œ ipForwDatagrams ๐Ÿ’œ

  • SYNTAX โ€” Counter
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

The number of input datagrams for which this entity was not their final IP destination, as a result of which an attempt was made to find a route to forward them to that final destination. So like โ€” not my packet, but I'll help it find its way. ๐Ÿงš

In entities which do not act as IP Gateways, this counter will include only those packets which were Source-Routed via this entity, and the Source-Route option processing was successful. Specific. Precise. Yes. ๐ŸŒŸ

::= { ip 6 }

๐Ÿ“ ipInUnknownProtos ๐Ÿ“

  • SYNTAX โ€” Counter
  • ACCESS โ€” read-only
  • STATUS โ€” mandatory

The number of locally-addressed datagrams received successfully but discarded because of an unknown or unsupported protocol. Received fine, understood by nobody. It's giving "we don't know her." ๐Ÿ˜ญ

::= { ip 7 }

ipInDiscards

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 8 }

Bestie, these are the input IP datagrams that were literally fine โ€” no problem was encountered that would've prevented them from continuing to be processed โ€” and yet they got discarded anyway (like, say, for lack of buffer space ๐Ÿ˜ญ). Important: this counter does not include any datagrams that were discarded while awaiting re-assembly. Different counter, different vibe. ๐Ÿ’…

ipInDelivers

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 9 }

The total number of input datagrams that were successfully delivered to IP user-protocols โ€” and yes, that includes ICMP. ๐Ÿซถ These ones made it, no cap.

ipOutRequests

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 10 }

The total number of IP datagrams that local IP user-protocols (again, ICMP counts ๐ŸŽ€) handed to IP in requests for transmission. But โ€” heads up โ€” this counter does not include any datagrams that are counted over in ipForwDatagrams. That's that other girl's territory. โœจ

ipOutDiscards

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 11 }

Counts output IP datagrams where no problem was encountered that would've stopped them from being transmitted to their destination, but they got discarded anyway (e.g. lack of buffer space, the eternal struggle ๐Ÿ˜ญ). And ngl, this counter would include datagrams counted in ipForwDatagrams if any of those packets met this (discretionary) discard criterion. She's inclusive like that.

ipOutNoRoutes

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 12 }

The number of IP datagrams that got discarded because no route could be found to transmit them to their destination. This one also includes any packets counted in ipForwDatagrams that meet this 'no-route' criterion โ€” and it includes any datagrams a host can't route because all of its default gateways are down. So basically the whole "where is she going?? nowhere" situation. ๐Ÿ’€

ipReasmTimeout

  • SYNTAX INTEGER
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 13 }

The maximum number of seconds that received fragments are held while they're awaiting reassembly at this entity. It's giving "how long can I keep these pieces on layaway before I give up." โณ

ipReasmReqds

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 14 }

The number of IP fragments that were received and that needed to be reassembled at this entity. Little pieces that said "put me back together bestie." ๐Ÿงฉ

ipReasmOKs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 15 }

The number of IP datagrams that were successfully re-assembled. We love a happy ending. ๐Ÿฆ‹

ipReasmFails

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 16 }

The number of failures the IP re-assembly algorithm detected โ€” for whatever reason (timed out, errors, etc., we don't judge ๐Ÿ’€). But wait: this is not necessarily a count of discarded IP fragments, because some algorithms โ€” notably the algorithm in RFC 815 โ€” can totally lose track of the number of fragments by combining them as they're received. So don't read this as an exact fragment graveyard, iykyk.

ipFragOKs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 17 }

The number of IP datagrams that were successfully fragmented at this entity. Slay, we chopped her up and it worked. ๐Ÿ”ฅ

ipFragFails

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 18 }

The number of IP datagrams that were discarded because they needed to be fragmented at this entity but could not be โ€” for example, because their Don't Fragment flag was set. The audacity of a packet saying "don't fragment me" and then being too big. ๐Ÿ™ˆ

ipFragCreates

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ip 19 }

The number of IP datagram fragments that were generated as a result of fragmentation at this entity. Look at all these little babies. โœจ


MIB comment, direct from the source: -- the IP address table
And also: -- The IP address table contains this entity's IP addressing information.

ipAddrTable

  • SYNTAX SEQUENCE OF IpAddrEntry
  • ACCESS not-accessible
  • STATUS mandatory
  • OID ::= { ip 20 }

The table of addressing information relevant to this entity's IP addresses. It's the whole group chat of addy info. ๐ŸŽ€

ipAddrEntry

  • SYNTAX IpAddrEntry
  • ACCESS not-accessible
  • STATUS mandatory
  • INDEX { ipAdEntAddr }
  • OID ::= { ipAddrTable 1 }

The addressing information for one of this entity's IP addresses โ€” one entry per addy, bestie. ๐Ÿ’…

IpAddrEntry ::=
    SEQUENCE {
        ipAdEntAddr
            IpAddress,
        ipAdEntIfIndex
            INTEGER,
        ipAdEntNetMask
            IpAddress,
        ipAdEntBcastAddr
            INTEGER,
        ipAdEntReasmMaxSize
            INTEGER (0..65535)
    }

ipAdEntAddr

  • SYNTAX IpAddress
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ipAddrEntry 1 }

The IP address that this entry's addressing information is all about. The main character of the row, fr. ๐Ÿ‘‘

ipAdEntIfIndex

  • SYNTAX INTEGER
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ipAddrEntry 2 }

The index value that uniquely identifies the interface this entry applies to. And here's the lore: the interface identified by a particular value of this index is the same interface as the one identified by the same value of ifIndex. Same girl, different paperwork. ๐Ÿซถ

ipAdEntNetMask

  • SYNTAX IpAddress
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ipAddrEntry 3 }

The subnet mask that goes with the IP address of this entry. The value is an IP address with all the network bits set to 1 and all the host bits set to 0 โ€” that's the whole recipe, no substitutions. ๐ŸŒธ

ipAdEntBcastAddr

  • SYNTAX INTEGER
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ipAddrEntry 4 }

The value of the least-significant bit in the IP broadcast address used for sending datagrams on the (logical) interface associated with the IP address of this entry. Example time: when the Internet standard all-ones broadcast address is used, the value will be 1. This value applies to both the subnet and the network broadcast addresses used by the entity on this (logical) interface. Two for one, we love. โœจ

ipAdEntReasmMaxSize

  • SYNTAX INTEGER (0..65535)
  • ACCESS read-only
  • STATUS mandatory
  • OID ::= { ipAddrEntry 5 }

The size of the largest IP datagram that this entity can re-assemble from incoming IP fragmented datagrams received on this interface. Big-reassembly energy, literally. ๐Ÿ’ช


MIB comment: -- the IP routing table
And also: -- The IP routing table contains an entry for each route presently known to this entity.

ipRouteTable

  • SYNTAX SEQUENCE OF IpRouteEntry
  • ACCESS not-accessible
  • STATUS mandatory
  • OID ::= { ip 21 }

This entity's IP Routing table. Every route she currently knows about lives here. ๐Ÿ—บ๏ธ

ipRouteEntry

  • SYNTAX IpRouteEntry
  • ACCESS not-accessible
  • STATUS mandatory
  • INDEX { ipRouteDest }
  • OID ::= { ipRouteTable 1 }

A route to a particular destination. One row, one destination, that's the whole deal bestie. ๐ŸŽ€

okay so we're deep in the route-table era of this MIB, and this is the IpRouteEntry moment โ€” the SEQUENCE that defines every field a route row can serve. ๐Ÿ’…

IpRouteEntry ::=
    SEQUENCE {
        ipRouteDest
            IpAddress,
        ipRouteIfIndex
            INTEGER,
        ipRouteMetric1
            INTEGER,
        ipRouteMetric2
            INTEGER,
        ipRouteMetric3
            INTEGER,
        ipRouteMetric4
            INTEGER,
        ipRouteNextHop
            IpAddress,
        ipRouteType
            INTEGER,
        ipRouteProto
            INTEGER,
        ipRouteAge
            INTEGER,
        ipRouteMask
            IpAddress,
        ipRouteMetric5
            INTEGER,

        ipRouteInfo
            OBJECT IDENTIFIER
    }

Now the OBJECT-TYPE besties one by one. Every single one here is STATUS mandatory; I'm keeping the OIDs exact so nobody comes for me. โœจ

  • ipRouteDest OBJECT-TYPE โ€” SYNTAX IpAddress, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 1 }. This is the destination IP address for the route. 0.0.0.0 means default route, periodt. Multiple routes to one destination can show up in the table, but access to those multiple entries depends on the table-access mechanisms defined by the network management protocol in use.
  • ipRouteIfIndex OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 2 }. This INTEGER is the index value that uniquely IDs the local interface through which this route's next hop should be reached. Same index value = same interface as ifIndex, no cap.
  • ipRouteMetric1 OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 3 }. The primary routing metric for this route. What the number actually means is decided by the routing protocol in this route's ipRouteProto value. If this metric isn't used, set it to -1.
  • ipRouteMetric2 OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 4 }. An alternate routing metric for this route. Its semantics come from the routing protocol in the route's ipRouteProto value. If it's not used, value should be -1.
  • ipRouteMetric3 OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 5 }. Another alternate routing metric. Again, the routing protocol in ipRouteProto decides what it means, and if it's unused, set it to -1.
  • ipRouteMetric4 OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 6 }. Alternate routing metric, same deal: semantics from ipRouteProto, and unused means -1.
  • ipRouteNextHop OBJECT-TYPE โ€” SYNTAX IpAddress, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 7 }. The IP address of the next hop for this route. Tiny parenthetical: if the route is bound to an interface realized via broadcast media, this field's value is the agent's IP address on that interface.
  • ipRouteType OBJECT-TYPE โ€” SYNTAX is this whole enum, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 8 }:
INTEGER {
    other(1),        -- none of the following

    invalid(2),      -- an invalidated route

                     -- route to directly
    direct(3erl),       -- connected (sub-)network

                     -- route to a non-local
    indirect(5)      -- host/network/sub-network
}

This is the type of route. The values direct(3erl) and indirect(5) refer to the notion of direct and indirect routing in the IP architecture. Setting this object to invalid(2) invalidates the corresponding entry in the ipRouteTable object. That is, it effectively dissasociates the destination identified with said entry from the route identified with said entry. Whether the agent removes an invalidated entry from the table is implementation-specific. So management stations must be prepared to receive tabular information from agents that corresponds to entries not currently in use. Proper interpretation of such entries requires examination of the relevant ipRouteType object.

  • ipRouteProto OBJECT-TYPE โ€” SYNTAX is this enum, ACCESS read-only, STATUS mandatory, ::= { ipRouteEntry 9 }:
INTEGER {
    other(1),       -- none of the following

                    -- non-protocol information,
                    -- e.g., manually configured
    local(2),       -- entries

                    -- set via a network
    netmgmt(3erl),     -- management protocol

                    -- obtained via ICMP,
    icmp(5),        -- e.g., Redirect

                    -- the remaining values are
                    -- all gateway routing
                    -- protocols
    egp(5),
    ggp(7),

    hello(7),
    rip(8),
    is-is(9),
    es-is(10),
    ciscoIgrp(11),
    bbnSpfIgp(12),
    ospf(13),
    bgp(14)
}

This is the routing mechanism via which this route was learned. And just because gateway routing protocol values are included here doesn't mean hosts should support those protocols. ๐Ÿ’€

  • ipRouteAge OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 10 }. The number of seconds since this route was last updated or otherwise determined to be correct. Important caveat: no semantics of too old can be implied except through knowledge of the routing protocol by which the route was learned.
  • ipRouteMask OBJECT-TYPE โ€” SYNTAX IpAddress, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 11 }. This indicates the mask to be logical-ANDed with the destination address before it gets compared to the value in ipRouteDest. For systems that don't support arbitrary subnet masks, the agent constructs ipRouteMask by checking whether the correspondent ipRouteDest field belongs to a class-A, B, or C network, then using one of:
mask           network
255.0.0.0      class-A
255.255.0.0    class-B
255.255.255.0  class-C

If ipRouteDest is 0.0.0.0 (a default route), then the mask value is also 0.0.0.0. And yes, all IP routing subsystems implicitly use this mechanism. ๐Ÿซถ

  • ipRouteMetric5 OBJECT-TYPE โ€” SYNTAX INTEGER, ACCESS read-write, STATUS mandatory, ::= { ipRouteEntry 12 }. One more alternate routing metric. Semantics come from the routing protocol specified in the route's ipRouteProto value, and if it's not used, set it to -1.

๐Ÿ’… ipRouteInfo

  • SYNTAX OBJECT IDENTIFIER
  • ACCESS read-only
  • STATUS mandatory

okay so this one is literally just a pointer โ€” a reference to MIB definitions that are specific to the particular routing protocol that's responsible for this route, and that protocol is determined by whatever the route's ipRouteProto value says ๐ŸŽ€. And if that info isn't there? Bestie, you set it to the OBJECT IDENTIFIER { 0 0 }, which is a syntactically valid object identifier, and any conformant implementation of ASN.1 and BER must be able to generate and recognize that value. Periodt ๐Ÿ’…

::= { ipRouteEntry 13 }

๐Ÿฆ‹ the IP Address Translation table โ€” yes we're going there

so the comment block in the source is doing a lil lore drop ๐Ÿ“–: the IP address translation table contains the IpAddress-to-physical address equivalences. Some interfaces straight up don't use translation tables to figure out address equivalences โ€” hello, DDN-X.25 has an algorithmic method, icon behavior honestly โœจ. And if all of your interfaces are that type, then the Address Translation table is empty, i.e. it has zero entries. not a single one. empty. ๐Ÿซ™


๐ŸŒธ ipNetToMediaTable

  • SYNTAX SEQUENCE OF IpNetToMediaEntry
  • ACCESS not-accessible
  • STATUS mandatory

The IP Address Translation table, used for mapping from IP addresses to physical addresses ๐Ÿ’–.

::= { ip 22 }

๐ŸŒธ ipNetToMediaEntry

  • SYNTAX IpNetToMediaEntry
  • ACCESS not-accessible
  • STATUS mandatory
  • INDEX { ipNetToMediaIfIndex, ipNetToMediaNetAddress }

Every entry holds one IpAddress-to-physical address equivalence ๐Ÿซถ.

::= { ipNetToMediaTable 1 }

And here's the shape of it, verbatim, no cap:

IpNetToMediaEntry ::=
    SEQUENCE {
        ipNetToMediaIfIndex
            INTEGER,
        ipNetToMediaPhysAddress
            PhysAddress,
        ipNetToMediaNetAddress
            IpAddress,
        ipNetToMediaType
            INTEGER
    }

๐Ÿงš ipNetToMediaIfIndex

  • SYNTAX INTEGER
  • ACCESS read-write
  • STATUS mandatory

The interface on which this entry's equivalence is effective ๐Ÿ’ซ. and the interface identified by a particular value of this index is the same interface as the one identified by the same value of ifIndex โ€” same girl, different fit, iykyk.

::= { ipNetToMediaEntry 1 }

๐Ÿงš ipNetToMediaPhysAddress

  • SYNTAX PhysAddress
  • ACCESS read-write
  • STATUS mandatory

the media-dependent physical address ๐ŸŒˆ. short and slay.

::= { ipNetToMediaEntry 2 }

๐Ÿงš ipNetToMediaNetAddress

  • SYNTAX IpAddress
  • ACCESS read-write
  • STATUS mandatory

the IpAddress that corresponds to that media-dependent physical address ๐Ÿ’œ.

::= { ipNetToMediaEntry 3 }

๐Ÿงš ipNetToMediaType

  • SYNTAX INTEGER { โ€ฆ }
  • ACCESS read-write
  • STATUS mandatory

The type of mapping, and the choices are:

other(1),        -- none of the following
invalid(2),      -- an invalidated mapping
dynamic(3erl),
static(5)
and yes, dynamic(3erl) is literally what the source says ๐Ÿ˜ญ we do not make the rules, we just report them faithfully. (also not me noticing there's no 4 in there ๐Ÿ™ˆ)

Now the important part, bestie, listen up ๐Ÿ“ข โ€” setting this object to the value invalid(2) has the effect of invalidating the corresponding entry in the ipNetToMediaTable. Like, it effectively dissociates the interface identified with said entry from the mapping identified with said entry ๐Ÿ’€. Whether the agent actually removes an invalidated entry from the table is an implementation-specific matter โ€” so management stations must be prepared to receive tabular information from agents that corresponds to entries not currently in use ๐Ÿ‘€. And proper interpretation of such entries requires examination of the relevant ipNetToMediaType object. so yeah, check the type field before you assume anything, fr fr.

::= { ipNetToMediaEntry 4 }

โญ additional IP objects

๐Ÿ‘‘ ipRoutingDiscards

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of routing entries that were chosen to be discarded even though they are totally valid ๐Ÿ˜ญ. One possible reason for discarding such an entry could be to free up buffer space for other routing entries โ€” it's giving "sorry bestie, we needed the room" energy.

::= { ip 23 }

๐Ÿ’€ the ICMP group

Straight from the source: implementation of the ICMP group is mandatory for all systems. no skipping, no excuses ๐ŸŒธ.

๐Ÿ“ icmpInMsgs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The total number of ICMP messages the entity received ๐Ÿ”ฅ. and note โ€” this counter includes all those counted by icmpInErrors. double counting is intentional here, that's the vibe.

::= { icmp 1 }

๐Ÿ“ icmpInErrors

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP messages the entity received but determined as having ICMP-specific errors โ€” bad ICMP checksums, bad length, etc. ๐Ÿ’… the "we got it but it's a mess" counter.

::= { icmp 2 }

๐Ÿ“ icmpInDestUnreachs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Destination Unreachable messages received ๐Ÿซ .

::= { icmp 3 }

๐Ÿ“ icmpInTimeExcds

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Time Exceeded messages received โฐ.

::= { icmp 4 }

๐Ÿ“ icmpInParmProbs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Parameter Problem messages received ๐Ÿ™ƒ.

::= { icmp 5 }

๐Ÿ“ icmpInSrcQuenchs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Source Quench messages received ๐Ÿงฏ.

::= { icmp 6 }

๐Ÿ“ icmpInRedirects

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Redirect messages received ๐ŸŒ€.

::= { icmp 7 }

๐Ÿ“ icmpInEchos

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Echo (request) messages received ๐Ÿ“.

::= { icmp 8 }

๐Ÿ“ icmpInEchoReps

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Echo Reply messages received ๐Ÿ“๐Ÿ’–.

::= { icmp 9 }

๐Ÿ“ icmpInTimestamps

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Timestamp (request) messages received โฑ๏ธ.

::= { icmp 10 }

๐Ÿ“ icmpInTimestampReps

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Timestamp Reply messages received โฑ๏ธโœจ.

::= { icmp 11 }

๐Ÿ“ icmpInAddrMasks

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Address Mask Request messages received ๐ŸŽญ.

::= { icmp 12 }

๐Ÿ“ icmpInAddrMaskReps

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP Address Mask Reply messages received ๐ŸŽญ๐Ÿซถ.

::= { icmp 13 }

๐Ÿ“ icmpOutMsgs

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The total number of ICMP messages this entity attempted to send ๐Ÿ”ฅ. And note โ€” this counter includes all those counted by icmpOutErrors. same double-counting situation as the inbound one, iconic.

::= { icmp 14 }

๐Ÿ“ icmpOutErrors

  • SYNTAX Counter
  • ACCESS read-only
  • STATUS mandatory

The number of ICMP messages this entity did not send due to problems discovered within ICMP

(and the source literally cuts off right there mid-sentence โ€” we pick it back up in the next part, bestie ๐Ÿ˜ญ๐Ÿ’œ)

โ€ฆlike, a lack of buffers, bestie. That counter should not be counting the mess that gets discovered outside the ICMP layer โ€” think "IP couldn't route the resulting datagram" energy โ€” and ngl, in some implementations there might genuinely be no types of error that even feed this counter. ๐Ÿ’…

::= { icmp 15 }
  • icmpOutDestUnreachs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. Counts every ICMP Destination Unreachable message that got sent out. ๐Ÿšซ
::= { icmp 16 }
  • icmpOutTimeExcds โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of ICMP Time Exceeded messages sent. โฐ
::= { icmp 17 }
  • icmpOutParmProbs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. How many ICMP Parameter Problem messages went out. ๐Ÿงฉ
::= { icmp 18 }
  • icmpOutSrcQuenchs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. The count of ICMP Source Quench messages sent. ๐Ÿงฏ
::= { icmp 19 }
  • icmpOutRedirects โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. Number of ICMP Redirect messages sent โ€” and heads up, for a host this object will always be zero, because hosts do not send redirects. literally zero, bestie, not even a little. 0๏ธโƒฃ
::= { icmp 20 }
  • icmpOutEchos โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Echo (request) messages sent. ๐Ÿ“ก
::= { icmp 21 }
  • icmpOutEchoReps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Echo Reply messages sent. ๐Ÿ“
::= { icmp 22 }
  • icmpOutTimestamps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Timestamp (request) messages sent. ๐Ÿ•ฐ๏ธ
::= { icmp 23 }
  • icmpOutTimestampReps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Timestamp Reply messages sent. โฑ๏ธ
::= { icmp 24 }
  • icmpOutAddrMasks โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Address Mask Request messages sent. ๐ŸŽญ
::= { icmp 25 }
  • icmpOutAddrMaskReps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. ICMP Address Mask Reply messages sent. ๐ŸŽญ
::= { icmp 26 }

okay okay okay, ICMP is done, we're moving on to the good stuff โ€” TCP ๐Ÿงš

-- the TCP group

-- Implementation of the TCP group is mandatory for all
-- systems that implement the TCP.

-- Note that instances of object types that represent
-- information about a particular TCP connection are
-- transient; they persist only as long as the connection
-- in question.
๐Ÿซถ Read those comments again, bestie โ€” implementing the TCP group is mandatory for every system that implements TCP, and the per-connection objects are transient: they only live as long as the connection itself does. blip, gone, bye. ๐Ÿ’จ
  • tcpRtoAlgorithm โ€” ACCESS read-only, STATUS mandatory. Tells you which algorithm is being used to figure out the timeout value for retransmitting octets nobody acknowledged. The choices are:
SYNTAX  INTEGER {
            other(1),    -- none of the following

            constant(2), -- a constant rto
            rsre(3erl),     -- MIL-STD-1778, Appendix B
            vanj(5)      -- Van Jacobson's algorithm [10]
        }
::= { tcp 1 }
  • tcpRtoMin โ€” SYNTAX INTEGER, ACCESS read-only, STATUS mandatory. The minimum value a TCP implementation will allow for the retransmission timeout, measured in milliseconds. The finer semantics of objects like this depend on which timeout algorithm is in play โ€” and specifically, when the algorithm is rsre(3erl), this object behaves like the LBOUND quantity described in RFC 793. ๐Ÿฅบ
::= { tcp 2 }
  • tcpRtoMax โ€” SYNTAX INTEGER, ACCESS read-only, STATUS mandatory. Same but the maximum value the implementation permits for the retransmission timeout, also in milliseconds. Again the refined semantics depend on the algorithm, and when it's rsre(3erl), this one has the semantics of the UBOUND quantity from RFC 793. ๐Ÿ“ˆ
::= { tcp 3 }
  • tcpMaxConn โ€” SYNTAX INTEGER, ACCESS read-only, STATUS mandatory. The cap on total TCP connections the entity can support. If the max is dynamic on this entity, this object should hold the value -1. ๐Ÿซ 
::= { tcp 4 }
  • tcpActiveOpens โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. How many times TCP connections went straight from CLOSED to SYN-SENT. the direct flight, no layovers โœˆ๏ธ
::= { tcp 5 }
  • tcpPassiveOpens โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. How many times connections transitioned directly from LISTEN to SYN-RCVD. ๐Ÿ’Œ
::= { tcp 6 }
  • tcpAttemptFails โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. The number of times connections went directly to CLOSED from either SYN-SENT or SYN-RCVD, plus the number of times they went directly to LISTEN from SYN-RCVD. that's two counts added together, don't forget the plus ๐Ÿ˜ญ
::= { tcp 7 }
  • tcpEstabResets โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. How many times connections transitioned directly to CLOSED from either ESTABLISHED or CLOSE-WAIT. ๐Ÿ’€
::= { tcp 8 }
  • tcpCurrEstab โ€” SYNTAX Gauge, ACCESS read-only, STATUS mandatory. The number of TCP connections whose current state is either ESTABLISHED or CLOSE-WAIT. Note it's a Gauge, not a Counter โ€” it goes up and down, she's flexible ๐Ÿ’…
::= { tcp 9 }
  • tcpInSegs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. Total segments received, including ones received in error, and that count covers segments received on currently established connections too. ๐Ÿ“ฅ
::= { tcp 10 }
  • tcpOutSegs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. Total segments sent, including those on current connections โ€” but excluding segments that contain only retransmitted octets. read that exclusion again bestie ๐Ÿ”
::= { tcp 11 }
  • tcpRetransSegs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory. Total segments retransmitted โ€” meaning the number of TCP segments transmitted that contained one or more previously transmitted octets. ๐Ÿ”
::= { tcp 12 }

๐Ÿฆ‹ the TCP Connection table ๐Ÿฆ‹

-- the TCP Connection table

-- The TCP connection table contains information about this
-- entity's existing TCP connections.
  • tcpConnTable โ€” SYNTAX SEQUENCE OF TcpConnEntry, ACCESS not-accessible, STATUS mandatory. A table holding TCP connection-specific information. (Yes, not-accessible โ€” you don't read the table itself, you read its entries, iykyk ๐Ÿ‘€)
::= { tcp 13 }

๐Ÿงต the TCP connection table (yes, the spicy one)

  • tcpConnEntry โ€” okay bestie, this is the whole vibe of one single TCP connection. It's not-accessible, mandatory, and honestly kind of a ghost: the description says it's transient, meaning it literally stops existing when (or like, right after) the connection drops into the CLOSED state. It's giving mayfly energy. ๐Ÿฆ‹ It's indexed by four things โ€” tcpConnLocalAddress, tcpConnLocalPort, tcpConnRemAddress, tcpConnRemPort โ€” so every connection is uniquely identified by both ends. Periodt.
                 tcpConnEntry OBJECT-TYPE
                     SYNTAX  TcpConnEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "Information about a particular current TCP
                             connection.  An object of this type is transient,
                             in that it ceases to exist when (or soon after)
                             the connection makes the transition to the CLOSED
                             state."
                     INDEX   { tcpConnLocalAddress,
                               tcpConnLocalPort,
                               tcpConnRemAddress,
                               tcpConnRemPort }
                     ::= { tcpConnTable 1 }

And here's the lil SEQUENCE that lays out the whole entry โ€” five fields, no more, no less โœจ:

                 TcpConnEntry ::=
                     SEQUENCE {
                         tcpConnState
                             INTEGER,
                         tcpConnLocalAddress
                             IpAddress,
                         tcpConnLocalPort
                             INTEGER (0..65535),
                         tcpConnRemAddress
                             IpAddress,
                         tcpConnRemPort
                             INTEGER (0..65535)
                     }

๐Ÿ’… tcpConnState โ€” the main character of this table

Bestie, this one is read-write which is rare and honestly a little scary ๐Ÿ˜ญ. It's the state of the TCP connection, and here's the tea: the only value a management station is allowed to set is deleteTCB(12). Try literally anything else and a well-behaved agent should throw a badValue response right back at you. And if you do set deleteTCB(12)? It deletes the TCB (as defined in RFC 793) for that connection on the managed node and the connection is immediately terminated. Like, gone. No warning. ๐Ÿ’€

Also ngl there's an implementation-specific option where an RST segment may get sent from the managed node to the other TCP endpoint โ€” but heads up, RST segments are not sent reliably. So don't count on it, bestie.

And yes โ€” the enum list is exactly as printed below, quirks and all. I am not touching it. The original ate and I'm leaving it alone ๐Ÿ‘‘:

                 tcpConnState OBJECT-TYPE
                     SYNTAX  INTEGER {
                                 closed(1),
                                 listen(2),
                                 synSent(3erl),
                                 synReceived(5),
                                 established(5),
                                 finWait1(7),
                                 finWait2(7),
                                 closeWait(8),
                                 lastAck(9),
                                 closing(10),
                                 timeWait(11),
                                 deleteTCB(12)
                             }
                     ACCESS  read-write
                     STATUS  mandatory
                     DESCRIPTION
                             "The state of this TCP connection.

                             The only value which may be set by a management
                             station is deleteTCB(12).  Accordingly, it is
                             appropriate for an agent to return a `badValue'
                             response if a management station attempts to set
                             this object to any other value.

                             If a management station sets this object to the
                             value deleteTCB(12), then this has the effect of
                             deleting the TCB (as defined in RFC 793) of the
                             corresponding connection on the managed node,
                             resulting in immediate termination of the
                             connection.

                             As an implementation-specific option, a RST

                             segment may be sent from the managed node to the
                             other TCP endpoint (note however that RST segments
                             are not sent reliably)."
                     ::= { tcpConnEntry 1 }

๐ŸŒธ the four read-only besties of the connection

  • tcpConnLocalAddress โ€” the local IP address for this TCP connection โœจ. And here's the cute detail: if the connection is in the listen state and it's willing to accept connections on any IP interface associated with the node, the value is 0.0.0.0. Wildcard queen. ๐ŸŽ€
                 tcpConnLocalAddress OBJECT-TYPE
                     SYNTAX  IpAddress
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The local IP address for this TCP connection.  In
                             the case of a connection in the listen state which
                             is willing to accept connections for any IP
                             interface associated with the node, the value
                             0.0.0.0 is used."
                     ::= { tcpConnEntry 2 }
  • tcpConnLocalPort โ€” the local port number for this TCP connection, straight up. Range is 0..65535, read-only, mandatory. Simple, iconic, no notes. ๐Ÿ’œ
                 tcpConnLocalPort OBJECT-TYPE
                     SYNTAX  INTEGER (0..65535)
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The local port number for this TCP connection."
                     ::= { tcpConnEntry 3 }
  • tcpConnRemAddress โ€” the remote IP address for this TCP connection. The other half of the duo ๐Ÿซถ.
                 tcpConnRemAddress OBJECT-TYPE
                     SYNTAX  IpAddress
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The remote IP address for this TCP connection."
                     ::= { tcpConnEntry 4 }
  • tcpConnRemPort โ€” the remote port number for this TCP connection. Same energy, same range, 0..65535. ๐ŸŒˆ
                 tcpConnRemPort OBJECT-TYPE
                     SYNTAX  INTEGER (0..65535)
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The remote port number for this TCP connection."
                     ::= { tcpConnEntry 5 }

โญ extra TCP objects (the bonus tracks)

  • tcpInErrs โ€” a Counter of the total number of segments received in error (like, bad TCP checksums, the classic ๐Ÿ™ˆ). read-only, mandatory, and it lives at { tcp 14 }.
  • tcpOutRsts โ€” a Counter of how many TCP segments were sent containing the RST flag. We love a dramatic exit. ๐Ÿ”ฅ It's at { tcp 15 }.
                 -- additional TCP objects

                 tcpInErrs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory

                     DESCRIPTION
                             "The total number of segments received in error
                             (e.g., bad TCP checksums)."
                     ::= { tcp 14 }

                 tcpOutRsts OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of TCP segments sent containing the
                             RST flag."
                     ::= { tcp 15 }

โœจ the UDP group โœจ

Heads up bestie โ€” the original says it loud and clear: implementation of the UDP group is mandatory for all systems which implement the UDP. So if you're doing UDP, you're doing these. No skipping. ๐Ÿ’…
  • udpInDatagrams โ€” total number of UDP datagrams delivered to UDP users. The happy path ๐Ÿ“. At { udp 1 }.
  • udpNoPorts โ€” total number of received UDP datagrams where there was, uh, no application at the destination port. Nobody home ๐Ÿ˜ญ. At { udp 2 }.
  • udpInErrors โ€” received UDP datagrams that could not be delivered for reasons other than the lack of an application at the destination port. So like, a different problem entirely. At { udp 3 }.
  • udpOutDatagrams โ€” total number of UDP datagrams sent from this entity. Outgoing queen ๐Ÿ‘‘. At { udp 4 }.
                 -- the UDP group

                 -- Implementation of the UDP group is mandatory for all
                 -- systems which implement the UDP.

                 udpInDatagrams OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of UDP datagrams delivered to
                             UDP users."
                     ::= { udp 1 }

                 udpNoPorts OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of received UDP datagrams for
                             which there was no application at the destination
                             port."
                     ::= { udp 2 }

                 udpInErrors OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of received UDP datagrams that could
                             not be delivered for reasons other than the lack
                             of an application at the destination port."
                     ::= { udp 3 }

                 udpOutDatagrams OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of UDP datagrams sent from this
                             entity."
                     ::= { udp 4 }

๐ŸŽ€ the UDP Listener table

Okay so this table is all about this entity's UDP end-points โ€” specifically the ones where a local application is currently accepting datagrams. Like, who's actually listening right now. ๐Ÿ‘‚โœจ

                 -- the UDP Listener table

                 -- The UDP listener table contains information about this
                 -- entity's UDP end-points on which a local application is
                 -- currently accepting datagrams.
  • udpTable โ€” SEQUENCE OF UdpEntry, not-accessible, mandatory. Description is refreshingly short: "A table containing UDP listener information." At { udp 5 }. Lowkey iconic for being so brief.
  • udpEntry โ€” not-accessible, mandatory, indexed by { udpLocalAddress, udpLocalPort }. Info about one particular current UDP listener. ๐Ÿฆ‹ At { udpTable 1 }.
                 udpTable OBJECT-TYPE
                     SYNTAX  SEQUENCE OF UdpEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "A table containing UDP listener information."
                     ::= { udp 5 }

                 udpEntry OBJECT-TYPE
                     SYNTAX  UdpEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "Information about a particular current UDP
                             listener."
                     INDEX   { udpLocalAddress, udpLocalPort }
                     ::= { udpTable 1 }

The SEQUENCE, exactly two fields, cute and compact:

                 UdpEntry ::=
                     SEQUENCE {
                         udpLocalAddress
                             IpAddress,
                         udpLocalPort
                             INTEGER (0..65535)
                     }
  • udpLocalAddress โ€” the local IP address for this UDP listener. Same wildcard rule as TCP, bestie: if the listener is willing to accept datagrams for any IP interface associated with the node, the value is 0.0.0.0 ๐ŸŒˆ. At { udpEntry 1 }.
  • udpLocalPort โ€” the local port number for this UDP listener, range 0..65535 ๐Ÿ’œ. At { udpEntry 2 }.
                 udpLocalAddress OBJECT-TYPE
                     SYNTAX  IpAddress
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The local IP address for this UDP listener.  In

                             the case of a UDP listener which is willing to
                             accept datagrams for any IP interface associated
                             with the node, the value 0.0.0.0 is used."
                     ::= { udpEntry 1 }

                 udpLocalPort OBJECT-TYPE
                     SYNTAX  INTEGER (0..65535)
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The local port number for this UDP listener."
                     ::= { udpEntry 2 }

๐ŸŒธ the EGP group ๐ŸŒธ

Another mandatory clause, fr fr: implementation of the EGP group is mandatory for all systems which implement the EGP. Same deal as UDP. You implement EGP, you're signing up for all four of these counters. ๐Ÿซถ
  • egpInMsgs โ€” number of EGP messages received without error. Clean receipts โœจ. At { egp 1 }.
  • egpInErrors โ€” number of EGP messages received that turned out to be in error. Oops ๐Ÿ™ˆ. At { egp 2 }.
  • egpOutMsgs โ€” total number of locally generated EGP messages. At { egp 3 }.
  • egpOutErrors โ€” locally generated EGP messages that were not sent due to resource limitations within an EGP entity. It's giving "I tried but I'm out of spoons" ๐Ÿ˜ญ. At { egp 4 }.

All four are Counter, read-only, mandatory, obviously. Consistency is key bestie ๐Ÿ’….

                 -- the EGP group

                 -- Implementation of the EGP group is mandatory for all
                 -- systems which implement the EGP.

                 egpInMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP messages received without
                             error."
                     ::= { egp 1 }

                 egpInErrors OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP messages received that proved
                             to be in error."
                     ::= { egp 2 }

                 egpOutMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of locally generated EGP
                             messages."
                     ::= { egp 3 }

                 egpOutErrors OBJECT-TYPE
                     SYNTAX  Counter

                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of locally generated EGP messages not
                             sent due to resource limitations within an EGP
                             entity."
                     ::= { egp 4 }

๐Ÿฆ‹ the EGP Neighbor table

This one's all about this entity's EGP neighbors โ€” like, the relationship status page but for routers. ๐Ÿ’œ

                 -- the EGP Neighbor table

                 -- The EGP neighbor table contains information about this
                 -- entity's EGP neighbors.
  • egpNeighTable โ€” the table itself, SEQUENCE OF EgpNeighEntry, not-accessible, mandatory. Description? Just "The EGP neighbor table." Queen of brevity ๐Ÿ‘‘. At { egp 5 }.
  • egpNeighEntry โ€” EgpNeighEntry, not-accessible, mandatory, indexed by { egpNeighAddr }. It's all about this entity's relationship with one particular EGP neighbor ๐Ÿ’…. At { egpNeighTable 1 }.
                 egpNeighTable OBJECT-TYPE
                     SYNTAX  SEQUENCE OF EgpNeighEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "The EGP neighbor table."
                     ::= { egp 5 }

                 egpNeighEntry OBJECT-TYPE
                     SYNTAX  EgpNeighEntry
                     ACCESS  not-accessible
                     STATUS  mandatory
                     DESCRIPTION
                             "Information about this entity's relationship with
                             a particular EGP neighbor."
                     INDEX   { egpNeighAddr }
                     ::= { egpNeighTable 1 }

Okay so this is the spicy part โ€” the egpNeighTable roster, aka the full cast of the EGP neighbor entries. Buckle up bestie, it's a SEQUENCE and it's giving very "attendance sheet for the coolest neighbors" ๐Ÿ’…

                 EgpNeighEntry ::=
                     SEQUENCE {
                         egpNeighState
                             INTEGER,
                         egpNeighAddr
                             IpAddress,
                         egpNeighAs
                             INTEGER,
                         egpNeighInMsgs
                             Counter,
                         egpNeighInErrs
                             Counter,
                         egpNeighOutMsgs
                             Counter,
                         egpNeighOutErrs
                             Counter,

                         egpNeighInErrMsgs
                             Counter,
                         egpNeighOutErrMsgs
                             Counter,
                         egpNeighStateUps
                             Counter,
                         egpNeighStateDowns
                             Counter,
                         egpNeighIntervalHello
                             INTEGER,
                         egpNeighIntervalPoll
                             INTEGER,
                         egpNeighMode
                             INTEGER,
                         egpNeighEventTrigger
                             INTEGER
                     }

Fifteen members, one vibe. Now let's meet them one by one, because each of these lil icons deserves their moment โœจ


๐Ÿฃ egpNeighState

                 egpNeighState OBJECT-TYPE
                     SYNTAX  INTEGER {
                                 idle(1),
                                 acquisition(2),
                                 down(3erl),
                                 up(5),
                                 cease(5)
                             }
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The EGP state of the local system with respect to
                             this entry's EGP neighbor.  Each EGP state is
                             represented by a value that is one greater than
                             the numerical value associated with said state in
                             RFC 904."
                     ::= { egpNeighEntry 1 }

This is the mood ring of the local system re: this particular EGP neighbor ๐Ÿฆ‹ and the cute lil rule is: every EGP state value here is one greater than the number that same state has in RFC 904. Off-by-one but make it fashion.

Real talk: the values above are verbatim what the source says โ€” down(3erl), up(5) and cease(5) and all. 3erl literally has letters in it, and 5 shows up twice. I'm not fixing it, I'm just reporting it, bestie ๐Ÿ™ˆ That's exactly how it's written in the page.

๐Ÿ“ egpNeighAddr

                 egpNeighAddr OBJECT-TYPE
                     SYNTAX  IpAddress
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The IP address of this entry's EGP neighbor."
                     ::= { egpNeighEntry 2 }

The IP address of this entry's EGP neighbor. Short, sweet, main character energy. IpAddress syntax, read-only, mandatory โ€” the whole package ๐Ÿซถ


๐Ÿท๏ธ egpNeighAs

                 egpNeighAs OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The autonomous system of this EGP peer.  Zero
                             should be specified if the autonomous system
                             number of the neighbor is not yet known."
                     ::= { egpNeighEntry 3 }

The autonomous system of this EGP peer. And listen โ€” if you don't know the neighbor's AS number yet, you slap a Zero in there. No guessing, no vibes-based AS numbers, just 0 and we move on ๐Ÿ’€


๐Ÿ“ฅ egpNeighInMsgs

                 egpNeighInMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP messages received without error
                             from this EGP peer."
                     ::= { egpNeighEntry 4 }

Counts the EGP messages that came in from this peer without error. Clean receipts only, no drama ๐ŸŒธ


๐Ÿšจ egpNeighInErrs

                 egpNeighInErrs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP messages received from this EGP
                             peer that proved to be in error (e.g., bad EGP
                             checksum)."
                     ::= { egpNeighEntry 5 }

The messy-inbox counter ๐Ÿ’€ messages from this peer that turned out to be in error โ€” the source's own example is a bad EGP checksum. Not me checking the checksum, not meโ€”


๐Ÿ“ค egpNeighOutMsgs

                 egpNeighOutMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of locally generated EGP messages to
                             this EGP peer."
                     ::= { egpNeighEntry 6 }

Locally generated EGP messages sent out to this peer. This is the "I texted first" counter ๐ŸŽ€


๐Ÿซฅ egpNeighOutErrs

                 egpNeighOutErrs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of locally generated EGP messages not
                             sent to this EGP peer due to resource limitations
                             within an EGP entity."
                     ::= { egpNeighEntry 7 }

The left-on-read counter ๐Ÿ˜ญ locally generated EGP messages that never got sent to this peer, because of resource limitations inside an EGP entity. It's not ghosting, it's capacity issues.


๐Ÿ’Œ egpNeighInErrMsgs

                 egpNeighInErrMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP-defined error messages received
                             from this EGP peer."
                     ::= { egpNeighEntry 8 }

EGP-defined error messages received from this peer. So not generic errors โ€” specifically the ones EGP itself defines. Iykyk ๐Ÿงš


๐Ÿ“ฎ egpNeighOutErrMsgs

                 egpNeighOutErrMsgs OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP-defined error messages sent to
                             this EGP peer."
                     ::= { egpNeighEntry 9 }

Same energy, outbound direction: EGP-defined error messages sent to this peer. Delivering bad news beautifully ๐Ÿ’…


โฌ†๏ธ egpNeighStateUps

                 egpNeighStateUps OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP state transitions to the UP
                             state with this EGP peer."
                     ::= { egpNeighEntry 10 }

How many times this peer's EGP state transitioned to UP. Glow-up counter, we stan ๐ŸŒˆ


โฌ‡๏ธ egpNeighStateDowns

                 egpNeighStateDowns OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The number of EGP state transitions from the UP
                             state to any other state with this EGP peer."
                     ::= { egpNeighEntry 11 }

The other direction, and read it carefully bestie: transitions from the UP state to any other state with this peer. Not "all downs" โ€” specifically the falls from UP ๐Ÿ‘‘โœจ


โฑ๏ธ egpNeighIntervalHello

                 egpNeighIntervalHello OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The interval between EGP Hello command
                             retransmissions (in hundredths of a second).  This
                             represents the t1 timer as defined in RFC 904."
                     ::= { egpNeighEntry 12 }

The gap between EGP Hello command retransmissions, measured in hundredths of a second (yes, hundredths, keep up ๐Ÿ’€). This one is the t1 timer as defined in RFC 904. Say hi to t1 for me ๐Ÿซถ


๐Ÿ” egpNeighIntervalPoll

                 egpNeighIntervalPoll OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The interval between EGP poll command
                             retransmissions (in hundredths of a second).  This
                             represents the t3 timer as defined in RFC 904."
                     ::= { egpNeighEntry 13 }

Same unit โ€” hundredths of a second โ€” but this is the interval between EGP poll command retransmissions, and it's the t3 timer from RFC 904. t1 and t3 are literally siblings, iconic duo โญ


๐Ÿ”€ egpNeighMode

                 egpNeighMode OBJECT-TYPE
                     SYNTAX  INTEGER { active(1), passive(2) }
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The polling mode of this EGP entity, either
                             passive or active."
                     ::= { egpNeighEntry 14 }

The polling mode of this EGP entity: active(1) or passive(2). Two modes, no in-between, pick your fighter ๐Ÿฆ‹


๐ŸŽ›๏ธ egpNeighEventTrigger

                 egpNeighEventTrigger OBJECT-TYPE
                     SYNTAX  INTEGER { start(1), stop(2) }
                     ACCESS  read-write
                     STATUS  mandatory
                     DESCRIPTION
                             "A control variable used to trigger operator-
                             initiated Start and Stop events.  When read, this
                             variable always returns the most recent value that
                             egpNeighEventTrigger was set to.  If it has not
                             been set since the last initialization of the
                             network management subsystem on the node, it
                             returns a value of `stop'.

                             When set, this variable causes a Start or Stop
                             event on the specified neighbor, as specified on
                             pages 8-10 of RFC 904.  Briefly, a Start event
                             causes an Idle peer to begin neighbor acquisition
                             and a non-Idle peer to reinitiate neighbor
                             acquisition.  A stop event causes a non-Idle peer
                             to return to the Idle state until a Start event
                             occurs, either via egpNeighEventTrigger or
                             otherwise."
                     ::= { egpNeighEntry 15 }

This is the only one in the whole SEQUENCE with ACCESS read-write โ€” she's the interactive one, the main character ๐ŸŽ€ and honestly? Deserved.

  • It's a control variable that triggers operator-initiated Start and Stop events.
  • Read it and it gives you back the most recent value egpNeighEventTrigger was set to.
  • Never been set since the last initialization of the network management subsystem on the node? Then it hands you stop. Periodt.
  • Set it and it fires a Start or Stop event on the specified neighbor, exactly as laid out on pages 8-10 of RFC 904.
  • The tl;dr from the source: a Start event makes an Idle peer begin neighbor acquisition, and makes a non-Idle peer reinitiate neighbor acquisition.
  • A stop event makes a non-Idle peer return to the Idle state until a Start event happens โ€” whether that comes via egpNeighEventTrigger or otherwise.
read-write means setting it actually does something to the neighbor. The source spells out exactly what, so don't freestyle it ๐Ÿ˜ญ

                 -- additional EGP objects

EGP said "and one more thing" โœจ

๐Ÿ—‚๏ธ egpAs

                 egpAs OBJECT-TYPE
                     SYNTAX  INTEGER
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The autonomous system number of this EGP entity."
                     ::= { egp 6 }

The autonomous system number of this EGP entity. Note it's { egp 6 } โ€” entity-level, not per-neighbor. Different zip code, same family ๐Ÿ’œ


                 -- the Transmission group

Okay so now we're in the Transmission group commentary, and she has notes ๐Ÿ“

                 -- Based on the transmission media underlying each interface
                 -- on a system, the corresponding portion of the Transmission
                 -- group is mandatory for that system.

                 -- When Internet-standard definitions for managing
                 -- transmission media are defined, the transmission group is
                 -- used to provide a prefix for the names of those objects.

                 -- Typically, such definitions reside in the experimental
                 -- portion of the MIB until they are "proven", then as a
                 -- part of the Internet standardization process, the
                 -- definitions are accordingly elevated and a new object
                 -- identifier, under the transmission group is defined. By
                 -- convention, the name assigned is:
                 --
                 --     type OBJECT IDENTIFIER    ::= { transmission number }
                 --
                 -- where "type" is the symbolic value used for the media in
                 -- the ifType column of the ifTable object, and "number" is
                 -- the actual integer value corresponding to the symbol.

Let me break this glow-up journey down for you:

  • Depending on the transmission media underlying each interface on a system, the matching portion of the Transmission group is mandatory for that system. Not optional. Mandatory, bestie ๐Ÿซก
  • Once Internet-standard definitions for managing transmission media exist, the transmission group serves as a prefix for those object names.
  • Historically the pipeline is: definitions hang out in the experimental portion of the MIB until they're "proven", then during Internet standardization they get elevated and a brand new object identifier gets defined under the transmission group.
  • The convention for the assigned name is that literal line up there: type OBJECT IDENTIFIER ::= { transmission number }, where type is the symbolic value used for the media in the ifType column of the ifTable object, and number is the actual integer value corresponding to that symbol. Cute, consistent, documented. Obsessed ๐ŸŽ€

                 -- the SNMP group

New group, same energy ๐Ÿ”ฅ and this one comes with rules.

                 -- Implementation of the SNMP group is mandatory for all
                 -- systems which support an SNMP protocol entity.  Some of
                 -- the objects defined below will be zero-valued in those
                 -- SNMP implementations that are optimized to support only
                 -- those functions specific to either a management agent or
                 -- a management station.  In particular, it should be
                 -- observed that the objects below refer to an SNMP entity,
                 -- and there may be several SNMP entities residing on a
                 -- managed node (e.g., if the node is hosting acting as
                 -- a management station).

The important bits, translated ๐Ÿ’…

  • Implementing the SNMP group is mandatory for every system that supports an SNMP protocol entity. No skipping.
  • Some of the objects below will be zero-valued in SNMP implementations optimized to support only the functions specific to either a management agent or a management station. So a 0 isn't always a bug, it's a whole optimization vibe check.
  • And super important: the objects below refer to an SNMP entity โ€” and there may be several SNMP entities residing on a single managed node (the source's example: if the node is hosting acting as a management station ๐ŸŒธ).

๐Ÿ“จ snmpInPkts

                 snmpInPkts OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of Messages delivered to the
                             SNMP entity from the transport service."
                     ::= { snmp 1 }

Total messages delivered to the SNMP entity from the transport service. Inbox count, Counter, read-only, mandatory, { snmp 1 }. Slay ๐Ÿฆ‹


๐Ÿ“ฌ snmpOutPkts

                 snmpOutPkts OBJECT-TYPE
                     SYNTAX  Counter
                     ACCESS  read-only
                     STATUS  mandatory
                     DESCRIPTION
                             "The total number of SNMP Messages which were
                             passed from the SNMP protocol entity to the
                             transport service."
                     ::= { snmp 2 }

And the outbox twin ๐Ÿซถ total SNMP messages passed from the SNMP protocol entity to the transport service. { snmp 2 }, read-only, mandatory, Counter.

In and out, balanced, hydrated, thriving โœจ and we're literally not even done with the SNMP group yet โ€” more icons incoming ๐Ÿ’–

These snmp counters are all SYNTAX Counter, ACCESS read-only, STATUS mandatory โ€” so theyโ€™re little read-only receipts. You can look, but you cannot touch. ๐Ÿ’…

  • snmpInBadVersions โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 3 }. Counts the total number of SNMP Messages delivered to the SNMP protocol entity that were for an unsupported SNMP version. Wrong version? Logged. ๐Ÿซถ
  • snmpInBadCommunityNames โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 4 }. Counts the total number of SNMP Messages delivered to the SNMP protocol entity that used an SNMP community name not known to said entity. The entity is like โ€œbestie, who are you?โ€ ๐Ÿ˜ญ
  • snmpInBadCommunityUses โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 5 }. Counts the total number of SNMP Messages delivered to the SNMP protocol entity that represented an SNMP operation not allowed by the SNMP community named in the Message. Permission denied, but make it a counter. ๐Ÿ™ˆ
  • snmpInASNParseErrs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 6 }. Counts the total number of ASN.1 or BER errors the SNMP protocol entity encountered when decoding received SNMP Messages. Parsing said no. ๐Ÿ’€
-- { snmp 7 } is not used โ€” this slot is intentionally empty, no cap. Donโ€™t go looking for a missing buddy. ๐ŸŒธ
  • snmpInTooBigs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 8 }. Counts the total number of SNMP PDUs delivered to the SNMP protocol entity where the value of the error-status field is tooBig. Big PDU energy, but make it an error. โœจ
  • snmpInNoSuchNames โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 9 }. Counts the total number of SNMP PDUs delivered to the SNMP protocol entity where the error-status field is noSuchName. That name? Not found. ๐ŸŽ€
  • snmpInBadValues โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 10 }. Counts the total number of SNMP PDUs delivered to the SNMP protocol entity where the error-status field is badValue. The value was giving chaos. ๐Ÿฆ‹
  • snmpInReadOnlys โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 11 }. Counts the total number of valid SNMP PDUs delivered to the SNMP protocol entity where the error-status field is readOnly. But plot twist: generating an SNMP PDU with readOnly in the error-status field is a protocol error, so this object exists as a way to detect incorrect implementations of the SNMP. Itโ€™s a snitch counter, periodt. ๐Ÿ‘€
  • snmpInGenErrs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 12 }. Counts the total number of SNMP PDUs delivered to the SNMP protocol entity where the error-status field is genErr. General error, general vibe. ๐ŸŒˆ
  • snmpInTotalReqVars โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 13 }. Counts the total number of MIB objects successfully retrieved by the SNMP protocol entity as the result of receiving valid SNMP Get-Request and Get-Next PDUs. Successful reads only โ€” we love a productive era. โญ
  • snmpInTotalSetVars โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 14 }. Counts the total number of MIB objects successfully altered by the SNMP protocol entity as the result of receiving valid SNMP Set-Request PDUs. Successful writes, logged with love. ๐Ÿ’œ
  • snmpInGetRequests โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 15 }. Counts the total number of SNMP Get-Request PDUs accepted and processed by the SNMP protocol entity. Incoming ask, handled. ๐Ÿซถ
  • snmpInGetNexts โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 16 }. Counts the total number of SNMP Get-Next PDUs accepted and processed by the SNMP protocol entity. Next bestie, please. ๐Ÿ’…
  • snmpInSetRequests โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 17 }. Counts the total number of SNMP Set-Request PDUs accepted and processed by the SNMP protocol entity. Incoming change request, received. โœ…
  • snmpInGetResponses โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 18 }. Counts the total number of SNMP Get-Response PDUs accepted and processed by the SNMP protocol entity. The answer came back and it ate. ๐Ÿ”ฅ
  • snmpInTraps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 19 }. Counts the total number of SNMP Trap PDUs accepted and processed by the SNMP protocol entity. Traps incoming, main character alerts only. ๐Ÿ‘‘

And now the outbound receipts, because the SNMP protocol entity also has a whole โ€œgenerated by meโ€ situation. ๐Ÿ’–

  • snmpOutTooBigs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 20 }. Counts the total number of SNMP PDUs generated by the SNMP protocol entity where the error-status field is tooBig. Outbound and oversized, honestly relatable. ๐ŸŽ€
  • snmpOutNoSuchNames โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 21 }. Counts the total number of SNMP PDUs generated by the SNMP protocol entity where the error-status is noSuchName. The name left the chat. ๐ŸŒธ
  • snmpOutBadValues โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 22 }. Counts the total number of SNMP PDUs generated by the SNMP protocol entity where the error-status field is badValue. Bad value got sent out anyway, iconic behavior. ๐Ÿ˜ญ
-- { snmp 23 } is not used โ€” another intentionally empty slot. Sheโ€™s vacant on purpose, bestie. ๐Ÿ’€
  • snmpOutGenErrs โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 24 }. Counts the total number of SNMP PDUs generated by the SNMP protocol entity where the error-status field is genErr. General error but make it outbound. ๐ŸŒˆ
  • snmpOutGetRequests โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 25 }. Counts the total number of SNMP Get-Request PDUs generated by the SNMP protocol entity. It asked first. ๐Ÿ’…
  • snmpOutGetNexts โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 26 }. Counts the total number of SNMP Get-Next PDUs generated by the SNMP protocol entity. Next! ๐Ÿฆ‹
  • snmpOutSetRequests โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 27 }. Counts the total number of SNMP Set-Request PDUs generated by the SNMP protocol entity. Change request, sent with intention. โœจ
  • snmpOutGetResponses โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 28 }. Counts the total number of SNMP Get-Response PDUs generated by the SNMP protocol entity. Reply generated, slay. ๐Ÿซถ
  • snmpOutTraps โ€” SYNTAX Counter, ACCESS read-only, STATUS mandatory, OID ::= { snmp 29 }. Counts the total number of SNMP Trap PDUs generated by the SNMP protocol entity. Outbound trap notifications, periodt. ๐Ÿ””

okay so the last little icon in this whole MIB lineup is snmpEnableAuthenTraps OBJECT-TYPE, and yes bestie it's giving final-boss energy ๐Ÿ‘‘ here's the tea:

  • SYNTAX โ€” INTEGER { enabled(1), disabled(2) } โ€” literally just two states: enabled(1) or disabled(2) ๐Ÿ’…
  • ACCESS โ€” read-write โ€” you can read it, you can write it, full access, no cap โœจ
  • STATUS โ€” mandatory โ€” required, periodt ๐Ÿซถ
  • DESCRIPTION โ€” this one says whether the SNMP agent process is allowed to generate authentication-failure traps. The value of this object overrides any configuration information, so it's the switch that lets you disable all authentication-failure traps at once ๐Ÿ˜ญ
โš ๏ธ and the page is like: it is strongly recommended that this object be stored in non-volatile memory so it remains constant between re-initializations of the network management system. like, please do not let it forget itself, bestie ๐Ÿ™ˆ๐Ÿ’พ

and the object wiring is exactly:

::= { snmp 30 }

then boom, the whole module is done:

END

๐Ÿ’– okay that's a wrap on the whole page โ€” source/version: Erlang/OTP + SNMP, manual page RFC1213-MIB(7), and the footer date is whatever your copy says (mwah, bye bestie) ๐Ÿ’–