RFC 4220

Traffic Engineering Link Management Information Base

πŸ“… published November 2005, from ietf

okay bestie, let's start with the title block πŸ’– This RFC is by M. Dubuc (Consultant), T. Nadeau (Cisco Systems), and J. Lang (Sonos, Inc.). It's from the Network Working Group, it's a Standards Track doc, and it's dated November 2005. Its title is Traffic Engineering Link Management Information Base, and the title block doesn't list anything it obsoletes or updates ✨


Status of This Memo πŸ“œ

this doc is an Internet standards track protocol for the Internet community, and it's asking for discussion and suggestions for improvements 🫢 For the standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited 🌸

Copyright (C) The Internet Society (2005) πŸ’œ

Abstract πŸ¦‹

this memo defines a portion of the Management Information Base (MIB) for use with network management protocols in the Internet community ✨ specifically, it describes managed objects for modeling TE links as described in the Link Bundling in MPLS Traffic Engineering (TE) document. literally the main thing it's here to do πŸ’…

Table of Contents 🧚

1. The Internet-Standard Management Framework ......................2
2. Introduction ....................................................3
3. Terminology .....................................................3
4. Feature Checklist ...............................................4
5. Outline .........................................................4
6. Brief Description of MIB Objects ................................4
   6.1. teLinkTable ................................................4
   6.2. teLinkDescriptorTable ......................................4
   6.3. teLinkSrlgTable ............................................5
   6.4. teLinkBandwidthTable .......................................5
   6.5. componentLinkTable .........................................5
   6.6. componentLinkDescriptorTable ...............................5
   6.7. componentLinkBandwidthTable ................................5
7. Example of Bundled Link Setup ...................................5
8. Application of the Interfaces Group to TE Links .................9
   8.1. Support of the TE Link Layer by ifTable ....................9
   8.2. Using ifStackTable ........................................11
   8.3. Applicability of ifRcvAddressTable ........................13
9. TE Link MIB Module Definitions .................................13
10. Security Considerations .......................................50
11. Contributors ..................................................51
12. Acknowledgements ..............................................51
13. IANA Considerations ...........................................51
    13.1. IANA Considerations for the TE-LINK-STD-MIB .............51
14. References ....................................................51
    14.1. Normative References ....................................51
    14.2. Informative References ..................................52

1. The Internet-Standard Management Framework ✨

for a detailed overview of the documents that describe the current Internet-Standard Management Framework, check out section 7 of RFC 3410 [RFC3410] πŸ“š

managed objects are accessed via a virtual information store, called the Management Information Base or MIB πŸ—‚οΈ MIB objects are generally accessed through the Simple Network Management Protocol (SNMP). objects in the MIB are defined using the mechanisms in the Structure of Management Information (SMI). this memo specifies a MIB module that is compliant to the SMIv2, which is described in STD 58, RFC 2578 [RFC2578], STD 58, RFC 2579 [RFC2579] and STD 58, RFC 2580 [RFC2580] 🫢

2. Introduction 🌈

okay so OSPF [RFC3630], Generalized MPLS (GMPLS) [RFC3471], and the Link Management Protocol (LMP) [RFC4204] all use the concept of traffic engineering (TE) links to abstract link properties πŸ¦‹ the effect is a reduction in the amount of routing information exchanged in the network, which improves routing scalability πŸ“ˆ on top of that, TE links allow new capabilities like link protection. main character energy, honestly πŸ‘‘

in this document, we present a MIB module that can be used to manage TE links and their extension, the bundled link ✨ this MIB module enables both the configuration and the performance monitoring of TE links and the bundled link πŸ’…

the key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119]. these are the official capital-letter words, so treat them as the rules they are πŸ”₯

3. Terminology πŸŽ€

this document uses terminology from the documents describing link bundling [RFC4201] and GMPLS [RFC3945] 🧠

the link bundling feature is designed to aggregate one or more similar entities between a node pair into a bundled link [RFC4201]. in RFC 4201, those entities are referred to as TE links. a TE link is a subinterface capable of carrying MPLS traffic engineered traffic πŸ“ a TE Link may be comprised of only one underlying component link. in cases where more than one component links are to be combined, multiple component links should be created with differing priorities to indicate hot-standby or parallel utilization 🌸

a bundled link is another kind of Traffic Engineering (TE) link (see [RFC4203]). a link bundle is a subinterface that binds the traffic of a group of one or more TE links 🫧 there should be more than one TE Link in a link bundle, but this is not a requirement, so no pressure πŸ™ˆ furthermore, if there are more than one TE links in a link bundle at some time, and at some point later all but one of the links are deleted, the agent may choose to either delete the link bundle, or it may choose to leave it intact. traffic counters on a link bundle are cumulative for all subinterfaces that it binds together. πŸ’œ

4. Feature Checklist πŸ’…

the TE Link MIB module (TE-LINK-STD-MIB) is designed to satisfy the following requirements and constraints:

  • The MIB module supports the management of TE links, including bundled links.
  • Support is provided for configuration of traffic engineering parameters associated with TE links.
  • The MIB module is used to monitor the priority-based component link and TE link bandwidth values.

5. Outline πŸ—ΊοΈ

configuring bundled links involves these steps:

  • Creating a bundled link.
  • Creating TE links.
  • Optionally specifying the shared risk link groups associated with the TE links.
  • Configuring the component links, including the bandwidth parameters, and associating the component links with the appropriate TE link.
  • Associating the TE links with the appropriate bundled link.

6. Brief Description of MIB Objects 🧁

sections 6.1 - 6.4 describe objects pertaining to TE links, while sections 6.5 - 6.7 describe objects pertaining to component links. the MIB objects were derived from the link bundling document [RFC4201] ✨

6.1. teLinkTable

this table represents the TE links, including bundled links, and their generic traffic engineering parameters πŸ’–

6.2. teLinkDescriptorTable

this table represents the TE link interface switching capability descriptors πŸ¦‹

6.3. teLinkSrlgTable

this table represents the shared risk link groups (SRLGs) associated with TE links 🌷

6.4. teLinkBandwidthTable

this table specifies the priority-based bandwidth traffic engineering parameters associated with TE links 🫢

6.5. componentLinkTable

this table enumerates the component links and their generic traffic engineering parameters 🧚

6.6. componentLinkDescriptorTable

this table enumerates the interface switching capability descriptors that each component link supports 🌈

6.7. componentLinkBandwidthTable

the component link bandwidth table specifies the priority-based bandwidth values associated with the component links πŸ’œ

component links that belong to the same TE link must be compatible. if these two tables are managed independently, mechanisms should be put in place to ensure consistency between the two tables. TE links that form a bundled link must have compatible traffic engineering parameters (resource class, link metric, and protection type). this part is giving "keep your story straight" πŸ™ˆ

the link descriptors of the teLinkDescriptorTable can be derived from the link descriptors of the componentLinkDescrTable πŸ“

some of the bandwidth parameters of the teLinkTable, teLinkDescriptorTable, and teLinkBandwidthTable are derived from the bandwidth parameters of the componentLinkTable, componentLinkDescriptorTable, and componentLinkBandwidthTable (maximum reservable bandwidth, minimum LSP bandwidth, maximum LSP bandwidth at specified priority, and unreserved bandwidth). it's all connected, bestie, and that's iconic πŸ‘‘

okay so this section is a quick walkthrough of using the MIB objects from section 10 to set up a bundled link πŸŽ€ It's not meant to show every single nuance of the MIB module, but it totally helps you get the key concepts. Read it after you've gone through the MIB module itself πŸ’… And Section 8.2 has the deeper details on using the ifStackTable to connect bundled links, TE links, and component links πŸ”—

Let's say you want to manually make a bundled link out of two 1:1 TE links, like in the figure in Section 8.2 πŸ¦‹ The bundled link is associated with SRLGs 10 and 50, and the component links are port entity interfaces (lambdas) 🌈 The example below shows which rows and objects you might create to make this happen.

First, you create a bundled link entry. An ifEntry with the same ifIndex and with ifType teLink needs to exist beforehand 🧚

In teLinkTable:
{
   ifIndex                        = 2,
   teLinkAddressType              = unknown(0),
   teLinkLocalIpAddr              = ''H,
   teLinkRemoteIpAddr             = ''H,
   teLinkMetric                   = 5,
   teLinkProtectionType           = dedicated1For1(4),
   teLinkWorkingPriority          = 7,
   teLinkResourceClass            = 3,
   teLinkIncomingIfId             = 0,
   teLinkOutgoingIfId             = 2,
   teLinkRowStatus                = createAndGo(4),
   teLinkStorageType              = nonVolatile(3)
}

In ifStackTable:
{
   ifStackHigherLayer             = 0,
   ifStackLowerLayer              = 2,
   ifStackStatus                  = createAndGo(4)
}

Next up, the two TE links get created 🫢

In teLinkTable:
{
   ifIndex                        = 3,
   teLinkAddressType              = unknown(0),
   teLinkLocalIpAddr              = ''H,
   teLinkRemoteIpAddr             = ''H,
   teLinkMetric                   = 5,
   teLinkProtectionType           = unprotected(2),
   teLinkWorkingPriority          = 7,
   teLinkResourceClass            = 3,
   teLinkIncomingIfId             = 0,
   teLinkOutgoingIfId             = 3,
   teLinkRowStatus                = createAndGo(4),
   teLinkStorageType              = nonVolatile(3)
}

In ifStackTable:
{
   ifStackHigherLayer             = 2,
   ifStackLowerLayer              = 3,
   ifStackStatus                  = createAndGo(4)
}

In teLinkTable:
{
   ifIndex                        = 4,
   teLinkAddressType              = unknown(0),
   teLinkLocalIpAddr              = ''H,
   teLinkRemoteIpAddr             = ''H,
   teLinkMetric                   = 5,
   teLinkProtectionType           = unprotected(2),
   teLinkWorkingPriority          = 7,
   teLinkResourceClass            = 3,
   teLinkIncomingIfId             = 0,
   teLinkOutgoingIfId             = 4,
   teLinkRowStatus                = createAndGo(4),
   teLinkStorageType              = nonVolatile(3)
}

In ifStackTable:
{
   ifStackHigherLayer             = 2,
   ifStackLowerLayer              = 4,
   ifStackStatus                  = createAndGo(4)
}

Now we assign SRLGs to the TE links πŸ’œ

In the teLinkSrlgTable:
{
   ifIndex                        = 3,
   teLinkSrlg                     = 10,
   teLinkSrlgRowStatus            = createAndGo(4),
   teLinkSrlgStorageType          = nonVolatile(3)
}

In the teLinkSrlgTable:
{

   ifIndex                        = 4,
   teLinkSrlg                     = 50,
   teLinkSrlgRowStatus            = createAndGo(4),
   teLinkSrlgStorageType          = nonVolatile(3)
}

And the bundled link inherits the SRLG properties from its associated TE links πŸ“

Next, for each unbundled TE link, you create a component link. An ifEntry with the same ifIndex needs to exist beforehand 🌸

In componentLinkTable:
{
   ifIndex                          = 5,
   componentLinkPreferredProtection = primary(1),
   componentLinkRowStatus           = createAndGo(4),
   componentLinkStorageType         = nonVolatile(3)
}

In ifStackTable:
{
   ifStackHigherLayer             = 3,
   ifStackLowerLayer              = 5,
   ifStackStatus                  = createAndGo(4)
}

In componentLinkTable:
{
   ifIndex                          = 6,
   componentLinkPreferredProtection = secondary(2),
   componentLinkRowStatus           = createAndGo(4)
   componentLinkStorageType         = nonVolatile(3)
}

In ifStackTable:
{
   ifStackHigherLayer             = 4,
   ifStackLowerLayer              = 6,
   ifStackStatus                  = createAndGo(4)
}

In this example, once a component link is added to the componentLinkTable, its associated link descriptors are implicitly added to the componentLinkDescriptorTable πŸ‘‘

TE link link descriptors are derived from their component link descriptors πŸŽ€

Also, the bandwidth attributes in teLinkDescriptorTable, componentLinkDescriptorTable, teLinkBandwidthTable, and componentLinkBandwidthTable are maintained by the device according to LSP creation/deletion at different priorities 🫧 The values in the teLinkBandwidthTable are an aggregation of the values for the component links of the TE links and the TE links of the bundled link πŸ’–


The Interfaces Group [RFC2863] defines generic managed objects for managing interfaces ✨ This memo adds the media-specific extensions to the Interfaces Group so you can manage TE Link interfaces as logical interfaces πŸ’…

This memo assumes the Interfaces Group is interpreted in line with [RFC2863], which says the interfaces table (ifTable) holds info on the managed resource's interfaces, and that every sub-layer below the internetwork layer of a network interface counts as an interface 🌈 So the TE Link interface shows up as an entry in the ifTable 🧚 How the entries in the ifTable relate to each other is defined by the Interfaces Stack Group, as set out in [RFC2863] πŸ”—

When you're using TE Link interfaces, the interface stack table might look something like this πŸŽ€

      +----------------------------------------+
      | TE link-interface ifType = teLink(200) +
      +----------------------------------------+
      | Underlying Layer...                    +
      +----------------------------------------+

In the diagram above, "Underlying Layer..." refers to the ifIndex of any interface type that has been defined for TE Link interworking 🫢 Examples include ATM, Frame Relay, Ethernet, etc. πŸ“

Here are some specific interpretations of ifTable for the TE Link layer πŸ’œ

Object        Use for the TE Link layer

ifIndex       Each TE Link interface is represented by an ifEntry.

ifDescr       Description of the TE Link interface.

ifType        The value that is allocated for TE Link is 200
              [IANAifType].

ifSpeed       The total bandwidth in bits per second for use by the
              TE Link layer.

ifPhysAddress Unused.

ifAdminStatus This variable indicates the administrator's intent as
              to whether TE Link should be enabled, disabled, or
              running in some diagnostic testing mode on this
              interface.  Also see [RFC2863].

ifOperStatus  This value reflects the actual or operational status of
              the TE Link on this interface.

ifLastChange  See [RFC2863].

ifInOctets    The number of received octets over the interface, i.e.,
              the number of received octets in all component links
              associated with the interface.

ifOutOctets   The number of transmitted octets over the interface,
              i.e., the number of octets transmitted over all
              component links associated with the interface.

ifInErrors    The number of packets dropped due to uncorrectable
              errors.

ifInUnknownProtos
              The number of received packets discarded during packet
              header validation.

ifOutErrors   See [RFC2863].

ifName        Textual name (unique on this system) of the interface,
              or an octet string of zero length.

ifLinkUpDownTrapEnable
              Default is disabled (2).

ifConnectorPresent
              Set to false (2).

ifHighSpeed   See [RFC2863].

ifHCInOctets  The 64-bit version of ifInOctets; supported if required
              by the compliance statements in [RFC2863].

ifHCOutOctets The 64-bit version of ifOutOctets; supported if
              required by the compliance statements in [RFC2863].

ifAlias       The non-volatile 'alias' name for the interface, as
              specified by a network manager.

ifCounterDiscontinuityTime
              See [RFC2863].

Support for ifInOctets, ifOutOctets, ifInErrors, ifInUnknownProtos, ifOutErrors, ifHCInOctets, and ifHCOutOctets objects isn't required if the encoding type is clear πŸ™ˆ For other encoding types, traffic counters on a TE link are cumulative for all subinterfaces that it binds together πŸ“Šβœ¨

8.2. Using ifStackTable ✨

okay so this section is all about showing, through examples, how to use the ifStackTable to map out how TE links sit on top of the TE-enabled interfaces underneath them 🧚 if you're building the stack table for TE link interfaces, you should check the RFC for whatever service is getting stacked on the TE links πŸ’… and fyi these examples are just for illustration, not gospel πŸŽ€

Example: MPLS is being carried on a bundled TE link. The bundled TE link represents a 1:1 optical transport interface.

Here the component link is a TE link, and the two component links (TE links) get grouped into one bundled link 🫢

   +-------------------------------------------------------------------+
   | MPLS interface ifType = mpls(166)                                 |
   | ifIndex = 1                                                       |
   +-------------------------------------------------------------------+
   | TE link (bundled link) ifType = teLink(200)                       |
   | ifIndex = 2                                                       |
   +--------------------------------+-+--------------------------------+
   | TE link ifType = teLink(200)   | | TE link ifType = teLink(200)   |
   | ifIndex = 3                    | | ifIndex = 4                    |
   +--------------------------------+ +--------------------------------+
   | Component link                 | | Component link                 |
   | ifType = opticalTransport(196) | | ifType = opticalTransport(196) |
   | ifIndex = 5                    | | ifIndex = 6                    |
   +--------------------------------+ +--------------------------------+

The index values could, for example, be assigned like this πŸ“

            ifIndex  Description
            1        mpls             (type 166)
            2        teLink           (type 200)
            3        teLink           (type 200)
            4        teLink           (type 200)
            5        opticalTransport (type 196)
            6        opticalTransport (type 196)

Then the ifStackTable is what shows how all these interfaces relate to each other πŸ¦‹

            ifStackTable Entries

            HigherLayer   LowerLayer
            0             1
            1             2
            2             3
            2             4
            3             5
            4             6
            5             0
            6             0

Now, if MPLS is only using a single TE link, the upper TE link layer (the link bundle) isn't needed at all 🌸

      +-----------------------------------+
      | MPLS interface ifType = mpls(166) |
      +-----------------------------------+
      | TE link ifType = teLink(200)      |
      +-----------------------------------+
      | Component link                    |
      | ifType = opticalTransport(196)    |
      +-----------------------------------+

The index values could, for example, be:

            ifIndex  Description
            1        mpls             (type 166)
            2        teLink           (type 200)
            3        opticalTransport (type 196)

And the ifStackTable again shows the relationships between the interfaces:

            ifStackTable Entries

            HigherLayer   LowerLayer
            0             1
            1             2
            2             3
            3             0

8.3. Applicability of ifRcvAddressTable πŸ™ˆ

ngl this one's short and sweet: TE link interfaces are logical interfaces with no media-level addresses πŸ’œ so the ifRcvAddressTable just doesn't apply to them πŸ’€

okay the MIB module is next, and it's giving a lot of detail, so every line stays exactly as written πŸ“œπŸŽ€

   TE-LINK-STD-MIB DEFINITIONS ::= BEGIN

   IMPORTS
      MODULE-IDENTITY, OBJECT-TYPE, transmission, Integer32, Unsigned32
         FROM SNMPv2-SMI

      MODULE-COMPLIANCE, OBJECT-GROUP
         FROM SNMPv2-CONF

      TEXTUAL-CONVENTION, RowStatus, StorageType
         FROM SNMPv2-TC

      InterfaceIndexOrZero, ifIndex
         FROM IF-MIB

      InetAddressType, InetAddress
         FROM INET-ADDRESS-MIB;


   teLinkStdMIB MODULE-IDENTITY
      LAST-UPDATED "200510110000Z"  -- 11 October 2005
      ORGANIZATION "Multiprotocol Label Switching (MPLS) Working Group"
      CONTACT-INFO
          "        Martin Dubuc
           Email:  mdubuc@ncf.ca

                   Thomas D. Nadeau
           Email:  tnadeau@cisco.com

                   Jonathan P. Lang
           Email:  jplang@ieee.org

           Comments about this document should be emailed directly to
           the MPLS working group mailing list at mpls@uu.net."

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

           This MIB module contains managed object definitions for
           MPLS traffic engineering links as defined in
           'Link Bundling in MPLS Traffic Engineering (TE)'."

      -- Revision history.
      REVISION
          "200510110000Z"  -- 11 October 2005
      DESCRIPTION
          "Initial version published as RFC 4220."
      ::= { transmission 200 }

   -- Textual Conventions

   TeLinkBandwidth ::= TEXTUAL-CONVENTION
      STATUS       current
      DESCRIPTION
          "This type is used to represent link bandwidth in bps.  This
           value is represented using a 4 octet IEEE floating point
           format [IEEE].  The floating point representation is not
           used to represent fractional value but rather to allow
           specification of large numbers that cannot be expressed
           with 32-bit integers."
      REFERENCE
          "IEEE Standard for Binary Floating-Point Arithmetic,
           Standard 754-1985"
      SYNTAX       OCTET STRING (SIZE(4))

   TeLinkPriority ::= TEXTUAL-CONVENTION
      DISPLAY-HINT "d"
      STATUS       current
      DESCRIPTION
          "This type is used to represent a priority.  Each connection
           is assigned a priority.  This priority is used when
           accounting for bandwidth on TE links or component
           links, for resource allocation and for rerouting purposes.
           Value 0 is the highest priority.  Value 7 is the lowest
           priority."

      SYNTAX       Unsigned32 (0..7)

   TeLinkProtection ::= TEXTUAL-CONVENTION
      STATUS       current
      DESCRIPTION
          "Link protection."
      SYNTAX       INTEGER {
                       primary(1),
                       secondary(2)
                   }

   TeLinkSwitchingCapability ::= TEXTUAL-CONVENTION
      STATUS       current
      DESCRIPTION
          "Switching capability as specified in the 'OSPF Extensions in
           Support of Generalized Multi-Protocol Label Switching
           (GMPLS)' document.  The values specified in this document
           are not contiguous."
      SYNTAX       INTEGER {
                       packetSwitch1(1),
                       packetSwitch2(2),
                       packetSwitch3(3),
                       packetSwitch4(4),
                       layer2Switch(51),
                       tdm(100),
                       lambdaSwitch(150),
                       fiberSwitch(200)
                   }

   TeLinkEncodingType ::= TEXTUAL-CONVENTION
      STATUS       current
      DESCRIPTION
          "Link encoding type as specified in 'Generalized
           Multi-Protocol Label Switching (GMPLS) Signaling
           Functional Description' document.  The values
           specified in this document are not contiguous."
      SYNTAX       INTEGER {
                       packet(1),
                       ethernet(2),
                       ansiEtsiPdh(3),
                       sdhItuSonetAnsi(5),
                       digitalWrapper(7),
                       lambda(8),
                       fiber(9),
                       fiberChannel(11)
                   }

   TeLinkSonetSdhIndication ::= TEXTUAL-CONVENTION

      STATUS       current
      DESCRIPTION
          "This convention is used to indicate whether the interface
           supports Standard or Arbitrary SONET/SDH.  To simplify the
           mapping process, the values used in this textual convention
           match the values specified in the interface switching
           capability specific information field, i.e., 0 for Standard
           SONET/SDH and 1 for Arbitrary SONET/SDH."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      SYNTAX       INTEGER {
                       standard(0),
                       arbitrary(1)
                   }

   -- Top level components of this MIB module

   -- Notifications
   teLinkNotifications OBJECT IDENTIFIER ::= { teLinkStdMIB 0 }
   -- Tables, Scalars
   teLinkObjects       OBJECT IDENTIFIER ::= { teLinkStdMIB 1 }
   -- Conformance
   teLinkConformance   OBJECT IDENTIFIER ::= { teLinkStdMIB 2 }

   -- TE Link Table

   teLinkTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF TeLinkEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the grouping of component links into
           TE links and the grouping of TE links into bundled links."
      ::= { teLinkObjects 1 }

   teLinkEntry OBJECT-TYPE
      SYNTAX        TeLinkEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table exists for each ifEntry with an
           ifType of teLink(200), i.e., for every TE link.  An ifEntry
           in the ifTable must exist before a teLinkEntry is created
           with the corresponding ifIndex.  If a TE link entry in the
           ifTable is destroyed, then so is the corresponding entry
           in the teLinkTable.  The administrative and operational
           status values are controlled from the ifEntry."

      INDEX         { ifIndex }
      ::= { teLinkTable 1 }

   TeLinkEntry ::= SEQUENCE {
     teLinkAddressType                 InetAddressType,
     teLinkLocalIpAddr                 InetAddress,
     teLinkRemoteIpAddr                InetAddress,
     teLinkMetric                      Unsigned32,
     teLinkMaximumReservableBandwidth  TeLinkBandwidth,
     teLinkProtectionType              INTEGER,
     teLinkWorkingPriority             TeLinkPriority,
     teLinkResourceClass               Unsigned32,
     teLinkIncomingIfId                Integer32,
     teLinkOutgoingIfId                InterfaceIndexOrZero,
     teLinkRowStatus                   RowStatus,
     teLinkStorageType                 StorageType
   }

   teLinkAddressType OBJECT-TYPE
      SYNTAX        InetAddressType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The type of Internet address for the TE link."
      ::= { teLinkEntry 1 }

   teLinkLocalIpAddr OBJECT-TYPE
      SYNTAX        InetAddress
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The local Internet address for numbered links.  The type of
           this address is determined by the value of the
           teLinkAddressType object.

           For IPv4 and IPv6 numbered links, this object represents the
           local IP address associated with the TE link.  For an
           unnumbered link, the local address is of type unknown, this
           object is set to the zero length string, and the
           teLinkOutgoingIfId object then identifies the unnumbered
           address.

           If the TE link is a Forwarding Adjacency (FA), the local
           IP address is set to the head-end address of the FA-LSP.

           If ipAddrTable is implemented, this object must have the
           same value as the ipAdEntAddr object that belongs to the
           row in ipAddrTable where ipAdEntIfIndex is equal to
           ifIndex."
      ::= { teLinkEntry 2 }

Okay so this is where the TE link gets its descriptor table πŸ’… Each descriptor entry hangs off the ifTable, and the bandwidth and switching details ride along with it πŸ¦‹

   teLinkRemoteIpAddr OBJECT-TYPE
      SYNTAX        InetAddress
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The remote Internet address for numbered links.  The type of
           this address is determined by the value of the
           teLinkAddressType object.

           The remote IP address associated with the TE link (IPv4 and
           IPv6 numbered links).  For an unnumbered link, the remote
           address is of type unknown, this object is set to the
           zero length string, and the teLinkIncomingIfId object then
           identifies the unnumbered address.

           If the TE link is a Forwarding Adjacency, the remote IP
           address is set to the tail-end address of the FA-LSP."
      ::= { teLinkEntry 3 }

   teLinkMetric OBJECT-TYPE
      SYNTAX        Unsigned32
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The traffic engineering metric for the TE link is
           derived from its component links.  All component links
           within the TE link must have the same traffic
           engineering metric."
      REFERENCE
          "Link Bundling in MPLS Traffic Engineering (TE), RFC 4201"
      ::= { teLinkEntry 4 }

   teLinkMaximumReservableBandwidth OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-only
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum reservable bandwidth on
           the TE link.  This is the union of the maximum reservable
           bandwidth of all the component links within the
           TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"

      ::= { teLinkEntry 5 }

   teLinkProtectionType OBJECT-TYPE
      SYNTAX        INTEGER {
                        extraTraffic(1),
                        unprotected(2),
                        shared(3),
                        dedicated1For1(4),
                        dedicated1Plus1(5),
                        enhanced(6)
                    }
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the link protection type of the
           TE link.  Descriptions of the different protection types can
           be found in the 'Routing Extensions in Support of
           Generalized Multi-Protocol Label Switching (GMPLS)'
           document."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203 and
           Routing Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4202"
      ::= { teLinkEntry 6 }

   teLinkWorkingPriority OBJECT-TYPE
      SYNTAX        TeLinkPriority
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This object represents a priority value such that a new
           connection with a higher priority, i.e., numerically lower
           than this value, is guaranteed to be setup on a primary
           link and not on a secondary link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkEntry 7 }

   teLinkResourceClass OBJECT-TYPE
      SYNTAX        Unsigned32
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the TE link resource class.
           The resource class is a 32 bit bitfield.  The resource class
           for a link bundle is derived from the resource class of its
           TE links.  All TE links within a link bundle must have the
           same resource class.  Encoding of the resource class is
           described in the 'Traffic Engineering (TE) Extensions to
           OSPF Version 2' document."
      REFERENCE
          "Link Bundling in MPLS Traffic Engineering (TE), RFC 4201
           and Traffic Engineering (TE) Extensions to OSPF Version 2,
           RFC 3630"
      ::= { teLinkEntry 8 }

   teLinkIncomingIfId OBJECT-TYPE
      SYNTAX        Integer32 (0..2147483647)
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "For unnumbered links, the incoming interface is set to the
           outgoing interface identifier chosen by the neighboring LSR
           for the reverse link corresponding to this TE link.  If the
           link is numbered, the value of this object is 0 and the
           address is stored in the teLinkRemoteIpAddr instead."
      REFERENCE
          "Link Bundling in MPLS Traffic Engineering (TE), RFC 4201"
      ::= { teLinkEntry 9 }

   teLinkOutgoingIfId OBJECT-TYPE
      SYNTAX        InterfaceIndexOrZero
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "If the link is unnumbered, the outgoing interface identifier
           is set to the outgoing interface identifier chosen for the
           TE link by the advertising LSR.  If the link is numbered, the
           value of this object is 0 and the address is stored in the
           teLinkLocalIpAddr instead."
      REFERENCE
          "Link Bundling in MPLS Traffic Engineering (TE), RFC 4201"
      ::= { teLinkEntry 10 }

   teLinkRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  None of the writable objects in
           a row can be changed if status is active(1)."
      ::= { teLinkEntry 11 }

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

   -- End of teLinkTable


   -- TE Link Descriptor Table

   teLinkDescriptorTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF TeLinkDescriptorEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the interface switching capability
           descriptors associated with the TE links."
      ::= { teLinkObjects 2 }

   teLinkDescriptorEntry OBJECT-TYPE
      SYNTAX        TeLinkDescriptorEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table is created for every TE link interface
           switching capability descriptor.  An ifEntry in the ifTable
           must exist before a teLinkDescriptorEntry using the same
           ifIndex is created.  ifType of ifEntry must be teLink(200).
           If a TE link entry in the ifTable is destroyed, then so are
           all of the entries in the teLinkDescriptorTable that use the
           ifIndex of this TE link."
      INDEX         { ifIndex, teLinkDescriptorId }
      ::= { teLinkDescriptorTable 1 }

   TeLinkDescriptorEntry ::= SEQUENCE {
     teLinkDescriptorId               Unsigned32,
     teLinkDescrSwitchingCapability   TeLinkSwitchingCapability,
     teLinkDescrEncodingType          TeLinkEncodingType,
     teLinkDescrMinLspBandwidth       TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio0  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio1  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio2  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio3  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio4  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio5  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio6  TeLinkBandwidth,
     teLinkDescrMaxLspBandwidthPrio7  TeLinkBandwidth,
     teLinkDescrInterfaceMtu          Unsigned32,
     teLinkDescrIndication            TeLinkSonetSdhIndication,
     teLinkDescrRowStatus             RowStatus,
     teLinkDescrStorageType           StorageType
   }

   teLinkDescriptorId OBJECT-TYPE
      SYNTAX        Unsigned32 (1..4294967295)
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This object specifies the link descriptor identifier."
      ::= { teLinkDescriptorEntry 1 }

   teLinkDescrSwitchingCapability OBJECT-TYPE
      SYNTAX        TeLinkSwitchingCapability
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies interface switching capability of
           the TE link, which is derived from its component links."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 2 }

   teLinkDescrEncodingType OBJECT-TYPE
      SYNTAX        TeLinkEncodingType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the TE link encoding type."
      REFERENCE
          "Generalized Multi-Protocol Label Switching (GMPLS)
           Signaling Functional Description, RFC 3471"
      ::= { teLinkDescriptorEntry 3 }

   teLinkDescrMinLspBandwidth OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION

          "This attribute specifies the minimum LSP bandwidth on
           the TE link.  This is derived from the union of the
           minimum LSP bandwidth of all the component links
           associated with the TE link that can be used to carry
           live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 4 }

   teLinkDescrMaxLspBandwidthPrio0 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 0 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 0 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 5 }

   teLinkDescrMaxLspBandwidthPrio1 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 1 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 1 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 6 }

   teLinkDescrMaxLspBandwidthPrio2 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 2 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 2 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 7 }

okay so the priority bandwidth stuff is next, and it's giving main character πŸ’…βœ¨

   teLinkDescrMaxLspBandwidthPrio3 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 3 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 3 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 8 }

   teLinkDescrMaxLspBandwidthPrio4 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 4 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 4 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 9 }

   teLinkDescrMaxLspBandwidthPrio5 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 5 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 5 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE

          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 10 }

   teLinkDescrMaxLspBandwidthPrio6 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 6 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 6 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 11 }

   teLinkDescrMaxLspBandwidthPrio7 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 7 on the TE link.  This is the union of the maximum
           LSP bandwidth at priority 7 of all the component links within
           the TE link that can be used to carry live traffic."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 12 }

   teLinkDescrInterfaceMtu OBJECT-TYPE
      SYNTAX        Unsigned32 (1..65535)
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the interface MTU for the TE
           link descriptor."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 13 }

   teLinkDescrIndication OBJECT-TYPE
      SYNTAX        TeLinkSonetSdhIndication
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies whether this interface supports
           Standard or Arbitrary SONET/SDH."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkDescriptorEntry 14 }

   teLinkDescrRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object
           can be changed if teLinkDescrRowStatus is in the active(1)
           state."
      ::= { teLinkDescriptorEntry 15 }

   teLinkDescrStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the
           teLinkDescriptorTable.  Conceptual rows having the value
           'permanent' need not allow write-access to any
           columnar object in the row."
      ::= { teLinkDescriptorEntry 16 }

   -- End of teLinkDescriptorTable


   -- TE Link Shared Risk Link Group Table

   teLinkSrlgTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF TeLinkSrlgEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the SRLGs associated with TE links."
      ::= { teLinkObjects 3 }

   teLinkSrlgEntry OBJECT-TYPE
      SYNTAX        TeLinkSrlgEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table contains information about an
           SRLG associated with a TE link.
           An ifEntry in the ifTable must exist before a
           teLinkSrlgEntry using the same ifIndex is created.
           The ifType of ifEntry must be teLink(200).
           If a TE link entry in the ifTable is destroyed, then so
           are all of the entries in the teLinkSrlgTable that use the
           ifIndex of this TE link."
      INDEX         { ifIndex, teLinkSrlg }
      ::= { teLinkSrlgTable 1 }

   TeLinkSrlgEntry ::= SEQUENCE {
     teLinkSrlg            Unsigned32,
     teLinkSrlgRowStatus   RowStatus,
     teLinkSrlgStorageType StorageType
   }

   teLinkSrlg OBJECT-TYPE
      SYNTAX        Unsigned32 (0..4294967295)
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This identifies an SRLG supported by the TE link.  An SRLG is
           identified with a 32-bit number that is unique within an IGP
           domain.  Zero is a valid SRLG number."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { teLinkSrlgEntry 1 }

   teLinkSrlgRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object can
           be modified if teLinkSrlgRowStatus is active(1)."
      ::= { teLinkSrlgEntry 2 }

   teLinkSrlgStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the

           teLinkSrlgTable.  Conceptual rows having the value
           'permanent' need not allow write-access to any
           columnar object in the row."
      ::= { teLinkSrlgEntry 3 }

   -- End of teLinkSrlgTable


   -- TE Link Bandwidth Table

   teLinkBandwidthTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF TeLinkBandwidthEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the priority-based bandwidth table
           for TE links."
      ::= { teLinkObjects 4 }

   teLinkBandwidthEntry OBJECT-TYPE
      SYNTAX        TeLinkBandwidthEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table contains information about
           the priority-based bandwidth of TE links.  An ifEntry in the
           ifTable must exist before a teLinkBandwidthEntry using the
           same ifIndex is created.  The ifType of ifEntry must be
           teLink(200).  If a TE link entry in the ifTable is destroyed,
           then so are all of the entries in the teLinkBandwidthTable
           that use the ifIndex of this TE link."
      INDEX         { ifIndex, teLinkBandwidthPriority }
      ::= { teLinkBandwidthTable 1 }

   TeLinkBandwidthEntry ::= SEQUENCE {
     teLinkBandwidthPriority    TeLinkPriority,
     teLinkBandwidthUnreserved  TeLinkBandwidth,
     teLinkBandwidthRowStatus   RowStatus,
     teLinkBandwidthStorageType StorageType
   }

   teLinkBandwidthPriority OBJECT-TYPE
      SYNTAX        TeLinkPriority
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This attribute specifies the priority.  A value of 0 is valid
           as specified in the 'Traffic Engineering (TE) Extensions to
           OSPF Version 2' document."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203 and
           Traffic Engineering (TE) Extensions to OSPF Version 2,
           RFC 3630"
      ::= { teLinkBandwidthEntry 1 }

   teLinkBandwidthUnreserved OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-only
      STATUS        current
      DESCRIPTION
          "This attribute specifies the TE link unreserved
           bandwidth at priority p.  It is the sum of the unreserved
           bandwidths at priority p of all component links associated
           with the TE link (excluding all links that are strictly
           used as protecting links)."
      REFERENCE
          "Link Bundling in MPLS Traffic Engineering (TE), RFC 4201"
      ::= { teLinkBandwidthEntry 2 }

   teLinkBandwidthRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object
           can be modified when teLinkBandwidthRowStatus is active(1)."
      ::= { teLinkBandwidthEntry 3 }

   teLinkBandwidthStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the
           teLinkBandwidthTable.  Conceptual rows having the value
           'permanent' need not allow write-access to any
           columnar object in the row."
      ::= { teLinkBandwidthEntry 4 }

   -- End of teLinkBandwidthTable


   -- Component Link Table
   componentLinkTable  OBJECT-TYPE
      SYNTAX        SEQUENCE OF ComponentLinkEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the component link parameters."
      ::= { teLinkObjects 5 }

   componentLinkEntry  OBJECT-TYPE
      SYNTAX        ComponentLinkEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table exists for each ifEntry that
           represents a component link.  An ifEntry must exist in
           the ifTable before a componentLinkEntry is created with
           the corresponding ifIndex.  ifEntry's ifType can be
           of any interface type that has been defined for TE Link
           interworking.  Examples include ATM, Frame Relay, Ethernet,
           etc.  If an entry representing a component link is destroyed
           in the ifTable, then so is the corresponding entry in the
           componentLinkTable.  The administrative and operational
           status values are controlled from the ifEntry."
      INDEX         { ifIndex }
      ::= { componentLinkTable 1 }

okay so this part is the MIB nitty-gritty πŸ’… the component link table is basically where each physical bundle member gets its own little profile πŸŽ€ and the descriptor table is where the switching and bandwidth details live πŸ¦‹

   ComponentLinkEntry ::= SEQUENCE {
     componentLinkMaxResBandwidth     TeLinkBandwidth,
     componentLinkPreferredProtection TeLinkProtection,
     componentLinkCurrentProtection   TeLinkProtection,
     componentLinkRowStatus           RowStatus,
     componentLinkStorageType         StorageType
   }

   componentLinkMaxResBandwidth OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum reservable bandwidth on
           the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkEntry 1 }

   componentLinkPreferredProtection OBJECT-TYPE

      SYNTAX        TeLinkProtection
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies whether this component link is
           a primary or secondary entity."
      ::= { componentLinkEntry 2 }

   componentLinkCurrentProtection OBJECT-TYPE
      SYNTAX        TeLinkProtection
      MAX-ACCESS    read-only
      STATUS        current
      DESCRIPTION
          "This attribute specifies whether this component link is
           currently used as primary or secondary link."
      ::= { componentLinkEntry 3 }

   componentLinkRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object
           can be modified when componentLinkRowStatus is active(1)."
      ::= { componentLinkEntry 4 }

   componentLinkStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the
           componentLinkTable.  Conceptual rows having the value
           'permanent' need not allow write-access to any
           columnar object in the row."
      ::= { componentLinkEntry 5 }

   -- End of componentLinkTable

okay now we're in the descriptor zone 🌈 the table itself is the container, and each entry is keyed by ifIndex plus a descriptor ID, so think of it like a little address book πŸ“’βœ¨

   -- Component Link Descriptor Table

   componentLinkDescriptorTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF ComponentLinkDescriptorEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION

          "This table specifies the interface switching capability
           descriptors associated with the component links."
      ::= { teLinkObjects 6 }

   componentLinkDescriptorEntry OBJECT-TYPE
      SYNTAX        ComponentLinkDescriptorEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table is created for every component link
           descriptor.  An ifEntry in the ifTable must exist before a
           componentLinkDescriptorEntry using the same ifIndex is
           created.  ifEntry's ifType can be of any interface type that
           has been defined for TE Link interworking.  Examples include
           ATM, Frame Relay, Ethernet, etc.  If a component link entry
           in the ifTable is destroyed, then so are all entries in the
           componentLinkDescriptorTable that use the ifIndex of this
           component link."
      INDEX         { ifIndex, componentLinkDescrId }
      ::= { componentLinkDescriptorTable 1 }

and here's the full column list for each descriptor row, which is a lot but honestly iconic πŸ’…πŸ’– every column gets its own OBJECT-TYPE with its own DESCRIPTION, and the ones about bandwidth per priority are a whole vibe πŸ“

   ComponentLinkDescriptorEntry ::= SEQUENCE {
     componentLinkDescrId                    Unsigned32,
     componentLinkDescrSwitchingCapability   TeLinkSwitchingCapability,
     componentLinkDescrEncodingType          TeLinkEncodingType,
     componentLinkDescrMinLspBandwidth       TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio0  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio1  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio2  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio3  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio4  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio5  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio6  TeLinkBandwidth,
     componentLinkDescrMaxLspBandwidthPrio7  TeLinkBandwidth,
     componentLinkDescrInterfaceMtu          Unsigned32,
     componentLinkDescrIndication            TeLinkSonetSdhIndication,
     componentLinkDescrRowStatus             RowStatus,
     componentLinkDescrStorageType           StorageType
   }

   componentLinkDescrId OBJECT-TYPE
      SYNTAX        Unsigned32 (1..4294967295)
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This object specifies the link descriptor identifier."
      ::= { componentLinkDescriptorEntry 1 }

   componentLinkDescrSwitchingCapability OBJECT-TYPE
      SYNTAX        TeLinkSwitchingCapability
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies link multiplexing capabilities of
           the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 2 }

   componentLinkDescrEncodingType OBJECT-TYPE
      SYNTAX        TeLinkEncodingType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the component link encoding type."
      REFERENCE
          "Generalized Multi-Protocol Label Switching (GMPLS) Signaling
           Functional Description, RFC 3471"
      ::= { componentLinkDescriptorEntry 3 }

   componentLinkDescrMinLspBandwidth OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the minimum LSP bandwidth on
           the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 4 }

   componentLinkDescrMaxLspBandwidthPrio0 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 0 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 5 }

   componentLinkDescrMaxLspBandwidthPrio1 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 1 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 6 }

   componentLinkDescrMaxLspBandwidthPrio2 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 2 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 7 }

   componentLinkDescrMaxLspBandwidthPrio3 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 3 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 8 }

   componentLinkDescrMaxLspBandwidthPrio4 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 4 on the component link."
      REFERENCE

          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 9 }

   componentLinkDescrMaxLspBandwidthPrio5 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "thousand bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 5 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 10 }

   componentLinkDescrMaxLspBandwidthPrio6 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 6 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 11 }

   componentLinkDescrMaxLspBandwidthPrio7 OBJECT-TYPE
      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies the maximum LSP bandwidth at
           priority 7 on the component link."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 12 }

   componentLinkDescrInterfaceMtu OBJECT-TYPE
      SYNTAX        Unsigned32 (1..65535)
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION

          "This attribute specifies the interface MTU for the component
           link descriptor."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 13 }

   componentLinkDescrIndication OBJECT-TYPE
      SYNTAX        TeLinkSonetSdhIndication
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This attribute specifies whether this interface supports
           Standard or Arbitrary SONET/SDH."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkDescriptorEntry 14 }

   componentLinkDescrRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object
           can be modified when componentLinkDescrRowStatus
           is active(1)."
      ::= { componentLinkDescriptorEntry 15 }

   componentLinkDescrStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the
           componentLinkDescriptorTable.  Conceptual rows
           having the value 'permanent' need not allow write-access
           to any columnar object in the row."
      ::= { componentLinkDescriptorEntry 16 }

   -- End of componentLinkDescriptorTable


   -- Component Link Bandwidth Table

okay so bestie, this is where the component link bandwidth table wraps up πŸ’– and the compliance statements start rolling in, which is basically the MIB's permission slip for who's allowed to do what πŸŽ€

   componentLinkBandwidthTable OBJECT-TYPE
      SYNTAX        SEQUENCE OF ComponentLinkBandwidthEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This table specifies the priority-based bandwidth
           for component links."
      ::= { teLinkObjects 7 }

   componentLinkBandwidthEntry OBJECT-TYPE
      SYNTAX        ComponentLinkBandwidthEntry
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "An entry in this table contains information about
           the priority-based bandwidth on component links.
           An ifEntry in the ifTable must exist before a
           componentLinkBandwidthEntry using the same ifIndex is
           created.  ifEntry's ifType can be of any interface type that
           has been defined for TE Link interworking.  Examples
           include ATM, Frame Relay, Ethernet, etc.  If a component link
           entry in the ifTable is destroyed, then so are all entries
           in the componentLinkBandwidthTable that use the ifIndex of
           this component link."
      INDEX         { ifIndex, componentLinkBandwidthPriority }
      ::= { componentLinkBandwidthTable 1 }

   ComponentLinkBandwidthEntry ::= SEQUENCE {
     componentLinkBandwidthPriority    TeLinkPriority,
     componentLinkBandwidthUnreserved  TeLinkBandwidth,
     componentLinkBandwidthRowStatus   RowStatus,
     componentLinkBandwidthStorageType StorageType
   }

   componentLinkBandwidthPriority OBJECT-TYPE
      SYNTAX        TeLinkPriority
      MAX-ACCESS    not-accessible
      STATUS        current
      DESCRIPTION
          "This attribute specifies the priority.  A value of 0 is valid
           as specified in the 'Traffic Engineering (TE) Extensions to
            OSPF Version 2' document."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203 and
           Traffic Engineering (TE) Extensions to OSPF Version 2,
           RFC 3630"
      ::= { componentLinkBandwidthEntry 1 }

   componentLinkBandwidthUnreserved OBJECT-TYPE

      SYNTAX        TeLinkBandwidth
      UNITS         "bps"
      MAX-ACCESS    read-only
      STATUS        current
      DESCRIPTION
          "This attribute specifies the component link unreserved
           bandwidth at priority p."
      REFERENCE
          "OSPF Extensions in Support of Generalized Multi-Protocol
           Label Switching (GMPLS), RFC 4203"
      ::= { componentLinkBandwidthEntry 2 }

   componentLinkBandwidthRowStatus OBJECT-TYPE
      SYNTAX        RowStatus
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "This variable is used to create, modify, and/or
           delete a row in this table.  No read-create object can
           be modified when componentLinkBandwidthRowStatus is
           active(1)."
      ::= { componentLinkBandwidthEntry 3 }

   componentLinkBandwidthStorageType OBJECT-TYPE
      SYNTAX        StorageType
      MAX-ACCESS    read-create
      STATUS        current
      DESCRIPTION
          "The storage type for this conceptual row in the
           componentLinkBandwidthTable.  Conceptual rows
           having the value 'permanent' need not allow write-access
           to any columnar object in the row."
      ::= { componentLinkBandwidthEntry 4 }

   -- End of componentLinkBandwidthTable


   -- Module compliance

   teLinkCompliances
      OBJECT IDENTIFIER ::= { teLinkConformance 1 }

   teLinkGroups
      OBJECT IDENTIFIER ::= { teLinkConformance 2 }

   teLinkModuleFullCompliance MODULE-COMPLIANCE
      STATUS current
      DESCRIPTION

          "Compliance statement for agents that support read-create
           so that both configuration and monitoring of TE links can
           be accomplished via this MIB module."
      MODULE -- this module

         MANDATORY-GROUPS    { teLinkGroup,
                               teLinkBandwidthGroup,
                               componentLinkBandwidthGroup }

         GROUP teLinkSrlgGroup
         DESCRIPTION
             "This group is mandatory for GMPLS enabled devices."

         GROUP teLinkPscGroup
         DESCRIPTION
             "This group is mandatory for devices that support the
              packet switching capability."

         GROUP teLinkTdmGroup
         DESCRIPTION
             "This group is mandatory for devices that support the TDM
              switching capability."

         -- teLinkTable

         OBJECT      teLinkAddressType
         SYNTAX      INTEGER { unknown(0), ipv4(1), ipv6(2) }
         DESCRIPTION
             "Only ipv4(1) and ipv6(2) address types need to be
              supported for numbered links.  For unnumbered links, the
              unknown(0) address type needs to be supported."

         OBJECT      teLinkLocalIpAddr
         SYNTAX      InetAddress (SIZE(0|4|16))
         DESCRIPTION
             "Size of TE link IP address depends on type of TE link.
              TE link IP address size is zero if the link is unnumbered,
              four if the link IP address is IPv4, and sixteen if the
              link IP address is IPv6."

         OBJECT      teLinkRemoteIpAddr
         SYNTAX      InetAddress (SIZE(0|4|16))
         DESCRIPTION
             "Size of TE link IP address depends on type of TE link.
              TE link IP address size is zero if the link is unnumbered,
              four if the link IP address is IPv4, and sixteen if the
              link IP address is IPv6."

         OBJECT      teLinkRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- teLinkDescriptorTable

         OBJECT      teLinkDescrRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- teLinkSrlgTable

         OBJECT      teLinkSrlgRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- teLinkBandwidthTable

         OBJECT      teLinkBandwidthRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- componentLinkTable

         OBJECT      componentLinkRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- componentLinkDescriptorTable

         OBJECT      componentLinkDescrRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

         -- componentLinkBandwidthTable

         OBJECT      componentLinkBandwidthRowStatus
         SYNTAX      RowStatus { active(1), notInService(2) }
         WRITE-SYNTAX RowStatus { active(1), notInService(2),
                                  createAndGo(4), destroy(6) }
         DESCRIPTION
             "Support for notReady(3) and createAndWait(5) is
              not required."

      ::= { teLinkCompliances 1 }

   teLinkModuleReadOnlyCompliance MODULE-COMPLIANCE
      STATUS current
      DESCRIPTION
          "Compliance statement for agents that support the
           monitoring of the TE link MIB module."
      MODULE -- this module

         MANDATORY-GROUPS    { teLinkGroup,
                               teLinkBandwidthGroup,
                               componentLinkBandwidthGroup }

         GROUP teLinkSrlgGroup
         DESCRIPTION
             "This group is mandatory for GMPLS enabled devices."

         GROUP teLinkPscGroup
         DESCRIPTION
             "This group is mandatory for devices that support the
              packet switching capability."

         GROUP teLinkTdmGroup
         DESCRIPTION
             "This group is mandatory for devices that support the TDM
              switching capability."

         -- teLinkTable
         OBJECT      teLinkAddressType
         SYNTAX      INTEGER { unknown(0), ipv4(1), ipv6(2) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Only ipv4(1) and ipv6(2) address types need to be
              supported for numbered links.  For unnumbered links, the
              unknown(0) address type needs to be supported."

         OBJECT      teLinkLocalIpAddr
         SYNTAX      InetAddress (SIZE(0|4|16))
         MIN-ACCESS  read-only
         DESCRIPTION
             "Size of TE link IP address depends on type of TE link.
              TE link IP address size is zero if the link is unnumbered,
              four if the link IP address is IPv4, and sixteen if the
              link IP address is IPv6."

         OBJECT      teLinkRemoteIpAddr
         SYNTAX      InetAddress (SIZE(0|4|16))
         MIN-ACCESS  read-only
         DESCRIPTION
             "Size of TE link IP address depends on type of TE link.
              TE link IP address size is zero if the link is unnumbered,
              four if the link IP address is IPv4, and sixteen if the
              link IP address is IPv6."

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

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

         OBJECT      teLinkRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

         -- teLinkDescriptorTable

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

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

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

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

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

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

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

okay so we're picking up right in the middle of the compliance statements, and this is where the MIB gets really specific about which objects need read-only access πŸ’…πŸŽ€

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

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

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

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

         OBJECT      teLinkDescrRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

         -- teLinkSrlgTable

         OBJECT      teLinkSrlgRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

         -- teLinkBandwidthTable

         OBJECT      teLinkBandwidthRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

         -- componentLinkTable

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

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

         OBJECT      componentLinkRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

         -- componentLinkDescriptorTable

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

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

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

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

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

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

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

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

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

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

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

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

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

         OBJECT      componentLinkDescrRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the

              only status that needs to be supported."

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

         -- componentLinkBandwidthTable

         OBJECT      componentLinkBandwidthRowStatus
         SYNTAX      RowStatus { active(1) }
         MIN-ACCESS  read-only
         DESCRIPTION
             "Write access is not required and active(1) is the
              only status that needs to be supported."

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

      ::= { teLinkCompliances 2 }

okay and now the fun part: the units of conformance! 🧚 these are basically the groups that bundle related objects together, so an implementer knows which chunk of the MIB they're signing up for ✨

   -- Units of conformance

   teLinkGroup OBJECT-GROUP
      OBJECTS { teLinkAddressType,
                teLinkLocalIpAddr,
                teLinkRemoteIpAddr,
                teLinkMetric,
                teLinkProtectionType,
                teLinkWorkingPriority,
                teLinkResourceClass,
                teLinkIncomingIfId,
                teLinkOutgoingIfId,
                teLinkRowStatus,
                teLinkStorageType,
                teLinkDescrSwitchingCapability,
                teLinkDescrEncodingType,
                teLinkDescrRowStatus,
                teLinkDescrStorageType,
                componentLinkPreferredProtection,
                componentLinkCurrentProtection,
                componentLinkRowStatus,
                componentLinkStorageType,
                componentLinkDescrSwitchingCapability,
                componentLinkDescrEncodingType,
                componentLinkDescrRowStatus,
                componentLinkDescrStorageType
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for the management of
              resources associated with TE links."
      ::= { teLinkGroups 1 }

   teLinkSrlgGroup OBJECT-GROUP
      OBJECTS { teLinkSrlgRowStatus,
                teLinkSrlgStorageType
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for the management of
              SRLG resources associated with TE links."
      ::= { teLinkGroups 2 }

   teLinkBandwidthGroup OBJECT-GROUP
      OBJECTS { teLinkMaximumReservableBandwidth,
                teLinkDescrMaxLspBandwidthPrio0,
                teLinkDescrMaxLspBandwidthPrio1,
                teLinkDescrMaxLspBandwidthPrio2,
                teLinkDescrMaxLspBandwidthPrio3,
                teLinkDescrMaxLspBandwidthPrio4,
                teLinkDescrMaxLspBandwidthPrio5,
                teLinkDescrMaxLspBandwidthPrio6,
                teLinkDescrMaxLspBandwidthPrio7,
                teLinkBandwidthUnreserved,
                teLinkBandwidthRowStatus,
                teLinkBandwidthStorageType
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for the management of
              the bandwidth resources associated with TE links and
              component links."
      ::= { teLinkGroups 3 }

   componentLinkBandwidthGroup OBJECT-GROUP
      OBJECTS { componentLinkMaxResBandwidth,
                componentLinkDescrMaxLspBandwidthPrio0,
                componentLinkDescrMaxLspBandwidthPrio1,
                componentLinkDescrMaxLspBandwidthPrio2,
                componentLinkDescrMaxLspBandwidthPrio3,
                componentLinkDescrMaxLspBandwidthPrio4,
                componentLinkDescrMaxLspBandwidthPrio5,
                componentLinkDescrMaxLspBandwidthPrio6,
                componentLinkDescrMaxLspBandwidthPrio7,
                componentLinkBandwidthUnreserved,
                componentLinkBandwidthRowStatus,
                componentLinkBandwidthStorageType
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for the management of the
              bandwidth parameters associated with component links."
      ::= { teLinkGroups 4 }

   teLinkPscGroup OBJECT-GROUP
      OBJECTS { teLinkDescrMinLspBandwidth,
                teLinkDescrInterfaceMtu,
                componentLinkDescrMinLspBandwidth,
                componentLinkDescrInterfaceMtu
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for devices that are
              packet switch capable."
      ::= { teLinkGroups 5 }

   teLinkTdmGroup OBJECT-GROUP
      OBJECTS { teLinkDescrMinLspBandwidth,
                teLinkDescrIndication,
                componentLinkDescrMinLspBandwidth,
                componentLinkDescrIndication
              }

      STATUS  current
      DESCRIPTION
             "Collection of objects needed for devices that are
              TDM switching capable."
      ::= { teLinkGroups 6 }

   -- End of TE-LINK-STD-MIB
   END

and that's the whole MIB module wrapped up, periodt πŸ¦‹πŸ’–

10. Security Considerations πŸ”βœ¨

okay bestie, this one is serious 😭 This MIB module has a bunch of management objects with a MAX-ACCESS of read-write and/or read-create. Those can be sensitive or vulnerable depending on the network. Doing SET operations in a non-secure environment without proper protection can seriously mess with network operations πŸ’€ Here are the tables and objects and how sensitive or vulnerable they are:

  • All the tables in this MIB module have routing information in them, so they all have the same security attributes. Unauthorized changes to attributes of these tables can disrupt resource allocation in the network.

Some of the readable objects in this MIB module (so, objects with a MAX-ACCESS other than not-accessible) may be sensitive or vulnerable in some network environments too πŸ‘€ So it's really important to control even GET and/or NOTIFY access to them, and possibly even encrypt their values when they're sent over the network via SNMP πŸ”’ Here's the list:

  • IP address entries in the teLinkTable (teLinkLocalIpAddr and teLinkRemoteIpAddr) may reveal the internals of a network provider IP address space.

SNMP versions before SNMPv3 did not include adequate security πŸ™ƒ Even if the network itself is secure (for example, by using IPSec), there's still no control over who on that secure network gets to access and GET/SET (read/change/create/delete) the objects in this MIB module. Not it πŸ™…β€β™€οΈ

It is RECOMMENDED that implementers consider the security features provided by the SNMPv3 framework (see [RFC3410], section 8), including full support for the SNMPv3 cryptographic mechanisms (for authentication and privacy) 🫢

Further, deployment of SNMP versions prior to SNMPv3 is NOT RECOMMENDED. Instead, it is RECOMMENDED to deploy SNMPv3 and to enable cryptographic security. It's then a customer/operator responsibility to make sure the SNMP entity giving access to an instance of this MIB module is configured so only the principals (users) with legitimate rights can GET or SET (change/create/delete) those objects. Main character energy for the admins πŸ‘‘

11. Contributors πŸŽ€

Sudheer Dharanikota EMail: sudheer@ieee.org

12. Acknowledgements 🌸

The authors would like to acknowledge the contribution of Dmitry Ryumkin πŸ™Œ

13. IANA Considerations πŸ¦‹

Okay so this next subsection is where we ask IANA for a new assignment πŸ“ New assignments can only be made via Standards Action, as specified in [RFC2434].

The TE-LINK-STD-MIB should be rooted under the transmission subtree. IANA has assigned { transmission 200 } to the TE-LINK-STD-MIB module specified in this document ✨

14. References πŸ“š

14.1. Normative References πŸ”₯

[IANAifType] "IANAifType MIB Module",
             http://www.iana.org/assignments/ianaiftype-mib.

[IEEE]       IEEE, "IEEE Standard for Binary Floating-Point
             Arithmetic", Standard 754-1985, 1985 (ISBN 1-5593-7653-
             8).

[RFC2119]    Bradner, S., "Key words for use in RFCs to Indicate
             Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2434]    Narten, T. and H. Alvestrand, "Guidelines for Writing an
             IANA Considerations Section in RFCs", BCP 26, RFC 2434,
             October 1998.

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

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

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

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

[RFC3471]    Berger, L., "Generalized Multi-Protocol Label Switching
             (GMPLS) Signaling Functional Description", RFC 3471,
             January 2003.

[RFC3630]    Katz, D., Kompella, K. and D. Yeung, "Traffic
             Engineering (TE) Extensions to OSPF Version 2", RFC
             3630, September 2003.

[RFC4201]    Kompella, K., Rekhter, Y. and L. Berger, "Link Bundling
             in MPLS Traffic Engineering (TE)", RFC 4201, October
             2005.

[RFC4202]    Kompella, K., Ed. and Y. Rekhter, Ed., "Routing
             Extensions in Support of Generalized Multi-Protocol
             Label Switching (GMPLS)", RFC 4202, October 2005.

[RFC4203]    Kompella, K., Ed. and Y. Rekhter, Ed., "OSPF Extensions
             in Support of Generalized Multi-Protocol Label Switching
             (GMPLS)", RFC 4203, October 2005.

[RFC4206]    Kompella, K. and Y. Rekhter, "Label Switched Paths (LSP)
             Hierarchy with Generalized Multi-Protocol Label
             Switching (GMPLS) Traffic Engineering (TE)", RFC 4206,
             October 2005.

[RFC4204]    Lang, J., Ed., "Link Management Protocol (LMP)", RFC
             4204, October 2005.

14.2. Informative References 🧚

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

[RFC3945]    Mannie, E., "Generalized Multi-Protocol Label Switching
             (GMPLS) Architecture", RFC 3945, October 2004.

Authors' Addresses 🏑

Martin Dubuc

EMail: mdubuc@ncf.ca


Thomas D. Nadeau
Cisco Systems
1414 Massachusetts Ave.
Boxborough, MA 01719

Phone: +1-978-244-3051
EMail: tnadeau@cisco.com


Jonathan P. Lang
Sonos, Inc.
223 E. De La Guerra St.
Santa Barbara, CA 93101

EMail: jplang@ieee.org

Copyright (C) The Internet Society (2005).

This document is subject to the rights, licenses and restrictions contained in BCP 78, and except as set forth therein, the authors retain all their rights.

This document and the information contained herein are provided on an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property 🌈

The IETF takes no position regarding the validity or scope of any Intellectual Property Rights or other rights that might be claimed to pertain to the implementation or use of the technology described in this document, or the extent to which any license under such rights might or might not be available. It also doesn't represent that it has made any independent effort to identify any such rights. Information on the procedures with respect to rights in RFC documents can be found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat, and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification, can be obtained from the IETF on-line IPR repository at http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights that may cover technology that may be required to implement this standard. Please address the information to the IETF at ietf-ipr@ietf.org.

Acknowledgement πŸ’–

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

πŸ“¦ where this page comes from