RFC 2455

Definitions of Managed Objects for APPN

πŸ“… published November 1998, from ietf

Part 1 of 21 πŸ’–

RFC 2455: Definitions of Managed Objects for APPN ✨

Authors: B. Clouston (Cisco Systems) and B. Moore (IBM Corporation) πŸ’œ Category: Standards Track πŸŽ€ Date: November 1998 πŸ“… Obsoletes: RFC 2155 πŸ¦‹

Okay bestie, this is the one that defines the managed objects for APPN (Advanced Peer-to-Peer Networking) 🌈 It obsoletes RFC 2155, so if you've got an older copy lying around, it's time to retire it πŸ’…


Status of this Memo 🌸

This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. πŸ’Œ

Copyright (C) The Internet Society (1998). All Rights Reserved. 🌈

Abstract πŸ¦‹

This memo defines a portion of the Management Information Base (MIB) for use with network management protocols in the Internet community. In particular, it defines objects for monitoring and controlling network devices with APPN (Advanced Peer-to-Peer Networking) capabilities. This memo identifies managed objects for the APPN protocol. πŸ”₯

Table of Contents πŸ“–

1.     Introduction  ..........................................   2
2.     The SNMPv2 Network Management Framework  ...............   2
3.     Overview  ..............................................   3
3.1      Relationship with RFC 2155 ...........................   6
3.2      APPN MIB structure ...................................   7
4.     Definitions  ...........................................  10
5.     Security Considerations  ............................... 135
6.     Intellectual Property  ................................. 136
7.     Acknowledgments  ....................................... 137
8.     References  ............................................ 137
9.     Authors' Addresses  .................................... 139
10.    Full Copyright Statement  .............................. 140

1. Introduction ✨

Okay so this document is a product of the SNA NAU Services MIB Working Group 🧚 It defines a MIB module for managing devices with Advanced Peer-to-Peer Networking (APPN) capabilities, which is giving "keep your devices organized" energy πŸŽ€

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 [17]. These are the official rules-of-the-road words, so read them carefully bestie, no cap 🫢

2. The SNMP Network Management Framework πŸ’…

Okay, the SNMP Management Framework presently consists of five major components. Let's go through them, I'm obsessed with how neatly these fit together πŸ’œ

  • An overall architecture, described in RFC 2271 [1].
  • Mechanisms for describing and naming objects and events for the purpose of management. The first version of this Structure of Management Information (SMI) is called SMIv1 and described in STD 16, RFC 1155 [2], STD 16, RFC 1212 [3] and RFC 1215 [4]. The second version, called SMIv2, is described in RFC 1902 [5], RFC 1903 [6] and RFC 1904 [7].
  • Message protocols for transferring management information. The first version of the SNMP message protocol is called SNMPv1 and described in STD 15, RFC 1157 [8]. A second version of the SNMP message protocol, which is not an Internet standards track protocol, is called SNMPv2c and described in RFC 1901 [9] and RFC 1906 [10]. The third version of the message protocol is called SNMPv3 and described in RFC 1906 [10], RFC 2272 [11] and RFC 2274 [12].
  • Protocol operations for accessing management information. The first set of protocol operations and associated PDU formats is described in STD 15, RFC 1157 [8]. A second set of protocol operations and associated PDU formats is described in RFC 1905 [13].
  • A set of fundamental applications described in RFC 2273 [14] and the view-based access control mechanism described in RFC 2275 [15].

Managed objects are accessed via a virtual information store, termed the Management Information Base or MIB. Objects in the MIB are defined using the mechanisms defined in the SMI. 🌸

This memo specifies a MIB module that is compliant to the SMIv2. A MIB conforming to the SMIv1 can be produced through the appropriate translations. The resulting translated MIB must be semantically equivalent, except where objects or events are omitted because no translation is possible (use of Counter64). Some machine readable information in SMIv2 will be converted into textual descriptions in SMIv1 during the translation process. However, this loss of machine readable information is not considered to change the semantics of the MIB. πŸ¦‹

3. Overview ✨

Okay bestie, this part is where we get into APPN πŸ¦‹. This document identifies a set of objects for monitoring the configuration and active characteristics of devices with APPN capabilities, and for controlling certain characteristics. APPN is the peer-to-peer part of Systems Network Architecture (SNA) πŸ’… and these networks carry both independent and dependent LU session traffic. For managing those sessions, see the SNANAU APPC MIB [21] and the SNA NAU MIB [22]. For the APPN extensions, see also RFC 2232, the DLUR MIB [23], and RFC 2238, the HPR MIB [24]. In this document, we describe the APPN managed objects πŸŽ€.

An APPN network is made up of different types of nodes, plus transmission groups (TGs) that connect those nodes 🌸. Network nodes (NNs) handle the directory and routing functions for session establishment. An NN can be a session end point or an intermediate node in a session. A border node is a type of network node that connects networks together for session establishment without fully merging them. A branch network node (BrNN) is similar to a border node, but has only minimal functions, which is how you build a large APPN network inside an enterprise 🧚. A BrNN is defined as a network node in the APPN architecture, but it also looks like an end node (EN) to upstream NNs. This MIB module treats it as its own node type, since it doesn't fit cleanly as an EN or an NN, and the module explicitly identifies the objects returned by a BrNN. For example, a BrNN does not implement the appnNnTopo objects, because it is the only node in its network topology table. It does implement the appnSessIntermediate objects, because it has intermediate session support. It also implements two of the appnEnUniqueCaps objects that could be useful to a management application. A BrNN identifies itself as 'endNode' in the appnNodeType object, and then identifies itself as a BrNN in the appnNodeBrNn object πŸ™ˆ.

End nodes are session end points that get directory and routing functions from network nodes over control-point to control-point (CP-CP) sessions πŸ’–. Low-entry networking (LEN) nodes are also session end points, but they don't support CP-CP sessions, so they need extra manual configuration definitions to establish sessions in an APPN network. ENs and LEN nodes may have minimal directory and routing functions, either to establish control sessions (ENs) or to connect into the APPN network (LEN nodes).

Virtual routing nodes (VRNs) are not really nodes 😭. They are common definitions among actual nodes in a shared transport facility, such as a local area network (LAN), and they let those actual nodes temporarily establish a logical link with one another without defining each other's link-level addressing information 🫢.

Ports and link stations are the node's interface to the data link control (DLC), which provides the physical transport, or to another protocol such as Data Link Switching (DLSw), which provides transport over an IP network ⭐. See the SNADLC SDLC MIB [25], the SNADLC LLC MIB [26], and the DLSw MIB [27]. A link station uses a port to make a connection to another node, and that connection establishes a TG between the two nodes 🌈.

The directory and routing functions let an NN find where an LU is located in the network and calculate the optimal route for the session, based on the requested class of service (COS) πŸ‘‘. A network node saves LU information in a directory database. That database is built from LUs defined locally, LU registration from served end nodes, and LUs learned from network searches.

Each NN maintains a local COS database that assigns a routing weight, or relative cost, to each resource for each class of service πŸ“. For example, the #INTER COS assigns a lower weight to TGs with a greater effective capacity, while the #BATCH COS favours TGs with a lower relative cost per byte.

A node saves network topology information (about NNs, VRNs, and the TGs between them) in a network topology database. A node that supports APPN function set 1120, branch awareness, also saves information about TGs to adjacent BrNNs πŸ”₯. The topology information includes state and routing characteristics. Topology information is exchanged between NNs over CP-CP sessions, so the database is fully replicated at each NN. Information about TGs to all node types is kept in a local topology database. Local topology information is only shared with other nodes during the session establishment process, so the NN responsible for route calculation has what it needs for end-to-end route calculation πŸ’….

A management application can show a full picture of the APPN network using the network and local topology information πŸ¦‹. To show the network topology, the application only needs to query the network topology tables from a single NN. To show all of the BrNNs, the application must also directly query all destinations of TGs that indicate they are branch TGs (indicated by the appnNnTgFRBranchTg object), to see if they have any cascaded BrNNs. For any NNs that don't indicate branch awareness support (indicated by the appnNnNodeFRBranchAwareness object), the application must query each NN's appnLocalTgTable, and then query the appnNodeBrNn object of each row's destination node to identify BrNNs. To show all of the nodes in the network, including ENs and LEN nodes, the application must query every NN's appnLocalTgTable, and iteratively do the same for each BrNN it finds 🌸.

SNA names such as LU names, CP names, COS names, and mode names can be padded with blanks (space characters) in SNA formats πŸŽ€. These blanks are nonsignificant. For example, in a BIND Request Unit (RU), a COS name of "#INTER" with a length of 6 is identical to a COS name of "#INTER " with a length of 8. However, in this MIB, the agent does not include nonsignificant blanks. Using the COS name from the previous example, an agent returns a length of 6 and the string "#INTER" with no blanks for appnCosName, no matter how it appears in the BIND RU or in internal storage. The lone exception is the all-blank mode name, for which the agent returns a length of 8 and the string " " (8 blank spaces). The MIB variables that this applies to are identified by a textual convention syntax that also describes this behaviour πŸ™ˆ.

When an SNA name is functioning as a table index, the agent treats trailing blanks as significant. If a management station requests the objects from a row with index "#INTER ", the agent does not match this to the row with index "#INTER". Since an agent has no nonsignificant blanks in any of its table indices, the only reason for a management station to include them would be to start GetNext processing at a chosen point in a table. For example, a GetNext request with index "M " would start retrieval from a table at the first row with an 8-character index beginning with "M" or a letter after "M" πŸ’€.

The SNA/APPN terms and overall architecture are documented in [18], [19], [20], and [28] πŸ“š.

Highlights of the management functions supported by the APPN MIB module include the following πŸ’œ:

  • Activating and deactivating ports and link stations.
  • Monitoring of configuration parameters related to the node, ports, link stations, virtual routing nodes, and classes of service.
  • Monitoring of operational parameters related to ports, link stations, virtual routing nodes, topology, directory, and intermediate sessions.
  • Historical information about link station errors during connection establishment, or that caused the connection to terminate.
  • Deactivating intermediate sessions.
  • Traps for SNA Management Services (SNA/MS) Alert conditions.

This MIB module does not support these things πŸ₯Ί:

  • Configuration of APPN nodes.
  • Monitoring and control of endpoint sessions.
  • Dependent LU Requester (DLUR) management.
  • High-Performance Routing (HPR) management.

3.1. Relationship with RFC 2155

This MIB obsoletes RFC 2155 [29] πŸ”„, with changes due to additions to the APPN architecture and some implementation experience with RFC 2155. The changes from RFC 2155 are as follows ✨:

  • New objects for the multi-link TG architecture enhancement: appnLsMltgMember, appnNnTgFRMltgLinkType, appnLocalTgMltgLinkType, and appnLocalEnTgMltgLinkType.
  • New objects, and explanations for values of existing objects, for the branch network node architecture enhancement: appnNodeBrNn, appnNnNodeFRBranchAwareness, appnNnTgFRBranchTg, and appnLocalTgBranchLinkType.
  • New object, appnNodeLsCounterType, to indicate which type of ANR traffic is returned in the appnLsTable traffic counters.
  • Deprecated appnNodeMibVersion object.
  • Miscellaneous editorial changes 🩷.

3.2. APPN MIB Structure

The APPN MIB module contains the following groups of objects πŸ§šβ€β™€οΈ:

  • appnNode - objects related to the APPN node for all node types.
  • appnNn - objects representing the network nodes, virtual routing nodes, and TGs between these nodes that make up the APPN network topology database maintained in NNs.
  • appnLocalTopology - objects representing nodes and TGs between nodes in the local topology database maintained in all nodes.
  • appnDir - objects related to LU location information from the node's directory database.
  • appnCos - objects related to classes of service information.
  • appnSessIntermediate - objects related to intermediate sessions that pass through this node.

These groups are described in more detail below πŸ‘‘.

3.2.1. appnNode group

The appnNode group consists of the following tables and objects 🌈:

  1. appnGeneralInfoAndCaps

This group of objects describes general information about the APPN node. The type of information includes the node type and the time since this node was initialized.

  1. appnNnUniqueInfoAndCaps

This group of objects describes information specific to network nodes, such as node routing characteristics.

  1. appnEnUniqueInfoAndCaps

This group of objects describes information specific to end nodes, with two objects that also apply to branch network nodes. This group includes an object indicating the node's network node server.

  1. appnPortInformation

This includes the appnPortTable, which describes the configuration and current status of the ports used by APPN, including the port state and DLC type.

  1. appnLinkStationInformation

This includes the appnNodeLsTable, which describes the configuration and current status of the link stations used by APPN, including the link state and port name. It also includes the appnLsStatusTable, which provides information about errors this node encountered with connections to adjacent nodes, such as the sense data captured during connection failures. It is a product option to decide how many appnLsStatusTable entries are kept πŸ“.

  1. appnVrnInfo

This includes the appnVrnTable, which describes the relationship between virtual routing nodes' TGs (described in the appnLocalTgTable) and ports in the appnPortTable πŸ¦‹.

3.2.2. appnNn group ✨

okay so the appnNn group is all about the network node's view of the topology πŸ—ΊοΈ

  1. appnNnTopo: this one's the general info bestie. It covers the network topology database, like how many nodes are there and how many topology database updates (TDU) wars the node has detected πŸ‘€
  2. appnNnTopology: this is where the actual APPN network topology database lives πŸ’… It has tables for the network nodes, virtual routing nodes, and TGs between them, plus the info about those resources that rides along in topology updates. The tables are indexed first by the same flow reduction sequence number (FRSN) that NNs use in topology exchanges. So a management station can grab just the incremental updates, since the agent bumps the FRSN of anything new or changed πŸ¦‹

3.2.3. appnLocalTopology group πŸŽ€

the appnLocalTopology group is giving "my own node, but make it detailed" 🌸

  1. appnLocalThisNode
    1. appnLocalGeneral is where you find the local node and its type 🧚
    2. appnLocalNnSpecific holds the routing info about the local network node πŸ’–
    3. appnLocalTg represents info about this node's local TGs ✨
  2. appnLocalEnTopology: this table has the TG info for EN TGs that the NN learned through TG registration with the local node 🫢

3.2.4. appnDir group πŸ“š

the appnDir group is the directory era πŸ“

  1. appnDirPerf: these objects cover info about the directory database and about directory searches involving this node πŸ”
  2. appnDirTable: this table is the directory database itself πŸ’œ It lists the LUs known to this node, along with the owning node of each LU and the serving NN of that owning node πŸ‘‘

3.2.5. appnCos group 🌈

the appnCos group is all about class of service, and it's giving mapping energy πŸ’…

  1. appnCosModeTable: this one represents the mode to class of service mapping πŸ¦‹
  2. appnCosNameTable: this one represents the transmission priority for each class of service πŸ”₯
  3. appnCosNodeRowTable: this one has the node-row info for each class of service, including the weight of each node ⭐
  4. appnCosTGRowTable: this one has the TG-row info for each class of service, including the weight of each TG πŸŽ€

3.2.6. appnSessIntermediate group 🧚

the appnSessIntermediate group is where intermediate sessions get their moment ✨

  1. appnIsInGlobal: these objects let you control the collection of intermediate session info, like Route Selection Control Vectors (RSCVs) and counters πŸ’–
  2. appnIsInTable: this table has info on active intermediate sessions 🌸
  3. appnIsRtpTable: this table has info on active intermediate sessions that are being carried over Rapid Transport Protocol (RTP) connections by High Performance Routing (HPR) πŸš€

3.2.7. appnTraps 🚨

there's exactly one APPN trap defined, and it's a whole vibe πŸ™ˆ

it's intended to line up with SNA/MS Alerts, but a product doesn't have to implement it, so it's optional πŸ’… The trap identifies the Alert ID number and, where possible, the affected resource 🫢


4. Definitions πŸ“œ

here's the MIB module itself, the actual ASN.1 source of truth πŸ”₯

APPN-MIB DEFINITIONS          ::= BEGIN

IMPORTS

        IANAifType
                FROM IANAifType-MIB

        DisplayString, VariablePointer, RowPointer, DateAndTime,
        TruthValue, TimeStamp, TEXTUAL-CONVENTION
                FROM SNMPv2-TC

        Counter32, Gauge32, Unsigned32, TimeTicks,
        OBJECT-TYPE, MODULE-IDENTITY, NOTIFICATION-TYPE
                FROM SNMPv2-SMI

        MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
                FROM SNMPv2-CONF

        snanauMIB
                FROM SNA-NAU-MIB;

appnMIB MODULE-IDENTITY
        LAST-UPDATED  "9807151800Z"  -- July 15, 1998
        ORGANIZATION  "IETF SNA NAU MIB WG / AIW APPN MIBs SIG"
        CONTACT-INFO

                "

                        Bob Clouston
                        Cisco Systems
                        7025 Kit Creek Road
                        P.O. Box 14987
                        Research Triangle Park, NC 27709, USA
                        Tel:    1 919 472 2333
                        E-mail: clouston@cisco.com

                        Bob Moore
                        IBM Corporation
                        4205 S. Miami Boulevard
                        BRQA/501
                        P.O. Box 12195
                        Research Triangle Park, NC 27709, USA
                        Tel:    1 919 254 4436
                        E-mail: remoore@us.ibm.com

                "
      DESCRIPTION
                "This is the MIB module for objects used to
                 manage network devices with APPN capabilities."

      -- Revision tracking starts with Proposed Standard (RFC 2155)
      REVISION  "9807151800Z"
      DESCRIPTION
                "Minor editorial fixes; new value 'none(5)' added
                to the enumeration for the appnLocalTgBranchLinkType
                object."

      REVISION  "9805261800Z"
      DESCRIPTION
                "Post-RFC 2155 conformance definitions added,
                appnNodeLsCounterType and appnNodeBrNn objects
                added, appnNodeMibVersion object deprecated."

      REVISION  "9707311800Z"
      DESCRIPTION
                "Branch network node (Branch Extender) objects added."
      REVISION  "9703311800Z"
      DESCRIPTION
                "MLTG objects added."
      REVISION  "9703201200Z"
      DESCRIPTION
                "RFC 2155 (Proposed Standard)"

::= { snanauMIB 4 }
-- snanauMIB ::= { mib-2 34 }

-- *********************************************************************
-- Textual Conventions
-- *********************************************************************
SnaNodeIdentification ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "An SNA Node Identification consists of two parts, which
          together comprise four bytes of hexadecimal data.  In SNA the
          Node Identification is transported in bytes 2-5 of the XID.

          The block number is the first three digits of the Node
          Identification.  These 3 hexadecimal digits identify the
          product.

          The ID number is the last 5 digits of the Node Identification.
          These 5 hexadecimal digits are administratively defined and
          combined with the 3-digit block number form the 8-digit Node
          Identification.  A unique value is required for connections to
          SNA subarea.  In some implementations, the value 'bbb00000'
          (where 'bbb' represents a 3-digit block number) is returned to
          mean that the ID number is not unique on this node.

          An SNA Node Identification is represented as eight
          ASCII-encoded hexadecimal digits, using the characters '0' -
          '9' and 'A' - 'F'."

      SYNTAX OCTET STRING (SIZE (8))

SnaControlPointName ::= TEXTUAL-CONVENTION

      STATUS current
      DESCRIPTION
          "A fully qualified SNA control point name, consisting of a 1 to
          8 character network identifier (NetId), a period ('.'), and a 1
          to 8 character control point name (CpName).

          The NetId and CpName are constructed from the uppercase letters
          'A' - 'Z' and the numerics '0' - '9', all encoded in ASCII,
          with the restriction that the first character of each must be
          a letter.  Trailing blanks are not allowed.

          Earlier versions of SNA permitted three additional characters
          in NetIds and CpNames:  '#', '@', and '$'.  While this use of
          these characters has been retired, a Management Station should
          still accept them for backward compatibility."

      SYNTAX OCTET STRING (SIZE (3..17))

SnaClassOfServiceName ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "An SNA class-of-service (COS) name, ranging from 1 to 8
          ASCII characters.  COS names take one of two forms:

             -  a user-defined COS name is constructed from the uppercase
                letters 'A' - 'Z' and the numerics '0' - '9', with the
                restriction that the first character of the name must be
                a letter.
             -  an SNA-defined user-session COS name begins with the
                character '#', which is followed by up to seven
                additional characters from the set of uppercase letters
                and numerics.

          Trailing blanks are not allowed in either form of COS name.

          A zero-length string indicates that a COS name is not
          available."

      SYNTAX OCTET STRING (SIZE (0..8))

SnaModeName ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "An SNA mode name, ranging from 1 to 8 ASCII characters.
          Mode names take one of two forms:

             -  a user-defined mode name is constructed from the
                uppercase letters 'A' - 'Z' and the numerics '0' - '9',
                with the restriction that the first character of the name
                must be a letter.
             -  an SNA-defined user-session mode name begins with the
                character '#', which is followed by up to seven
                additional characters from the set of uppercase letters
                and numerics.

          Trailing blanks are not allowed in either form of mode name,
          with the single exception of the all-blank mode name, where
          a string consisting of 8 blanks is returned.

          A zero-length string indicates that a mode name is not
          available."

      SYNTAX OCTET STRING (SIZE (0..8))

SnaSenseData ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "To facilitate their display by a Management Station, sense
          data objects in the MIB are represented as OCTET STRINGS
          containing eight ASCII characters.  Eight '0' characters
          indicates that no sense data identifying an SNA error
          condition is available.

          An SNA sense data is represented as eight hexadecimal digits,
          using the characters '0' - '9' and 'A' - 'F'."

      SYNTAX OCTET STRING (SIZE (8))

DisplayableDlcAddress ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "DLC address of a port or link station, represented as an
          OCTET STRING containing 0 to 64 ASCII characters.
          A Management Station should use a value of this type only
          for display.  The 'real' DLC address, i.e., the sequence of
          bytes that flow in the DLC header, is often available in a
          DLC-specific MIB.

          The zero-length string indicates that the DLC address in
          question is not known to the agent."

      SYNTAX OCTET STRING (SIZE (0..64))

AppnNodeCounter ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION

          "An object providing global statistics for the entire APPN
          node.  A Management Station can detect discontinuities in this
          counter by monitoring the appnNodeCounterDisconTime object."

      SYNTAX Counter32

AppnPortCounter ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "An object providing statistics for an APPN port.  A
          Management Station can detect discontinuities in this counter
          by monitoring the appnPortCounterDisconTime object."

      SYNTAX Counter32

AppnLinkStationCounter ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "An object providing statistics for an APPN link station.  A
          Management Station can detect discontinuities in this counter
          by monitoring the appnLsCounterDisconTime object."

      SYNTAX Counter32

Okay bestie, the textual conventions are still going, so let's keep the vibe rolling πŸ’…βœ¨

AppnTopologyEntryTimeLeft ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "Number of days before deletion of this entry from the topology
          database.  Range is 0-15.  A value of 0 indicates that the
          entry is either in the process of being deleted, or is being
          marked for deletion at the next garbage collection cycle."

      SYNTAX INTEGER (0..15)

AppnTgDlcData ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "DLC-specific data related to a connection network transmission
          group.  For other TGs, a zero-length string is returned.

          Examples of the type of data returned by an object with this
          syntax include the following:

                Token-Ring      - MAC/SAP
                X.25 Switched   - dial digits
                X.21 Switched   - dial digits
                Circuit Switch  - dial digits

          This MIB does not specify formats for these or any other types
          of DLC-specific data.  Formats may, however, be specified in
          documents related to a particular DLC.

          The contents of an object with this syntax correspond to the
          contents of the DLC-specific subfields of cv46, documented in
          (6)."

      SYNTAX OCTET STRING  (SIZE (0..64))

AppnTgEffectiveCapacity ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "A value representing the effective capacity of a transmission
          group.  This is an administratively assigned value derived from
          the link bandwidth and maximum load factor.  It is encoded in
          the same way as byte 7 of cv47, and represents a floating-point
          number in units of 300 bits per second."

      SYNTAX OCTET STRING (SIZE (1))

AppnTgSecurity ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "A value representing the level of security on a transmission
          group.  A class of service definition includes an indication of
          the acceptable TG security value(s) for that class of service.

          The following seven values are defined:

            nonsecure(1) -
                              (X'01'):  none of the values listed below;
                              for example, satellite-connected or
                              located in a nonsecure country
            publicSwitchedNetwork(32) -
                              (X'20'):  public switched network; secure
                              in the sense that there is no
                              predetermined route that traffic will take
            undergroundCable(64) -
                              (X'40'):  underground cable; located in a
                              secure country (as determined by the
                              network administrator)
            secureConduit(96) -
                              (X'60'):  secure conduit, not guarded; for
                              example, pressurized pipe
            guardedConduit(128) -
                              (X'80'):  guarded conduit; protected
                              against physical tapping

            encrypted(160) -
                              (X'A0'):  link-level encryption is provided
            guardedRadiation(192) -
                              (X'C0'):  guarded conduit containing the
                              transmission medium; protected against
                              physical and radiation tapping"

      SYNTAX INTEGER {
                     nonsecure(1),               -- X'01'
                     publicSwitchedNetwork(32),  -- X'20'
                     undergroundCable(64),       -- X'40'
                     secureConduit(96),          -- X'60'
                     guardedConduit(128),        -- X'80'
                     encrypted(160),             -- X'A0'
                     guardedRadiation(192)       -- X'C0'
                     }

AppnTgDelay ::= TEXTUAL-CONVENTION
      STATUS current
      DESCRIPTION
          "Relative amount of time that it takes for a signal to travel
          the length of a logical link.  This time is represented in
          microseconds, using the same encoding scheme used in cv47 in a
          topology update.  Some of the more common values, along with
          their encoded hex values, are:

                     minimum(0),                 X'00'
                     negligible(384),            X'4C'
                     terrestrial(9216),          X'71'
                     packet(147456),             X'91'
                     long(294912),               X'99'
                     maximum(2013265920)         X'FF'

          "

      SYNTAX OCTET STRING (SIZE (1))

Now we're into the actual MIB objects 🌸 The APPN Node Group is where the node-wide info lives, so it's basically the main character of this module πŸ‘‘

APPN Node Group ✨

-- *********************************************************************
  appnObjects             OBJECT IDENTIFIER ::= { appnMIB 1 }
-- *********************************************************************

-- ******************** The APPN Node Group ****************************

appnNode              OBJECT IDENTIFIER ::= { appnObjects 1 }
  appnGeneralInfoAndCaps      OBJECT IDENTIFIER ::= { appnNode 1 }
  appnNnUniqueInfoAndCaps     OBJECT IDENTIFIER ::= { appnNode 2 }
  appnEnUniqueCaps            OBJECT IDENTIFIER ::= { appnNode 3 }
  appnPortInformation         OBJECT IDENTIFIER ::= { appnNode 4 }
  appnLinkStationInformation  OBJECT IDENTIFIER ::= { appnNode 5 }
  appnVrnInfo                 OBJECT IDENTIFIER ::= { appnNode 6 }

-- This group provides global information about an APPN network node,
-- an APPN end node, an APPN branch network node, or an LEN node.

-- APPN General Information
-- This section applies to APPN network nodes, end nodes, and branch
-- network nodes, as well as to LEN end nodes.

appnNodeCpName OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned network name for this node."

      ::= { appnGeneralInfoAndCaps 1 }

-- appnNodeMibVersion OBJECT-TYPE (deprecated:  moved to end of module)

appnNodeId OBJECT-TYPE
      SYNTAX SnaNodeIdentification
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This node's Node Identification, which it sends in bytes
          2-5 of XID."

      ::= { appnGeneralInfoAndCaps 3 }

appnNodeType OBJECT-TYPE
      SYNTAX INTEGER {
                     networkNode(1),
                     endNode(2),
                     t21len(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Type of APPN node:

                networkNode(1) - APPN network node
                endNode(2)     - APPN end node
                t21len(4)      - LEN end node

          Note:  A branch network node SHALL return endNode(2)
          as the value of this object.  A management application
          can distinguish between a branch network node and an
          actual end node by retrieving the appnNodeBrNn object."

      ::= { appnGeneralInfoAndCaps 4 }

appnNodeUpTime OBJECT-TYPE
      SYNTAX TimeTicks
      UNITS "hundredths of a second"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Amount of time (in hundredths of a second) since the APPN node
          was last reinitialized."

      ::= { appnGeneralInfoAndCaps 5 }

appnNodeParallelTg OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node supports parallel TGs."

      ::= { appnGeneralInfoAndCaps 6 }

appnNodeAdaptiveBindPacing OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node supports adaptive bind pacing for
          dependent LUs."

      ::= { appnGeneralInfoAndCaps 7 }

appnNodeHprSupport OBJECT-TYPE
      SYNTAX INTEGER {
                 noHprSupport(1),
                 hprBaseOnly(2),
                 rtpTower(3),
                 controlFlowsOverRtpTower(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates this node's level of support for high-performance
          routing (HPR):

             noHprSupport(1)             - no HPR support
             hprBaseOnly(2)              - HPR base (option set 1400)
                                           supported
             rtpTower(3)                 - HPR base and RTP tower
                                           (option set 1401) supported
             controlFlowsOverRtpTower(4) - HPR base, RTP tower, and
                                           control flows over RTP
                                           (option set 1402) supported

          This object corresponds to cv4580, byte 9, bits 3-4."

      ::= { appnGeneralInfoAndCaps 8 }

appnNodeMaxSessPerRtpConn OBJECT-TYPE
      SYNTAX Gauge32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object represents a configuration parameter indicating
          the maximum number of sessions that the APPN node is to put on
          any HPR connection.  The value is zero if not applicable."

      ::= { appnGeneralInfoAndCaps 9 }

appnNodeHprIntRteSetups OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of HPR route setups received for routes
          passing through this node since the node was last
          reinitialized."

      ::= { appnGeneralInfoAndCaps 10 }

appnNodeHprIntRteRejects OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of HPR route setups rejected by this node for
          routes passing through it since the node was last
          reinitialized."

      ::= { appnGeneralInfoAndCaps 11 }

appnNodeHprOrgRteSetups OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of HPR route setups sent for routes
          originating in this node since the node was last
          reinitialized."

      ::= { appnGeneralInfoAndCaps 12 }

appnNodeHprOrgRteRejects OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of HPR route setups rejected by other nodes for
          routes originating in this node since the node was last
          reinitialized."

      ::= { appnGeneralInfoAndCaps 13 }

appnNodeHprEndRteSetups OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of HPR route setups received for routes
          ending in this node since the node was last reinitialized."

      ::= { appnGeneralInfoAndCaps 14 }

appnNodeHprEndRteRejects OBJECT-TYPE
      SYNTAX AppnNodeCounter
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of HPR route setups rejected by this node for
          routes ending in it since the node was last reinitialized."

      ::= { appnGeneralInfoAndCaps 15 }

appnNodeCounterDisconTime OBJECT-TYPE
      SYNTAX TimeStamp
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The value of the sysUpTime object the last time the APPN node
          was reinitialized."

      ::= { appnGeneralInfoAndCaps 16 }

Okay so the next bit is all about ANR counters and the node's branch network status πŸ‘€ Let's go.

Ngl the counter type object is giving main character energy πŸ’…

appnNodeLsCounterType OBJECT-TYPE
      SYNTAX INTEGER {
                 other(1),
                 noAnr(2),
                 anrForLocalNces(3),
                 allAnr(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates which ANR traffic, if any, the node includes in the
          counts returned by the APPN link station counters
          appnLsInXidBytes, appnLsInMsgBytes, appnLsInXidFrames,
          appnLsInMsgFrames, appnLsOutXidBytes, appnLsOutMsgBytes,
          appnLsOutXidFrames, and appnLsOutMsgFrames.  These counters
          are always incremented for ISR traffic.

          The following values are defined:

             other(1)             - the node does something different
                                    from all the options listed below
             noAnr(2)             - the node does not include any ANR
                                    traffic in these counts
             anrForLocalNces(3)   - the node includes in these counts
                                    ANR traffic for RTP connections
                                    that terminate in this node, but
                                    not ANR traffic for RTP connections
                                    that pass through this node without
                                    terminating in it
             allAnr(4)            - the node includes all ANR traffic
                                    in these counts."

      ::= { appnGeneralInfoAndCaps 17 }

So this one picks which ANR traffic gets counted in the link station counters πŸŽ€ The four values are other(1), noAnr(2), anrForLocalNces(3) and allAnr(4), and the ISR traffic is always counted no matter what. Iconic, honestly ✨

appnNodeBrNn OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node is currently configured as a
          branch network node.

          Note:  throughout the remainder of this MIB module, branch
          network node is treated as a third node type, parallel to
          network node and end node.  This is not how branch network
          nodes are treated in the base APPN architecture, but it
          increases clarity to do it here."

      ::= { appnGeneralInfoAndCaps 18 }

Bestie, the note here is literally the tea πŸ«– The MIB treats branch network nodes as a third node type, next to network nodes and end nodes, even though base APPN doesn't do it that way. It's just clearer this way, so we're doing it 🧚


-- *********************************************************************
-- APPN Network Node Information
-- This section provides global information about an APPN network node.
-- *********************************************************************

appnNodeNnCentralDirectory OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node supports central directory
          services.

          This object corresponds to cv4580, byte 8, bit 1."

      ::= { appnNnUniqueInfoAndCaps 1 }

appnNodeNnTreeCache OBJECT-TYPE
      SYNTAX INTEGER {
                     noCache(1),
                     cacheNoIncrUpdate(2),
                     cacheWithIncrUpdate(3)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates this node's level of support for caching of route
          trees.  Three levels are specified:

             noCache(1)             - caching of route trees is not
                                      supported
             cacheNoIncrUpdate(2)   - caching of route trees is
                                      supported, but without incremental
                                      updates
             cacheWithIncrUpdate(3) - caching of route trees with
                                      incremental updates is supported"

      ::= { appnNnUniqueInfoAndCaps 2 }

appnNodeNnRouteAddResist OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION

          "Route addition resistance.

          This administratively assigned value indicates the relative
          desirability of using this node for intermediate session
          traffic.  The value, which can be any integer 0-255, is used
          in route computation.  The lower the value, the more
          desirable the node is for intermediate routing.

          This object corresponds to cv4580, byte 6."

      ::= { appnNnUniqueInfoAndCaps 3 }

appnNodeNnIsr OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node supports intermediate session
          routing.

          This object corresponds to cv4580, byte 8, bit 2."

      ::= { appnNnUniqueInfoAndCaps 4 }

appnNodeNnFrsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The last flow-reduction sequence number (FRSN) sent by this
          node in a topology update to an adjacent network node."

      ::= { appnNnUniqueInfoAndCaps 5 }

appnNodeNnPeriBorderSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has peripheral border node
          support.

          This object corresponds to cv4580, byte 9, bit 0."

      ::= { appnNnUniqueInfoAndCaps 6 }

appnNodeNnInterchangeSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has interchange node support.

          This object corresponds to cv4580, byte 9, bit 1."

      ::= { appnNnUniqueInfoAndCaps 7 }

appnNodeNnExteBorderSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has extended border node support.

          This object corresponds to cv4580, byte 9, bit 2."

      ::= { appnNnUniqueInfoAndCaps 8 }


appnNodeNnSafeStoreFreq OBJECT-TYPE
      SYNTAX INTEGER (0..32767)
      UNITS "TDUs"
      MAX-ACCESS read-write
      STATUS current
      DESCRIPTION
          "The topology safe store frequency.

          If this number is not zero, then the topology database is saved
          each time the total number of topology database updates (TDUs)
          received by this node increases by this number.  A value of
          zero indicates that the topology database is not being saved."

      ::= { appnNnUniqueInfoAndCaps 9 }

appnNodeNnRsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Resource sequence number for this node, which it assigns and
          controls.

          This object corresponds to the numeric value in cv4580, bytes
          2-5."

      ::= { appnNnUniqueInfoAndCaps 10 }

appnNodeNnCongested OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node is congested.  Other network nodes
          stop routing traffic to this node while this flag is on.

          This object corresponds to cv4580, byte 7, bit 0."
      ::= { appnNnUniqueInfoAndCaps 11 }

appnNodeNnIsrDepleted OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicate whether intermediated session routing resources are
          depleted.  Other network nodes stop routing traffic through
          this node while this flag is on.

          This object corresponds to cv4580, byte 7, bit 1."

      ::= { appnNnUniqueInfoAndCaps 12 }

appnNodeNnQuiescing OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node is quiescing.

          This object corresponds to cv4580, byte 7, bit 5."

      ::= { appnNnUniqueInfoAndCaps 13 }

appnNodeNnGateway OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node has gateway services support.

          This object corresponds to cv4580, byte 8, bit 0."

      ::= { appnNnUniqueInfoAndCaps 14 }

Okay the network node section is a whole vibe 🌈 Central directory, tree caching, route addition resistance, ISR, FRSN, and the border and gateway support flags are all in here. The lower the appnNodeNnRouteAddResist value, the more desirable the node is for intermediate routing, so that one is literally a popularity contest πŸ‘‘

The congested and ISR-depleted flags are kind of dramatic too πŸ’€ Other network nodes stop routing traffic to this node while the congested flag is on, and they stop routing through it while the depleted flag is on. Not me being like "ugh, sorry" πŸ™ˆ


-- *********************************************************************
-- APPN End Node Information
-- This section provides global information about an APPN end node.  Two
-- of the objects are also implemented by a branch network node.
-- *********************************************************************

appnNodeEnModeCosMap OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this end node supports mode name to COS name
          mapping."

      ::= { appnEnUniqueCaps 1 }

appnNodeEnNnServer OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0 | 3..17))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The fully qualified name of the current NN server for this end
          node.  An NN server is identified using the format specified in
          the SnaControlPointName textual convention.  The value is a
          zero-length string when there is no active NN server.

          A branch network node shall also implement this object."

      ::= { appnEnUniqueCaps 2 }

appnNodeEnLuSearch OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node is to be searched for LUs as part
          of a network broadcast search.

          A branch network node shall also implement this object."

      ::= { appnEnUniqueCaps 3 }

End node time πŸ¦‹ Two of these objects are also implemented by a branch network node, so if you're a branch network node, appnNodeEnNnServer and appnNodeEnLuSearch are yours too 🫢 The NN server name reads as zero-length when there's no active NN server, which is very "I'm not here right now" energy 😭


-- *********************************************************************
-- APPN Port information
-- This section provides information about an APPN node's ports.
-- *********************************************************************
appnPortTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnPortEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The Port table describes the configuration and current status
          of the ports used by APPN.  When it is known to the APPN
          component, an OBJECT IDENTIFIER pointing to additional
          information related to the port is included.  This may, but
          need not, be a RowPointer to an ifTable entry for a DLC
          interface immediately 'below' the port."

      ::= { appnPortInformation 1 }

appnPortEntry OBJECT-TYPE
      SYNTAX AppnPortEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The port name is used as the index to this table."

      INDEX
             { appnPortName }

      ::= { appnPortTable 1 }

AppnPortEntry ::= SEQUENCE {
      appnPortName                 DisplayString,
      appnPortCommand              INTEGER,
      appnPortOperState            INTEGER,
      appnPortDlcType              IANAifType,
      appnPortPortType             INTEGER,
      appnPortSIMRIM               TruthValue,
      appnPortLsRole               INTEGER,
      appnPortNegotLs              TruthValue,
      appnPortDynamicLinkSupport   TruthValue,
      appnPortMaxRcvBtuSize        INTEGER,
      appnPortMaxIframeWindow      Gauge32,
      appnPortDefLsGoodXids        AppnPortCounter,
      appnPortDefLsBadXids         AppnPortCounter,
      appnPortDynLsGoodXids        AppnPortCounter,
      appnPortDynLsBadXids         AppnPortCounter,
      appnPortSpecific             RowPointer,
      appnPortDlcLocalAddr         DisplayableDlcAddress,
      appnPortCounterDisconTime    TimeStamp
                     }

appnPortName OBJECT-TYPE

      SYNTAX DisplayString (SIZE (1..10))
      MAX-ACCESS not-accessible
      STATUS current

      DESCRIPTION
          "Administratively assigned name for this APPN port."

      ::= { appnPortEntry 1 }

Now we're entering the port zone πŸšͺ✨ The port table is basically the list of APPN ports, with the port name as the index, so appnPortName is the key to everything else in the row πŸ”‘ It's giving organised, and honestly I respect it πŸ’œ

Okay bestie, we're picking up right where the port table left off πŸ’… The next bit lets a management station poke the port's Command knob, so let's go! πŸ¦‹

appnPortCommand OBJECT-TYPE
      SYNTAX INTEGER {
                      deactivate(1),
                      activate(2),
                      recycle(3),
                      ready(4)
                     }
      MAX-ACCESS read-write
      STATUS current
      DESCRIPTION
          "Object by which a Management Station can activate, deactivate,
          or recycle (i.e., cause to be deactivated and then immediately
          activated) a port, by setting the value to activate(1),
          deactivate(2), or recycle(3), respectively.  The value ready(4)
          is returned on GET operations until a SET has been processed;
          after that the value received on the most recent SET is
          returned."

      ::= { appnPortEntry 2 }

appnPortOperState OBJECT-TYPE
      SYNTAX INTEGER    {
                         inactive(1),
                         pendactive(2),
                         active(3),
                         pendinact(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates the current state of this port:

              inactive(1)   - port is inactive
              pendactive(2) - port is pending active
              active(3)     - port is active
              pendinact(4)  - port is pending inactive"


      ::= { appnPortEntry 3 }

appnPortDlcType OBJECT-TYPE
      SYNTAX IANAifType
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The type of DLC interface, distinguished according to the
          protocol immediately 'below' this layer."

      ::= { appnPortEntry 4 }

appnPortPortType OBJECT-TYPE
      SYNTAX INTEGER {
                     leased(1),
                     switched(2),
                     sharedAccessFacilities(3)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Identifies the type of line used by this port:

              leased(1)                 - leased line
              switched(2)               - switched line
              sharedAccessFacilities(3) - shared access facility, such
                                          as a LAN."

      ::= { appnPortEntry 5 }

appnPortSIMRIM OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether Set Initialization Mode (SIM) and Receive
          Initialization Mode (RIM) are supported for this port."

      ::= { appnPortEntry 6 }

appnPortLsRole OBJECT-TYPE
      SYNTAX INTEGER {
                     primary(1),
                     secondary(2),
                     negotiable(3),
                     abm(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION

             "Initial role for link stations activated through this port.
             The values map to the following settings in the initial XID,
             where 'ABM' indicates asynchronous balanced mode and 'NRM'
             indicated normal response mode:

                 primary(1):     ABM support = 0     ( = NRM)
                                 role = 01           ( = primary)
                 secondary(2):   ABM support = 0     ( = NRM)
                                 role = 00           ( = secondary)
                 negotiable(3):  ABM support = 0     ( = NRM)
                                 role = 11           ( = negotiable)
                 abm(4):         ABM support = 1     ( = ABM)
                                 role = 11           ( = negotiable)"

      ::= { appnPortEntry 7 }

appnPortNegotLs OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node supports negotiable link stations
          for this port."

      ::= { appnPortEntry 8 }

appnPortDynamicLinkSupport OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node allows call-in on this port from
          nodes not defined locally."

      ::= { appnPortEntry 9 }

appnPortMaxRcvBtuSize OBJECT-TYPE
      SYNTAX INTEGER (99..32767)
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum Basic Transmission Unit (BTU) size that a link station
          on this port can receive.

          This object corresponds to bytes 21-22 of XID3."

      ::= { appnPortEntry 10 }

appnPortMaxIframeWindow OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "I-frames"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum number of I-frames that can be received by the XID
          sender before an acknowledgement is received."

      ::= { appnPortEntry 11 }

appnPortDefLsGoodXids OBJECT-TYPE
      SYNTAX AppnPortCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of successful XID exchanges that have
          occurred on all defined link stations on this port since the
          last time this port was started."

      ::= { appnPortEntry 12 }

appnPortDefLsBadXids OBJECT-TYPE
      SYNTAX AppnPortCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of unsuccessful XID exchanges that have
          occurred on all defined link stations on this port since the
          last time this port was started."

      ::= { appnPortEntry 13 }

appnPortDynLsGoodXids OBJECT-TYPE
      SYNTAX AppnPortCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of successful XID exchanges that have
          occurred on all dynamic link stations on this port since the
          last time this port was started."

      ::= { appnPortEntry 14 }

appnPortDynLsBadXids OBJECT-TYPE

      SYNTAX AppnPortCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of unsuccessful XID exchanges that have
          occurred on all dynamic link stations on this port since the
          last time this port was started."

      ::= { appnPortEntry 15 }

appnPortSpecific OBJECT-TYPE
      SYNTAX RowPointer
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Identifies the object, e.g., one in a DLC-specific MIB, that
          can provide additional information related to this port.

          If the agent is unable to identify such an object, the value
          0.0 is returned."

      ::= { appnPortEntry 16 }

appnPortDlcLocalAddr OBJECT-TYPE
      SYNTAX DisplayableDlcAddress
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Local DLC address of this port."

      ::= { appnPortEntry 17 }

appnPortCounterDisconTime OBJECT-TYPE
      SYNTAX TimeStamp
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The value of the sysUpTime object the last time the port was
          started."

      ::= { appnPortEntry 18 }

Now we're moving on to the link station table, which is giving main character energy πŸŽ€ Each link station gets its own row, and the index is its name 🌸

-- *********************************************************************
-- APPN Link Station Information
-- This section provides information about an APPN node's link stations.
-- *********************************************************************
appnLsTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnLsEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table contains detailed information about the link
          station configuration and its current status."

      ::= { appnLinkStationInformation 1 }

appnLsEntry OBJECT-TYPE
      SYNTAX AppnLsEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the link station name."

      INDEX
             { appnLsName }

      ::= { appnLsTable 1 }

AppnLsEntry ::= SEQUENCE {
      appnLsName                  DisplayString,
      appnLsCommand               INTEGER,
      appnLsOperState             INTEGER,

      appnLsPortName              DisplayString,
      appnLsDlcType               IANAifType,
      appnLsDynamic               TruthValue,

      appnLsAdjCpName             OCTET STRING,
      appnLsAdjNodeType           INTEGER,
      appnLsTgNum                 INTEGER,
      appnLsLimResource           TruthValue,
      appnLsActOnDemand           TruthValue,
      appnLsMigration             TruthValue,
      appnLsPartnerNodeId         SnaNodeIdentification,
      appnLsCpCpSessionSupport    TruthValue,

      appnLsMaxSendBtuSize        INTEGER,
-- performance data
      appnLsInXidBytes            AppnLinkStationCounter,
      appnLsInMsgBytes            AppnLinkStationCounter,
      appnLsInXidFrames           AppnLinkStationCounter,
      appnLsInMsgFrames           AppnLinkStationCounter,
      appnLsOutXidBytes           AppnLinkStationCounter,
      appnLsOutMsgBytes           AppnLinkStationCounter,
      appnLsOutXidFrames          AppnLinkStationCounter,
      appnLsOutMsgFrames          AppnLinkStationCounter,
-- propagation delay
      appnLsEchoRsps              AppnLinkStationCounter,
      appnLsCurrentDelay          Gauge32,
      appnLsMaxDelay              Gauge32,
      appnLsMinDelay              Gauge32,
      appnLsMaxDelayTime          DateAndTime,
-- XID Statistics
      appnLsGoodXids              AppnLinkStationCounter,
      appnLsBadXids               AppnLinkStationCounter,
-- DLC-specific
      appnLsSpecific              RowPointer,
      appnLsActiveTime            Unsigned32,
      appnLsCurrentStateTime      TimeTicks,
-- HPR-specific
      appnLsHprSup                INTEGER,
      appnLsErrRecoSup            TruthValue,
      appnLsForAnrLabel           OCTET STRING,
      appnLsRevAnrLabel           OCTET STRING,
      appnLsCpCpNceId             OCTET STRING,
      appnLsRouteNceId            OCTET STRING,
      appnLsBfNceId               OCTET STRING,

      appnLsLocalAddr             DisplayableDlcAddress,
      appnLsRemoteAddr            DisplayableDlcAddress,
      appnLsRemoteLsName          DisplayString,
      appnLsCounterDisconTime     TimeStamp,
      appnLsMltgMember            TruthValue
                     }

appnLsName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..10))
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for the link station.
           The name can be from one to ten characters."

      ::= { appnLsEntry 1 }

appnLsCommand OBJECT-TYPE
      SYNTAX INTEGER {
                      deactivate(1),
                      activate(2),
                      recycle(3),
                      ready(4)
                     }

      MAX-ACCESS read-write
      STATUS current
      DESCRIPTION
          "Object by which a Management Station can activate, deactivate,
          or recycle (i.e., cause to be deactivated and then immediately
          reactivated) a link station, by setting the value to
          activate(1), deactivate(2), or recycle(3), respectively.  The
          value ready(4) is returned on GET operations until a SET has
          been processed; after that the value received on the most
          recent SET is returned."

      ::= { appnLsEntry 2 }

Okay bestie, the link station state is where things get spicy πŸ”₯. Here's how it's giving:

appnLsOperState OBJECT-TYPE
      SYNTAX INTEGER    {
          inactive(1),
          sentConnectOut(2),    -- pending active
          pendXidExch(3),       -- pending active
          sendActAs(4),         -- pending active
          sendSetMode(5),       -- pending active
          otherPendingActive(6),-- pending active
          active(7),
          sentDeactAsOrd(8),    -- pending inactive
          sentDiscOrd(9),       -- pending inactive
          sentDiscImmed(10),    -- pending inactive
          otherPendingInact(11) -- pending inactive
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "State of this link station.  The comments map these more
          granular states to the 'traditional' four states for SNA
          resources.  Values (2) through (5) represent the normal
          progression of states when a link station is being activated.
          Value (6) represents some other state of a link station in
          the process of being activated.  Values (8) through (10)
          represent different ways a link station can be deactivated.
          Value (11) represents some other state of a link station in
          the process of being deactivated."

      ::= { appnLsEntry 3 }

Next up is the port name, and it's a short one πŸŽ€

appnLsPortName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..10))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned name for the port associated with
          this link station.  The name can be from one to ten
          characters."

      ::= { appnLsEntry 4 }
appnLsDlcType OBJECT-TYPE
      SYNTAX IANAifType
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The type of DLC interface, distinguished according to the
          protocol immediately 'below' this layer."

      ::= { appnLsEntry 5 }
appnLsDynamic OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Identifies whether this is a dynamic link station.  Dynamic
          link stations are created when links that have not been locally
          defined are established by adjacent nodes."

      ::= { appnLsEntry 6 }

Okay the adjacent CP name object is giving detective 🧚 It has a little priority order, so pay attention:

appnLsAdjCpName OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0 | 3..17))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Fully qualified name of the adjacent node for this link
          station.  An adjacent node is identified using the format
          specified in the SnaControlPointName textual convention.

          The value of this object is determined as follows:

             1. If the adjacent node's name was received on XID, it
                is returned.

             2. If the adjacent node's name was not received on XID,
                but a locally-defined value is available, it is
                returned.

             3. Otherwise a string of length 0 is returned, indicating
                that no name is known for the adjacent node."

      ::= { appnLsEntry 7 }
appnLsAdjNodeType OBJECT-TYPE
      SYNTAX INTEGER {
                     networkNode(1),
                     endNode(2),
                     t21len(4),
                     unknown(255)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Node type of the adjacent node on this link:

                networkNode(1) - APPN network node
                endNode(2)     - APPN end node
                t21len(4)      - LEN end node
                unknown(255)   - the agent does not know the node type
                                 of the adjacent node
          "

      ::= { appnLsEntry 8 }
appnLsTgNum OBJECT-TYPE
      SYNTAX INTEGER (0..256)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number associated with the TG to this link station, with a
          range from 0 to 256.  A value of 256 indicates that the TG
          number has not been negotiated and is unknown at this time."

      ::= { appnLsEntry 9 }
appnLsLimResource OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the link station is a limited resource.  A
          link station that is a limited resource is deactivated when it
          is no longer in use."

      ::= { appnLsEntry 10 }

Activate-on-demand is my favourite, it's so iconic πŸ’…

appnLsActOnDemand OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION

          "Indicates whether the link station is activatable on demand.

          Such a link station is reported in the topology as active
          regardless of its actual state, so that it can be considered in
          route calculations.  If the link station is inactive and is
          chosen for a route, it will be activated at that time."

      ::= { appnLsEntry 11 }
appnLsMigration OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this link station will be used for
          connections to down-level or migration partners.

          In general, migration nodes do not append their CP names on
          XID3.  Such nodes:  (1) will not support parallel TGs, (2)
          should be sent an ACTIVATE PHYSICAL UNIT (ACTPU), provided that
          the partner supports ACTPUs, and (3) should not be sent
          segmented BINDs.  However, if this node receives an XID3 with
          an appended CP name, then the partner node will not be treated
          as a migration node.

           In the case of DYNAMIC TGs this object should be set to 'no'."

      ::= { appnLsEntry 12 }
appnLsPartnerNodeId OBJECT-TYPE
      SYNTAX SnaNodeIdentification
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The partner's Node Identification, from bytes 2-5 of the XID
          received from the partner.  If this value is not available,
          then the characters '00000000' are returned."

      ::= { appnLsEntry 13 }
appnLsCpCpSessionSupport OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether CP-CP sessions are supported by this
          link station.  For a dynamic link, this object represents
          the default ('Admin') value."

      ::= { appnLsEntry 14 }

The max BTU size has a whole negotiation storyline, so grab your snacks πŸ“

appnLsMaxSendBtuSize OBJECT-TYPE
      SYNTAX INTEGER (99..32767)
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Numeric value between 99 and 32767 inclusive indicating the
          maximum number of bytes in a Basic Transmission Unit (BTU) sent
          on this link.

          When the link state (returned by the appnLsOperState object) is
          inactive or pending active, the value configured at this node
          is returned.  When the link state is active, the value that was
          negotiated for it is returned.  This negotiated value is the
          smaller of the value configured at this node and the partner's
          maximum receive BTU length, received in XID."

      ::= { appnLsEntry 15 }

Now the counters, which are a lot but honestly iconic πŸ“Š

appnLsInXidBytes OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of XID bytes received.  All of the bytes in the SNA
          basic transmission unit (BTU), i.e., all of the bytes in the
          DLC XID Information Field, are counted."

      ::= { appnLsEntry 16 }
appnLsInMsgBytes OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of message (I-frame) bytes received.  All of the bytes
          in the SNA basic transmission unit (BTU), including the
          transmission header (TH), are counted."

      ::= { appnLsEntry 17 }
appnLsInXidFrames OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "XID frames"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of XID frames received."

      ::= { appnLsEntry 18 }
appnLsInMsgFrames OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "I-frames"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of message (I-frame) frames received."

      ::= { appnLsEntry 19 }
appnLsOutXidBytes OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of XID bytes sent.  All of the bytes in the SNA basic
          transmission unit (BTU), i.e., all of the bytes in the DLC XID
          Information Field, are counted."

      ::= { appnLsEntry 20 }
appnLsOutMsgBytes OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of message (I-frame) bytes sent.  All of the bytes
          in the SNA basic transmission unit (BTU), including the
          transmission header (TH), are counted."

      ::= { appnLsEntry 21 }
appnLsOutXidFrames OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "XID frames"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of XID frames sent."

      ::= { appnLsEntry 22 }
appnLsOutMsgFrames OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "I-frames"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of message (I-frame) frames sent."

      ::= { appnLsEntry 23 }

Echo responses and delay are the connectivity check era, and it's giving ping energy πŸ¦‹

appnLsEchoRsps OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "echo responses"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of echo responses returned from adjacent link station.
          A response should be returned for each test frame sent by this
          node.  Test frames are sent to adjacent nodes periodically to
          verify connectivity and to measure the actual round trip time,
          that is, the time interval from when the test frame is sent
          until when the response is received."


      ::= { appnLsEntry 24 }
appnLsCurrentDelay OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "milliseconds"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The time that it took for the last test signal to be sent and
          returned from this link station to the adjacent link station.
          This time is represented in milliseconds."

      ::= { appnLsEntry 25 }
appnLsMaxDelay OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "milliseconds"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The longest time it took for a test signal to be sent and
          returned from this link station to the adjacent link station.

          This time is represented in milliseconds .

          The value 0 is returned if no test signal has been sent and
          returned."

      ::= { appnLsEntry 26 }
appnLsMinDelay OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "milliseconds"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The shortest time it took for a test signal to be sent and
          returned from this link station to the adjacent link station.
          This time is represented in milliseconds.

          The value 0 is returned if no test signal has been sent and
          returned."

      ::= { appnLsEntry 27 }

okay so the next batch is where the link station stuff really starts flexing πŸ’… we've got timestamps, counters, the HPR support level, ANR labels, NCE IDs, and addresses, all bundled up in the appnLsEntry table πŸ¦‹

Starting with the time the longest delay happened. It's basically a timestamp for your worst moment, so you can line it up with other events like an APPC session dropping πŸ™ˆ

appnLsMaxDelayTime OBJECT-TYPE
      SYNTAX DateAndTime
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The time when the longest delay occurred.  This time can be
          used to identify when this high water mark occurred in relation
          to other events in the APPN node, for example, the time at
          which an APPC session was either terminated or failed to be
          established.  This latter time is available in the
          appcHistSessTime object in the APPC MIB.

          The value 00000000 is returned if no test signal has been sent
          and returned."

      ::= { appnLsEntry 28 }

Next up are the XID counters πŸŽ€ good ones and bad ones, both counted since the link station was started. Literally iconic record keeping 😭

appnLsGoodXids OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of successful XID exchanges that have
          occurred on this link station since the time it was started."

      ::= { appnLsEntry 29 }

appnLsBadXids OBJECT-TYPE
      SYNTAX AppnLinkStationCounter
      UNITS "XID exchanges"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The total number of unsuccessful XID exchanges that have
          occurred on this link station since the time it was started."

      ::= { appnLsEntry 30 }

appnLsSpecific is giving pointer energy 🧚 it points you to an object in a DLC-specific MIB that has more info. If the agent can't find one, the value is 0.0.

appnLsSpecific OBJECT-TYPE
      SYNTAX RowPointer
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Identifies the object, e.g., one in a DLC-specific MIB, that
          can provide additional information related to this link
          station.

          If the agent is unable to identify such an object, the value
          0.0 is returned."

      ::= { appnLsEntry 31 }

Now the timers 🌸 appnLsActiveTime tracks how long the link has been active in hundredths of a second, adding up across the node's life since its last reinit. Zero means it's never been active since the last reinit, so no cap, that's a sad link πŸ’€

appnLsActiveTime OBJECT-TYPE
      SYNTAX Unsigned32
      UNITS "hundredths of a second"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The cumulative amount of time since the node was last
          reinitialized, measured in hundredths of a second, that this
          link station has been in the active state.  A zero value
          indicates that the link station has never been active since
          the node was last reinitialized."

      ::= { appnLsEntry 32 }

appnLsCurrentStateTime OBJECT-TYPE
      SYNTAX TimeTicks
      UNITS "hundredths of a second"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The amount of time, measured in hundredths of a second, that
          the link station has been in its current state."

      ::= { appnLsEntry 33 }

Here's the HPR support check πŸ‘‘ it's an enum with four levels, from no support at all up to control flows riding over the RTP tower. The option sets are listed right there in the description, so you know exactly what each level means. If the link isn't active, you get the defined value back.

appnLsHprSup OBJECT-TYPE
      SYNTAX INTEGER {
                 noHprSupport(1),
                 hprBaseOnly(2),
                 rtpTower(3),
                 controlFlowsOverRtpTower(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates the level of high performance routing (HPR) support
          over this link:

             noHprSupport(1)             - no HPR support
             hprBaseOnly(2)              - HPR base (option set 1400)
                                           supported
             rtpTower(3)                 - HPR base and RTP tower
                                           (option set 1401) supported
             controlFlowsOverRtpTower(4) - HPR base, RTP tower, and
                                           control flows over RTP
                                           (option set 1402) supported

          If the link is not active, the defined value is returned."

      ::= { appnLsEntry 34 }

appnLsErrRecoSup is a TruthValue that just tells you whether the link station supports HPR link-level error recovery. Yes or no, bestie 🫢

appnLsErrRecoSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the link station is supporting
           HPR link-level error recovery."

      ::= { appnLsEntry 35 }

Now the ANR labels πŸ¦‹ these are octet strings of up to eight bytes, one for forward and one for reverse. If the link doesn't do HPR or the value is unknown, you get a zero-length string back.

appnLsForAnrLabel OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The forward Automatic Network Routing (ANR) label for this
          link station.  If the link does not support HPR or the value is
          unknown, a zero-length string is returned."

      ::= { appnLsEntry 36 }

appnLsRevAnrLabel OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The reverse Automatic Network Routing (ANR) label for this
          link station.  If the link does not support HPR or the value is
          unknown, a zero-length string is returned."

      ::= { appnLsEntry 37 }

Next are the NCE IDs 🧚 there are three of them, and each is an octet string of up to eight bytes. CP-CP sessions get one, Route Setup gets one, and the APPN/HPR boundary function gets one. Each one is a zero-length string when it's unknown or doesn't mean anything for this node, and each one only applies if the node supports the HPR transport tower.

appnLsCpCpNceId OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The network connection endpoint identifier (NCE ID) for CP-CP
          sessions if this node supports the HPR transport tower, a
          zero-length string if the value is unknown or not meaningful
          for this node."

      ::= { appnLsEntry 38 }

appnLsRouteNceId OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The network connection endpoint identifier (NCE ID) for Route
          Setup if this node supports the HPR transport tower, a zero-
          length string if the value is unknown or not meaningful for
          this node."

      ::= { appnLsEntry 39 }

appnLsBfNceId OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The network connection endpoint identifier (NCE ID) for the
          APPN/HPR boundary function if this node supports the HPR
          transport tower, a zero-length string if the value is unknown
          or not meaningful for this node."

      ::= { appnLsEntry 40 }

Addresses are up next 🌈 appnLsLocalAddr is the address of this link station, and appnLsRemoteAddr is the address of the remote link station on the same link.

appnLsLocalAddr OBJECT-TYPE
      SYNTAX DisplayableDlcAddress
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Local address of this link station."

      ::= { appnLsEntry 41 }


appnLsRemoteAddr OBJECT-TYPE
      SYNTAX DisplayableDlcAddress
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Address of the remote link station on this link."

      ::= { appnLsEntry 42 }

appnLsRemoteLsName is the name of the remote link station, pulled from the XID exchange πŸ“ it's one to ten characters, and a zero-length string means the name isn't known.

appnLsRemoteLsName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (0..10))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Remote link station discovered from the XID exchange.
          The name can be from one to ten characters.  A zero-length
          string indicates that the value is not known."

      ::= { appnLsEntry 43 }

appnLsCounterDisconTime is a TimeStamp that holds the sysUpTime value from the last time the link station was started. Yes, the name says disconnect, but the description says started, so I'm copying exactly what the spec says πŸ™ˆ

appnLsCounterDisconTime OBJECT-TYPE
      SYNTAX TimeStamp
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The value of the sysUpTime object the last time the link
          station was started."

      ::= { appnLsEntry 44 }

appnLsMltgMember tells you whether the link is part of a multi-link TG. The tricky bit is that once a TG has been brought up as multi-link, every link in it counts as a member, even if it's the only active one right now πŸ‘‘

appnLsMltgMember OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the link is a member of a multi-link TG.  If
          the link's TG has been brought up as a multi-link TG, then the
          link is reported as a member of a multi-link TG, even if it is
          currently the only active link in the TG."

      ::= { appnLsEntry 45 }

The next table is the status table πŸ’œ it logs the errors this node ran into with its adjacent nodes. Entries get added for exceptional conditions while connections are being set up, and for ones that ended a connection. Normal stuff doesn't get logged at all, and removing old entries is up to the implementation.

--********************************************************************
-- This table provides information about errors this node encountered
-- with connections to adjacent nodes.  Entries are added for exceptional
-- conditions encountered establishing connections, and for exceptional
-- conditions that resulted in termination of a connection.  It is an
-- implementation option when entries are removed from this table.
--********************************************************************

appnLsStatusTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnLsStatusEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table contains information related to exceptional and
          potentially exceptional conditions that occurred during the
          activation, XID exchange, and termination of a connection.  No
          entries are created when these activities proceed normally.

          It is an implementation option when entries are removed from
          this table."

      ::= { appnLinkStationInformation 2 }

appnLsStatusEntry OBJECT-TYPE
      SYNTAX AppnLsStatusEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the LsStatusIndex, which is an
          integer that is continuously updated until it eventually
          wraps."

      INDEX
             { appnLsStatusIndex }

      ::= { appnLsStatusTable 1 }

AppnLsStatusEntry ::= SEQUENCE {
      appnLsStatusIndex              INTEGER,
      appnLsStatusTime               DateAndTime,
      appnLsStatusLsName             DisplayString,
      appnLsStatusCpName             DisplayString,
      appnLsStatusPartnerId          SnaNodeIdentification,
      appnLsStatusTgNum              INTEGER,
      appnLsStatusGeneralSense       SnaSenseData,
      appnLsStatusRetry              TruthValue,
      appnLsStatusEndSense           SnaSenseData,
      appnLsStatusXidLocalSense      SnaSenseData,
      appnLsStatusXidRemoteSense     SnaSenseData,
      appnLsStatusXidByteInError     INTEGER,
      appnLsStatusXidBitInError      INTEGER,
      appnLsStatusDlcType            IANAifType,
      appnLsStatusLocalAddr          DisplayableDlcAddress,
      appnLsStatusRemoteAddr         DisplayableDlcAddress
                     }


appnLsStatusIndex OBJECT-TYPE
      SYNTAX INTEGER (0..2147483647)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table index.  The value of the index begins at zero
           and is incremented up to a maximum value of 2**31-1
           (2,147,483,647) before wrapping."

      ::= { appnLsStatusEntry 1 }

appnLsStatusTime OBJECT-TYPE
      SYNTAX DateAndTime
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Time when the exception condition occurred.  This time can be
          used to identify when this event occurred in relation to other
          events in the APPN node, for example, the time at which an APPC
          session was either terminated or failed to be established.
          This latter time is available in the appcHistSessTime object in
          the APPC MIB."

      ::= { appnLsStatusEntry 2 }

appnLsStatusLsName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..10))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned name for the link station
          experiencing the condition."

      ::= { appnLsStatusEntry 3 }

appnLsStatusCpName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (0 | 3..17))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Fully qualified name of the adjacent node for this link
          station.  An adjacent node is identified using the format
          specified in the SnaControlPointName textual convention.

          The value of this object is determined as follows:

             1. If the adjacent node's name was received on XID, it
                is returned.

             2. If the adjacent node's name was not received on XID,
                but a locally-defined value is available, it is
                returned.

             3. Otherwise a string of length 0 is returned, indicating
                that no name is known for the adjacent node."

      ::= { appnLsStatusEntry 4 }

appnLsStatusPartnerId OBJECT-TYPE
      SYNTAX SnaNodeIdentification
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The partner's Node Identification, from bytes 2-5 of the XID
          received from the partner.  If this value is not available,
          then the characters '00000000' are returned."

      ::= { appnLsStatusEntry 5 }

Picking up right where the link station status table left off πŸ’… These last fields explain why a link went sideways: the TG number, the sense data, and the XID rejection details. Literally the receipts 😭

appnLsStatusTgNum OBJECT-TYPE
      SYNTAX INTEGER (0..256)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number associated with the TG to this link station, with a
          range from 0 to 256.  A value of 256 indicates that the TG
          number was unknown at the time of the failure."

      ::= { appnLsStatusEntry 6 }

So appnLsStatusTgNum is the TG number for the link station, and 256 is the sentinel for "we didn't know the TG number when things broke" πŸ™ˆ

appnLsStatusGeneralSense OBJECT-TYPE

      SYNTAX SnaSenseData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The error sense data associated with the start sequence of
          activation of a link up to the beginning of the XID sequence.

          This is the sense data that came from Configuration Services
          whenever the link did not activate or when it went inactive."

      ::= { appnLsStatusEntry 7 }

appnLsStatusRetry OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node will retry the start request to
          activate the link."

      ::= { appnLsStatusEntry 8 }

appnLsStatusGeneralSense is the sense data from Configuration Services, covering the stretch from the start of activation up to the beginning of the XID sequence 🧚 appnLsStatusRetry is the yes-or-no on whether the node will try the start request again πŸ”

appnLsStatusEndSense OBJECT-TYPE
      SYNTAX SnaSenseData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The sense data associated with the termination of the link
          connection to adjacent node.

          This is the sense data that came from the DLC layer."

      ::= { appnLsStatusEntry 9 }

appnLsStatusXidLocalSense OBJECT-TYPE
      SYNTAX SnaSenseData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The sense data associated with the rejection of the XID.

          This is the sense data that came from the local node (this
          node) when it built the XID Negotiation Error control vector
          (cv22) to send to the remote node."

      ::= { appnLsStatusEntry 10 }

appnLsStatusXidRemoteSense OBJECT-TYPE

      SYNTAX SnaSenseData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The sense data the adjacent node returned to this node
          indicating the reason the XID was rejected.

          This is the sense data that came from the remote node in the
          XID Negotiation Error control vector (cv22) it sent to the
          local node (this node)."

      ::= { appnLsStatusEntry 11 }

appnLsStatusEndSense is the sense data from the DLC layer for when the link connection to the adjacent node ends πŸ”Œ The two XID sense objects are a matched pair. appnLsStatusXidLocalSense is what this node built into the cv22 it sent over, and appnLsStatusXidRemoteSense is what the neighbour sent back in its cv22 🫢 Both are about XID rejection, so they're basically a little argument with receipts on each side πŸ’…

appnLsStatusXidByteInError OBJECT-TYPE
      SYNTAX INTEGER (0..65536)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object identifies the actual byte in the XID that caused
          the error.  The value 65536 indicates that the object has no
          meaning.

          For values in the range 0-65535, this object corresponds to
          bytes 2-3 of the XID Negotiation (X'22') control vector."

      ::= { appnLsStatusEntry 12 }

appnLsStatusXidBitInError OBJECT-TYPE
      SYNTAX INTEGER (0..8)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object identifies the actual bit in error (0 through 7)
          within the errored byte of the XID.  The value 8 indicates that
          this object has no meaning.

          For values in the range 0-7, this object corresponds to byte 4
          of the XID Negotiation (X'22') control vector."

      ::= { appnLsStatusEntry 13 }

Okay, this is so specific it's iconic πŸŽ€ appnLsStatusXidByteInError points at the exact byte in the XID that caused the problem, and 65536 is the "nothing to see here" value. appnLsStatusXidBitInError narrows it down to the exact bit, and 8 means "no meaning" πŸ™ˆ

appnLsStatusDlcType OBJECT-TYPE
      SYNTAX IANAifType
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The type of DLC interface, distinguished according to the
          protocol immediately 'below' this layer."

      ::= { appnLsStatusEntry 14 }

appnLsStatusLocalAddr OBJECT-TYPE
      SYNTAX DisplayableDlcAddress
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Local address of this link station."

      ::= { appnLsStatusEntry 15 }

appnLsStatusRemoteAddr OBJECT-TYPE
      SYNTAX DisplayableDlcAddress
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Address of the remote link station on this link."

      ::= { appnLsStatusEntry 16 }

The last few fields round things out 🌸 appnLsStatusDlcType tells you which kind of DLC interface you're on, based on the protocol right below it, and the local and remote addresses are the two ends of this link station's link ✨

APPN Virtual Routing Node Information πŸ¦‹

-- *********************************************************************
-- APPN Virtual Routing Node Information
-- This section provides information relating a virtual routing node to
-- an APPN port.
-- *********************************************************************


appnVrnTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnVrnEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table relates a virtual routing node to an APPN port."

      ::= { appnVrnInfo 1 }

appnVrnEntry OBJECT-TYPE
      SYNTAX AppnVrnEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the virtual routing node name, TG
          number, and port name.  There will be a matching entry in the
          appnLocalTgTable to represent status and characteristics of the
          TG representing each virtual routing node definition."

      INDEX
             { appnVrnName, appnVrnTgNum, appnVrnPortName }

      ::= { appnVrnTable 1 }

AppnVrnEntry ::= SEQUENCE {
      appnVrnName             SnaControlPointName,
      appnVrnTgNum            INTEGER,
      appnVrnPortName         DisplayString
}

appnVrnName OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name of the virtual routing node.
          This is a fully qualified name, and matches the appnLocalTgDest
          name in the appnLocalTgTable."

      ::= { appnVrnEntry 1 }

appnVrnTgNum OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Number associated with the transmission group representing
          this virtual routing node definition."

      ::= { appnVrnEntry 2 }

appnVrnPortName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..10))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The name of the port this virtual routing node definition is
          defined to."

      ::= { appnVrnEntry 3 }

This section is all about the virtual routing node, which is the thing that links a VRN to an APPN port πŸ’œ The table is keyed by three things: the VRN name, the TG number, and the port name. Every entry has a matching row in appnLocalTgTable, so the two tables stay in sync 🀝

The APPN Topology Group 🌈

-- ************** The APPN Topology Group ******************************

appnNn                OBJECT IDENTIFIER ::= { appnObjects 2 }
appnNnTopo         OBJECT IDENTIFIER ::= { appnNn 1 }
appnNnTopology     OBJECT IDENTIFIER ::= { appnNn 2 }

-- This group is used to represent the entire APPN network-node topology
-- including network nodes, virtual routing nodes and all TGs associated
-- with these nodes, including intersubnetwork TGs (ISTGs) and branch TGs.

--
-- Network nodes
-- The APPN topology database consists of information about every APPN
-- network node in this network node's topology subnetwork.  This
-- information is learned over time as each network node exchanges
-- topology information with the network nodes adjacent to it.  The
-- database consists of information about each node, and information
-- about all of the transmission groups used by these nodes.
--
-- Virtual routing nodes
-- Information about virtual routing nodes (representing connection
-- networks) is treated in the same way as information about network
-- nodes, and is replicated at each network node.  The FRSN, node name,
-- and node type are the only meaningful fields for a virtual routing
-- node.  The other node objects return unspecified values.  Each
-- node that has defined a TG with this virtual routing node as the
-- destination also defines a TG on this virtual routing node.  There
-- is a TG record for each node that uses this virtual routing node.
--
-- The APPN node table represents node information from the APPN topology
-- database, with the FRSN and APPN fully qualified CP name serving as
-- the index.  The FRSN is the agent's relative time stamp of an update
-- to the network topology database.  After collecting the entire database
-- once, a management application can issue GET NEXT commands starting
-- from the last rows it has retrieved from the appnNnTopologyFRTable and
-- from the appnNnTgTopologyFRTable.  When the response to either of these
-- GET NEXT commands returns another row of its respective table, this
-- indicates a change to the agent's topology database.  The management
-- application can then retrieve only the updates to the table, using
-- GET NEXT commands starting from the last retrieved node or TG entry.
--
-- The format of the actual APPN topology database is as follows:
--
-- Node table (entry for each node in network)
--   TG table (entry for each TG owned by node)
--
-- Due to SNMP's ASN.1 limitations, we cannot represent the TG table
-- within the node table in this way.  We define separate tables for
-- nodes and TGs, adding the node name to each TG entry to provide a
-- means of correlating the TG with its originating node.

appnNnTopoMaxNodes OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "node entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum number of node entries allowed in the APPN topology
          database.  It is an implementation choice whether to count only
          network-node entries, or to count all node entries.  If the
          number of node entries exceeds this value, APPN will issue an
          Alert and the node can no longer participate as a network node.
          The value 0 indicates that the local node has no defined limit,
          and the number of node entries is bounded only by memory."

      ::= { appnNnTopo 1 }

appnNnTopoCurNumNodes OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "node entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current number of node entries in this node's topology
          database.  It is an implementation choice whether to count only
          network-node entries, or to count all node entries, but an
          implementation must make the same choice here that it makes for
          the appnNnTopoMaxNodes object.  If this value exceeds the
          maximum number of nodes allowed (appnNnTopoMaxNodes, if that
          field in not 0), APPN Alert CPDB002 is issued."

      ::= { appnNnTopo 2 }

appnNnTopoNodePurges OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "node entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Total number of topology node records purged from this node's
          topology database since the node was last reinitialized."

      ::= { appnNnTopo 3 }

appnNnTopoTgPurges OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "TG entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Total number of topology TG records purged from this node's
          topology database since the node was last reinitialized."

      ::= { appnNnTopo 4 }

appnNnTopoTotalTduWars OBJECT-TYPE

      SYNTAX AppnNodeCounter
      UNITS "TDU wars"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of TDU wars detected by this node since its last
          initialization."

      ::= { appnNnTopo 5 }

This is the big topology group, and the comment block is basically the whole vibe 🧠 It covers every network node, every VRN, and every TG hooked up to them, including ISTGs and branch TGs. The topology database is built up over time as network nodes swap info with their neighbours, and the VRN fields that actually matter are the FRSN, node name, and node type πŸ’– Management apps can use GET NEXT to fetch only the updates after they've grabbed the whole database once, which is honestly so efficient πŸ™Œ The comment ends with the reason for keeping node and TG data in separate tables, which is that SNMP's ASN.1 can't nest a TG table inside a node table, so each TG row carries its node name to stay connected ✨

The five objects after that are the counters and limits: the max number of node entries, the current count, and how many node records, TG records, and TDU wars have happened since the last initialization πŸ“Š

Network Node Topology Table πŸ’…

-- APPN network node topology table (using FRSN and name as index)

-- This table describes every APPN network node and virtual routing node
-- represented in this node's topology database.

appnNnTopologyFRTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnNnTopologyFREntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Portion of the APPN topology database that describes all of
          the APPN network nodes and virtual routing nodes known to this
          node."

      ::= { appnNnTopology 3 }

appnNnTopologyFREntry OBJECT-TYPE
      SYNTAX AppnNnTopologyFREntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The FRSN and the fully qualified node name are used to index
          this table."

      INDEX
             {appnNnNodeFRFrsn,
              appnNnNodeFRName}

      ::= { appnNnTopologyFRTable 1 }

And this table is the map of every APPN network node and VRN in your node's topology database πŸ—ΊοΈ Its entries are indexed by the FRSN plus the fully qualified node name, so that's how you look up a specific node πŸ¦‹

Okay so this is where the FR entry really gets its personality πŸ’… Here's the SEQUENCE that lists every field, and then we go field by field.

AppnNnTopologyFREntry ::= SEQUENCE {
      appnNnNodeFRFrsn                     Unsigned32,
      appnNnNodeFRName                     SnaControlPointName,
      appnNnNodeFREntryTimeLeft            AppnTopologyEntryTimeLeft,
      appnNnNodeFRType                     INTEGER,
      appnNnNodeFRRsn                      Unsigned32,
      appnNnNodeFRRouteAddResist           INTEGER,
      appnNnNodeFRCongested                TruthValue,
      appnNnNodeFRIsrDepleted              TruthValue,
      appnNnNodeFRQuiescing                TruthValue,
      appnNnNodeFRGateway                  TruthValue,
      appnNnNodeFRCentralDirectory         TruthValue,
      appnNnNodeFRIsr                      TruthValue,
      appnNnNodeFRGarbageCollect           TruthValue,

      appnNnNodeFRHprSupport               INTEGER,
      appnNnNodeFRPeriBorderSup            TruthValue,
      appnNnNodeFRInterchangeSup           TruthValue,
      appnNnNodeFRExteBorderSup            TruthValue,
      appnNnNodeFRBranchAwareness          TruthValue
}

The first three fields are the ones that identify the node. The FRSN is the main character here πŸ¦‹ because it's the timestamp for when this resource was last updated at the agent node. It's not a global number, either. It's only unique within each APPN network node, and one TDU can cover several APPN resources at once.

appnNnNodeFRFrsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Flow reduction sequence numbers (FRSNs) are associated with
          Topology Database Updates (TDUs) and are unique only within
          each APPN network node.  A TDU can be associated with multiple
          APPN resources.  This FRSN indicates the last relative time
          this resource was updated at the agent node."

      ::= { appnNnTopologyFREntry 1 }

appnNnNodeFRName OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned network name that is locally defined
          at each network node."

      ::= { appnNnTopologyFREntry 2 }

appnNnNodeFREntryTimeLeft OBJECT-TYPE
      SYNTAX AppnTopologyEntryTimeLeft
      UNITS "days"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of days before deletion of this network node entry."

      ::= { appnNnTopologyFREntry 3 }

appnNnNodeFRType OBJECT-TYPE
      SYNTAX INTEGER {
                     networkNode(1),
                     virtualRoutingNode(3)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Type of APPN node."

      ::= { appnNnTopologyFREntry 4 }

appnNnNodeFRRsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Resource sequence number, which is assigned and controlled by
          the network node that owns this resource.  An odd number
          indicates that information about the resource is inconsistent.

          This object corresponds to the numeric value in cv4580, bytes
          2-5."

      ::= { appnNnTopologyFREntry 5 }

Next up is the route addition resistance, which is basically a popularity score for routing πŸ’– The lower the number, the more desirable the node is for intermediate routing. Then we get a run of TruthValue flags that all come from cv4580, so it's giving bit-level drama πŸ”₯

appnNnNodeFRRouteAddResist OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Route addition resistance.

          This administratively assigned value indicates the relative
          desirability of using this node for intermediate session
          traffic.  The value, which can be any integer 0-255, is used
          in route computation.  The lower the value, the more
          desirable the node is for intermediate routing.

          This object corresponds to cv4580, byte 6."

      ::= { appnNnTopologyFREntry 6 }

appnNnNodeFRCongested OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node is congested.  This node is not be
          included in route selection by other nodes when this congestion
          exists.

          This object corresponds to cv4580, byte 7, bit 0."

      ::= { appnNnTopologyFREntry 7 }

appnNnNodeFRIsrDepleted OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether intermediate session routing resources are
          depleted.  This node is not included in intermediate route
          selection by other nodes when resources are depleted.

          This object corresponds to cv4580, byte 7, bit 1."

      ::= { appnNnTopologyFREntry 8 }

appnNnNodeFRQuiescing OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node is quiescing.  This node is not
          included in route selection by other nodes when the node is
          quiescing.

          This object corresponds to cv4580, byte 7, bit 5."

      ::= { appnNnTopologyFREntry 9 }

appnNnNodeFRGateway OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node provide gateway services.

          This object corresponds to cv4580, byte 8, bit 0."


      ::= { appnNnTopologyFREntry 10 }

appnNnNodeFRCentralDirectory OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node supports central directory
          services.

          This object corresponds to cv4580, byte 8, bit 1."


      ::= { appnNnTopologyFREntry 11 }

appnNnNodeFRIsr OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node supports intermediate session
          routing (ISR).

          This object corresponds to cv4580, byte 8, bit 2."

      ::= { appnNnTopologyFREntry 12 }

appnNnNodeFRGarbageCollect OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the node has been marked for garbage
          collection (deletion from the topology database) upon the next
          garbage collection cycle.

          This object corresponds to cv4580, byte 7, bit 3."

      ::= { appnNnTopologyFREntry 13 }

Now the HPR support field, which is an INTEGER with four levels of glow-up ✨ Each level builds on the last, from no HPR at all up to control flows riding over the RTP tower.

appnNnNodeFRHprSupport OBJECT-TYPE
      SYNTAX INTEGER {
                 noHprSupport(1),
                 hprBaseOnly(2),
                 rtpTower(3),
                 controlFlowsOverRtpTower(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION

          "Indicates the node's level of support for high-performance
          routing (HPR):

             noHprSupport(1)             - no HPR support
             hprBaseOnly(2)              - HPR base (option set 1400)
                                           supported
             rtpTower(3)                 - HPR base and RTP tower
                                           (option set 1401) supported
             controlFlowsOverRtpTower(4) - HPR base, RTP tower, and
                                           control flows over RTP
                                           (option set 1402) supported

          This object corresponds to cv4580, byte 9, bits 3-4."

      ::= { appnNnTopologyFREntry 14 }

appnNnNodeFRPeriBorderSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has peripheral border node
          support.

          This object corresponds to cv4580, byte 9, bit 0."

      ::= { appnNnTopologyFREntry 15 }

appnNnNodeFRInterchangeSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has interchange node support.

          This object corresponds to cv4580, byte 9, bit 1."

      ::= { appnNnTopologyFREntry 16 }

appnNnNodeFRExteBorderSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node has extended border node
           support.

          This object corresponds to cv4580, byte 9, bit 2."

      ::= { appnNnTopologyFREntry 17 }

appnNnNodeFRBranchAwareness OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether this node supports branch awareness.

          This object corresponds to cv4580, byte 8, bit 4."

      ::= { appnNnTopologyFREntry 18 }


--APPN transmission group (TG) table

-- This table describes the TGs associated with all the APPN network
-- nodes known to this node.   The originating (owning) node for each
-- TG is repeated here to provide a means of correlating the TGs with
-- the nodes.

appnNnTgTopologyFRTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnNnTgTopologyFREntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Portion of the APPN topology database that describes all of
          the APPN transmissions groups between nodes in the database."

      ::= { appnNnTopology 4 }

appnNnTgTopologyFREntry OBJECT-TYPE
      SYNTAX AppnNnTgTopologyFREntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by four columns:  FRSN, TG owner fully
          qualified node name, TG destination fully qualified node name,
          and TG number."

      INDEX
             {appnNnTgFRFrsn,
              appnNnTgFROwner,
              appnNnTgFRDest,
              appnNnTgFRNum}

      ::= { appnNnTgTopologyFRTable 1 }

AppnNnTgTopologyFREntry ::= SEQUENCE {

      appnNnTgFRFrsn           Unsigned32,
      appnNnTgFROwner          SnaControlPointName,
      appnNnTgFRDest           SnaControlPointName,
      appnNnTgFRNum            INTEGER,
      appnNnTgFREntryTimeLeft  AppnTopologyEntryTimeLeft,

      appnNnTgFRDestVirtual    TruthValue,
      appnNnTgFRDlcData        AppnTgDlcData,

      appnNnTgFRRsn            Unsigned32,
      appnNnTgFROperational    TruthValue,
      appnNnTgFRQuiescing      TruthValue,
      appnNnTgFRCpCpSession    INTEGER,
      appnNnTgFREffCap         AppnTgEffectiveCapacity,
      appnNnTgFRConnCost       INTEGER,
      appnNnTgFRByteCost       INTEGER,
      appnNnTgFRSecurity       AppnTgSecurity,
      appnNnTgFRDelay          AppnTgDelay,
      appnNnTgFRUsr1           INTEGER,
      appnNnTgFRUsr2           INTEGER,
      appnNnTgFRUsr3           INTEGER,
      appnNnTgFRGarbageCollect TruthValue,
      appnNnTgFRSubareaNum     Unsigned32,

      appnNnTgFRHprSup         TruthValue,
      appnNnTgFRDestHprTrans   TruthValue,
      appnNnTgFRTypeIndicator  INTEGER,
      appnNnTgFRIntersubnet    TruthValue,
      appnNnTgFRMltgLinkType   TruthValue,
      appnNnTgFRBranchTg       TruthValue
}

Now we're into the TG table, which is the list of every transmission group between the nodes in the database 🌈 Its index is a four-way combo of FRSN, owner, destination and TG number, so it's basically a whole friendship bracelet of keys πŸ’œ

appnNnTgFRFrsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Flow reduction sequence numbers (FRSNs) are associated with
          Topology Database Updates (TDUs) and are unique only within
          each APPN network node.  A TDU can be associated with multiple
          APPN resources.  This FRSN indicates the last time this
          resource was updated at this node."

      ::= { appnNnTgTopologyFREntry 1 }

appnNnTgFROwner OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for the originating node for
          this TG.  This is the same name specified in the node table."

      ::= { appnNnTgTopologyFREntry 2 }

appnNnTgFRDest OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned fully qualified network name for the
          destination node for this TG."

      ::= { appnNnTgTopologyFREntry 3 }

appnNnTgFRNum OBJECT-TYPE
      SYNTAX INTEGER  (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Number associated with this transmission group.  Range is
          0-255."

      ::= { appnNnTgTopologyFREntry 4 }

okay bestie, the TG entries keep going and they are SO detailed πŸ’… each one is a little row in the appnNnTgTopologyFREntry table πŸ¦‹

appnNnTgFREntryTimeLeft OBJECT-TYPE
      SYNTAX AppnTopologyEntryTimeLeft
      UNITS "days"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of days before deletion of this network node TG entry
          if it is not operational or has an odd (inconsistent) RSN."

      ::= { appnNnTgTopologyFREntry 5 }

ok so TimeLeft is basically a countdown ⏳ in days, and it only starts ticking if the TG isn't operational or its RSN is odd (aka inconsistent). no cap, it's giving "use it or lose it" πŸ’€

appnNnTgFRDestVirtual OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the destination node is a virtual routing
          node."

      ::= { appnNnTgTopologyFREntry 6 }

DestVirtual is a yes/no πŸŽ€ that tells you if the far end is a virtual routing node. simple, iconic.

appnNnTgFRDlcData OBJECT-TYPE
      SYNTAX AppnTgDlcData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "DLC-specific data related to a link connection network."

      ::= { appnNnTgTopologyFREntry 7 }

DlcData is the DLC-specific info for a link connection network 🌸 it's the detailed stuff that belongs to that particular link.

appnNnTgFRRsn OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current owning node's resource sequence number for this
          resource.  An odd number indicates that information about the
          resource is inconsistent.

          This object corresponds to cv47, bytes
          2-5"

      ::= { appnNnTgTopologyFREntry 8 }

Rsn is the owning node's resource sequence number πŸ”₯ and this one is a big deal: an odd number means the info is inconsistent. it maps to bytes 2-5 of cv47, so if you're a cv47 person, that's your spot 🧚

appnNnTgFROperational OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is operational.

          This object corresponds to cv47, byte 6, bit 0."

      ::= { appnNnTgTopologyFREntry 9 }

Operational is the "is this TG live?" check ✨ it lives in cv47, byte 6, bit 0.

appnNnTgFRQuiescing OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is quiescing.

          If the TG owner is either an extended border node or a
          branch-aware network node (indicated, respectively, by
          the appnNnNodeFRExteBorderSup and appnNnNodeFRBranchAwareness
          objects in the corresponding appnNnTopologyFREntry), then
          this indicator is artificially set to TRUE in the APPN
          topology database, to remove the TG from other nodes'
          route calculations.  A management application can
          determine whether the TG is actually quiescing by
          examining its appnLocalTgQuiescing object at the TG owner.

          This object corresponds to cv47, byte 6, bit 2."

      ::= { appnNnTgTopologyFREntry 10 }

okay Quiescing is lowkey the drama queen of this table πŸ™ˆ if the owner is an extended border node or a branch-aware network node, the flag gets faked to TRUE in the topology database so other nodes skip this TG when they calculate routes. the real answer is in appnLocalTgQuiescing back at the owner, so that's where a management app should go check. cv47, byte 6, bit 2.

appnNnTgFRCpCpSession OBJECT-TYPE
      SYNTAX INTEGER {
                     supportedUnknownStatus(1),
                     supportedActive(2),
                     notSupported(3),
                     supportedNotActive(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether CP-CP sessions are supported on this TG, and
          whether the TG owner's contention-winner session is active on
          this TG.  Some nodes in the network are not able to
          differentiate support and status of CP-CP sessions, and thus
          may report the 'supportedUnknownStatus' value.

          This object corresponds to cv47, byte 6, bits 3-4."

      ::= { appnNnTgTopologyFREntry 11 }

CpCpSession is giving four-way choice energy πŸ’… it covers whether CP-CP sessions are supported on the TG, and whether the owner's contention-winner session is active there. some nodes can't tell support apart from status, so they may just say supportedUnknownStatus, and that's valid too 🫢 it's cv47, byte 6, bits 3-4.

appnNnTgFREffCap OBJECT-TYPE
      SYNTAX AppnTgEffectiveCapacity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Effective capacity for this TG."

      ::= { appnNnTgTopologyFREntry 12 }

EffCap is the effective capacity for this TG 🌈 short and sweet, no notes needed.

appnNnTgFRConnCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Cost per connect time.

          This is an administratively assigned value representing the
          relative cost per unit of time to use this TG.  Range is from
          0, which means no cost, to 255, which indicates maximum cost.

          This object corresponds to cv47, byte 13."

      ::= { appnNnTgTopologyFREntry 13 }

ConnCost is the price tag for time spent on the TG πŸ’° it's admin-assigned, 0 means free and 255 means maximum ouch. lives in cv47, byte 13.

appnNnTgFRByteCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Cost per byte transmitted.

          This is an administratively assigned value representing the
          relative cost of transmitting a byte over this TG.  Range is
          from 0, which means no cost, to 255, which indicates maximum
          cost.

          This object corresponds to cv47, byte 14."

      ::= { appnNnTgTopologyFREntry 14 }

ByteCost is the same vibe but per byte sent πŸ“¦ same 0 to 255 scale, cv47, byte 14.

appnNnTgFRSecurity OBJECT-TYPE
      SYNTAX AppnTgSecurity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned security level of this TG.

          This object corresponds to cv47, byte 16."

      ::= { appnNnTgTopologyFREntry 15 }

Security is the admin-assigned security level of the TG πŸ”’ cv47, byte 16. protect your main character era.

appnNnTgFRDelay OBJECT-TYPE
      SYNTAX AppnTgDelay
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned delay associated with this TG.

          This object corresponds to cv47, byte 17."

      ::= { appnNnTgTopologyFREntry 16 }

Delay is the admin-assigned delay for this TG ⏱️ cv47, byte 17.

appnNnTgFRUsr1 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "First user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG.

          This object corresponds to cv47, byte 19."

      ::= { appnNnTgTopologyFREntry 17 }

appnNnTgFRUsr2 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Second user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG.

          This object corresponds to cv47, byte 20."

      ::= { appnNnTgTopologyFREntry 18 }

appnNnTgFRUsr3 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Third user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG.

          This object corresponds to cv47, byte 21."

      ::= { appnNnTgTopologyFREntry 19 }

the Usr1, Usr2 and Usr3 trio πŸ“ these are three user-defined TG characteristics, each one an admin-assigned value from 0 to 255. they sit at cv47 bytes 19, 20 and 21, so it's basically a little custom-label squad πŸ‘‘

appnNnTgFRGarbageCollect OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the TG has been marked for garbage
          collection (deletion from the topology database) upon the next
          garbage collection cycle.

          This object corresponds to cv47, byte 6, bit 1."

      ::= { appnNnTgTopologyFREntry 20 }

GarbageCollect is the "you're getting deleted next cycle" flag πŸ—‘οΈ it says whether the TG is marked for removal from the topology database on the next garbage collection cycle. cv47, byte 6, bit 1. ngl the most dramatic boolean in the whole table πŸ’€

appnNnTgFRSubareaNum OBJECT-TYPE
      SYNTAX Unsigned32
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The subarea number associated with this TG.

          This object corresponds to cv4680, bytes m+2 through m+5."

      ::= { appnNnTgTopologyFREntry 21 }

SubareaNum is the subarea number tied to this TG 🧩 it comes from cv4680, bytes m+2 through m+5.

appnNnTgFRHprSup OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether high performance routing (HPR)
          is supported over this TG.

          This object corresponds to cv4680, byte m+1, bit 2."

      ::= { appnNnTgTopologyFREntry 22 }

appnNnTgFRDestHprTrans OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the destination node supports
          high performance routing (HPR) transport tower.

          This object corresponds to cv4680, byte m+1, bit 7."

      ::= { appnNnTgTopologyFREntry 23 }

HprSup checks if high performance routing (HPR) runs over this TG πŸš€ and DestHprTrans checks if the destination node supports the HPR transport tower. both live in cv4680, byte m+1 (bits 2 and 7 respectively).

appnNnTgFRTypeIndicator OBJECT-TYPE
      SYNTAX INTEGER {
                      unknown(1),
                      appnOrBfTg(2),
                      interchangeTg(3),
                      virtualRouteTg(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates the type of the TG.

          This object corresponds to cv4680, byte m+1, bits 3-4."

      ::= { appnNnTgTopologyFREntry 24 }

TypeIndicator is the "what kind of TG is this?" label 🏷️ four options: unknown, appnOrBfTg, interchangeTg and virtualRouteTg. it's read from cv4680, byte m+1, bits 3-4.

appnNnTgFRIntersubnet OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is an intersubnet TG,
          which defines a border between subnetworks.

          This object corresponds to cv4680, byte m+1, bit 5."

      ::= { appnNnTgTopologyFREntry 25 }

Intersubnet tells you if the TG is a border between subnetworks πŸŒ‰ it's cv4680, byte m+1, bit 5.

appnNnTgFRMltgLinkType OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object indicates whether the transmission group is a
          multi-link TG.  A TG that has been brought up as a multi-link
          TG is reported as one, even if it currently has only one link
          active.

          This object corresponds to cv47, byte 6, bit 5."

      ::= { appnNnTgTopologyFREntry 26 }

MltgLinkType is the multi-link check πŸ”— and the vibe here is "once a multi-link, always a multi-link." even if only one link is active right now, it still gets reported as multi-link. cv47, byte 6, bit 5.

appnNnTgFRBranchTg OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is a branch TG
          (equivalently, whether the destination of the transmission
          group is a branch network node).

          This object corresponds to cv4680, byte m+1, bit 1."
      ::= { appnNnTgTopologyFREntry 27 }

BranchTg checks if the TG is a branch TG, which is the same as asking whether the destination is a branch network node 🌿 it's cv4680, byte m+1, bit 1.


okay now we're moving into the local topology group 🧚✨ this part of the MIB is for the topology that each node keeps for itself. it's a little different depending on the node type, so pay attention bestie πŸ‘€

-- ************** The APPN Local Topology Group ************************
-- This MIB Group represents the local topology maintained in
-- APPN network nodes, end nodes, and branch network nodes.  It consists
-- of two tables:
--    - a table containing information about all of the TGs owned
--      by this node, which is implemented by all node types.
--    - a table containing all of the information known to this node
--      about the TGs owned by its end nodes, which is implemented only
--      by network nodes.

appnLocalTopology     OBJECT IDENTIFIER ::= { appnObjects 3 }

so the group covers APPN network nodes, end nodes and branch network nodes 🌸 there are two tables in it: one for TGs owned by this node (every node type has this one), and one for what the node knows about its end nodes' TGs (only network nodes do this one). and appnLocalTopology is just the OID hanging off appnObjects 3 πŸ¦‹

-- APPN Local Transmission Group (TG) table
-- This table describes the TGs associated with this node only.

appnLocalTgTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnLocalTgEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "TG Table describes all of the TGs owned by this node.  The TG
          destination can be a virtual node, network node, LEN node, or
          end node."

      ::= { appnLocalTopology 1 }

appnLocalTgEntry OBJECT-TYPE
      SYNTAX AppnLocalTgEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the destination CpName and the TG
          number."

      INDEX
             {appnLocalTgDest,
              appnLocalTgNum}

      ::= { appnLocalTgTable 1 }

AppnLocalTgEntry ::= SEQUENCE {

      appnLocalTgDest             SnaControlPointName,
      appnLocalTgNum              INTEGER,
      appnLocalTgDestVirtual      TruthValue,
      appnLocalTgDlcData          AppnTgDlcData,
      appnLocalTgPortName         DisplayString,

      appnLocalTgQuiescing        TruthValue,
      appnLocalTgOperational      TruthValue,
      appnLocalTgCpCpSession      INTEGER,
      appnLocalTgEffCap           AppnTgEffectiveCapacity,
      appnLocalTgConnCost         INTEGER,
      appnLocalTgByteCost         INTEGER,
      appnLocalTgSecurity         AppnTgSecurity,
      appnLocalTgDelay            AppnTgDelay,
      appnLocalTgUsr1             INTEGER,
      appnLocalTgUsr2             INTEGER,
      appnLocalTgUsr3             INTEGER,
      appnLocalTgHprSup           INTEGER,
      appnLocalTgIntersubnet      TruthValue,
      appnLocalTgMltgLinkType     TruthValue,
      appnLocalTgBranchLinkType   INTEGER
                     }

appnLocalTgDest OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name of the destination node for
          this TG.  This is the fully qualified name of a network node,
          end node, LEN node, or virtual routing node."

      ::= { appnLocalTgEntry 1 }

appnLocalTgNum OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Number associated with this transmission group."

      ::= { appnLocalTgEntry 2 }

ok the local TG table is the "my own TGs" list πŸ’– it's indexed by the destination CpName plus the TG number, so those two together pick out one row. the destination can be a virtual node, network node, LEN node or end node, and the destination name is the fully qualified name. the TG number is just a 0 to 255 number for the transmission group πŸŽ€

Okay bestie, we're picking up right where the local TG table is giving us all the per-TG details πŸ’… Every one of these is its own OBJECT-TYPE, and that ::= { appnLocalTgEntry N } number is just where the column sits in the entry. Let's go 🫢

appnLocalTgDestVirtual OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the destination node for this TG is a
          virtual routing node."

      ::= { appnLocalTgEntry 3 }

appnLocalTgDlcData OBJECT-TYPE
      SYNTAX AppnTgDlcData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "DLC-specific data related to a link connection network."

      ::= { appnLocalTgEntry 4 }

appnLocalTgPortName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (0..10))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned name for the local port associated
          with this TG.  A zero-length string indicates that this value
          is unknown."

      ::= { appnLocalTgEntry 5 }

appnLocalTgQuiescing OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is quiescing."

      ::= { appnLocalTgEntry 6 }

appnLocalTgOperational OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is operational."

      ::= { appnLocalTgEntry 7 }

Next up is the CP-CP session flag, and this one is a whole vibe 🌈 It tells you whether CP-CP sessions are supported on the TG and whether the TG owner's contention-winner session is active on it. Some nodes can't tell support and status apart, so they're allowed to report supportedUnknownStatus and we just roll with it πŸ™ˆ

appnLocalTgCpCpSession OBJECT-TYPE
      SYNTAX INTEGER {
                     supportedUnknownStatus(1),
                     supportedActive(2),
                     notSupported(3),
                     supportedNotActive(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether CP-CP sessions are supported on this TG, and
          whether the TG owner's contention-winner session is active on
          this TG.  Some nodes in the network are not able to
          differentiate support and status of CP-CP sessions, and thus
          may report the 'supportedUnknownStatus' value."

      ::= { appnLocalTgEntry 8 }

appnLocalTgEffCap OBJECT-TYPE
      SYNTAX AppnTgEffectiveCapacity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Effective capacity for this TG."

      ::= { appnLocalTgEntry 9 }

appnLocalTgConnCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Cost per connect time:  a value representing the relative cost
          per unit of time to use the TG.  Range is from 0, which means
          no cost, to 255."

      ::= { appnLocalTgEntry 10 }

appnLocalTgByteCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Relative cost of transmitting a byte over this link.
          Range is from 0 (lowest cost) to 255."

      ::= { appnLocalTgEntry 11 }

appnLocalTgSecurity OBJECT-TYPE
      SYNTAX AppnTgSecurity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned security level of this TG."

      ::= { appnLocalTgEntry 12 }

appnLocalTgDelay OBJECT-TYPE
      SYNTAX AppnTgDelay
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned delay associated with this TG."
      ::= { appnLocalTgEntry 13 }

Now the three user-defined characteristics, usr1 through usr3 ✨ These are whatever the admin decides they are, so they're basically a little sticky-note space for each TG πŸŽ€

appnLocalTgUsr1 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "First user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalTgEntry 14 }

appnLocalTgUsr2 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Second user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalTgEntry 15 }

appnLocalTgUsr3 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Third user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalTgEntry 16 }

HPR support is the ladder of levels, and each rung adds more πŸͺœπŸ¦‹ The enum values are noHprSupport(1), hprBaseOnly(2), rtpTower(3), and controlFlowsOverRtpTower(4). The option set numbers in the description are part of the spec too, so they stay exactly as they are.

appnLocalTgHprSup OBJECT-TYPE
      SYNTAX INTEGER {
                 noHprSupport(1),
                 hprBaseOnly(2),
                 rtpTower(3),
                 controlFlowsOverRtpTower(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates the level of high performance routing (HPR) support
          over this TG :

             noHprSupport(1)             - no HPR support
             hprBaseOnly(2)              - HPR base (option set 1400)
                                           supported
             rtpTower(3)                 - HPR base and RTP tower
                                           (option set 1401) supported
             controlFlowsOverRtpTower(4) - HPR base, RTP tower, and
                                           control flows over RTP
                                           (option set 1402) supported"

      ::= { appnLocalTgEntry 17 }

Intersubnet and multi-link are both TruthValue flags πŸ™Œ The multi-link one has a fun twist: a TG that was brought up as multi-link still counts as multi-link even when only one link is active right now. Once it's multi-link, it stays multi-link in the report ✨

appnLocalTgIntersubnet OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is an intersubnet TG,
          which defines a border between subnetworks."

      ::= { appnLocalTgEntry 18 }

appnLocalTgMltgLinkType OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object indicates whether the transmission group is a
          multi-link TG.  A TG that has been brought up as a multi-link
          TG is reported as one, even if it currently has only one link
          active."

      ::= { appnLocalTgEntry 19 }

Last one in this entry is the branch link type, and it's a whole family tree 🌳 It can be other, uplink, downlink, downlinkToBranchNetworkNode, none, or unknown. Be careful with the details here, because other is specifically what gets used for a connection network TG owned by a branch network node πŸ’€

appnLocalTgBranchLinkType OBJECT-TYPE
      SYNTAX INTEGER {
                     other(1),
                     uplink(2),
                     downlink(3),
                     downlinkToBranchNetworkNode(4),
                     none(5),
                     unknown(255)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Branch link type of this TG:
             other(1)             = the agent has determined the TG's
                                    branch link type to be a value other
                                    than branch uplink or branch
                                    downlink.  This is the value used
                                    for a connection network TG owned by
                                    a branch network node.
             uplink(2)            = the TG is a branch uplink.
             downlink(3)          = the TG is a branch downlink to an
                                    end node.
             downlinkToBranchNetworkNode(4) = the TG is a branch
                                    downlink to a cascaded branch
                                    network node.
             none(5)              = the TG is not a branch TG.
             unknown(255)         = the agent cannot determine the
                                    branch link type of the TG."

      ::= { appnLocalTgEntry 20 }

Now we're moving on to the end node TG table 🧚 This one tracks every TG owned by the end nodes this node knows about through TG registration. It's not this node's own view of the TG for the partner, and the destination can be a virtual routing node, a network node, or an end node. It's giving "who's in my contacts" energy πŸ“±

-- APPN Local End Node Transmission Group (TG) table
-- This table describes the TGs associated with all of the end nodes
-- known to this node.

appnLocalEnTgTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnLocalEnTgEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table describing all of the TGs owned by the end nodes known
          to this node via TG registration.  This node does not represent
          its own view of the TG on behalf of the partner node in this
          table.  The TG destination can be a virtual routing node,
          network node, or end node."

      ::= { appnLocalTopology 2 }

appnLocalEnTgEntry OBJECT-TYPE
      SYNTAX AppnLocalEnTgEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table requires multiple indexes to uniquely identify each
          TG.  They are originating CPname, destination CPname, and the
          TG number."

      INDEX
             {appnLocalEnTgOrigin,
              appnLocalEnTgDest,
              appnLocalEnTgNum}

      ::= { appnLocalEnTgTable 1 }

AppnLocalEnTgEntry ::= SEQUENCE {
      appnLocalEnTgOrigin        SnaControlPointName,
      appnLocalEnTgDest          SnaControlPointName,
      appnLocalEnTgNum           INTEGER,
      appnLocalEnTgEntryTimeLeft AppnTopologyEntryTimeLeft,

      appnLocalEnTgDestVirtual   TruthValue,
      appnLocalEnTgDlcData       AppnTgDlcData,

      appnLocalEnTgOperational   TruthValue,
      appnLocalEnTgCpCpSession   INTEGER,
      appnLocalEnTgEffCap        AppnTgEffectiveCapacity,
      appnLocalEnTgConnCost      INTEGER,
      appnLocalEnTgByteCost      INTEGER,
      appnLocalEnTgSecurity      AppnTgSecurity,
      appnLocalEnTgDelay         AppnTgDelay,
      appnLocalEnTgUsr1          INTEGER,
      appnLocalEnTgUsr2          INTEGER,
      appnLocalEnTgUsr3          INTEGER,
      appnLocalEnTgMltgLinkType  TruthValue
                     }

appnLocalEnTgOrigin OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name of the origin node for this
          TG.  This is a fully qualified network name."

      ::= { appnLocalEnTgEntry 1 }

appnLocalEnTgDest OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name of the destination node for
          this TG.  This is the fully qualified name of a network node,
          end node, LEN node, or virtual routing node."

      ::= { appnLocalEnTgEntry 2 }

appnLocalEnTgNum OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Number associated with this transmission group."

      ::= { appnLocalEnTgEntry 3 }

appnLocalEnTgEntryTimeLeft OBJECT-TYPE
      SYNTAX AppnTopologyEntryTimeLeft
      UNITS "days"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of days before deletion of this end node TG entry."

      ::= { appnLocalEnTgEntry 4 }

appnLocalEnTgDestVirtual OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the destination node is a virtual routing
          node."

      ::= { appnLocalEnTgEntry 5 }

appnLocalEnTgDlcData OBJECT-TYPE
      SYNTAX AppnTgDlcData
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "DLC-specific data related to a link connection network."

      ::= { appnLocalEnTgEntry 6 }

appnLocalEnTgOperational OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether the transmission group is operational."

      ::= { appnLocalEnTgEntry 7 }

appnLocalEnTgCpCpSession OBJECT-TYPE
      SYNTAX INTEGER {
                     supportedUnknownStatus(1),
                     supportedActive(2),
                     notSupported(3),
                     supportedNotActive(4)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether CP-CP sessions are supported on this TG, and
          whether the TG owner's contention-winner session is active on
          this TG.  Some nodes in the network are not able to
          differentiate support and status of CP-CP sessions, and thus
          may report the 'supportedUnknownStatus' value."

      ::= { appnLocalEnTgEntry 8 }

appnLocalEnTgEffCap OBJECT-TYPE
      SYNTAX AppnTgEffectiveCapacity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Effective capacity for this TG."

      ::= { appnLocalEnTgEntry 9 }

okay so we're still in the TG attribute era πŸ’… these next few are all read-only and all just the admin's call, which is giving "the network's secret sauce is set by a human" 🧚

appnLocalEnTgConnCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Cost per connect time:  a value representing the relative cost
          per unit of time to use the TG.  Range is from 0, which means
          no cost, to 255."

      ::= { appnLocalEnTgEntry 10 }

appnLocalEnTgByteCost OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Relative cost of transmitting a byte over this link.
          Range is from 0, which means no cost, to 255."

      ::= { appnLocalEnTgEntry 11 }

appnLocalEnTgSecurity OBJECT-TYPE
      SYNTAX AppnTgSecurity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned security level of this TG."

      ::= { appnLocalEnTgEntry 12 }

appnLocalEnTgDelay OBJECT-TYPE
      SYNTAX AppnTgDelay
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
            "Administratively assigned delay associated with this TG."

      ::= { appnLocalEnTgEntry 13 }

appnLocalEnTgUsr1 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "First user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalEnTgEntry 14 }

appnLocalEnTgUsr2 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Second user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalEnTgEntry 15 }

appnLocalEnTgUsr3 OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Third user-defined TG characteristic for this TG.  This is
          an administratively assigned value associated with the TG."

      ::= { appnLocalEnTgEntry 16 }

appnLocalEnTgMltgLinkType OBJECT-TYPE
      SYNTAX TruthValue
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "This object indicates whether the transmission group is a
          multi-link TG.  A TG that has been brought up as a multi-link
          TG is reported as one, even if it currently has only one link
          active."

      ::= { appnLocalEnTgEntry 17 }

ngl the multi-link bit is kind of iconic πŸ¦‹ once a TG comes up as multi-link it keeps getting reported that way, even if only one link is still active. it's giving "once you're in the group chat, you stay in the group chat" πŸ’œ

now we get to the directory group, which is where the nodes keep their little black books of who's where πŸ“’βœ¨

-- ************** The APPN Directory Group *****************************
appnDir               OBJECT IDENTIFIER ::= { appnObjects 4 }
appnDirPerf  OBJECT IDENTIFIER ::= { appnDir 1 }

-- The APPN Directory Group

-- The APPN Directory Database

-- Each APPN network node and branch network node maintains directories
-- containing information on which LUs (applications) are available and
-- where they are located.  LUs can be located in an APPN network node,
-- in any of its attached end nodes or branch network nodes, or in any
-- of the nodes below one of its attached branch network nodes.

appnDirMaxCaches OBJECT-TYPE
      SYNTAX Unsigned32
      UNITS "directory entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum number of cache entries allowed.  This is an
          administratively assigned value."

      ::= { appnDirPerf 1 }

appnDirCurCaches OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "directory entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current number of cache entries."

      ::= { appnDirPerf 2 }

appnDirCurHomeEntries OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "directory entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current number of home entries."

      ::= { appnDirPerf 3 }

appnDirRegEntries OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "directory entries"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current number of registered entries."

      ::= { appnDirPerf 4 }

appnDirInLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of directed Locates received since the node was last
          reinitialized."

      ::= { appnDirPerf 5 }

appnDirInBcastLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of broadcast Locates received since the node was last
          reinitialized."

      ::= { appnDirPerf 6 }

appnDirOutLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of directed Locates sent since the node was last
          reinitialized."

      ::= { appnDirPerf 7 }

appnDirOutBcastLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of broadcast Locates sent since the node was last
          reinitialized."

      ::= { appnDirPerf 8 }

appnDirNotFoundLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of directed Locates returned with a 'not found' since
          the node was last reinitialized."

      ::= { appnDirPerf 9 }

appnDirNotFoundBcastLocates OBJECT-TYPE
      SYNTAX AppnNodeCounter
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Number of broadcast Locates returned with a 'not found' since
          the node was last reinitialized."

      ::= { appnDirPerf 10 }

appnDirLocateOutstands OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "Locate messages"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Current number of outstanding Locates, both directed and
          broadcast.  This value varies.  A value of zero indicates
          that no Locates are unanswered."

      ::= { appnDirPerf 11 }

the directory is basically a big "who's where" list for LUs, and the nodes look up each other's entries for every app that wants to find a buddy 🫢 the counters up there are just the vibe check for how the lookups are going: locates in, locates out, the "not found" ones that left everyone on read πŸ’€


okay the directory table is the main event, one row per LU, and it's indexed by the LU name so you can look someone up by their name like a proper bestie πŸŽ€

--APPN Directory table

-- This table contains information about all known LUs.

appnDirTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnDirEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table containing information about all known LUs."

      ::= { appnDir 2 }

appnDirEntry OBJECT-TYPE
      SYNTAX AppnDirEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the LU name."

      INDEX
             {appnDirLuName}

      ::= { appnDirTable 1 }

AppnDirEntry ::= SEQUENCE {
      appnDirLuName                   DisplayString,
      appnDirNnServerName             SnaControlPointName,
      appnDirLuOwnerName              SnaControlPointName,
      appnDirLuLocation               INTEGER,
      appnDirType                     INTEGER,
      appnDirApparentLuOwnerName      DisplayString
                     }
appnDirLuName OBJECT-TYPE
      SYNTAX DisplayString  (SIZE (1..17))
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Fully qualified network LU name in the domain of the
           serving network node.  Entries take one of three forms:

              - Explicit entries do not contain the character '*'.
              - Partial wildcard entries have the form 'ccc*', where
                'ccc' represents one to sixteen characters in a
                legal SNA LuName.
              - A full wildcard entry consists of the single
                character '*'"

      ::= { appnDirEntry 1 }

appnDirNnServerName OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Fully qualified control point (CP) name of the network node
          server.  For unassociated end node entries, a zero-length
          string is returned."

      ::= { appnDirEntry 2 }

appnDirLuOwnerName OBJECT-TYPE
      SYNTAX SnaControlPointName
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Fully qualified CP name of the node at which the LU is
          located.  This name is the same as the serving NN name when
          the LU is located at a network node.  It is also the same as
          the fully qualified LU name when this is the control point
          LU for this node."

      ::= { appnDirEntry 3 }

appnDirLuLocation OBJECT-TYPE
      SYNTAX INTEGER {
                     local(1),     --Local
                     domain(2),    --Domain
                     xdomain(3)    --Cross Domain

                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Specifies the location of the LU with respect to the local
          node."

      ::= { appnDirEntry 4 }

appnDirType OBJECT-TYPE
      SYNTAX INTEGER {
                     home(1),      --defined as home entry
                     cache(2),     --learned over time
                     registered(3) --registered by end node
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Directory types are:
            1 - Home
                  The LU is in the domain of the local node, and the LU
                  information has been configured at the local node.

            2 - Cache
                  The LU has previously been located by a broadcast
                  search, and the location information has been saved.

            3 - Registered
                  The LU is at an end node that is in the domain
                  of the local network node.  Registered entries
                  are registered by the served end node."

      ::= { appnDirEntry 5 }

appnDirApparentLuOwnerName OBJECT-TYPE
      SYNTAX DisplayString (SIZE (0 | 3..17))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Fully qualified CP name of the node at which the LU appears to
          be located.  This object and the appnDirLuOwnerName object are
          related as follows:

          Implementations that support this object save in their
          directory database information about an LU's owning control
          point that was communicated in two control vectors:

               -  an Associated Resource Entry (X'3C') CV with resource
                  type X'00F4' (ENCP)

               -  a Real Owning Control Point (X'4A') CV.

          The X'4A' CV is created by a branch network node to preserve
          the name of the real owning control point for an LU below the
          branch network node, before it overwrites this name with its
          own name in the X'3C' CV.  The X'4A' CV is not present for LUs
          that are not below branch network nodes.

          If the information a node has about an LU's owning CP came only
          in a X'3C' CV, then the name from the X'3C' is returned in the
          appnDirLuOwnerName object, and a null string is returned in
          this object.

          If the information a node has about an LU's owning CP came in
          both X'3C' and X'4A' CVs, then the name from the X'4A' is
          returned in the appnDirLuOwnerName object, and the name from
          the X'3C' (which will be the branch network node's name) is
          returned in this object."

      ::= { appnDirEntry 6 }

the apparent owner one is lowkey the plot twist of this whole table πŸ™ˆ the LU's real owner and the name it appears to live under can be two different things, and the X'3C' and X'4A' control vectors are how the story gets sorted out. main character energy for sure πŸ‘‘


and now we're moving on to the Class of Service group, which is all about how routes get ranked for quality and how urgent your traffic is πŸ”₯

-- ************** The APPN Class of Service Group **********************

appnCos               OBJECT IDENTIFIER ::= { appnObjects 5 }
-- The APPN Class of Service (COS)

-- Class of Service is a means of expressing the quality of routes and
-- the transmission priority of traffic that flows on these routes.
-- The quality of routes is specified by two tables, a COS weight table
-- for TGs and a COS weight table for nodes.  Values in these COS tables
-- are administratively assigned at each APPN node, with seven default
-- tables specified by the APPN architecture.

ok so COS is basically the VIP list of the network. it's how routes get graded on quality and how much priority your traffic gets, with two weight tables (one for TGs, one for nodes) that the admin fills in. the seven default tables come from the APPN architecture, so you don't have to start from scratch 🌈✨

okay bestie, the Class of Service tables are about to get very detailed πŸ’…βœ¨ every mode name, priority, and weight lives right here πŸŽ€

-- *********************************************************************

appnCosModeTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnCosModeEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table representing all of the defined mode names for this
          node.  The table contains the matching COS name for each
          mode name."

      ::= { appnCos 1 }

appnCosModeEntry OBJECT-TYPE
      SYNTAX AppnCosModeEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table is indexed by the mode name."

      INDEX
             {appnCosModeName}

      ::= { appnCosModeTable 1 }

AppnCosModeEntry ::= SEQUENCE {
      appnCosModeName     SnaModeName,
      appnCosModeCosName  SnaClassOfServiceName
                     }

appnCosModeName OBJECT-TYPE
      SYNTAX SnaModeName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for this mode."

      ::= { appnCosModeEntry 1 }

appnCosModeCosName OBJECT-TYPE

      SYNTAX SnaClassOfServiceName
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Administratively assigned name for this class of service."

      ::= { appnCosModeEntry 2 }


-- *********************************************************************
appnCosNameTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnCosNameEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table mapping all of the defined class-of-service names for
          this node to their network transmission priorities."

      ::= { appnCos 2 }

appnCosNameEntry OBJECT-TYPE
      SYNTAX AppnCosNameEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The COS name is the index to this table."

      INDEX
             {appnCosName}

      ::= { appnCosNameTable 1 }

AppnCosNameEntry ::= SEQUENCE {
      appnCosName            SnaClassOfServiceName,
      appnCosTransPriority   INTEGER
                     }


appnCosName OBJECT-TYPE
      SYNTAX SnaClassOfServiceName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for this class of service."

      ::= { appnCosNameEntry 1 }

appnCosTransPriority OBJECT-TYPE

      SYNTAX INTEGER {
                     low(1),               --X'01'
                     medium(2),            --X'02'
                     high(3),              --X'03'
                     network(4)            --X'04'
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Transmission priority for this class of service:

              low(1)     - (X'01'):  low priority
              medium(2)  - (X'02'):  medium priority
              high(3)    - (X'03'):  high priority
              network(4) - (X'04'):  network priority"

      ::= { appnCosNameEntry 2 }


-- *********************************************************************
appnCosNodeRowTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnCosNodeRowEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "This table contains all node-row information for all classes
          of service defined in this node."

      ::= { appnCos 3 }

appnCosNodeRowEntry OBJECT-TYPE
      SYNTAX AppnCosNodeRowEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "A node entry for a given class of service."

      INDEX
             {appnCosNodeRowName,
              appnCosNodeRowIndex}

      ::= { appnCosNodeRowTable 1 }

AppnCosNodeRowEntry ::= SEQUENCE {
      appnCosNodeRowName                 SnaClassOfServiceName,
      appnCosNodeRowIndex                INTEGER,
      appnCosNodeRowWgt                  DisplayString,
      appnCosNodeRowResistMin            INTEGER,
      appnCosNodeRowResistMax            INTEGER,
      appnCosNodeRowMinCongestAllow      INTEGER,
      appnCosNodeRowMaxCongestAllow      INTEGER
                     }

appnCosNodeRowName OBJECT-TYPE
      SYNTAX SnaClassOfServiceName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for this class of service."

      ::= { appnCosNodeRowEntry 1 }

appnCosNodeRowIndex OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Subindex under appnCosNodeRowName, corresponding to a row in
          the node table for the class of service identified in
          appnCosNodeRowName.

          For each class of service, this subindex orders rows in the
          appnCosNodeRowTable in the same order as that used for route
          calculation in the APPN node."

      ::= { appnCosNodeRowEntry 2 }

appnCosNodeRowWgt OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..64))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Weight to be associated with the nodes that fit the criteria
          specified by this node row.

          This value can either be a character representation of an
          integer, or a formula for calculating the weight."

      ::= { appnCosNodeRowEntry 3 }

appnCosNodeRowResistMin OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum route addition resistance value for this node.

          Range of values is 0-255.  The lower the value, the more
          desirable the node is for intermediate routing."

      ::= { appnCosNodeRowEntry 4 }

appnCosNodeRowResistMax OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum route addition resistance value for this node.
          Range of values is 0-255.  The lower the value, the more
          desirable the node is for intermediate routing."

      ::= { appnCosNodeRowEntry 5 }

appnCosNodeRowMinCongestAllow OBJECT-TYPE
      SYNTAX INTEGER (0..1)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether low congestion will be tolerated.  This
          object and appnCosNodeRowMaxCongestAllow together delineate a
          range of acceptable congestion states for a node.  For the
          ordered pair (minimum congestion allowed, maximum congestion
          allowed), the values are interpreted as follows:

           - (0,0):  only low congestion is acceptable
           - (0,1):  either low or high congestion is acceptable
           - (1,1):  only high congestion is acceptable.

          Note that the combination (1,0) is not defined, since it
          would identify a range whose lower bound was high congestion
          and whose upper bound was low congestion."


      ::= { appnCosNodeRowEntry 6 }

appnCosNodeRowMaxCongestAllow OBJECT-TYPE
      SYNTAX INTEGER (0..1)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether low congestion will be tolerated.  This
          object and appnCosNodeRowMinCongestAllow together delineate a
          range of acceptable congestion states for a node.  For the
          ordered pair (minimum congestion allowed, maximum congestion
          allowed), the values are interpreted as follows:

           - (0,0):  only low congestion is acceptable
           - (0,1):  either low or high congestion is acceptable
           - (1,1):  only high congestion is acceptable.

          Note that the combination (1,0) is not defined, since it
          would identify a range whose lower bound was high congestion
          and whose upper bound was low congestion."

      ::= { appnCosNodeRowEntry 7 }


-- *********************************************************************
appnCosTgRowTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnCosTgRowEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Table containing all the TG-row information for all classes of
          service defined in this node."

      ::= { appnCos 4 }

appnCosTgRowEntry OBJECT-TYPE
      SYNTAX AppnCosTgRowEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "A TG entry for a given class of service."

      INDEX
             {appnCosTgRowName,
              appnCosTgRowIndex}

      ::= { appnCosTgRowTable 1 }

AppnCosTgRowEntry ::= SEQUENCE {
      appnCosTgRowName                  SnaClassOfServiceName,
      appnCosTgRowIndex                 INTEGER,
      appnCosTgRowWgt                   DisplayString,
      appnCosTgRowEffCapMin             AppnTgEffectiveCapacity,
      appnCosTgRowEffCapMax             AppnTgEffectiveCapacity,
      appnCosTgRowConnCostMin           INTEGER,
      appnCosTgRowConnCostMax           INTEGER,
      appnCosTgRowByteCostMin           INTEGER,
      appnCosTgRowByteCostMax           INTEGER,
      appnCosTgRowSecurityMin           AppnTgSecurity,
      appnCosTgRowSecurityMax           AppnTgSecurity,
      appnCosTgRowDelayMin              AppnTgDelay,
      appnCosTgRowDelayMax              AppnTgDelay,
      appnCosTgRowUsr1Min               INTEGER,
      appnCosTgRowUsr1Max               INTEGER,
      appnCosTgRowUsr2Min               INTEGER,
      appnCosTgRowUsr2Max               INTEGER,
      appnCosTgRowUsr3Min               INTEGER,
      appnCosTgRowUsr3Max               INTEGER
                     }

appnCosTgRowName OBJECT-TYPE
      SYNTAX SnaClassOfServiceName
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Administratively assigned name for this class of service."

      ::= { appnCosTgRowEntry 1 }

appnCosTgRowIndex OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Subindex under appnCosTgRowName, corresponding to a row in the
          TG table for the class of service identified in
          appnCosTgRowName.

          For each class of service, this subindex orders rows in the
          appnCosTgRowTable in the same order as that used for route
          calculation in the APPN node."

      ::= { appnCosTgRowEntry 2 }

appnCosTgRowWgt OBJECT-TYPE
      SYNTAX DisplayString (SIZE (1..64))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Weight to be associated with the TGs that fit the criteria
          specified by this TG row.

          This value can either be a character representation of an
          integer, or a formula for calculating the weight."

      ::= { appnCosTgRowEntry 3 }

appnCosTgRowEffCapMin OBJECT-TYPE
      SYNTAX AppnTgEffectiveCapacity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable capacity for this class of service."

      ::= { appnCosTgRowEntry 4 }

appnCosTgRowEffCapMax OBJECT-TYPE
      SYNTAX AppnTgEffectiveCapacity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable capacity for this class of service."

      ::= { appnCosTgRowEntry 5 }

appnCosTgRowConnCostMin OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable cost per connect time for this class of
          service.

          Cost per connect time:  a value representing the relative
          cost per unit of time to use this TG.  Range is from 0, which
          means no cost, to 255."

      ::= { appnCosTgRowEntry 6 }

appnCosTgRowConnCostMax OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable cost per connect time for this class of
          service.

          Cost per connect time:  a value representing the relative
          cost per unit of time to use this TG.  Range is from 0, which
          means no cost, to 255."

      ::= { appnCosTgRowEntry 7 }

Okay bestie, the Min and Max pairs are basically the lower and upper bounds for each class of service. ✨ Here's the next batch of TG row objects πŸ’…

appnCosTgRowByteCostMin OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable cost per byte transmitted for this class
          of service.

          Cost per byte transmitted:  a value representing the relative
          cost per unit of time to use this TG.  Range is from 0, which
          means no cost, to 255."

      ::= { appnCosTgRowEntry 8 }

appnCosTgRowByteCostMax OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable cost per byte transmitted for this class
          of service.

          Cost per byte transmitted:  a value representing the relative
          cost of transmitting a byte over this TG.  Range is from 0,
          which means no cost, to 255."

      ::= { appnCosTgRowEntry 9 }

appnCosTgRowSecurityMin OBJECT-TYPE
      SYNTAX AppnTgSecurity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable security for this class of service."

      ::= { appnCosTgRowEntry 10 }

appnCosTgRowSecurityMax OBJECT-TYPE
      SYNTAX AppnTgSecurity
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable security for this class of service."

      ::= { appnCosTgRowEntry 11 }

appnCosTgRowDelayMin OBJECT-TYPE
      SYNTAX AppnTgDelay
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable propagation delay for this class of
          service."

      ::= { appnCosTgRowEntry 12 }

appnCosTgRowDelayMax OBJECT-TYPE
      SYNTAX AppnTgDelay
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable propagation delay for this class of
          service."

      ::= { appnCosTgRowEntry 13 }

appnCosTgRowUsr1Min OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 14 }

appnCosTgRowUsr1Max OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 15 }

appnCosTgRowUsr2Min OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 16 }

appnCosTgRowUsr2Max OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 17 }

appnCosTgRowUsr3Min OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Minimum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 18 }

appnCosTgRowUsr3Max OBJECT-TYPE
      SYNTAX INTEGER (0..255)
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Maximum acceptable value for this user-defined
          characteristic."

      ::= { appnCosTgRowEntry 19 }

Now we're entering the intermediate session info era πŸ¦‹ This is where the node keeps track of sessions that pass through it, not ones that start or end on it.

-- *********************************************************************
-- Intermediate Session Information
-- *********************************************************************
appnSessIntermediate  OBJECT IDENTIFIER ::= { appnObjects 6 }

-- *********************************************************************
-- Intermediate Session Information Global Objects
-- *********************************************************************
-- The following simple objects allow the collection of intermediate
-- session Information to be started and stopped.
-- *********************************************************************
appnIsInGlobal OBJECT IDENTIFIER ::= { appnSessIntermediate 1 }

appnIsInGlobeCtrAdminStatus OBJECT-TYPE
      SYNTAX INTEGER {
                      notActive(1),
                      active(2),
                      ready(3)
                     }
      MAX-ACCESS read-write
      STATUS current
      DESCRIPTION

          "Object by which a Management Station can deactivate or
          activate capture of intermediate-session counts and names, by
          setting the value to notActive(1) or active(2), respectively.
          The value ready(3) is returned on GET operations until a SET
          has been processed; after that the value received on the most
          recent SET is returned.

          The counts referred to here are the eight objects in the
          AppnIsInTable, from appnIsInP2SFmdPius through
          appnIsInS2PNonFmdBytes.  The names are the four objects in this
          table, from appnIsInPriLuName through appnIsInCosName.

          Setting this object to the following values has the following
          effects:

              notActive(1)  stop collecting count data.  If a count
                            is queried, it returns the value 0.
                            Collection of names may, but need not be,
                            disabled.
              active(2)     start collecting count data.  If it is
                            supported, collection of names is enabled."

      ::= { appnIsInGlobal 1 }

appnIsInGlobeCtrOperStatus OBJECT-TYPE
      SYNTAX INTEGER {
                      notActive(1),
                      active(2)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "Indicates whether or not the intermediate session counts
          are active.  The counts referred to here are the eight
          objects in the AppnIsInTable, from appnIsInP2SFmdPius through
          appnIsInS2PNonFmdBytes.  These eight counts are of type
          Unsigned32 rather than Counter32 because when this object
          enters the notActive state, either because a Management
          Station has set appnInInGlobeCtrAdminStatus to notActive or
          because of a locally-initiated transition, the counts are
          all reset to 0.

          The values for this object are:

              notActive(1):  collection of counts is not active; if it
                             is queried, a count returns the value 0.
              active(2):     collection of counts is active."

      ::= { appnIsInGlobal 2 }

appnIsInGlobeCtrStatusTime OBJECT-TYPE
      SYNTAX TimeTicks
      UNITS "hundredths of a second"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The time since the appnIsInGlobeCtrOperStatus object last
          changed, measured in hundredths of a second.  This time can be
          used to identify when this change occurred in relation to other
          events in the agent, such as the last time the APPN node was
          reinitialized."

      ::= { appnIsInGlobal 3 }

appnIsInGlobeRscv OBJECT-TYPE
      SYNTAX INTEGER {
                      notActive(1),
                      active(2)
                     }
      MAX-ACCESS read-write
      STATUS current
      DESCRIPTION
          "Indicates the current route selection control vector (RSCV)
          collection option in effect, and allows a Management Station to
          change the option.

          The values for this object are:

             notActive(1): collection of route selection control vectors
                           is not active.
             active(2):    collection of route selection control vectors
                           is active."

      ::= { appnIsInGlobal 4 }

appnIsInGlobeRscvTime OBJECT-TYPE
      SYNTAX TimeTicks
      UNITS "hundredths of a second"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The time since the appnIsInGlobeRscv object last changed,
          measured in hundredths of a second.  This time can be used to
          identify when this change occurred in relation to other events
          in the agent, such as the last time the APPN node was
          reinitialized."

      ::= { appnIsInGlobal 5 }

appnIsInGlobeActSess OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "sessions"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of currently active intermediate sessions."

      ::= { appnIsInGlobal 6 }

appnIsInGlobeHprBfActSess OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "sessions"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of currently active HPR intermediate sessions."

      ::= { appnIsInGlobal 7 }

Next up is the table itself 🌸 It's got one row per active intermediate session, and the row is identified by the index pair below.

-- *********************************************************************
-- Intermediate Session Information Table
-- *********************************************************************
-- This table contains information on intermediate sessions
-- which are currently active.
-- *********************************************************************
appnIsInTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnIsInEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Intermediate Session Information Table"

      ::= { appnSessIntermediate 2 }

appnIsInEntry OBJECT-TYPE
      SYNTAX AppnIsInEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Entry of Intermediate Session Information Table."

      INDEX
             { appnIsInFqCpName,
               appnIsInPcid }

      ::= { appnIsInTable 1 }

AppnIsInEntry ::= SEQUENCE {
      appnIsInFqCpName            SnaControlPointName,
      appnIsInPcid                OCTET STRING,

      appnIsInSessState           INTEGER,
      appnIsInPriLuName           DisplayString,
      appnIsInSecLuName           DisplayString,
      appnIsInModeName            SnaModeName,
      appnIsInCosName             SnaClassOfServiceName,
      appnIsInTransPriority       INTEGER,

      appnIsInSessType            INTEGER,
      appnIsInSessUpTime          TimeTicks,
      appnIsInCtrUpTime           TimeTicks,

      appnIsInP2SFmdPius          Unsigned32,
      appnIsInS2PFmdPius          Unsigned32,
      appnIsInP2SNonFmdPius       Unsigned32,
      appnIsInS2PNonFmdPius       Unsigned32,
      appnIsInP2SFmdBytes         Unsigned32,
      appnIsInS2PFmdBytes         Unsigned32,
      appnIsInP2SNonFmdBytes      Unsigned32,
      appnIsInS2PNonFmdBytes      Unsigned32,

      appnIsInPsAdjCpName         SnaControlPointName,
      appnIsInPsAdjTgNum          INTEGER,
      appnIsInPsSendMaxBtuSize    INTEGER,
      appnIsInPsSendPacingType    INTEGER,
      appnIsInPsSendRpc           Gauge32,
      appnIsInPsSendNxWndwSize    Gauge32,
      appnIsInPsRecvPacingType    INTEGER,
      appnIsInPsRecvRpc           Gauge32,
      appnIsInPsRecvNxWndwSize    Gauge32,
      appnIsInSsAdjCpName         SnaControlPointName,
      appnIsInSsAdjTgNum          INTEGER,
      appnIsInSsSendMaxBtuSize    INTEGER,
      appnIsInSsSendPacingType    INTEGER,
      appnIsInSsSendRpc           Gauge32,
      appnIsInSsSendNxWndwSize    Gauge32,
      appnIsInSsRecvPacingType    INTEGER,
      appnIsInSsRecvRpc           Gauge32,
      appnIsInSsRecvNxWndwSize    Gauge32,

      appnIsInRouteInfo           OCTET STRING,

      appnIsInRtpNceId            OCTET STRING,
      appnIsInRtpTcid             OCTET STRING
                     }

appnIsInFqCpName OBJECT-TYPE SYNTAX SnaControlPointName MAX-ACCESS not-accessible STATUS current DESCRIPTION "The network-qualified control point name of the node at which the session and PCID originated. For APPN and LEN nodes, this is either CP name of the APPN node at which the origin LU is located or the CP name of the NN serving the LEN node at which the origin LU is located. For resources served by a dependent LU requester (DLUR), it is the name of the owning system services control point (SSCP)."

::= { appnIsInEntry 1 }

appnIsInPcid OBJECT-TYPE SYNTAX OCTET STRING (SIZE (8)) MAX-ACCESS not-accessible STATUS current DESCRIPTION "The procedure correlation identifier (PCID) of a session. It is an 8-byte value assigned by the primary LU."

::= { appnIsInEntry 2 }

appnIsInSessState OBJECT-TYPE SYNTAX INTEGER { inactive(1), pendactive(2), active(3), pendinact(4) } MAX-ACCESS read-write STATUS current DESCRIPTION "Indicates the state of the session:

inactive(1) - session is inactive pendactive(2) - session is pending active active(3) - session is active pendinact(4) - session is pending inactive

Active sessions can be deactivated by setting this object to inactive(1)."

::= { appnIsInEntry 3 }

appnIsInPriLuName OBJECT-TYPE SYNTAX DisplayString (SIZE (0..17)) MAX-ACCESS read-only STATUS current DESCRIPTION "The primary LU name of the session. A zero-length string indicates that this name is not available."

::= { appnIsInEntry 4 }

appnIsInSecLuName OBJECT-TYPE SYNTAX DisplayString (SIZE (0..17)) MAX-ACCESS read-only STATUS current DESCRIPTION "The secondary LU name of the session. A zero-length string indicates that this name is not available."

::= { appnIsInEntry 5 }

appnIsInModeName OBJECT-TYPE SYNTAX SnaModeName MAX-ACCESS read-only STATUS current DESCRIPTION "The mode name used for this session."

::= { appnIsInEntry 6 }

appnIsInCosName OBJECT-TYPE SYNTAX SnaClassOfServiceName MAX-ACCESS read-only STATUS current DESCRIPTION "The Class of Service (COS) name used for this session."

::= { appnIsInEntry 7 }

appnIsInTransPriority OBJECT-TYPE SYNTAX INTEGER { low(1), --X'01' medium(2), --X'02' high(3), --X'03' network(4) --X'04' } MAX-ACCESS read-only STATUS current DESCRIPTION "Transmission priority for this class of service. Values are:

low(1) - (X'01'): low priority medium(2) - (X'02'): medium priority high(3) - (X'03'): high priority network(4) - (X'04'): network priority"

::= { appnIsInEntry 8 }

appnIsInSessType OBJECT-TYPE SYNTAX INTEGER { unknown(1), lu62(2), lu0thru3(3), lu62dlur(4), lu0thru3dlur(5) } MAX-ACCESS read-only STATUS current DESCRIPTION "The type of intermediate session. Defined values are

unknown The session type is not known.

lu62 A session between LUs of type 6.2 (as indicated by the LU type in Bind)

lu0thru3 A session between LUs of type 0, 1, 2, or 3 (as indicated by the LU type in Bind)

lu62dlur A session between LUs of type 6.2 (as indicated by the LU type in Bind). One of the LUs is a dependent LU supported by the dependent LU requester (DLUR) function at this node.

lu0thru3dlur A session between LUs of type 0, 1, 2, or 3 (as indicated by the LU type in Bind) One of the LUs is a dependent LU supported by the dependent LU requester (DLUR) function at this node."

::= { appnIsInEntry 9 }

appnIsInSessUpTime OBJECT-TYPE SYNTAX TimeTicks UNITS "hundredths of a second" MAX-ACCESS read-only STATUS current DESCRIPTION "Length of time the session has been active, measured in hundredths of a second."

::= { appnIsInEntry 10 }

appnIsInCtrUpTime OBJECT-TYPE SYNTAX TimeTicks UNITS "hundredths of a second" MAX-ACCESS read-only STATUS current DESCRIPTION "Length of time the session counters have been active, measured in hundredths of a second."

::= { appnIsInEntry 11 }

appnIsInP2SFmdPius OBJECT-TYPE SYNTAX Unsigned32 UNITS "path information units (PIUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of function management data (FMD) path information units (PIUs) sent from the Primary LU to the Secondary LU since the counts were last activated."

::= { appnIsInEntry 12 }

appnIsInS2PFmdPius OBJECT-TYPE SYNTAX Unsigned32 UNITS "path information units (PIUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of FMD PIUs sent from the Secondary LU to the Primary LU since the counts were last activated."

::= { appnIsInEntry 13 }

appnIsInP2SNonFmdPius OBJECT-TYPE SYNTAX Unsigned32 UNITS "path information units (PIUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of non-FMD PIUs sent from the Primary LU to the Secondary LU since the counts were last activated."

::= { appnIsInEntry 14 }

appnIsInS2PNonFmdPius OBJECT-TYPE SYNTAX Unsigned32 UNITS "path information units (PIUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of non-FMD PIUs sent from the Secondary LU to the Primary LU since the counts were last activated."

::= { appnIsInEntry 15 }

appnIsInP2SFmdBytes OBJECT-TYPE SYNTAX Unsigned32 UNITS "bytes" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of FMD bytes sent from the Primary LU to the Secondary LU since the counts were last activated."

::= { appnIsInEntry 16 }

appnIsInS2PFmdBytes OBJECT-TYPE SYNTAX Unsigned32 UNITS "bytes" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of FMD bytes sent from the Secondary LU to the Primary LU since the counts were last activated."

::= { appnIsInEntry 17 }

appnIsInP2SNonFmdBytes OBJECT-TYPE SYNTAX Unsigned32 UNITS "bytes" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of non-FMD bytes sent from the Primary LU to the Secondary LU since the counts were last activated."

::= { appnIsInEntry 18 }

appnIsInS2PNonFmdBytes OBJECT-TYPE SYNTAX Unsigned32 UNITS "bytes" MAX-ACCESS read-only STATUS current DESCRIPTION "Number of non-FMD bytes sent from the Secondary LU to the Primary LU since the counts were last activated."

::= { appnIsInEntry 19 }

appnIsInPsAdjCpName OBJECT-TYPE SYNTAX SnaControlPointName MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage adjacent CP name of this session. If the session stage traverses an RTP connection, the CP name of the remote RTP endpoint is returned."

::= { appnIsInEntry 20 }

appnIsInPsAdjTgNum OBJECT-TYPE SYNTAX INTEGER (0..300) MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage adjacent transmission group (TG) number associated with this session. If the session stage traverses an RTP connection, the value 256 is returned.

Values between 257 and 300 are available for other possible TG 'stand-ins' that may be added to APPN in the future."

::= { appnIsInEntry 21 }

appnIsInPsSendMaxBtuSize OBJECT-TYPE SYNTAX INTEGER (99..32767) UNITS "bytes" MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage maximum basic transmission unit (BTU) size for sending data."

::= { appnIsInEntry 22 }

appnIsInPsSendPacingType OBJECT-TYPE SYNTAX INTEGER { fixed(1), adaptive(2) } MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage type of pacing being used for sending data."

::= { appnIsInEntry 23 }

appnIsInPsSendRpc OBJECT-TYPE SYNTAX Gauge32 UNITS "message units (MUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage send residual pace count. This represents the primary stage number of message units (MUs) that can still be sent in the current session window."

::= { appnIsInEntry 24 }

appnIsInPsSendNxWndwSize OBJECT-TYPE SYNTAX Gauge32 UNITS "message units (MUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage size of the next window which will be used to send data."

::= { appnIsInEntry 25 }

appnIsInPsRecvPacingType OBJECT-TYPE SYNTAX INTEGER { fixed(1), adaptive(2) } MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage type of pacing being used for receiving data."

::= { appnIsInEntry 26 }

appnIsInPsRecvRpc OBJECT-TYPE SYNTAX Gauge32 UNITS "message units (MUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage receive residual pace count. This represents the primary stage number of message units (MUs) that can still be received in the current session window."

::= { appnIsInEntry 27 }

appnIsInPsRecvNxWndwSize OBJECT-TYPE SYNTAX Gauge32 UNITS "message units (MUs)" MAX-ACCESS read-only STATUS current DESCRIPTION "The primary stage size of the next window which will be used to receive data."

::= { appnIsInEntry 28 }

appnIsInSsAdjCpName OBJECT-TYPE SYNTAX SnaControlPointName MAX-ACCESS read-only STATUS current DESCRIPTION "The secondary stage adjacent CP name of this session. If the session stage traverses an RTP connection, the CP name of the remote RTP endpoint is returned."

::= { appnIsInEntry 29 }

appnIsInSsAdjTgNum OBJECT-TYPE SYNTAX INTEGER (0..300) MAX-ACCESS read-only STATUS current DESCRIPTION "The secondary stage adjacent transmission group (TG) number associated with this session. If the session stage traverses an RTP connection, the value 256 is returned.

Values between 257 and 300 are available for other possible TG 'stand-ins' that may be added to APPN in the future."

::= { appnIsInEntry 30 }

okay so the secondary stage gets its own set of send and receive knobs, and I'm obsessed 🫢

appnIsInSsSendMaxBtuSize OBJECT-TYPE
      SYNTAX INTEGER (99..32767)
      UNITS "bytes"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage maximum basic transmission unit (BTU) size
          for sending data."

      ::= { appnIsInEntry 31 }

appnIsInSsSendPacingType OBJECT-TYPE
      SYNTAX INTEGER {
                     fixed(1),
                     adaptive(2)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage type of pacing being used for sending
          data."

      ::= { appnIsInEntry 32 }

appnIsInSsSendRpc OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "message units (MUs)"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage send residual pace count.  This represents
          the secondary stage number of message units (MUs) that can
          still be sent in the current session window."

      ::= { appnIsInEntry 33 }

appnIsInSsSendNxWndwSize OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "message units (MUs)"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage size of the next window which will be used
          to send data."

      ::= { appnIsInEntry 34 }

appnIsInSsRecvPacingType OBJECT-TYPE

      SYNTAX INTEGER {
                     fixed(1),
                     adaptive(2)
                     }
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage type of pacing being used for receiving
          data."

      ::= { appnIsInEntry 35 }

appnIsInSsRecvRpc OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "message units (MUs)"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage receive residual pace count.  This
          represents the secondary stage number of message units (MUs)
          that can still be received in the current session window."

      ::= { appnIsInEntry 36 }

appnIsInSsRecvNxWndwSize OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "message units (MUs)"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The secondary stage size of the next window which will be used
          to receive data."

      ::= { appnIsInEntry 37 }

appnIsInRouteInfo OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (0..255))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The route selection control vector (RSCV X'2B') used for this
          session.  It is present for APPN nodes; but is not present for
          LEN nodes.  The format of this vector is described in SNA
          Formats.  If no RSCV is available, a zero-length string is
          returned."

      ::= { appnIsInEntry 38 }

appnIsInRtpNceId OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (1..8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The HPR local Network Connection Endpoint of the session."

      ::= { appnIsInEntry 39 }

appnIsInRtpTcid OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (8))
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The RTP connection local TCID of the session."

      ::= { appnIsInEntry 40 }

-- *********************************************************************
-- Intermediate Session RTP Table
-- *********************************************************************
-- This table contains information on intermediate sessions that are
-- being transported on Rapid Transport Protocol (RTP) connections by
-- High Performance Routing (HPR).
-- *********************************************************************
appnIsRtpTable OBJECT-TYPE
      SYNTAX SEQUENCE OF AppnIsRtpEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "A table indicating how many ISR sessions are transported by
          each RTP connection."

      ::= { appnSessIntermediate 3 }

appnIsRtpEntry OBJECT-TYPE
      SYNTAX AppnIsRtpEntry
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "Entry of Intermediate Session RTP Table."

      INDEX
             { appnIsRtpNceId,
               appnIsRtpTcid }

      ::= { appnIsRtpTable 1 }

AppnIsRtpEntry ::= SEQUENCE {
      appnIsRtpNceId              OCTET STRING,
      appnIsRtpTcid               OCTET STRING,
      appnIsRtpSessions           Gauge32
                     }

appnIsRtpNceId OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (1..8))
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The local Network Connection Endpoint of the RTP connection."

      ::= { appnIsRtpEntry  1 }

appnIsRtpTcid OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (8))
      MAX-ACCESS not-accessible
      STATUS current
      DESCRIPTION
          "The local TCID of the RTP connection."

      ::= { appnIsRtpEntry  2 }

appnIsRtpSessions OBJECT-TYPE
      SYNTAX Gauge32
      UNITS "sessions"
      MAX-ACCESS read-only
      STATUS current
      DESCRIPTION
          "The number of intermediate sessions using this RTP
          connection."

      ::= { appnIsRtpEntry  3 }


-- *********************************************************************
  appnTraps               OBJECT IDENTIFIER ::= { appnMIB 2 }
-- *********************************************************************

alertTrap NOTIFICATION-TYPE
      OBJECTS  { alertIdNumber, affectedObject }
      STATUS current
      DESCRIPTION
          "This trap carries a 32-bit SNA Management Services (SNA/MS)
          Alert ID Number, as specified in SNA/MS Formats."

      ::= { appnTraps 1 }

alertIdNumber OBJECT-TYPE
      SYNTAX OCTET STRING (SIZE (4))
      MAX-ACCESS accessible-for-notify
      STATUS current
      DESCRIPTION
          "A 32-bit SNA Management Services (SNA/MS) Alert ID Number, as
          specified in SNA/MS Formats."

      ::= { appnTraps 2 }

affectedObject OBJECT-TYPE
      SYNTAX VariablePointer
      MAX-ACCESS accessible-for-notify
      STATUS current
      DESCRIPTION
          "The MIB object associated with the Alert condition, if there
          is an object associated with it.  If no associated object can
          be identified, the value 0.0 is passed in the trap."

      ::= { appnTraps 3 }

-- *********************************************************************
-- Conformance information
-- *********************************************************************

appnConformance       OBJECT IDENTIFIER ::= { appnMIB 3 }

appnCompliances       OBJECT IDENTIFIER ::= { appnConformance 1 }
appnGroups            OBJECT IDENTIFIER ::= { appnConformance 2 }

-- Compliance statements

-- appnCompliance  MODULE-COMPLIANCE (deprecated:  moved to end of module)

appnCompliance2  MODULE-COMPLIANCE
        STATUS  current
        DESCRIPTION
            "The compliance statement for the SNMPv2 entities that
            implement the APPN MIB.

            In the descriptions for the conditionally mandatory groups that
            follow, the branch network node is treated as a third node type,
            parallel to network node and end node.  This is not how branch
            network nodes are treated in the base APPN architecture, but it
            increases clarity here to do it."
        MODULE  -- this module

--      Unconditionally mandatory groups

                MANDATORY-GROUPS  {
                        appnGeneralConfGroup2,
                        appnPortConfGroup,
                        appnLinkConfGroup2,
                        appnLocalTgConfGroup2,
                        appnDirTableConfGroup2
                 }

--      Conditionally mandatory groups
                GROUP  appnNnUniqueConfGroup
                DESCRIPTION
                    "The appnNnUniqueConfGroup is mandatory for
                    network nodes."

                GROUP  appnEnUniqueConfGroup
                DESCRIPTION
                    "The appnEnUniqueConfGroup is mandatory for end
                    nodes."

                GROUP  appnVrnConfGroup
                DESCRIPTION
                    "The appnVrnConfGroup is mandatory for network
                    nodes, end nodes, and branch network nodes that
                    implement virtual routing node support."

                GROUP  appnNnTopoConfGroup2
                DESCRIPTION
                    "The appnNnTopoConfGroup2 is mandatory for
                    network nodes."

                GROUP  appnLocalEnTopoConfGroup2
                DESCRIPTION
                    "The appnLocalEnTopoConfGroup2 is mandatory for
                    network nodes."

                GROUP  appnLocalDirPerfConfGroup
                DESCRIPTION
                    "The appnLocalDirPerfConfGroup is mandatory for
                    APPN network nodes, end nodes, and branch network
                    nodes."

                GROUP  appnCosConfGroup
                DESCRIPTION
                    "The appnCosConfGroup is mandatory for APPN
                    network nodes, end nodes, and branch network
                    nodes."

                GROUP  appnIntSessConfGroup
                DESCRIPTION
                    "The appnIntSessConfGroup is mandatory for
                    network nodes and branch network nodes."

                GROUP  appnHprBaseConfGroup
                DESCRIPTION
                    "The appnHprBaseConfGroup is mandatory for nodes
                    that implement the HPR base (APPN option set 1400)."
                GROUP  appnHprRtpConfGroup
                DESCRIPTION
                    "The appnHprRtpConfGroup is mandatory for nodes
                    that implement the HPR RTP tower (APPN option set
                    1401)."

                GROUP  appnHprCtrlFlowsRtpConfGroup
                DESCRIPTION
                    "The appnHprCtrlFlowsRtpConfGroup is mandatory for
                    nodes that implement the HPR Control Flows over
                    RTP tower (APPN option set 1402)."

                GROUP  appnHprBfConfGroup
                DESCRIPTION
                    "The appnHprBfConfGroup is mandatory for nodes
                    that implement the APPN/HPR boundary function."

                GROUP  appnTrapConfGroup
                DESCRIPTION
                    "Traps are optional for all nodes."

                GROUP  appnTrapNotifGroup
                DESCRIPTION
                    "Traps are optional for all nodes."

                GROUP  appnBrNnConfGroup
                DESCRIPTION
                    "The appnBrNnConfGroup is mandatory for branch
                    network nodes."

        ::= { appnCompliances 3 }
         -- { appnCompliances 2 } is used by the APPN-TRAP-MIB

-- Units of conformance
appnGeneralConfGroup2  OBJECT-GROUP
        OBJECTS  {
                 appnNodeCpName,
                 appnNodeId,
                 appnNodeType,
                 appnNodeUpTime,
                 appnNodeParallelTg,
                 appnNodeAdaptiveBindPacing,
                 appnNodeHprSupport,
                 appnNodeCounterDisconTime,
                 appnNodeLsCounterType,
                 appnNodeBrNn

                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN general information and capabilities."
        ::= { appnGroups 26 }
         -- { appnGroups 21 - 25 } are used by the APPN-TRAP-MIB

Okay so this part is all about the object groups πŸ’– Each one is a bundle of APPN objects that belong together, like a little friend group πŸŽ€

appnPortConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnPortCommand,
                 appnPortOperState,
                 appnPortDlcType,
                 appnPortPortType,
                 appnPortSIMRIM,
                 appnPortLsRole,
                 appnPortNegotLs,
                 appnPortDynamicLinkSupport,
                 appnPortMaxRcvBtuSize,
                 appnPortMaxIframeWindow,
                 appnPortDefLsGoodXids,
                 appnPortDefLsBadXids,
                 appnPortDynLsGoodXids,
                 appnPortDynLsBadXids,
                 appnPortSpecific,
                 appnPortDlcLocalAddr,
                 appnPortCounterDisconTime
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN port information."
        ::= { appnGroups 2 }

appnLinkConfGroup2  OBJECT-GROUP
        OBJECTS  {
                 appnLsCommand,
                 appnLsOperState,
                 appnLsPortName,
                 appnLsDlcType,
                 appnLsDynamic,
                 appnLsAdjCpName,
                 appnLsAdjNodeType,
                 appnLsTgNum,
                 appnLsLimResource,
                 appnLsActOnDemand,
                 appnLsMigration,
                 appnLsPartnerNodeId,
                 appnLsCpCpSessionSupport,
                 appnLsMaxSendBtuSize,
                 appnLsInXidBytes,
                 appnLsInMsgBytes,
                 appnLsInXidFrames,
                 appnLsInMsgFrames,
                 appnLsOutXidBytes,
                 appnLsOutMsgBytes,
                 appnLsOutXidFrames,
                 appnLsOutMsgFrames,
                 appnLsEchoRsps,
                 appnLsCurrentDelay,
                 appnLsMaxDelay,
                 appnLsMinDelay,
                 appnLsMaxDelayTime,
                 appnLsGoodXids,
                 appnLsBadXids,
                 appnLsSpecific,
                 appnLsActiveTime,
                 appnLsCurrentStateTime,
                 appnLsHprSup,
                 appnLsLocalAddr,
                 appnLsRemoteAddr,
                 appnLsRemoteLsName,
                 appnLsStatusTime,
                 appnLsStatusLsName,
                 appnLsStatusCpName,
                 appnLsStatusPartnerId,
                 appnLsStatusTgNum,
                 appnLsStatusGeneralSense,
                 appnLsStatusRetry,
                 appnLsStatusEndSense,
                 appnLsStatusXidLocalSense,
                 appnLsStatusXidRemoteSense,
                 appnLsStatusXidByteInError,
                 appnLsStatusXidBitInError,
                 appnLsStatusDlcType,
                 appnLsStatusLocalAddr,
                 appnLsStatusRemoteAddr,
                 appnLsCounterDisconTime,
                 appnLsMltgMember
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN link information."
        ::= { appnGroups 27 }

appnLocalTgConfGroup2  OBJECT-GROUP
        OBJECTS  {
                 appnLocalTgDestVirtual,
                 appnLocalTgDlcData,
                 appnLocalTgPortName,
                 appnLocalTgQuiescing,
                 appnLocalTgOperational,
                 appnLocalTgCpCpSession,
                 appnLocalTgEffCap,
                 appnLocalTgConnCost,
                 appnLocalTgByteCost,
                 appnLocalTgSecurity,
                 appnLocalTgDelay,
                 appnLocalTgUsr1,
                 appnLocalTgUsr2,
                 appnLocalTgUsr3,
                 appnLocalTgHprSup,
                 appnLocalTgIntersubnet,
                 appnLocalTgMltgLinkType
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN local TG information."
        ::= { appnGroups 28 }

appnDirTableConfGroup2  OBJECT-GROUP
        OBJECTS  {
                 appnDirNnServerName,
                 appnDirLuOwnerName,
                 appnDirLuLocation,
                 appnDirType,
                 appnDirApparentLuOwnerName
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation of the
            APPN directory database."
        ::= { appnGroups 29 }

appnNnUniqueConfGroup  OBJECT-GROUP

        OBJECTS  {
                 appnNodeNnCentralDirectory,
                 appnNodeNnTreeCache,
                 appnNodeNnRouteAddResist,
                 appnNodeNnIsr,
                 appnNodeNnFrsn,
                 appnNodeNnPeriBorderSup,
                 appnNodeNnInterchangeSup,
                 appnNodeNnExteBorderSup,
                 appnNodeNnSafeStoreFreq,
                 appnNodeNnRsn,
                 appnNodeNnCongested,
                 appnNodeNnIsrDepleted,
                 appnNodeNnQuiescing,
                 appnNodeNnGateway
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing instrumentation unique
            to APPN network nodes."
        ::= { appnGroups 6 }

appnEnUniqueConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnNodeEnModeCosMap,
                 appnNodeEnNnServer,
                 appnNodeEnLuSearch
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing instrumentation for
            APPN end nodes.  Some of these objects also appear in the
            instrumentation for a branch network node."
        ::= { appnGroups 7 }

appnVrnConfGroup       OBJECT-GROUP
        OBJECTS  {
                 appnVrnPortName
                 }
        STATUS  current
        DESCRIPTION
            "An object providing the instrumentation for virtual
            routing node support in an APPN node."
        ::= { appnGroups 8 }

appnNnTopoConfGroup2    OBJECT-GROUP
        OBJECTS  {
                 appnNnTopoMaxNodes,
                 appnNnTopoCurNumNodes,
                 appnNnTopoNodePurges,
                 appnNnTopoTgPurges,
                 appnNnTopoTotalTduWars,
                 appnNnNodeFREntryTimeLeft,
                 appnNnNodeFRType,
                 appnNnNodeFRRsn,
                 appnNnNodeFRRouteAddResist,
                 appnNnNodeFRCongested,
                 appnNnNodeFRIsrDepleted,
                 appnNnNodeFRQuiescing,
                 appnNnNodeFRGateway,
                 appnNnNodeFRCentralDirectory,
                 appnNnNodeFRIsr,
                 appnNnNodeFRGarbageCollect,
                 appnNnNodeFRHprSupport,
                 appnNnNodeFRPeriBorderSup,
                 appnNnNodeFRInterchangeSup,
                 appnNnNodeFRExteBorderSup,
                 appnNnNodeFRBranchAwareness,
                 appnNnTgFREntryTimeLeft,
                 appnNnTgFRDestVirtual,
                 appnNnTgFRDlcData,
                 appnNnTgFRRsn,
                 appnNnTgFROperational,
                 appnNnTgFRQuiescing,
                 appnNnTgFRCpCpSession,
                 appnNnTgFREffCap,
                 appnNnTgFRConnCost,
                 appnNnTgFRByteCost,
                 appnNnTgFRSecurity,
                 appnNnTgFRDelay,
                 appnNnTgFRUsr1,
                 appnNnTgFRUsr2,
                 appnNnTgFRUsr3,
                 appnNnTgFRGarbageCollect,
                 appnNnTgFRSubareaNum,
                 appnNnTgFRHprSup,
                 appnNnTgFRDestHprTrans,
                 appnNnTgFRTypeIndicator,
                 appnNnTgFRIntersubnet,
                 appnNnTgFRMltgLinkType,
                 appnNnTgFRBranchTg
                 }
        STATUS  current
        DESCRIPTION
            "The appnNnTopoConfGroup is mandatory only for network
            nodes."

        ::= { appnGroups 30 }

appnLocalEnTopoConfGroup2   OBJECT-GROUP
        OBJECTS  {
                 appnLocalEnTgEntryTimeLeft,
                 appnLocalEnTgDestVirtual,
                 appnLocalEnTgDlcData,
                 appnLocalEnTgOperational,
                 appnLocalEnTgCpCpSession,
                 appnLocalEnTgEffCap,
                 appnLocalEnTgConnCost,
                 appnLocalEnTgByteCost,
                 appnLocalEnTgSecurity,
                 appnLocalEnTgDelay,
                 appnLocalEnTgUsr1,
                 appnLocalEnTgUsr2,
                 appnLocalEnTgUsr3,
                 appnLocalEnTgMltgLinkType
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing the instrumentation
            of the information that a network node possesses about
            the end nodes directly attached to it."
        ::= { appnGroups 31 }

okay the directory perf stats are up first, and then the COS, the internal session stuff, and the HPR bits 🫢

appnLocalDirPerfConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnDirMaxCaches,
                 appnDirCurCaches,
                 appnDirCurHomeEntries,
                 appnDirRegEntries,
                 appnDirInLocates,
                 appnDirInBcastLocates,
                 appnDirOutLocates,
                 appnDirOutBcastLocates,
                 appnDirNotFoundLocates,
                 appnDirNotFoundBcastLocates,
                 appnDirLocateOutstands
                 }
        STATUS  current
        DESCRIPTION
            "The appnLocalDirPerfConfGroup is mandatory only for APPN
            network nodes and end nodes."
        ::= { appnGroups 11 }

appnCosConfGroup          OBJECT-GROUP
        OBJECTS  {

                 appnCosModeCosName,
                 appnCosTransPriority,
                 appnCosNodeRowWgt,
                 appnCosNodeRowResistMin,
                 appnCosNodeRowResistMax,
                 appnCosNodeRowMinCongestAllow,
                 appnCosNodeRowMaxCongestAllow,
                 appnCosTgRowWgt,
                 appnCosTgRowEffCapMin,
                 appnCosTgRowEffCapMax,
                 appnCosTgRowConnCostMin,
                 appnCosTgRowConnCostMax,
                 appnCosTgRowByteCostMin,
                 appnCosTgRowByteCostMax,
                 appnCosTgRowSecurityMin,
                 appnCosTgRowSecurityMax,
                 appnCosTgRowDelayMin,
                 appnCosTgRowDelayMax,
                 appnCosTgRowUsr1Min,
                 appnCosTgRowUsr1Max,
                 appnCosTgRowUsr2Min,
                 appnCosTgRowUsr2Max,
                 appnCosTgRowUsr3Min,
                 appnCosTgRowUsr3Max
                 }
        STATUS  current
        DESCRIPTION
            "The appnCosConfGroup is mandatory only for APPN network
            nodes and end nodes."
        ::= { appnGroups 12 }

appnIntSessConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnIsInGlobeCtrAdminStatus,
                 appnIsInGlobeCtrOperStatus,
                 appnIsInGlobeCtrStatusTime,
                 appnIsInGlobeRscv,
                 appnIsInGlobeRscvTime,
                 appnIsInGlobeActSess,
                 appnIsInSessState,
                 appnIsInPriLuName,
                 appnIsInSecLuName,
                 appnIsInModeName,
                 appnIsInCosName,
                 appnIsInTransPriority,
                 appnIsInSessType,
                 appnIsInSessUpTime,
                 appnIsInCtrUpTime,
                 appnIsInP2SFmdPius,
                 appnIsInS2PFmdPius,
                 appnIsInP2SNonFmdPius,
                 appnIsInS2PNonFmdPius,
                 appnIsInP2SFmdBytes,
                 appnIsInS2PFmdBytes,
                 appnIsInP2SNonFmdBytes,
                 appnIsInS2PNonFmdBytes,
                 appnIsInPsAdjCpName,
                 appnIsInPsAdjTgNum,
                 appnIsInPsSendMaxBtuSize,
                 appnIsInPsSendPacingType,
                 appnIsInPsSendRpc,
                 appnIsInPsSendNxWndwSize,
                 appnIsInPsRecvPacingType,
                 appnIsInPsRecvRpc,
                 appnIsInPsRecvNxWndwSize,
                 appnIsInSsAdjCpName,
                 appnIsInSsAdjTgNum,
                 appnIsInSsSendMaxBtuSize,
                 appnIsInSsSendPacingType,
                 appnIsInSsSendRpc,
                 appnIsInSsSendNxWndwSize,
                 appnIsInSsRecvPacingType,
                 appnIsInSsRecvRpc,
                 appnIsInSsRecvNxWndwSize,
                 appnIsInRouteInfo
                 }
        STATUS  current
        DESCRIPTION
            "The appnIntSessConfGroup is mandatory only for network
            nodes."
        ::= { appnGroups 13 }

appnHprBaseConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnNodeHprIntRteSetups,
                 appnNodeHprIntRteRejects,
                 appnLsErrRecoSup,
                 appnLsForAnrLabel,
                 appnLsRevAnrLabel
                 }
        STATUS  current
        DESCRIPTION
            "The appnHprBaseConfGroup is mandatory only for nodes that
            implement the HPR base (APPN option set 1400)."
        ::= { appnGroups 14 }

appnHprRtpConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnNodeMaxSessPerRtpConn,
                 appnNodeHprOrgRteSetups,
                 appnNodeHprOrgRteRejects,
                 appnNodeHprEndRteSetups,
                 appnNodeHprEndRteRejects,
                 appnLsBfNceId
                 }
        STATUS  current
        DESCRIPTION
            "The appnHprRtpConfGroup is mandatory only for nodes that
            implement the HPR RTP tower (APPN option set 1401)."
        ::= { appnGroups 15 }

appnHprCtrlFlowsRtpConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnLsCpCpNceId,
                 appnLsRouteNceId
                 }
        STATUS  current
        DESCRIPTION
            "The appnHprCtrlFlowsRtpConfGroup is mandatory only for nodes
            that implement the HPR Control Flows over RTP tower (APPN
            option set 1402)."
        ::= { appnGroups 16 }

appnHprBfConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnIsInGlobeHprBfActSess,
                 appnIsInRtpNceId,
                 appnIsInRtpTcid,
                 appnIsRtpSessions
                 }
        STATUS  current
        DESCRIPTION
            "The appnHprBfConfGroup is mandatory only for nodes that
            implement the APPN/HPR boundary function."
        ::= { appnGroups 17 }

the trap groups are next, and they're optional for everyone, so no pressure πŸ¦‹

appnTrapConfGroup    OBJECT-GROUP
        OBJECTS  {
                 alertIdNumber,
                 affectedObject
                 }
        STATUS  current
        DESCRIPTION
            "The appnTrapConfGroup is optional for all APPN nodes.  Nodes
            implementing this group shall also implement the
            appnTrapNotifGroup."
        ::= { appnGroups 18 }

appnTrapNotifGroup    NOTIFICATION-GROUP
        NOTIFICATIONS {
                      alertTrap
                      }
        STATUS  current
        DESCRIPTION
            "The appnTrapNotifGroup is optional for all APPN nodes.
            Nodes implementing this group shall also implement the
            appnTrapConfGroup."
        ::= { appnGroups 19 }

appnBrNnConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnNodeEnNnServer,
                 appnNodeEnLuSearch,
                 appnLocalTgBranchLinkType
                 }
        STATUS  current
        DESCRIPTION
            "A collection of objects providing instrumentation for
            branch network nodes.  Some of these objects also appear
            in the instrumentation for an end node.

            Note:  A branch network node always returns endNode(2)
            as the value of the appnNodeType object from the
            appnGeneralConfGroup2 conformance group."
        ::= { appnGroups 20 }


-- *********************************************************************
-- Deprecated definitions
-- *********************************************************************

appnNodeMibVersion OBJECT-TYPE
      SYNTAX DisplayString  (SIZE (11))
      MAX-ACCESS read-only
      STATUS deprecated
      DESCRIPTION
          "The value of LAST-UPDATED from this module's MODULE-IDENTITY
          macro.  This object gives a Management Station an easy way of
          determining the level of the MIB supported by an agent.

          Since this object incorporates the Year 2000-unfriendly
          2-digit year specified in SMI for the LAST-UPDATED field, and
          since it was not found to be particularly useful, it has been
          deprecated.  No replacement object has been defined."

      ::= { appnGeneralInfoAndCaps 2 }

heads up, the compliance statement is next, and it's deprecated but still very much part of the spec πŸŽ€

appnCompliance  MODULE-COMPLIANCE
        STATUS  deprecated
        DESCRIPTION
            "The compliance statement for the SNMPv2 entities that
            implement the APPN MIB.

            This is the compliance statement for the RFC 2155-level version
            of the APPN MIB.  It was deprecated as new objects were added
            to the MIB for MLTG, branch network node, and other extensions
            to the APPN architecture."
        MODULE  -- this module

--      Unconditionally mandatory groups
                MANDATORY-GROUPS  {
                        appnGeneralConfGroup,
                        appnPortConfGroup,
                        appnLinkConfGroup,
                        appnLocalTgConfGroup,
                        appnDirTableConfGroup
                 }

--      Conditionally mandatory groups
                GROUP  appnNnUniqueConfGroup
                DESCRIPTION
                    "The appnNnUniqueConfGroup is mandatory only for
                    network nodes."

                GROUP  appnEnUniqueConfGroup
                DESCRIPTION
                    "The appnEnUniqueConfGroup is mandatory only for end
                    nodes."

                GROUP  appnVrnConfGroup
                DESCRIPTION
                    "The appnVrnConfGroup is mandatory only for network
                    nodes and end nodes that implement virtual routing
                    node support."

                GROUP  appnNnTopoConfGroup
                DESCRIPTION
                    "The appnNnTopoConfGroup is mandatory only for
                    network nodes."

                GROUP  appnLocalEnTopoConfGroup
                DESCRIPTION
                    "The appnLocalEnTopoConfGroup is mandatory only for
                    network nodes."

                GROUP  appnLocalDirPerfConfGroup
                DESCRIPTION
                    "The appnLocalDirPerfConfGroup is mandatory only for
                    APPN network nodes and end nodes."

                GROUP  appnCosConfGroup
                DESCRIPTION
                    "The appnCosConfGroup is mandatory only for APPN
                    network nodes and end nodes."

                GROUP  appnIntSessConfGroup
                DESCRIPTION
                    "The appnIntSessConfGroup is mandatory only for
                    network nodes."

                GROUP  appnHprBaseConfGroup
                DESCRIPTION
                    "The appnHprBaseConfGroup is mandatory only for nodes
                    that implement the HPR base (APPN option set 1400)."

                GROUP  appnHprRtpConfGroup
                DESCRIPTION
                    "The appnHprRtpConfGroup is mandatory only for nodes
                    that implement the HPR RTP tower (APPN option set
                    1401)."
                GROUP  appnHprCtrlFlowsRtpConfGroup
                DESCRIPTION
                    "The appnHprCtrlFlowsRtpConfGroup is mandatory only
                    for nodes that implement the HPR Control Flows over
                    RTP tower (APPN option set 1402)."

                GROUP  appnHprBfConfGroup
                DESCRIPTION
                    "The appnHprBfConfGroup is mandatory only for nodes
                    that implement the APPN/HPR boundary function."

                GROUP  appnTrapConfGroup
                DESCRIPTION
                    "Traps are optional for all nodes."

                GROUP  appnTrapNotifGroup
                DESCRIPTION
                    "Traps are optional for all nodes."

        ::= { appnCompliances 1 }
appnGeneralConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnNodeCpName,
                 appnNodeMibVersion,
                 appnNodeId,
                 appnNodeType,
                 appnNodeUpTime,
                 appnNodeParallelTg,
                 appnNodeAdaptiveBindPacing,
                 appnNodeHprSupport,
                 appnNodeCounterDisconTime
                 }
        STATUS  deprecated
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN general information and capabilities.

            This RFC 2155-level group was deprecated when the
            appnNodeMibVersion object was removed and the
            appnNodeLsCounterType and appnNodeBrNn objects were added."
        ::= { appnGroups 1 }

appnLinkConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnLsCommand,
                 appnLsOperState,
                 appnLsPortName,
                 appnLsDlcType,
                 appnLsDynamic,
                 appnLsAdjCpName,
                 appnLsAdjNodeType,
                 appnLsTgNum,
                 appnLsLimResource,
                 appnLsActOnDemand,
                 appnLsMigration,
                 appnLsPartnerNodeId,
                 appnLsCpCpSessionSupport,
                 appnLsMaxSendBtuSize,
                 appnLsInXidBytes,
                 appnLsInMsgBytes,
                 appnLsInXidFrames,
                 appnLsInMsgFrames,
                 appnLsOutXidBytes,
                 appnLsOutMsgBytes,
                 appnLsOutXidFrames,
                 appnLsOutMsgFrames,
                 appnLsEchoRsps,
                 appnLsCurrentDelay,
                 appnLsMaxDelay,
                 appnLsMinDelay,
                 appnLsMaxDelayTime,
                 appnLsGoodXids,
                 appnLsBadXids,
                 appnLsSpecific,
                 appnLsActiveTime,
                 appnLsCurrentStateTime,
                 appnLsHprSup,
                 appnLsLocalAddr,
                 appnLsRemoteAddr,
                 appnLsRemoteLsName,
                 appnLsStatusTime,
                 appnLsStatusLsName,
                 appnLsStatusCpName,
                 appnLsStatusPartnerId,
                 appnLsStatusTgNum,
                 appnLsStatusGeneralSense,
                 appnLsStatusRetry,
                 appnLsStatusEndSense,
                 appnLsStatusXidLocalSense,
                 appnLsStatusXidRemoteSense,
                 appnLsStatusXidByteInError,
                 appnLsStatusXidBitInError,
                 appnLsStatusDlcType,
                 appnLsStatusLocalAddr,
                 appnLsStatusRemoteAddr,
                 appnLsCounterDisconTime
                 }
        STATUS  deprecated
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN link information.

            This RFC 2155-level group was deprecated when the
            appnLsMltgMember object was added."

        ::= { appnGroups 3 }

appnLocalTgConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnLocalTgDestVirtual,
                 appnLocalTgDlcData,
                 appnLocalTgPortName,
                 appnLocalTgQuiescing,
                 appnLocalTgOperational,
                 appnLocalTgCpCpSession,
                 appnLocalTgEffCap,
                 appnLocalTgConnCost,
                 appnLocalTgByteCost,
                 appnLocalTgSecurity,
                 appnLocalTgDelay,
                 appnLocalTgUsr1,
                 appnLocalTgUsr2,
                 appnLocalTgUsr3,
                 appnLocalTgHprSup,
                 appnLocalTgIntersubnet
                 }
        STATUS  deprecated
        DESCRIPTION
            "A collection of objects providing the instrumentation of
            APPN local TG information.

            This RFC 2155-level group was deprecated when the
            appnLocalTgMltgLinkType object was added."

        ::= { appnGroups 4 }

appnDirTableConfGroup  OBJECT-GROUP
        OBJECTS  {
                 appnDirNnServerName,
                 appnDirLuOwnerName,
                 appnDirLuLocation,
                 appnDirType
                 }
        STATUS  deprecated
        DESCRIPTION
            "A collection of objects providing the instrumentation of the
            APPN directory database.

            This RFC 2155-level group was deprecated when the
            appnDirApparentLuOwnerName object was added."

        ::= { appnGroups 5 }

appnNnTopoConfGroup    OBJECT-GROUP
        OBJECTS  {
                 appnNnTopoMaxNodes,
                 appnNnTopoCurNumNodes,
                 appnNnTopoNodePurges,
                 appnNnTopoTgPurges,
                 appnNnTopoTotalTduWars,
                 appnNnNodeFREntryTimeLeft,
                 appnNnNodeFRType,
                 appnNnNodeFRRsn,
                 appnNnNodeFRRouteAddResist,
                 appnNnNodeFRCongested,
                 appnNnNodeFRIsrDepleted,
                 appnNnNodeFRQuiescing,
                 appnNnNodeFRGateway,
                 appnNnNodeFRCentralDirectory,
                 appnNnNodeFRIsr,
                 appnNnNodeFRGarbageCollect,
                 appnNnNodeFRHprSupport,
                 appnNnNodeFRPeriBorderSup,
                 appnNnNodeFRInterchangeSup,
                 appnNnNodeFRExteBorderSup,
                 appnNnTgFREntryTimeLeft,
                 appnNnTgFRDestVirtual,
                 appnNnTgFRDlcData,
                 appnNnTgFRRsn,
                 appnNnTgFROperational,
                 appnNnTgFRQuiescing,
                 appnNnTgFRCpCpSession,
                 appnNnTgFREffCap,
                 appnNnTgFRConnCost,
                 appnNnTgFRByteCost,
                 appnNnTgFRSecurity,
                 appnNnTgFRDelay,
                 appnNnTgFRUsr1,
                 appnNnTgFRUsr2,
                 appnNnTgFRUsr3,
                 appnNnTgFRGarbageCollect,
                 appnNnTgFRSubareaNum,
                 appnNnTgFRHprSup,
                 appnNnTgFRDestHprTrans,
                 appnNnTgFRTypeIndicator,
                 appnNnTgFRIntersubnet
                 }
        STATUS  deprecated
        DESCRIPTION
            "The appnNnTopoConfGroup is mandatory only for network
            nodes.

            This RFC 2155-level group was deprecated when the
            appnNnNodeFRBranchAwareness, appnNnTgFRMltgLinkType, and
            appnNnFRBranchTg objects were added."

        ::= { appnGroups 9 }

appnLocalEnTopoConfGroup   OBJECT-GROUP
        OBJECTS  {

                 appnLocalEnTgEntryTimeLeft,
                 appnLocalEnTgDestVirtual,
                 appnLocalEnTgDlcData,
                 appnLocalEnTgOperational,
                 appnLocalEnTgCpCpSession,
                 appnLocalEnTgEffCap,
                 appnLocalEnTgConnCost,
                 appnLocalEnTgByteCost,
                 appnLocalEnTgSecurity,
                 appnLocalEnTgDelay,
                 appnLocalEnTgUsr1,
                 appnLocalEnTgUsr2,
                 appnLocalEnTgUsr3
                 }
        STATUS  deprecated
        DESCRIPTION
            "The appnLocalEnTopoConfGroup is mandatory only for network
            nodes.

            This RFC 2155-level group was deprecated when the
            appnLocalEnTgMltgLinkType object was added."


        ::= { appnGroups 10 }


END

5. Security Considerations πŸ”

Okay bestie, this section is serious and I need you to take it seriously 😭. Some of the info in this MIB can be sensitive depending on the network, so authentication of received SNMP requests and controlled access to management information SHOULD be set up in those environments. The authentication protocol is defined in [12], and a protocol for access control is defined in [15]. πŸ›‘οΈ

The read-only objects appnNnTgFRSecurity, appnLocalTgSecurity, appnLocalEnTgSecurity, appnCosTgRowSecurityMin, and appnCosTgRowSecurityMax can be used to figure out the potential path of secure data. Even though a management app can't change these through this MIB, they could reveal a security exposure caused by an improper config on the agent. πŸ‘€

None of the other read-only objects in the APPN MIB reports a password, user data, or anything else that's particularly sensitive. πŸ™Œ That said, some enterprises see their network config itself, plus info about network usage and performance, as corporate assets, so they may want to restrict SNMP access to most of the objects in the MIB. πŸ’Ό

Four of the read-write objects in the MIB can affect network operations, so it is recommended that SNMP access to these objects be restricted. 🚨 The four objects are:

  • appnNodeNnSafeStoreFreq: Setting this to 0, or to a very large value, effectively turns off safe storing of topology data. πŸ™…
  • appnPortCommand, appnLsCommand: These two let an APPN port or link station be activated, deactivated, or recycled via an SNMP operation. The latter two operations may disrupt current users of the network. πŸ“΅
  • appnIsInSessState: Setting this to 'inactive' causes an active SNA session to be deactivated. πŸ’₯

Other read-write objects control the gathering of network management data, so controlling access to these is less critical. ✨

6. Intellectual Property πŸ“œ

The IETF takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document, or on whether any license under such rights might or might not be available. It also doesn't represent that it has made any effort to identify any such rights. πŸ€·β€β™€οΈ Info on the IETF's procedures for rights in standards-track and standards-related documentation can be found in BCP-11 [16]. Copies of claims of rights made available for publication, any assurances of licenses to be made available, or the result of an attempt to get a general license or permission for implementers or users to use such proprietary rights, can be obtained from the IETF Secretariat. πŸ“¬

The IETF invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology required to practice this standard. Please send that info to the IETF Executive Director. πŸ’Œ

7. Acknowledgments 🫢

This MIB module is the product of the IETF SNA NAU MIB WG and the AIW APPN/HPR MIBs SIG. Huge thanks to Wayne Clark, Cisco Systems; Jim Cobban, Nortel; Rich Daugherty, IBM Corporation; Mark Regan, Cisco Systems; and Leo Temoshenko, IBM Corporation, for their contributions and review. 🌸

8. References πŸŽ€

okay bestie, this is the reading list πŸ“š every source the spec leans on, all 29 of them, so you can go check the receipts yourself πŸ’…

[1] Harrington, D., Presuhn, R., and B. Wijnen, "An Architecture for Describing SNMP Management Frameworks", RFC 2271, January 1998.

[2] Rose, M., and K. McCloghrie, "Structure and Identification of Management Information for TCP/IP-based Internets", STD 16, RFC 1155, May 1990.

[3] Rose, M., and K. McCloghrie, "Concise MIB Definitions", STD 16, RFC 1212, March 1991.

[4] Rose, M., "A Convention for Defining Traps for use with the SNMP", RFC 1215, March 1991.

[5] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Structure of Management Information for Version 2 of the Simple Network Management Protocol (SNMPv2)", RFC 1902, January 1996.

[6] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Textual Conventions for Version 2 of the Simple Network Management Protocol (SNMPv2)", RFC 1903, January 1996.

[7] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Conformance Statements for Version 2 of the Simple Network Management Protocol (SNMPv2)", RFC 1904, January 1996.

[8] Case, J., Fedor, M., Schoffstall, M., and J. Davin, "Simple Network Management Protocol", STD 15, RFC 1157, May 1990.

[9] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Introduction to Community-based SNMPv2", RFC 1901, January 1996.

[10] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Transport Mappings for Version 2 of the Simple Network Management Protocol (SNMPv2)", RFC 1906, January 1996.

[11] Case, J., Harrington D., Presuhn R., and B. Wijnen, "Message Processing and Dispatching for the Simple Network Management Protocol (SNMP)", RFC 2272, January 1998.

[12] Blumenthal, U., and B. Wijnen, "User-based Security Model (USM) for version 3 of the Simple Network Management Protocol (SNMPv3)", RFC 2274, January 1998.

[13] Case, J., McCloghrie, K., Rose, M., and S. Waldbusser, "Protocol Operations for Version 2 of the Simple Network Management Protocol (SNMPv2)", RFC 1905, January 1996.

[14] Levi, D., Meyer, P., and B. Stewart, "SNMPv3 Applications", RFC 2273, January 1998.

[15] Wijnen, B., Presuhn, R., and K. McCloghrie, "View-based Access Control Model (VACM) for the Simple Network Management Protocol (SNMP)", RFC 2275, January 1998.

[16] Hovey, R., and S. Bradner, "The Organizations Involved in the IETF Standards Process", BCP 11, RFC 2028, October 1996.

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

[18] IBM, Systems Network Architecture Technical Overview, GC30-3073.

[19] IBM, Systems Network Architecture APPN Architecture Reference, SC30-3422

[20] IBM, Systems Network Architecture Formats, SC30-3346.

[21] Allen, M., Clouston, B., Kielczewski, Z., Kwan, W., and B. Moore, "Definition of Managed Objects for APPC", RFC 2051, December 1995.

[22] Kielczewski, Z., Kostick D., and K. Shih, "Definition of Managed Objects for SNA NAUs using SMIv2", RFC 1666, August 1994.

[23] Clouston, B., and B. Moore, "Definitions of Managed Objects for DLUR", RFC 2232, November 1996.

[24] Clouston, B., and B. Moore, "Definitions of Managed Objects for HPR", RFC 2238, November 1996.

[25] SNA DLC Services MIB Working Group, Hilgeman, J., Nix, S., Bartky, A., and W. Clark, "Definitions of Managed Objects for SNA Data Link Control (SDLC) using SMIv2", RFC 1747, January 1995.

[26] SNA DLC Services MIB Working Group, Berl, S., Nix, S., and W. Clark, "Definitions of Managed Objects for SNA Data Link Control: LLC", May 1995.

[27] Chen, D., Gayek, P., and S. Nix, "Definitions of Managed Objects for Data Link Switching using SNMPv2", RFC 2024, October 1995.

[28] IBM, Systems Network Architecture Management Services Formats, GC31-8302.

[29] Clouston, B., and B. Moore, "Definitions of Managed Objects for APPN", RFC 2155, June 1997.


9. Authors' Addresses πŸ’Œ

these are the people who wrote the whole thing, so here's where to find them 🧚

Bob Clouston
Cisco Systems
7025 Kit Creek Road
P.O. Box 14987
Research Triangle Park, NC 27709, USA

Phone: +1 919 472 2333
EMail: clouston@cisco.com


Robert Moore
Dept. BRQA/Bldg. 501/G114
IBM Corporation
P.O.Box 12195
3039 Cornwallis
Research Triangle Park, NC 27709, USA

Phone: +1 919 254 4436
EMail: remoore@us.ibm.com

okay the legal part, but make it cute 🫢 the Internet Society (1998) owns the copyright, and this is the fine print for what you can and can't do with the document.

Copyright (C) The Internet Society (1998). All Rights Reserved.

so you can copy this document and share it with others, and you can write derivative works that comment on it, explain it, or help people implement it. you can do that in whole or in part, with no restriction of any kind, as long as the copyright notice and this paragraph stay on every copy and derivative work πŸ’… but the document itself may not be modified in any way, like removing the copyright notice or the references to the Internet Society or other Internet organizations. the exceptions are when you need it for developing Internet standards, in which case the procedures for copyrights defined in the Internet Standards process must be followed, or when you need to translate it into languages other than English 🌍

these limited permissions are perpetual, and the Internet Society or its successors or assigns will never revoke them πŸ¦‹

and the usual disclaimer, because the Internet Society and the Internet Engineering Task Force want to be clear: this document and the information in it are provided on an "AS IS" basis. THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS 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. πŸ’€

πŸ“¦ where this page comes from