RFC 5833

Control and Provisioning of Wireless Access Points (CAPWAP) Protocol Base MIB

📅 published May 2010, from ietf

RFC 5833: Control and Provisioning of Wireless Access Points (CAPWAP) Protocol Base MIB 🎀

Okay bestie, here's the deal. This RFC is an Informational doc from the IETF, published in May 2010 with ISSN 2070-1721. Y. Shi (Ed.) from Hangzhou H3C Tech. Co., Ltd. wrote it with D. Perkins (Ed.), C. Elliott (Ed.), and Y. Zhang (Ed.) from Fortinet, Inc. The title block doesn't list any RFCs it obsoletes or updates. 💅


Abstract 💖

Okay so this memo defines a piece of the Management Information Base (MIB) for use with network management protocols. Specifically, it describes the managed objects for modeling the Control And Provisioning of Wireless Access Points (CAPWAP) Protocol. This MIB module is presented as a basis for future work on the SNMP management of the CAPWAP protocol. ✨

Status of This Memo 🌸

This document is not an Internet Standards Track specification; it is published for informational purposes. 📚

This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Not all documents approved by the IESG are a candidate for any level of Internet Standard; see Section 2 of RFC 5741.

Info about the current status of this document, any errata, and how to give feedback on it can be found at http://www.rfc-editor.org/info/rfc5833. 🦋

Copyright (c) 2010 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.

Table of Contents 🧚

1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
2.  The Internet-Standard Management Framework . . . . . . . . . .  3
3.  Terminology  . . . . . . . . . . . . . . . . . . . . . . . . .  3
4.  Conventions  . . . . . . . . . . . . . . . . . . . . . . . . .  4
5.  Overview . . . . . . . . . . . . . . . . . . . . . . . . . . .  5
  5.1.  Requirements and Constraints . . . . . . . . . . . . . . .  5
  5.2.  Wireless Binding MIB Modules . . . . . . . . . . . . . . .  5
  5.3.  Design Objectives  . . . . . . . . . . . . . . . . . . . .  5
  5.4.  Design Idea  . . . . . . . . . . . . . . . . . . . . . . .  6
  5.5.  Mechanism of Reusing Wireless Binding MIB Modules  . . . .  6
  5.6.  CAPWAP Protocol Wireless Binding MIB Module  . . . . . . .  7
  5.7.  WTP Profile  . . . . . . . . . . . . . . . . . . . . . . .  7
6.  Structure of the MIB Module  . . . . . . . . . . . . . . . . .  8
7.  Relationship to Other MIB Modules  . . . . . . . . . . . . . .  9
  7.1.  Relationship to SNMPv2-MIB Module  . . . . . . . . . . . .  9
  7.2.  Relationship to IF-MIB Module  . . . . . . . . . . . . . .  9
  7.3.  Relationship to ENTITY-MIB Module  . . . . . . . . . . . . 10
  7.4.  Relationship to Wireless Binding MIB Modules . . . . . . . 10
  7.5.  MIB Modules Required for IMPORTS . . . . . . . . . . . . . 10
8.  Example of CAPWAP-BASE-MIB Module Usage  . . . . . . . . . . . 10
9.  Definitions  . . . . . . . . . . . . . . . . . . . . . . . . . 14
10. Security Considerations  . . . . . . . . . . . . . . . . . . . 69
11. IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 70
  11.1. IANA Considerations for CAPWAP-BASE-MIB Module . . . . . . 70
  11.2. IANA Considerations for ifType . . . . . . . . . . . . . . 70
12. Contributors . . . . . . . . . . . . . . . . . . . . . . . . . 70
13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 71
14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 71
  14.1. Normative References . . . . . . . . . . . . . . . . . . . 71
  14.2. Informative References . . . . . . . . . . . . . . . . . . 72

1. Introduction ✨

The CAPWAP Protocol [RFC5415] is a standard, interoperable protocol that lets an Access Controller (AC) manage a collection of Wireless Termination Points (WTPs). 🫶

This document defines a MIB module that can be used to manage CAPWAP implementations. It covers both the configuration and the WTP status-monitoring side of CAPWAP, and it provides a way to reuse MIB modules for any wireless technology. It is presented as a basis for future work on SNMP management of the CAPWAP protocol. 💜

2. The Internet-Standard Management Framework 🍓

For a detailed overview of the documents that describe the current Internet-Standard Management Framework, check out section 7 of RFC 3410 [RFC3410]. 👀

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

3. Terminology 📖

This document uses terminology from the CAPWAP Protocol specification [RFC5415] and the Architecture Taxonomy for CAPWAP [RFC4118]. 🎀

Access Controller (AC): The network entity that provides WTP access to the network infrastructure in the data plane, control plane, management plane, or a combination therein. 🏢

Wireless Termination Point (WTP): The physical or network entity that contains a radio frequency (RF) antenna and wireless physical layer (PHY) to transmit and receive station traffic for wireless access networks. 📡

Control And Provisioning of Wireless Access Points (CAPWAP): It is a generic protocol defining AC and WTP control and data plane communication via a CAPWAP protocol transport mechanism. CAPWAP control messages, and optionally CAPWAP data messages, are secured using Datagram Transport Layer Security (DTLS) [RFC4347]. 🔐

CAPWAP Control Channel: A bi-directional flow defined by the AC IP Address, WTP IP Address, AC control port, WTP control port, and the transport-layer protocol (UDP or UDP-Lite) over which CAPWAP control packets are sent and received. 🔁

CAPWAP Data Channel: A bi-directional flow defined by the AC IP Address, WTP IP Address, AC data port, WTP data port, and the transport-layer protocol (UDP or UDP-Lite) over which CAPWAP data packets are sent and received. 🔁

Station (STA): A device that contains an interface to a wireless medium (WM). 📱

Split and Local MAC: The CAPWAP protocol supports two modes of operation: Split and Local MAC (medium access control). In Split MAC mode, all Layer 2 wireless data and management frames are encapsulated via the CAPWAP protocol and exchanged between the AC and the WTPs. The Local MAC mode allows the data frames to be either locally bridged or tunneled as 802.3 frames. 🌉

Wireless Binding: The CAPWAP protocol is independent of a specific WTP radio technology, as well as its associated wireless link-layer protocol. Elements of the CAPWAP protocol are designed to accommodate the specific needs of each wireless technology in a standard way. Implementation of the CAPWAP protocol for a particular wireless technology MUST define a binding protocol for it, e.g., the binding for IEEE 802.11, provided in [RFC5416]. 💅

Autonomous Wireless Local Area Network (WLAN) Architecture: It is the traditional autonomous WLAN architecture, in which each WTP is a single physical device that implements all the wireless services. 🏝️

Centralized WLAN Architecture: It is an emerging hierarchical architecture utilizing one or more centralized controllers for managing a large number of WTP devices. It can be said that the full wireless functions are implemented across multiple physical network devices, namely, the WTPs and ACs. 🏰

4. Conventions 💜

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119]. 🌷


5. Overview 🦋

5.1. Requirements and Constraints 🎯

The CAPWAP Protocol MIB module (CAPWAP-BASE-MIB) is designed to:

  • Support centralized management and monitoring of WTPs from the AC in combination with the CAPWAP protocol;
  • Allow operators to make configurations for WTPs before and after they connect to the AC;
  • Support querying of CAPWAP protocol parameters;
  • Support displaying of WTPs' current states and configurations;
  • Provide basic property information about the AC, WTPs, radios, and stations, and their relationships;
  • Provide counters for events on WTPs and radios such as reboot and hardware failure;
  • Provide various notifications such as channel up and join failure.

5.2. Wireless Binding MIB Modules 🧩

Other Standards Development Organizations (SDOs), such as IEEE, have already defined MIB modules for specific wireless technologies, e.g., the IEEE 802.11 MIB module [IEEE.802-11.2007]. Such MIB modules are called wireless binding MIB modules. 🫧

5.3. Design Objectives 🌟

This document introduces a mechanism to avoid redefining MIB objects in the existing MIB modules for a specific wireless technology. In other words, it is a mechanism to reuse wireless binding MIB modules defined by other SDOs. 🔄

In summary, the CAPWAP-BASE-MIB module has the following design objectives:

  • To implement an architecture that uses SNMP for the management and control of wireless networks, and answers the operator's requirements for centralized management, whatever the wireless devices are configured and deployed (centralized, autonomous, or some mix);
  • To be consistent with the CAPWAP protocol;
  • To be independent of any wireless technologies and be able to reuse wireless binding MIB modules defined by other SDOs;
  • To enable interoperability between vendors;
  • To meet the management requirements for the centralized WLAN architecture.

5.4. Design Idea 🧁

The basic design idea of the CAPWAP-BASE-MIB module is:

  • The SNMP agent MUST be run on the AC devices and is not REQUIRED on the WTP devices. It follows the same model as the CAPWAP protocol: Centralized Control.
  • It is designed to accommodate the specific needs of each wireless technology in a standard way. It is independent of any wireless technologies.
  • The ifIndex [RFC2863] is used as a common index for corresponding interfaces in the CAPWAP-BASE-MIB and the MIB modules of specific wireless technologies.
  • The operator could manage and control the centralized WLAN architectures using multiple MIB modules defined by multiple SDOs, while keeping them loosely coupled.

5.5. Mechanism of Reusing Wireless Binding MIB Modules

okay so radio management is SO important for any wireless tech 📡✨ Wireless binding MIB modules can handle radio management all by themselves, no cap. For example, the MIB tables like the dot11OperationTable [IEEE.802-11.2007] can support WTP radio configuration 🎀. These tables use the ifIndex as the index, and they work really well under an autonomous WLAN architecture 💖

Reusing those wireless binding MIB modules is a whole main character moment for centralized WLAN architectures 👑 According to [RFC5415], a specific PHY radio can be identified by the combination of the WTP and Radio identifiers (WTP ID + Radio ID). So the key is to use the ifIndex idea and figure out a way to keep track of the mappings between 'WTP ID + radio ID' and the ifIndex 🦋 As a generic mechanism, an ifIndex can identify an interface in an abstract way, and it does NOT care about the interface's PHY location (whether it's on the WTP or the AC) 🫶 The AC can have WTP Virtual Radio Interfaces that logically represent PHY radios on the WTP. From the operator's point of view, it looks like the PHY radios live on the AC, and the WTP's PHY location is hidden 🙈 The operator can operate the radios through MIB tables using the ifIndex of a WTP Virtual Radio Interface. Since it's a type of abstract interface, a WTP Virtual Radio Interface can be used by any wireless technology, like IEEE 802.11 and 802.16 ✨ The capwapBaseWirelessBindingTable in the CAPWAP-BASE-MIB module stores the mappings between the 'WTP ID + Radio ID' and the ifIndex 💅

5.6. CAPWAP Protocol Wireless Binding MIB Module

According to the CAPWAP Protocol specification [RFC5415], when you define a binding for wireless technologies, the authors MUST include any necessary definitions for technology-specific messages and all technology-specific message elements for those messages 🧚 A CAPWAP binding protocol is required for a specific wireless binding technology, for example the protocol in [RFC5416] for the IEEE 802.11 binding 🌸

Sometimes not all the technology-specific message elements in a CAPWAP binding protocol have MIB objects defined by other SDOs 🙈 For example, the protocol in [RFC5416] defines WLAN management. A WLAN is a logical component instantiated on a WTP device. A single physical WTP MAY operate a number of WLANs 🍓 Local or Split MAC modes can also be specified for a WLAN. The MAC mode for a WLAN is not in the scope of IEEE 802.11 [IEEE.802-11.2007] 💀 So in cases like this, along with the existing wireless binding MIB modules defined by other SDOs, a CAPWAP protocol wireless binding MIB module is required to be defined for a wireless binding, e.g., the CAPWAP Protocol Binding MIB for IEEE 802.11 [RFC5834] 🔥

5.7. WTP Profile

In a centralized WLAN architecture, a WTP profile is used to set configurations like a static IP address for a WTP, both before and after it connects to the AC 💜 It MUST contain the Base MAC address [RFC5415] of the WTP, because the CAPWAP message received from the WTP carries the Base MAC address, and the AC uses that Base MAC address to find the matching WTP profile 🎀

Section 4.6.40 of [RFC5415] leaves out saying that the WTP's Base MAC address MUST be included in the WTP Board Data message element. This is a known errata item [Err1832] and should be fixed in any future revision of RFC 5415 😭

Another big job of the WTP profile is triggering the creation of WTP Virtual Radio Interfaces on the AC 🌈 To make that happen, a WTP profile MUST include the WTP's model number [RFC5415], which reflects how many PHY radios the WTP has. So creating a WTP profile automatically triggers the AC to create the same number of WTP Virtual Radio Interfaces as the WTP's PHY radios, no manual intervention needed ✨ With those WTP Virtual Radio Interface ifIndexes, the operator can configure and manage the WTP's PHY radios through the wireless binding MIB modules 👑

6. Structure of the MIB Module

The MIB objects are derived from the CAPWAP protocol document [RFC5415] 🦋

  1. capwapBaseAcNameListTable - The AC name list table is used to configure the AC name list. 🍓
  2. capwapBaseMacAclTable - The ACL table is used to configure stations' Access Control Lists (ACLs). 🫶
  3. capwapBaseWtpProfileTable - The WTP profile table is used to configure WTP profiles for WTPs to be managed before they connect to the AC. An operator can change a WTP's current configuration by changing the parameter values in the matching WTP profile, and then the WTP can get the new configuration through the CAPWAP control channel 💅
  4. capwapBaseWtpStateTable - The state table of WTPs is used to indicate the AC's CAPWAP FSM state for each WTP, and it helps the operator query a WTP's current configuration 🔍
  5. capwapBaseWtpTable - The WTP table is used to display properties of the WTPs in running state 🌸
  6. capwapBaseWirelessBindingTable - The wireless binding table is used to display the mappings between WTP Virtual Radio Interfaces and PHY radios, plus the wireless binding type for each PHY radio 🧚
  7. capwapBaseStationTable - The station table is used to provide stations' basic property information. 💜
  8. capwapBaseWtpEventsStatsTable - The WTP events statistic table is used to collect WTP reboot count, link failure count, hardware failure count and so on. 😭
  9. capwapBaseRadioEventsStatsTable - The radio events statistic table is used to collect radio reset count, channel change count, hardware failure count, and so on. 🔥

7. Relationship to Other MIB Modules

7.1. Relationship to SNMPv2-MIB Module

The CAPWAP-BASE-MIB module does not duplicate the objects of the 'system' group in the SNMPv2-MIB [RFC3418], which is defined as being mandatory for all systems, and those objects apply to the entity as a whole 🎀 The 'system' group gives identification of the management entity and certain other system-wide data ✨

7.2. Relationship to IF-MIB Module

The Interfaces Group [RFC2863] defines generic managed objects for managing interfaces. This memo contains the media-specific extensions to the Interfaces Group for managing WTP PHY radios that are modeled as interfaces 🦋

The IF-MIB module is required to be supported on the AC. Each PHY radio on the WTP corresponds to a WTP Virtual Radio Interface on the AC. The WTP Virtual Radio Interface provides a way to configure the radio's parameters and query the radio's traffic statistics, and it reuses wireless binding modules defined by other SDOs 💖 The interface MUST be modeled as an ifEntry, and ifEntry objects such as ifIndex, ifDescr, ifName, and ifAlias are to be used as per [RFC2863] 🫶

Also, since an ifIndex [RFC2863] is used as a common index for corresponding interfaces in the CAPWAP-BASE-MIB and specific wireless technology MIB modules, the AC MUST have a mechanism that preserves the values of the ifIndexes in the ifTable across AC reboots 🔥

7.3. Relationship to ENTITY-MIB Module

The ENTITY-MIB module [RFC4133] meets the need for a standardized way of representing a single agent that supports multiple instances of one MIB. It can express a certain relationship between multiple entities and provide entity properties for each entity 🌈

In a centralized WLAN architecture, the SNMP agent runs on the AC and is not required on the WTP. With the ENTITY-MIB module on the AC, it can keep entity information such as firmware revision and software revision for the AC and WTPs 💅 From the ENTITY-MIB module's point of view, the overall physical entity (the AC) is a 'compound' of multiple physical entities (that is, the WTPs connected to the AC), and every entity is identified by a physical index 🧚 The capwapBaseWtpTable of the CAPWAP-BASE-MIB module uses the capwapBaseWtpPhyIndex object to store the mappings of WTP objects between the CAPWAP-BASE-MIB and ENTITY-MIB modules 🍓

By querying both the CAPWAP-BASE-MIB and ENTITY-MIB modules, operators can check the status and properties of the AC and WTPs 🌸 For example, they can get a WTP's current status through the CAPWAP-BASE-MIB module, and a WTP's software revision information through the ENTITY-MIB module. The CAPWAP-BASE-MIB module does not duplicate those objects defined in the ENTITY-MIB module 🙈

7.4. Relationship to Wireless Binding MIB Modules

The wireless binding MIB module of a wireless technology (such as [IEEE.802-11.2007]) is required to be supported on the AC. The CAPWAP-BASE-MIB module is able to support any wireless binding 🫶 Through the ifIndexes of WTP Virtual Radio Interfaces, it provides a consistent and abstract way of reusing MIB objects in the wireless binding MIB modules ✨ The CAPWAP-BASE-MIB module does not duplicate those objects defined in the wireless binding MIB modules 💜

7.5. MIB Modules Required for IMPORTS

The following MIB module IMPORTS objects from SYSAPPL-MIB [RFC2287], SNMPv2-SMI [RFC2578], SNMPv2-TC [RFC2579], SNMPv2-CONF [RFC2580], IF-MIB [RFC2863], SNMP-FRAMEWORK-MIB [RFC3411], INET-ADDRESS-MIB [RFC4001], and ENTITY-MIB [RFC4133] 🎀

8. Example of CAPWAP-BASE-MIB Module Usage 🧚

Okay so, let's walk through a real example! 🎀 We're using the IEEE 802.11 binding to show how these MIB modules work together. It's giving practical, and I'm obsessed.

1) Create a WTP profile. 💖

Say the WTP's Base MAC address is '00:01:01:01:01:00'. Create the WTP profile like this:

In capwapBaseWtpProfileTable
{
  capwapBaseWtpProfileId                  = 1,
  capwapBaseWtpProfileName                = 'WTP Profile 123456',
  capwapBaseWtpProfileWtpMacAddress       = '00:01:01:01:01:00',
  capwapBaseWtpProfileWtpModelNumber             = 'WTP123',
  capwapBaseWtpProfileWtpName                    = 'WTP 123456',
  capwapBaseWtpProfileWtpLocation                = 'office',
  capwapBaseWtpProfileWtpStaticIpEnable          = true(1),
  capwapBaseWtpProfileWtpStaticIpType            = ipv4(1),
  capwapBaseWtpProfileWtpStaticIpAddress         = '192.0.2.10',
  capwapBaseWtpProfileWtpNetmask                 = '255.255.255.0',
  capwapBaseWtpProfileWtpGateway                 = '192.0.2.1',
  capwapBaseWtpProfileWtpFallbackEnable          = true(1),
  capwapBaseWtpProfileWtpEchoInterval            = 30,
  capwapBaseWtpProfileWtpIdleTimeout             = 300,
  capwapBaseWtpProfileWtpMaxDiscoveryInterval    = 20,
  capwapBaseWtpProfileWtpReportInterval          = 120,
  capwapBaseWtpProfileWtpStatisticsTimer         = 120,
  capwapBaseWtpProfileWtpEcnSupport              = limited(0)
}

Suppose the WTP with model number 'WTP123' has one PHY radio, which is ID 1. Creating this WTP profile automatically triggers the AC to make a WTP Virtual Radio Interface and add a new row to the capwapBaseWirelessBindingTable, no manual work needed! ✨ Say the ifIndex of that WTP Virtual Radio Interface is 10. The following info gets stored in the capwapBaseWirelessBindingTable:

In capwapBaseWirelessBindingTable
{
  capwapBaseWtpProfileId                          = 1,
  capwapBaseWirelessBindingRadioId                = 1,
  capwapBaseWirelessBindingVirtualRadioIfIndex    = 10,
  capwapBaseWirelessBindingType                   = dot11(2)
}

The WTP Virtual Radio Interfaces on the AC line up with the PHY radios on the WTP 🦋. The WTP Virtual Radio Interface is modeled in ifTable [RFC2863]:

In ifTable
{
  ifIndex              = 10,
  ifDescr              = 'WTP Virtual Radio Interface',
  ifType               = 254,
  ifMtu                = 0,
  ifSpeed              = 0,
  ifPhysAddress        = '00:00:00:00:00:00',
  ifAdminStatus        = true(1),
  ifOperStatus         = false(0),
  ifLastChange         = 0,
  ifInOctets           = 0,
  ifInUcastPkts        = 0,
  ifInDiscards         = 0,
  ifInErrors           = 0,
  ifInUnknownProtos    = 0,
  ifOutOctets          = 0,
  ifOutUcastPkts       = 0,
  ifOutDiscards        = 0,
  ifOutErrors          = 0
}

2) Query the ifIndexes of WTP Virtual Radio Interfaces. 🔍

Before configuring PHY radios, the operator needs the ifIndexes of the WTP Virtual Radio Interfaces that match those radios. Since capwapBaseWirelessBindingTable already stores the mappings between PHY radios (Radio IDs) and the ifIndexes of WTP Virtual Radio Interfaces, the operator can just query that table. This query SHOULD run from radio ID 1 to radio ID 31 according to [RFC5415]), and it stops when an invalid ifIndex value (0) comes back. 💅

In this example, capwapBaseWtpProfileId = 1 and capwapBaseWirelessBindingRadioId = 1 go in as inputs, and the query returns capwapBaseWirelessBindingVirtualRadioIfIndex = 10. Next, capwapBaseWtpProfileId = 1 with capwapBaseWirelessBindingRadioId = 2 gets back an invalid ifIndex value (0), so the query ends there. This method gives you the ifIndexes of the WTP Virtual Radio Interfaces AND the number of PHY radios, which is a whole double win 👑. Besides checking that the ifIndex value is valid, the operator SHOULD check that capwapBaseWirelessBindingType is the binding type they want.

3) Configure specific wireless binding parameters for a WTP Virtual Radio Interface. 🎀

This config gets made on the AC through a specific wireless binding MIB module, like the IEEE 802.11 MIB module.

Here's an example of setting parameters for the WTP Virtual Radio Interface with ifIndex 10 through the IEEE 802.11 dot11OperationTable [IEEE.802-11.2007]:

In dot11OperationTable
{
  ifIndex                                  = 10,
  dot11MACAddress                          = '00:00:00:00:00:00',
  dot11RTSThreshold                        = 2347,
  dot11ShortRetryLimit                     = 7,
  dot11LongRetryLimit                      = 4,
  dot11FragmentationThreshold              = 256,
  dot11MaxTransmitMSDULifetime             = 512,
  dot11MaxReceiveLifetime                  = 512,
  dot11ManufacturerID                      = 'capwap',
  dot11ProductID                           = 'capwap',
  dot11CAPLimit                            = 2,
  dot11HCCWmin                             = 0,
  dot11HCCWmax                             = 0,
  dot11HCCAIFSN                            = 1,
  dot11ADDBAResponseTimeout                = 1,
  dot11ADDTSResponseTimeout                = 1,
  dot11ChannelUtilizationBeaconInterval    = 50,
  dot11ScheduleTimeout                     = 10,
  dot11DLSResponseTimeout                  = 10,
  dot11QAPMissingAckRetryLimit             = 1,
  dot11EDCAAveragingPeriod                 = 5
}

4) Get the current configuration status report from the WTP to the AC. 📡

According to [RFC5415], before a WTP that has joined the AC gets configuration from the AC, it needs to report its current configuration status by sending a configuration status request message to the AC. The AC uses that message to update MIB objects. For example, with the IEEE 802.11 binding, the AC updates data in the ifTable [RFC2863] and the IEEE 802.11 MIB module, and so on, based on the message. For ifIndex 10, its ifOperStatus in ifTable gets updated to match the current radio operational status in the CAPWAP message. Look at that sync! 🥹

5) Query WTP and radio statistical data. 📊

Once WTPs start running, the operator can query WTP and radio statistics through CAPWAP-BASE-MIB and the specific binding MIB module on the AC. For example, through dot11CountersTable in the IEEE 802.11 MIB module, the operator can query a radio's counter data using the ifIndex of its corresponding WTP Virtual Radio Interface. With the capwapBaseWtpTable in the CAPWAP-BASE-MIB module, the operator can look up the properties of running WTPs.

6) Run MIB operations through a CAPWAP protocol wireless binding MIB module. 🦄

For example, with the CAPWAP IEEE 802.11 binding protocol [RFC5416], some MIB operations, like MAC mode configuration for a WLAN, depend on the CAPWAP Protocol Binding MIB for IEEE 802.11 [RFC5834]. For more info, check out [RFC5834].

7) Query other properties of a WTP. 🔎

The operator can query MIB objects in the ENTITY-MIB [RFC4133] module by using the capwapBaseWtpPhyIndex in the capwapBaseWtpTable of the CAPWAP-BASE-MIB module. The WTP's properties, like software version and hardware version, live in the ENTITY-MIB module. Easy!


9. Definitions 💜

CAPWAP-BASE-MIB DEFINITIONS ::= BEGIN

IMPORTS

   PhysAddress, TEXTUAL-CONVENTION, TruthValue,
   DateAndTime, RowStatus
       FROM SNMPv2-TC
   LongUtf8String
       FROM SYSAPPL-MIB
   InterfaceIndex, ifGeneralInformationGroup
       FROM IF-MIB
   PhysicalIndex
       FROM ENTITY-MIB
   SnmpAdminString
       FROM SNMP-FRAMEWORK-MIB
   NOTIFICATION-GROUP, OBJECT-GROUP, MODULE-COMPLIANCE
       FROM SNMPv2-CONF
   MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE, mib-2,
   Integer32, Unsigned32, Counter32, Gauge32, TimeTicks

       FROM SNMPv2-SMI
   InetAddressType, InetAddress
       FROM INET-ADDRESS-MIB;

capwapBaseMIB MODULE-IDENTITY
    LAST-UPDATED "201004300000Z"        -- 30 April 2010
    ORGANIZATION "IETF Control And Provisioning of Wireless Access
                  Points (CAPWAP) Working Group
                  http://www.ietf.org/html.charters/capwap-charter.html"
    CONTACT-INFO
        "General Discussion: capwap@frascone.com
         To Subscribe: http://lists.frascone.com/mailman/listinfo/capwap

         Yang Shi (editor)
         Hangzhou H3C Tech. Co., Ltd.
         Beijing R&D Center of H3C, Digital Technology Plaza
         NO. 9 Shangdi 9th Street, Haidian District
         Beijing  100085
         China
         Phone: +86 010 82775276
         Email: rishyang@gmail.com

         David T. Perkins (editor)
         228 Bayview Dr.
         San Carlos, CA  94070
         USA
         Phone: +1 408 394-8702
         Email: dperkins@dsperkins.com

         Chris Elliott (editor)
         1516 Kent St.
         Durham, NC  27707
         USA
         Phone: +1 919-308-1216
         Email: chelliot@pobox.com

         Yong Zhang (editor)
         Fortinet, Inc.
         1090 Kifer Road
         Sunnyvale, CA  94086
         USA
         Email: yzhang@fortinet.com"

    DESCRIPTION
        "Copyright (c) 2010 IETF Trust and the persons identified as
         authors of the code. All rights reserved.

         Redistribution and use in source and binary forms, with or
         without modification, is permitted pursuant to, and subject
         to the license terms contained in, the Simplified BSD License
         set forth in Section 4.c of the IETF Trust's Legal Provisions
         Relating to IETF Documents
         (http://trustee.ietf.org/license-info).

         This version of this MIB module is part of RFC 5833;
         see the RFC itself for full legal notices.

         This MIB module contains managed object definitions for
         the CAPWAP Protocol."
    REVISION    "201004300000Z"
    DESCRIPTION
        "Initial version published as RFC 5833"
         ::= { mib-2 196 }

-- Textual Conventions

CapwapBaseWtpProfileIdTC ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "d"
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP profile."
    SYNTAX      Unsigned32 (0..4096)

CapwapBaseWtpIdTC ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "1x:"
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP instance.
         As usual, the Base MAC address of the WTP is used."
    SYNTAX      OCTET STRING (SIZE(6|8))

CapwapBaseStationIdTC ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "1x:"
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a station instance.
         As usual, the MAC address of the station is used."
    SYNTAX      OCTET STRING (SIZE(6|8))

CapwapBaseRadioIdTC ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "d"
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a radio on a WTP."
    SYNTAX      Unsigned32 (1..31)

Okay bestie, the textual conventions are giving main character energy 💅✨ Each one is a little reusable type with its own vibe, and the MIB objects below lean on them.

Tunnel modes first 🦋 A WTP can pick from more than one tunnel option, and the bit field says which ones it's got:

CapwapBaseTunnelModeTC ::= TEXTUAL-CONVENTION
    STATUS      current
    DESCRIPTION
        "Represents the tunneling modes of operation that are
         supported by a WTP.
         The WTP MAY support more than one option, represented by
         the bit field below:
           localBridging(0) - Local bridging mode
           dot3Tunnel(1)    - 802.3 frame tunnel mode
           nativeTunnel(2)  - Native frame tunnel mode"
    REFERENCE
        "Section 4.6.43 of CAPWAP Protocol Specification, RFC 5415."
    SYNTAX      BITS {
                  localBridging(0),
                  dot3Tunnel(1),
                  nativeTunnel(2)
                }

CapwapBaseMacTypeTC ::= TEXTUAL-CONVENTION
    STATUS      current
    DESCRIPTION
        "Represents the MAC mode of operation supported by a WTP.
         The following enumerated values are supported:
           localMAC(0) - Local-MAC mode
           splitMAC(1) - Split-MAC mode
           both(2)     - Both Local-MAC and Split-MAC
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object
         follows that rule."
    REFERENCE
        "Section 4.6.44 of CAPWAP Protocol Specification, RFC 5415."
    SYNTAX      INTEGER {
                  localMAC(0),
                  splitMAC(1),
                  both(2)
                }

CapwapBaseChannelTypeTC::= TEXTUAL-CONVENTION
    STATUS      current
    DESCRIPTION
        "Represents the channel type for CAPWAP protocol.
         The following enumerated values are supported:
           data(1)    - Data channel
           control(2) - Control channel"
    SYNTAX      INTEGER {
                  data(1),
                  control(2)
                }

CapwapBaseAuthenMethodTC ::= TEXTUAL-CONVENTION
    STATUS      current
    DESCRIPTION
        "Represents the authentication credential type for a WTP.
         The following enumerated values are supported:
           other(1) - Other method, for example, vendor specific
           clear(2) - Clear text and no authentication
           x509(3)  - X.509 certificate authentication
           psk(4)   - Pre-Shared secret authentication
         As a mandatory requirement, CAPWAP control channel
         authentication SHOULD use DTLS, either by certificate or
         PSK.  For data channel authentication, DTLS is optional."
    SYNTAX      INTEGER {
                  other(1),
                  clear(2),
                  x509(3),
                  psk(4)
                }

-- Top-level components of this MIB module

-- Notifications
capwapBaseNotifications OBJECT IDENTIFIER
    ::= { capwapBaseMIB 0 }
-- Tables, Scalars
capwapBaseObjects OBJECT IDENTIFIER
    ::= { capwapBaseMIB 1 }
-- Conformance
capwapBaseConformance OBJECT IDENTIFIER
    ::= { capwapBaseMIB 2 }


-- AC Objects Group

capwapBaseAc OBJECT IDENTIFIER
    ::= { capwapBaseObjects 1 }

capwapBaseWtpSessions OBJECT-TYPE
    SYNTAX      Gauge32 (0..65535)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the total number of WTPs that are connecting to
         the AC."
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 1 }

capwapBaseWtpSessionsLimit  OBJECT-TYPE
    SYNTAX      Unsigned32 (0..65535)
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum number of WTP sessions configured on
         the AC.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 2 }

capwapBaseStationSessions  OBJECT-TYPE
    SYNTAX      Gauge32 (0..65535)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the total number of stations that are accessing
         the wireless service provided by the AC."
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 3 }

capwapBaseStationSessionsLimit  OBJECT-TYPE
    SYNTAX      Unsigned32 (0..65535)
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum number of station sessions configured
         on the AC.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 4 }

capwapBaseDataChannelDTLSPolicyOptions  OBJECT-TYPE
    SYNTAX      BITS {
                  other(0),
                  clear(1),
                  dtls(2)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "The AC communicates its policy on the use of DTLS for
         the CAPWAP data channel.
         The AC MAY support more than one option, represented by the bit
         field below:

           other(0) - Other method, for example, vendor specific
           clear(1) - Clear text
           dtls(2)  - DTLS"
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 5 }

capwapBaseControlChannelAuthenOptions  OBJECT-TYPE
    SYNTAX      BITS {
                  x509(0),
                  psk(1)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the authentication credential type supported by the
         AC for CAPWAP control channel.
         The AC MAY support more than one option, represented by the bit
         field below:
           x509(0) - X.509 certificate based
           psk(1)  - Pre-Shared secret"
    REFERENCE
        "Section 4.6.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 6 }

-- capwapBaseAcNameListTable table

capwapBaseAcNameListTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseAcNameListEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that configure the AC name list.
         Values of all read-create objects in this table are
         persistent at restart/reboot."
    REFERENCE
        "Section 4.6.5 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 9 }

capwapBaseAcNameListEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseAcNameListEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that configures the AC name list."
    INDEX { capwapBaseAcNameListId }
    ::= { capwapBaseAcNameListTable 1 }

CapwapBaseAcNameListEntry ::= SEQUENCE {
      capwapBaseAcNameListId          Unsigned32,
      capwapBaseAcNameListName        LongUtf8String,
      capwapBaseAcNameListPriority    Unsigned32,
      capwapBaseAcNameListRowStatus   RowStatus
    }

capwapBaseAcNameListId OBJECT-TYPE
    SYNTAX      Unsigned32 (1..255)
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of an AC Name list."
    ::= { capwapBaseAcNameListEntry 1 }

capwapBaseAcNameListName OBJECT-TYPE
    SYNTAX      LongUtf8String (SIZE(1..512))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the name of an AC, and it is expected to be
         an UTF-8 encoded string."
    REFERENCE
        "Section 4.6.5 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAcNameListEntry 2 }

capwapBaseAcNameListPriority OBJECT-TYPE
    SYNTAX      Unsigned32 (1..255)
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the priority order of the preferred AC.
         For instance, the value of one (1) is used to set the primary
         AC, the value of two (2) is used to set the secondary AC, etc."
    REFERENCE
        "Section 4.6.5 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAcNameListEntry 3 }

capwapBaseAcNameListRowStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "This object is used to create, modify, and/or delete a row
         in this table.
         The value of capwapBaseAcNameListName and
         capwapBaseAcNameListPriority can be changed when this
         object is in state 'active' or in 'notInService'.

         The capwapBaseAcNameListRowStatus may be changed to 'active'
         if all the managed objects in the conceptual row with
         MAX-ACCESS read-create have been assigned valid values."
    ::= { capwapBaseAcNameListEntry 4 }

-- End of capwapBaseAcNameListTable table


-- capwapBaseMacAclTable table

capwapBaseMacAclTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseMacAclEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that configure station Access Control
         Lists (ACLs).
         The WTP will not provide service to the MAC addresses
         configured in this table.
         Values of all read-create objects in this table are persistent
         at AC restart/reboot."
    REFERENCE
        "Section 4.6.7 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseAc 10 }

capwapBaseMacAclEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseMacAclEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that configures station Access Control
         Lists (ACLs)."
    INDEX { capwapBaseMacAclId }
    ::= { capwapBaseMacAclTable 1 }

CapwapBaseMacAclEntry ::= SEQUENCE {
      capwapBaseMacAclId           Unsigned32,
      capwapBaseMacAclStationId    CapwapBaseStationIdTC,
      capwapBaseMacAclRowStatus    RowStatus
    }

capwapBaseMacAclId OBJECT-TYPE
    SYNTAX      Unsigned32
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of an ACL."
    ::= { capwapBaseMacAclEntry 1 }

capwapBaseMacAclStationId OBJECT-TYPE
    SYNTAX      CapwapBaseStationIdTC
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the MAC address of a station to which WTPs will
         no longer provides service."
    REFERENCE
        "Section 4.6.7 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseMacAclEntry 2 }

capwapBaseMacAclRowStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "This object is used to create, modify, and/or delete a row
         in this table.
         The value of capwapBaseMacAclStationId can be changed when
         this object is in state 'active' or in 'notInService'.
         The capwapBaseMacAclRowStatus may be changed to 'active'
         if all the managed objects in the conceptual row with
         MAX-ACCESS read-create have been assigned valid values."
    ::= { capwapBaseMacAclEntry 3 }

-- End of capwapBaseMacAclTable table

-- End of AC Objects Group


-- WTP Objects Group

capwapBaseWtps OBJECT IDENTIFIER
    ::= { capwapBaseObjects 2 }

-- capwapBaseWtpProfileTable Table

capwapBaseWtpProfileTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseWtpProfileEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that configure WTP profiles for WTPs to
         be managed before they connect to the AC.
         An operator could change a WTP's configuration by changing
         the values of parameters in the corresponding WTP profile,
         then the WTP could get the new configuration through the
         CAPWAP control channel.

         Values of all read-create objects in this table are
         persistent at restart/reboot."
    ::= { capwapBaseWtps 1 }

capwapBaseWtpProfileEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseWtpProfileEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that configures and displays a WTP profile."
    INDEX { capwapBaseWtpProfileId }
    ::= { capwapBaseWtpProfileTable 1 }

okay so now we're in the WTP profile entry, which is literally the main character row of this whole table 💅✨

CapwapBaseWtpProfileEntry ::= SEQUENCE {
      capwapBaseWtpProfileId                  CapwapBaseWtpProfileIdTC,
      capwapBaseWtpProfileName                       SnmpAdminString,
      capwapBaseWtpProfileWtpMacAddress              CapwapBaseWtpIdTC,
      capwapBaseWtpProfileWtpModelNumber             SnmpAdminString,
      capwapBaseWtpProfileWtpName                    LongUtf8String,
      capwapBaseWtpProfileWtpLocation                LongUtf8String,
      capwapBaseWtpProfileWtpStaticIpEnable          TruthValue,
      capwapBaseWtpProfileWtpStaticIpType            InetAddressType,
      capwapBaseWtpProfileWtpStaticIpAddress         InetAddress,
      capwapBaseWtpProfileWtpNetmask                 InetAddress,
      capwapBaseWtpProfileWtpGateway                 InetAddress,
      capwapBaseWtpProfileWtpFallbackEnable          INTEGER,
      capwapBaseWtpProfileWtpEchoInterval            Unsigned32,
      capwapBaseWtpProfileWtpIdleTimeout             Unsigned32,
      capwapBaseWtpProfileWtpMaxDiscoveryInterval    Unsigned32,
      capwapBaseWtpProfileWtpReportInterval          Unsigned32,
      capwapBaseWtpProfileWtpStatisticsTimer         Unsigned32,
      capwapBaseWtpProfileWtpEcnSupport              INTEGER,
      capwapBaseWtpProfileRowStatus                  RowStatus
    }

first up is the profile ID, which is the not-accessible key for the row 🔑

capwapBaseWtpProfileId OBJECT-TYPE
    SYNTAX      CapwapBaseWtpProfileIdTC
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP profile."
    ::= { capwapBaseWtpProfileEntry 1 }

capwapBaseWtpProfileName  OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION

        "Represents the name of a WTP profile."
    ::= { capwapBaseWtpProfileEntry 2 }

capwapBaseWtpProfileWtpMacAddress  OBJECT-TYPE
    SYNTAX      CapwapBaseWtpIdTC
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the Base MAC address of a WTP.
         A WTP profile MUST contain the Base MAC address of the WTP
         because the CAPWAP message received from the WTP contains
         its Base MAC address and the AC uses the Base MAC address to
         find the corresponding WTP profile.
         Section 4.6.40 of [RFC5415] omits indicating that the WTP's
         Base MAC address must be included in the WTP Board Data
         message element.  This is a known errata item and should be
         fixed in any future revision of the RFC 5415."
    REFERENCE
        "Section 4.6.40 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 3 }

capwapBaseWtpProfileWtpModelNumber  OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the model number of a WTP.
         A WTP profile MUST include the WTP's model number, which
         reflects the number of Physical Layer (PHY) radios on the WTP.
         In this way, the creation of a WTP profile triggers the AC
         to automatically create the same number of WTP Virtual Radio
         Interfaces corresponding to the WTP's PHY radios without
         manual intervention.  With the ifIndexes of WTP Virtual
         Radio Interfaces, the operator could configure and manage
         the WTP's PHY radios through the wireless binding MIB
         modules."
    REFERENCE
        "Section 4.6.40 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 4 }

capwapBaseWtpProfileWtpName  OBJECT-TYPE
    SYNTAX      LongUtf8String (SIZE(1..512))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the name of the WTP."
    REFERENCE
        "Section 4.6.45 of CAPWAP Protocol Specification, RFC 5415."

    ::= { capwapBaseWtpProfileEntry 5 }

capwapBaseWtpProfileWtpLocation  OBJECT-TYPE
    SYNTAX      LongUtf8String (SIZE(1..1024))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the location of the WTP."
    REFERENCE
        "Section 4.6.30 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 6 }

capwapBaseWtpProfileWtpStaticIpEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents whether the WTP SHOULD use a static IP address
         or not.  A value of false disables the static IP address,
         while a value of true enables it."
    REFERENCE
        "Section 4.6.48 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 7 }

capwapBaseWtpProfileWtpStaticIpType OBJECT-TYPE
    SYNTAX      InetAddressType {ipv4(1)}
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the static IP address type used by the WTP.
         Only ipv4(1) is supported by the object.
         Although the CAPWAP protocol [RFC5415] supports both IPv4
         and IPv6, note that the CAPWAP field modeled by this
         object does not support IPv6, so the object does not
         support ipv6(2)."
    REFERENCE
        "Section 4.6.48 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 8 }

capwapBaseWtpProfileWtpStaticIpAddress OBJECT-TYPE
    SYNTAX      InetAddress (SIZE(4))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "When capwapBaseWtpProfileWtpStaticIpEnable is true,
         it represents the static IP address to be assigned to the WTP.
         The format of this IP address is determined by the
         corresponding instance of object
         capwapBaseWtpProfileWtpStaticIpType."
    REFERENCE
        "Section 4.6.48 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 9 }

capwapBaseWtpProfileWtpNetmask OBJECT-TYPE
    SYNTAX      InetAddress (SIZE(4))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "When capwapBaseWtpProfileWtpStaticIpEnable is true,
         it represents the netmask to be assigned to the WTP.
         The format of this netmask is determined by the
         corresponding instance of object
         capwapBaseWtpProfileWtpStaticIpType."
    REFERENCE
        "Section 4.6.48 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 10 }

capwapBaseWtpProfileWtpGateway OBJECT-TYPE
    SYNTAX      InetAddress (SIZE(4))
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "When capwapBaseWtpProfileWtpStaticIpEnable is true,
         it represents the gateway to be assigned to the WTP.
         The format of this IP address is determined by the
         corresponding instance of object
         capwapBaseWtpProfileWtpStaticIpType."
    REFERENCE
        "Section 4.6.48 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 11 }

capwapBaseWtpProfileWtpFallbackEnable OBJECT-TYPE
    SYNTAX      INTEGER {
                  enabled(1),
                  disabled(2)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents whether to enable or disable automatic CAPWAP
         fallback in the event that a WTP detects its preferred AC
         and is not currently connected to it.
         The following enumerated values are supported:
           enabled(1)  - The fallback mode is enabled
           disabled(2) - The fallback mode is disabled"
    REFERENCE

        "Section 4.6.42 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { enabled }
     ::= { capwapBaseWtpProfileEntry 12 }

capwapBaseWtpProfileWtpEchoInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the minimum time, in seconds, between sending Echo
         Request messages to the AC that the WTP has joined."
    REFERENCE
        "Section 4.7.7 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 30 }
    ::= { capwapBaseWtpProfileEntry 13 }

capwapBaseWtpProfileWtpIdleTimeout OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the idle timeout value that the WTP SHOULD enforce
         for its active stations."
    REFERENCE
        "Section 4.7.8 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 300 }
    ::= { capwapBaseWtpProfileEntry 14 }

capwapBaseWtpProfileWtpMaxDiscoveryInterval OBJECT-TYPE
    SYNTAX      Unsigned32 (2..180)
    UNITS       "second"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the maximum time allowed between sending Discovery
         Request messages, in seconds."
    REFERENCE
        "Section 4.7.10 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 20 }
    ::= { capwapBaseWtpProfileEntry 15 }

capwapBaseWtpProfileWtpReportInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the interval for WTP to send the Decryption Error
         report."
    REFERENCE
        "Section 4.7.11 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 120 }
    ::= { capwapBaseWtpProfileEntry 16 }

capwapBaseWtpProfileWtpStatisticsTimer OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the interval the WTP uses between the WTP Event
         Requests it transmits to the AC to communicate its statistics,
         in seconds."
    REFERENCE
        "Section 4.7.14 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 120 }
    ::= { capwapBaseWtpProfileEntry 17 }

capwapBaseWtpProfileWtpEcnSupport OBJECT-TYPE
    SYNTAX      INTEGER {
                  limited(0),
                  fullAndLimited(1)
                }
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "Represents the support for the Explicit Congestion Notification
         (ECN) bits, as defined in [RFC3168].
         The following enumerated values are supported:
           limited(0)        - Limited ECN support
           fullAndLimited(1) - Full and limited ECN support
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object follows
         that rule."
    REFERENCE
        "Section 4.6.25 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpProfileEntry 18 }

that's the whole WTP profile entry bestie, and the ECN support object closes it out 🎀💜

capwapBaseWtpProfileRowStatus OBJECT-TYPE 💖

okay bestie, RowStatus is the boss of this whole table 👑 it's how you create, modify, and delete a row, so it's giving main character energy. Here's the full vibe:

capwapBaseWtpProfileRowStatus OBJECT-TYPE
    SYNTAX      RowStatus
    MAX-ACCESS  read-create
    STATUS      current
    DESCRIPTION
        "This object is used to create, modify, and/or delete a row

         in this table.
         The value of capwapBaseWtpProfileName,
         capwapBaseWtpProfileWtpName and capwapBaseWtpProfileWtpLocation
         can be changed when this object is in state 'active' or in
         'notInService'.
         The other objects in a row can be modified only when the value
         of this object in the corresponding conceptual row is not
         'active'.  Thus, to modify one or more of the objects in
         this conceptual row:
              a. change the row status to 'notInService'
              b. change the values of the row
              c. change the row status to 'active'
         The capwapBaseWtpProfileRowStatus may be changed to 'active'
         if the managed objects capwapBaseWtpProfileName,
         capwapBaseWtpProfileWtpMacAddress,
         capwapBaseWtpProfileWtpModelNumber,
         capwapBaseWtpProfileWtpName, and
         capwapBaseWtpProfileWtpLocation in the conceptual row
         have been assigned valid values.

         Deleting a WTP profile in use will disconnect the WTP from
         the AC.  So the network management system SHOULD
         ask the operator to confirm such an operation.
         When a WTP profile entry is removed from the table,
         the corresponding WTP Virtual Radio Interfaces are also
         removed from the capwapBaseWirelessBindingTable and
         ifTable [RFC2863].
         Also, the related object instances SHOULD be removed from
         the wireless binding MIB modules such as the IEEE 802.11
         MIB module [IEEE.802-11.2007]."
    ::= { capwapBaseWtpProfileEntry 19 }
⚠️ bestie, deleting a WTP profile that's in use will disconnect the WTP from the AC, so the network management system SHOULD ask the operator to confirm first. Don't skip that check 🙈

-- End of capwapBaseWtpProfileTable table

-- capwapBaseWtpStateTable table

capwapBaseWtpStateTable OBJECT-TYPE 🧚

so this table is where you can see the AC's CAPWAP FSM state for each WTP, which is super handy when you're trying to figure out what a WTP is up to 🔍

capwapBaseWtpStateTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseWtpStateEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that indicate the AC's CAPWAP FSM state
         for each WTP, and helps the operator to query a WTP's
         current configuration."
    ::= { capwapBaseWtps 2 }

capwapBaseWtpStateEntry OBJECT-TYPE 🦋

each row here is a little snapshot of one WTP, and you can look up its current config using its profile identifier 🎀

capwapBaseWtpStateEntry  OBJECT-TYPE

    SYNTAX      CapwapBaseWtpStateEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays the AC's CAPWAP FSM state
         for each WTP.
         Also, the operator could query the current configuration
         of a WTP by using the identifier of the corresponding
         WTP profile."
    INDEX { capwapBaseWtpStateWtpId }
    ::= { capwapBaseWtpStateTable 1 }

CapwapBaseWtpStateEntry ::= SEQUENCE {
      capwapBaseWtpStateWtpId                   CapwapBaseWtpIdTC,
      capwapBaseWtpStateWtpIpAddressType        InetAddressType,
      capwapBaseWtpStateWtpIpAddress            InetAddress,
      capwapBaseWtpStateWtpLocalIpAddressType   InetAddressType,
      capwapBaseWtpStateWtpLocalIpAddress       InetAddress,
      capwapBaseWtpStateWtpBaseMacAddress       PhysAddress,
      capwapBaseWtpState                        INTEGER,
      capwapBaseWtpStateWtpUpTime               TimeTicks,
      capwapBaseWtpStateWtpCurrWtpProfileId     CapwapBaseWtpProfileIdTC
    }

capwapBaseWtpStateWtpId OBJECT-TYPE 🌸

this is the unique ID for each WTP, the key that every row is indexed by 🔑

capwapBaseWtpStateWtpId OBJECT-TYPE
    SYNTAX      CapwapBaseWtpIdTC
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP."
    ::= { capwapBaseWtpStateEntry 1 }

capwapBaseWtpStateWtpIpAddressType OBJECT-TYPE 🌈

it's the address type of the WTP, and only the IPv4 and IPv6 ones are supported here 🙌

capwapBaseWtpStateWtpIpAddressType OBJECT-TYPE
    SYNTAX      InetAddressType
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the IP address type of a WTP.
         Only ipv4(1) and ipv6(2) are supported by the object."
    ::= { capwapBaseWtpStateEntry 2 }

capwapBaseWtpStateWtpIpAddress OBJECT-TYPE 📮

this is the WTP's IP address, the one that shows up in the IP packet header. Its format depends on the address type object right above it 💌

capwapBaseWtpStateWtpIpAddress OBJECT-TYPE
    SYNTAX      InetAddress
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the IP address of a WTP that corresponds to
         the IP address in the IP packet header.

         The format of this IP address is determined by
         the corresponding instance of object
         capwapBaseWtpStateWtpIpAddressType."
    REFERENCE
        "Section 4 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpStateEntry 3 }

capwapBaseWtpStateWtpLocalIpAddressType OBJECT-TYPE 🫶

same energy as the last type object, it's the local IP address type of the WTP, and it's IPv4 or IPv6 only 💅

capwapBaseWtpStateWtpLocalIpAddressType OBJECT-TYPE
    SYNTAX      InetAddressType
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the local IP address type of a WTP.
         Only ipv4(1) and ipv6(2) are supported by the object."
    ::= { capwapBaseWtpStateEntry 4 }

capwapBaseWtpStateWtpLocalIpAddress OBJECT-TYPE 🔥

this one models the CAPWAP Local IPv4 or Local IPv6 Address fields. The tea is that if there's a NAT box between the WTP and the AC, this value will NOT match the regular IP address one, so don't be confused when they look different 👀

capwapBaseWtpStateWtpLocalIpAddress OBJECT-TYPE
    SYNTAX      InetAddress
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the local IP address of a WTP and models the
         CAPWAP Local IPv4 Address or CAPWAP Local IPv6 Address fields
         [RFC5415].
         If a Network Address Translation (NAT) device is present
         between WTP and AC, the value of
         capwapBaseWtpStateWtpLocalIpAddress will be different from the
         value of capwapBaseWtpStateWtpIpAddress.
         The format of this IP address is determined by
         the corresponding instance of object
         capwapBaseWtpStateWtpLocalIpAddressType."
    REFERENCE
        "Sections 4.6.11 and 4.6.12 of CAPWAP Protocol Specification,
         RFC 5415."
    ::= { capwapBaseWtpStateEntry 5 }

capwapBaseWtpStateWtpBaseMacAddress OBJECT-TYPE 🍓

this is the WTP's Base MAC Address. It MAY be assigned to the primary Ethernet interface, so it's optional vibes there 🧃

capwapBaseWtpStateWtpBaseMacAddress  OBJECT-TYPE
    SYNTAX      PhysAddress (SIZE(6|8))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the WTP's Base MAC Address, which MAY be
         assigned to the primary Ethernet interface.
         The instance of the object corresponds to the Base MAC Address
         sub-element in the CAPWAP protocol [RFC5415]."
    REFERENCE
        "Section 4.6.40 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpStateEntry 6 }

capwapBaseWtpState OBJECT-TYPE 🚦

okay the big one. This tells you which state the AC's CAPWAP FSM is in for each WTP, with nine possible values. Let's get into it 🎢

capwapBaseWtpState  OBJECT-TYPE
    SYNTAX      INTEGER {
                  dtls(1),
                  join(2),
                  image(3),
                  configure(4),
                  dataCheck(5),
                  run(6),
                  reset(7),
                  dtlsTeardown(8),
                  unknown(9)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the various possibilities of the AC's CAPWAP FSM
         state for each WTP.
         The following enumerated values are supported:
           dtls(1)         - DTLS negotiation states, which include
                             DTLS setup, authorize, DTLS connect
           join(2)         - The WTP is joining with the AC
           image(3)        - The WTP is downloading software
           configure(4)    - The WTP is getting configuration from
                             the AC
           dataCheck(5)    - The AC is waiting for the Data Channel Keep
                             Alive Packet
           run(6)          - The WTP enters the running state
           reset(7)        - The AC transmits a reset request message
                             to the WTP
           dtlsTeardown(8) - DTLS session is torn down
           unknown(9)      - Operator already prepared configuration
                             for the WTP, while the WTP has not
                             contacted the AC until now"
    REFERENCE
        "Section 2.3.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpStateEntry 7 }

capwapBaseWtpStateWtpUpTime OBJECT-TYPE ⏰

this is how long the WTP has been in the running state, counted in hundredths of a second. It only ticks while it's in run(6) 🕰️

capwapBaseWtpStateWtpUpTime  OBJECT-TYPE
    SYNTAX      TimeTicks
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the time (in hundredths of a second) since the
         WTP has been in the running state (corresponding to the
         value run(6) of capwapBaseWtpState)."
    ::= { capwapBaseWtpStateEntry 8 }

capwapBaseWtpStateWtpCurrWtpProfileId OBJECT-TYPE 🎀

this is the current WTP profile ID, so you can pull up a WTP's current config using it 🧸

capwapBaseWtpStateWtpCurrWtpProfileId OBJECT-TYPE

    SYNTAX      CapwapBaseWtpProfileIdTC
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the current identifier of a WTP profile.
         The operator could query a WTP's current configuration
         with the identifier of a WTP profile."
    ::= { capwapBaseWtpStateEntry 9 }

-- End of capwapBaseWtpStateTable Table

-- capwapBaseWtpTable Table

capwapBaseWtpTable OBJECT-TYPE 🌷

this table holds properties of the WTPs that are currently in running state, so the running ones get the spotlight ✨

capwapBaseWtpTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseWtpEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that display properties of the WTPs
         in running state."
    ::= { capwapBaseWtps 3 }

capwapBaseWtpEntry OBJECT-TYPE 🪩

one row per running WTP, indexed by its current ID 💜

capwapBaseWtpEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseWtpEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays properties of the WTPs
         in running state."
    INDEX { capwapBaseWtpCurrId }
    ::= { capwapBaseWtpTable 1 }

CapwapBaseWtpEntry ::= SEQUENCE {
      capwapBaseWtpCurrId                       CapwapBaseWtpIdTC,
      capwapBaseWtpPhyIndex                     PhysicalIndex,
      capwapBaseWtpBaseMacAddress               PhysAddress,
      capwapBaseWtpTunnelModeOptions            CapwapBaseTunnelModeTC,
      capwapBaseWtpMacTypeOptions               CapwapBaseMacTypeTC,
      capwapBaseWtpDiscoveryType                INTEGER,
      capwapBaseWtpRadiosInUseNum               Gauge32,
      capwapBaseWtpRadioNumLimit                Unsigned32,
      capwapBaseWtpRetransmitCount              Counter32
    }

capwapBaseWtpCurrId OBJECT-TYPE 🍭

this is the unique identifier for a WTP that's in running state. It's the index for the row 🗝️

capwapBaseWtpCurrId OBJECT-TYPE
    SYNTAX      CapwapBaseWtpIdTC
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP in running state."
    ::= { capwapBaseWtpEntry 1 }

capwapBaseWtpPhyIndex OBJECT-TYPE 🧩

this is the physical index into the ENTITY-MIB module. You can get info like the software version through it, so it's basically a shortcut 🔗

capwapBaseWtpPhyIndex OBJECT-TYPE
    SYNTAX      PhysicalIndex
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the unique physical index of a physical entity
         in the ENTITY-MIB module [RFC4133].
         Information about a specific WTP such as its software version
         could be accessed through this index."
    ::= { capwapBaseWtpEntry 2 }

capwapBaseWtpBaseMacAddress OBJECT-TYPE 🍑

the WTP's Base MAC Address again, and it MAY be assigned to the primary Ethernet interface. Same MAY energy as the state table one 🫧

capwapBaseWtpBaseMacAddress  OBJECT-TYPE
    SYNTAX      PhysAddress (SIZE(6|8))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the WTP's Base MAC Address, which MAY be assigned
         to the primary Ethernet interface.
         The instance of the object corresponds to the Base MAC Address
         sub-element in the CAPWAP protocol [RFC5415]."
    REFERENCE
        "Section 4.6.40 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 3 }

capwapBaseWtpTunnelModeOptions OBJECT-TYPE 🚇

these are the tunneling modes the WTP supports, so you can see what it's capable of at a glance 🛸

capwapBaseWtpTunnelModeOptions  OBJECT-TYPE
    SYNTAX      CapwapBaseTunnelModeTC
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the tunneling modes of operation supported by
         the WTP."
    REFERENCE
        "Section 4.6.43 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 4 }

capwapBaseWtpMacTypeOptions OBJECT-TYPE 🌙

and last but not least for this stretch, this is the MAC mode of operation the WTP supports 🌟

capwapBaseWtpMacTypeOptions  OBJECT-TYPE
    SYNTAX      CapwapBaseMacTypeTC
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the MAC mode of operation supported by the WTP."
    REFERENCE
        "Section 4.6.44 of CAPWAP Protocol Specification, RFC 5415."

    ::= { capwapBaseWtpEntry 5 }

Okay bestie, the WTP discovery info is up next 🦋 how the WTP finds its AC is giving main character energy 💅

capwapBaseWtpDiscoveryType OBJECT-TYPE
    SYNTAX      INTEGER {
                  unknown(0),
                  staticConfig(1),
                  dhcp(2),
                  dns(3),
                  acRef(4)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents how the WTP discovers the AC.
         The following enumerated values are supported:
           unknown(0)      - Unknown
           staticConfig(1) - Static configuration
           dhcp(2)         - DHCP
           dns(3)          - DNS
           acRef(4)        - AC referral
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object
         follows that rule."
    REFERENCE
        "Section 4.6.21 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 6 }

capwapBaseWtpRadiosInUseNum OBJECT-TYPE
    SYNTAX      Gauge32 (0..255)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of radios in use on the WTP."
    REFERENCE
        "Section 4.6.41 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 7 }

capwapBaseWtpRadioNumLimit OBJECT-TYPE
    SYNTAX      Unsigned32 (0..255)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the maximum radio number supported by the WTP."
    REFERENCE
        "Section 4.6.41 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 8 }

capwapBaseWtpRetransmitCount OBJECT-TYPE

    SYNTAX      Counter32
    UNITS       "retransmissions"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of retransmissions for a given
         CAPWAP packet."
    REFERENCE
        "Section 4.8.8 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEntry 9 }

-- End of capwapBaseWtpTable table


-- capwapBaseWirelessBindingTable Table

capwapBaseWirelessBindingTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseWirelessBindingEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that display the mappings between
         WTP Virtual Radio Interfaces and PHY radios, and the
         wireless binding type for each PHY radio.
         As capwapBaseWirelessBindingTable stores the mappings between
         PHY radios (Radio IDs) and the ifIndexes of WTP Virtual Radio
         Interfaces, the operator can get the ifIndex information by
         querying this table.  Such a query operation SHOULD run from
         radio ID 1 to radio ID 31 according to [RFC5415],
         and stop when an invalid ifIndex value (0) is returned.
         Values of all objects in this table are persistent at
         restart/reboot."
    ::= { capwapBaseWtps 4 }

capwapBaseWirelessBindingEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseWirelessBindingEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays the mapping between
         a specific WTP Virtual Radio Interface and a PHY
         radio, and the wireless binding type for the PHY radio."
    INDEX {
      capwapBaseWtpProfileId,
      capwapBaseWirelessBindingRadioId
    }
    ::= { capwapBaseWirelessBindingTable 1 }

CapwapBaseWirelessBindingEntry ::= SEQUENCE {
      capwapBaseWirelessBindingRadioId              CapwapBaseRadioIdTC,
      capwapBaseWirelessBindingVirtualRadioIfIndex  InterfaceIndex,
      capwapBaseWirelessBindingType                 INTEGER
    }

capwapBaseWirelessBindingRadioId OBJECT-TYPE
    SYNTAX      CapwapBaseRadioIdTC
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the identifier of a PHY radio on a WTP, which
         is required to be unique on a WTP.
         For example, WTP A and WTP B use a same value of
         capwapBaseWirelessBindingRadioId for their first radio."
    REFERENCE
        "Section 4.3 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWirelessBindingEntry 1 }

capwapBaseWirelessBindingVirtualRadioIfIndex OBJECT-TYPE
    SYNTAX      InterfaceIndex
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the index value that uniquely identifies a
         WLAN Virtual Radio Interface.  The interface identified by
         a particular value of this index is the same interface as
         identified by the same value of the ifIndex.
         Before WTPs contact the AC to get configuration,
         the operator configures WTP profiles for them.
         The creation of a WTP profile triggers the system to
         automatically create a specific number of WTP Virtual Radio
         Interfaces and add a new row object in the
         capwapBaseWirelessBindingTable without manual intervention.
         As most MIB modules use the ifIndex to identify an interface
         for configuration and statistical data (for example, the IEEE
         802.11 MIB module [IEEE.802-11.2007]), it will be easy to
         reuse other wireless binding MIB modules through the WTP
         Virtual Radio Interface in the Centralized WLAN
         Architecture."
    ::= { capwapBaseWirelessBindingEntry 2 }

capwapBaseWirelessBindingType OBJECT-TYPE
    SYNTAX      INTEGER {
                  dot11(1),
                  epc(3)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the wireless binding type for the radio.
         The following enumerated values are supported:
           dot11(1) - IEEE 802.11
           epc(3)   - EPCGlobal"
    REFERENCE
        "Section 4.3 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWirelessBindingEntry 3 }

-- End of capwapBaseWirelessBindingTable Table


-- capwapBaseStationTable Table

capwapBaseStationTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseStationEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that display stations that are accessing
         the wireless service provided by the AC."
    REFERENCE
        "Section 4.6.8 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtps 5 }

capwapBaseStationEntry OBJECT-TYPE
    SYNTAX      CapwapBaseStationEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays a station that is
         associated with the specific radio on the WTP.
         Note that in some cases such as roaming that a station may
         simultaneously associate with two WTPs for some (short) time.
         The MIB implementation MUST ensure there is only one valid
         and meaningful entry for a specific station."
    INDEX { capwapBaseStationId }
    ::= { capwapBaseStationTable 1 }

CapwapBaseStationEntry ::= SEQUENCE {
      capwapBaseStationId            CapwapBaseStationIdTC,
      capwapBaseStationWtpId         CapwapBaseWtpIdTC,
      capwapBaseStationWtpRadioId    CapwapBaseRadioIdTC,
      capwapBaseStationAddedTime     DateAndTime,
      capwapBaseStationVlanName      SnmpAdminString
    }

capwapBaseStationId OBJECT-TYPE
    SYNTAX      CapwapBaseStationIdTC
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of the station."
    REFERENCE
        "Section 4.6.8 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStationEntry 1 }

capwapBaseStationWtpId OBJECT-TYPE
    SYNTAX      CapwapBaseWtpIdTC
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP in running state."
    ::= { capwapBaseStationEntry 2 }

capwapBaseStationWtpRadioId OBJECT-TYPE
    SYNTAX      CapwapBaseRadioIdTC
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the identifier of a PHY radio on a WTP, which
         is required to be unique on a WTP.
         For example, WTP A and WTP B use a same value of
         capwapBaseStationWtpRadioId for their first radio."
    REFERENCE
        "Section 4.3 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStationEntry 3 }

capwapBaseStationAddedTime OBJECT-TYPE
    SYNTAX      DateAndTime
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the time when the station is added."
    REFERENCE
        "Section 4.6.8 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStationEntry 4 }

capwapBaseStationVlanName OBJECT-TYPE
    SYNTAX      SnmpAdminString (SIZE(0..32))
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents VLAN name to which the station is associated."
    REFERENCE

        "Section 4.6.8 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStationEntry 5 }

-- End of capwapBaseStationTable Table


--  capwapBaseWtpEventsStatsTable

capwapBaseWtpEventsStatsTable  OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseWtpEventsStatsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that display the WTPs' events statistics."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtps 6 }

capwapBaseWtpEventsStatsEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseWtpEventsStatsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays the events statistics
         of a WTP."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    INDEX { capwapBaseWtpCurrId }
    ::= { capwapBaseWtpEventsStatsTable 1 }

CapwapBaseWtpEventsStatsEntry ::= SEQUENCE {
      capwapBaseWtpEventsStatsRebootCount            Counter32,
      capwapBaseWtpEventsStatsInitCount              Counter32,
      capwapBaseWtpEventsStatsLinkFailureCount       Counter32,
      capwapBaseWtpEventsStatsSwFailureCount         Counter32,
      capwapBaseWtpEventsStatsHwFailureCount         Counter32,
      capwapBaseWtpEventsStatsOtherFailureCount      Counter32,
      capwapBaseWtpEventsStatsUnknownFailureCount    Counter32,
      capwapBaseWtpEventsStatsLastFailureType        INTEGER
    }

capwapBaseWtpEventsStatsRebootCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of reboots that have occurred due to a
         WTP crash.

         Note that the CAPWAP field [RFC5415] modeled by this counter
         takes the value 65535 to indicate that the information is not
         available on the WTP.  This MIB object does not follow this
         behavior, which would not be standard in SMIv2.  If the WTP
         does not have the information, the agent will not instantiate
         the object."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 1 }

capwapBaseWtpEventsStatsInitCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of reboots that have occurred at the
         request of a CAPWAP protocol message, such as a change in
         configuration that requires a reboot or an explicit CAPWAP
         protocol reset request.
         Note that the CAPWAP field [RFC5415] modeled by this counter
         takes the value 65535 to indicate that the information is not
         available on the WTP.  This MIB object does not follow this
         behavior, which would not be standard in SMIv2.  If the WTP
         does not have the information, the agent will not instantiate
         the object."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 2 }

Okay so the WTP failure stats are where things get juicy 💅 This first one counts how many times a CAPWAP connection with an AC dropped because of a link failure 🔗

capwapBaseWtpEventsStatsLinkFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that a CAPWAP protocol
         connection with an AC has failed due to link failures."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 3 }

capwapBaseWtpEventsStatsSwFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that a CAPWAP protocol
         connection with an AC has failed due to software-related
         reasons."

    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 4 }

capwapBaseWtpEventsStatsHwFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that a CAPWAP protocol
         connection with an AC has failed due to hardware-related
         reasons."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 5 }

capwapBaseWtpEventsStatsOtherFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that a CAPWAP protocol
         connection with an AC has failed due to known reasons, other
         than the AC-initiated, link, software or hardware failures."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 6 }

capwapBaseWtpEventsStatsUnknownFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that a CAPWAP protocol
         connection with an AC has failed for unknown reasons."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 7 }

capwapBaseWtpEventsStatsLastFailureType OBJECT-TYPE
    SYNTAX      INTEGER {
                  unsupported(0),
                  acInit(1),
                  linkFailure(2),
                  swFailure(3),
                  hwFailure(4),
                  otherFailure(5),
                  unknown(255)

                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the failure type of the most recent WTP failure.
         The following enumerated values are supported:
           unsupported(0)  - Not supported
           acInit(1)       - The AC initiated
           linkFailure(2)  - Link failure
           swFailure(3)    - Software failure
           hwFailure(4)    - Hardware failure
           otherFailure(5) - Other failure
           unknown(255)    - Unknown (e.g., WTP doesn't keep track
                             of info)
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object
         follows that rule."
    REFERENCE
        "Section 4.6.47 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtpEventsStatsEntry 8 }

--  End of capwapBaseWtpEventsStatsTable table


--  capwapBaseRadioEventsStatsTable table

capwapBaseRadioEventsStatsTable  OBJECT-TYPE
    SYNTAX      SEQUENCE OF CapwapBaseRadioEventsStatsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A table of objects that display statistics on the radios'
         behaviors and reasons why the WTP radio has been reset.
         To get the events statistics of all radios on a specific WTP
         (identified by the capwapBaseWtpCurrId), a query
         operation SHOULD run from radio ID 1 to radio ID 31 until there
         is no data returned.  The radio ID here corresponds to the
         object capwapBaseRadioEventsWtpRadioId.  If the previous MIB
         operations such as query on the capwapBaseWirelessBindingTable
         know the exact value of each radio ID, the query operation on
         the capwapBaseRadioEventsStatsTable could use that value
         of Radio IDs."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseWtps 7 }

capwapBaseRadioEventsStatsEntry  OBJECT-TYPE
    SYNTAX      CapwapBaseRadioEventsStatsEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
        "A set of objects that displays the statistical data of
         events that happened on a specific radio of a WTP."
    INDEX { capwapBaseWtpCurrId, capwapBaseRadioEventsWtpRadioId }
    ::= { capwapBaseRadioEventsStatsTable 1 }

CapwapBaseRadioEventsStatsEntry ::= SEQUENCE {
      capwapBaseRadioEventsWtpRadioId             CapwapBaseRadioIdTC,
      capwapBaseRadioEventsStatsResetCount             Counter32,
      capwapBaseRadioEventsStatsSwFailureCount         Counter32,
      capwapBaseRadioEventsStatsHwFailureCount         Counter32,
      capwapBaseRadioEventsStatsOtherFailureCount      Counter32,
      capwapBaseRadioEventsStatsUnknownFailureCount    Counter32,
      capwapBaseRadioEventsStatsConfigUpdateCount      Counter32,
      capwapBaseRadioEventsStatsChannelChangeCount     Counter32,
      capwapBaseRadioEventsStatsBandChangeCount        Counter32,
      capwapBaseRadioEventsStatsCurrNoiseFloor         Integer32,
      capwapBaseRadioEventsStatsDecryptErrorCount      Counter32,
      capwapBaseRadioEventsStatsLastFailureType        INTEGER
    }

capwapBaseRadioEventsWtpRadioId OBJECT-TYPE
     SYNTAX      CapwapBaseRadioIdTC
     MAX-ACCESS  not-accessible
     STATUS      current
     DESCRIPTION
         "Represents the identifier of a PHY radio on a WTP, which
          is required to be unique on a WTP.
          For example, WTP A and WTP B use the same value of
          capwapBaseRadioEventsWtpRadioId for their first radio."
     REFERENCE
         "Section 4.3 of CAPWAP Protocol Specification, RFC 5415."
     ::= { capwapBaseRadioEventsStatsEntry 1 }

capwapBaseRadioEventsStatsResetCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has been
         reset."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 2 }

capwapBaseRadioEventsStatsSwFailureCount OBJECT-TYPE

    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has failed due
         to software-related reasons."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 3 }

capwapBaseRadioEventsStatsHwFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has failed due
         to hardware-related reasons."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 4 }

capwapBaseRadioEventsStatsOtherFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has failed due to
         known reasons, other than software or hardware failure."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 5 }

capwapBaseRadioEventsStatsUnknownFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has failed for
         unknown reasons."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 6 }

capwapBaseRadioEventsStatsConfigUpdateCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION

        "Represents the number of times that the radio configuration has
         been updated."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 7 }

capwapBaseRadioEventsStatsChannelChangeCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio channel has
         been changed."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 8 }

capwapBaseRadioEventsStatsBandChangeCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of times that the radio has changed
         frequency bands."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 9 }

capwapBaseRadioEventsStatsCurrNoiseFloor OBJECT-TYPE
    SYNTAX      Integer32
    UNITS       "dBm"
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the noise floor of the radio receiver in units of
         dBm."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 10 }

capwapBaseRadioEventsStatsDecryptErrorCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of decryption errors that have occurred
         on the WTP.  Note that this field is only valid in cases where
         the WTP provides encryption/decryption services."

    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 11 }

capwapBaseRadioEventsStatsLastFailureType OBJECT-TYPE
    SYNTAX      INTEGER {
                  unsupported(0),
                  swFailure(1),
                  hwFailure(2),
                  otherFailure(3),
                  unknown(255)
                }
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the failure type of the most recent radio failure.
         The following enumerated values are supported:
           unsupported(0)  - Not supported
           swFailure(1)    - Software failure
           hwFailure(2)    - Hardware failure
           otherFailure(3) - Other failure
           unknown(255)    - Unknown
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object follows
         that rule."
    REFERENCE
        "Section 4.6.46 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseRadioEventsStatsEntry 12 }

--  End of capwapBaseRadioEventsStatsTable table

-- End of WTP Objects Group


-- CAPWAP Base Parameters Group

capwapBaseParameters OBJECT IDENTIFIER
    ::= { capwapBaseObjects 3 }

capwapBaseAcMaxRetransmit OBJECT-TYPE
    SYNTAX      Unsigned32
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum number of retransmissions for a given
         CAPWAP packet before the link layer considers the peer dead.
         The value of the object is persistent at restart/reboot."
    REFERENCE

        "Section 4.8.7 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 5 }
    ::= { capwapBaseParameters 1 }

That's the end of the WTP failure stats, and the radio stats are next 🦋✨

Okay bestie, the AC timers are next, and they're all about how long things get to wait 💅⏱️

capwapBaseAcChangeStatePendingTimer OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum time, in seconds, the AC will wait
         for the Change State Event Request from the WTP after having
         transmitted a successful Configuration Status Response
         message.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.1 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 25 }
    ::= { capwapBaseParameters 2 }

capwapBaseAcDataCheckTimer OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents The number of seconds the AC will wait for
         the Data Channel Keep Alive, which is required by the
         CAPWAP state machine's Data Check state.
         The AC resets the state machine if this timer expires
         prior to transitioning to the next state.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.4 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 30 }
    ::= { capwapBaseParameters 3 }

capwapBaseAcDTLSSessionDeleteTimer OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the minimum time, in seconds, the AC MUST wait
         for DTLS session deletion.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.6 of CAPWAP Protocol Specification, RFC 5415."

    DEFVAL { 5 }
    ::= { capwapBaseParameters 4 }

capwapBaseAcEchoInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the minimum time, in seconds, between sending Echo
         Request messages to the AC with which the WTP has joined.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.7 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 30 }
    ::= { capwapBaseParameters 5 }

capwapBaseAcRetransmitInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the minimum time, in seconds, in which a
         non-acknowledged CAPWAP packet will be retransmitted.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.12 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 3 }
    ::= { capwapBaseParameters 6 }

capwapBaseAcSilentInterval OBJECT-TYPE
    SYNTAX      Unsigned32
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the minimum time, in seconds, during which the AC
         SHOULD ignore all CAPWAP and DTLS packets received from the
         WTP that is in the Sulking state.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.13 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 30 }
    ::= { capwapBaseParameters 7 }

capwapBaseAcWaitDTLSTimer OBJECT-TYPE
    SYNTAX      Unsigned32 (30..4294967295)
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum time, in seconds, the AC MUST wait
         without having received a DTLS Handshake message from an AC.
         This timer MUST be greater than 30 seconds.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.15 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 60 }
    ::= { capwapBaseParameters 8 }

capwapBaseAcWaitJoinTimer OBJECT-TYPE
    SYNTAX      Unsigned32 (20..4294967295)
    UNITS       "second"
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the maximum time, in seconds, the AC will wait
         after the DTLS session has been established until it receives
         the Join Request from the WTP.  This timer MUST be greater
         than 20 seconds.
         The value of the object is persistent at restart/reboot."
    REFERENCE
        "Section 4.7.16 of CAPWAP Protocol Specification, RFC 5415."
    DEFVAL { 60 }
    ::= { capwapBaseParameters 9 }

capwapBaseAcEcnSupport OBJECT-TYPE
    SYNTAX      INTEGER {
                  limited(0),
                  fullAndLimited(1)
                }
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents the support for the Explicit Congestion Notification
         (ECN) bits, as defined in [RFC3168].
         The value of the object is persistent at restart/reboot.
         The following enumerated values are supported:
           limited(0)        - Limited ECN support
           fullAndLimited(1) - Full and limited ECN support
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object follows
         that rule."
    REFERENCE
        "Section 4.6.25 of CAPWAP Protocol Specification, RFC 5415."

    ::= { capwapBaseParameters 10 }

-- End of CAPWAP Base Parameters Group


-- CAPWAP Statistics Group

capwapBaseStats OBJECT IDENTIFIER
    ::= { capwapBaseObjects 4 }

capwapBaseFailedDTLSAuthFailureCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of failed DTLS session establishment
         attempts due to authentication failures."
    REFERENCE
        "Section 4.8.3 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStats 1 }

capwapBaseFailedDTLSSessionCount OBJECT-TYPE
    SYNTAX      Counter32
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION
        "Represents the number of failed DTLS session
         establishment attempts."
    REFERENCE
        "Section 4.8.4 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseStats 2 }

-- Notifications

capwapBaseChannelUp NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfChannelType,
                  capwapBaseNtfAuthenMethod
                }
    STATUS      current
    DESCRIPTION
        "This notification is sent by the AC when a CAPWAP channel
         is established.
         The notification is separated for data or control channel."
    ::= { capwapBaseNotifications 1 }

capwapBaseChannelDown NOTIFICATION-TYPE

    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfChannelType,
                  capwapBaseNtfChannelDownReason
                }
    STATUS      current
    DESCRIPTION
        "This notification is sent by the AC when a CAPWAP channel
         is down.
         The notification is separated for data or control channel."
    ::= { capwapBaseNotifications 2 }

capwapBaseDecryptErrorReport NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfRadioId,
                  capwapBaseNtfStationIdList
                }
    STATUS      current
    DESCRIPTION
        "This notification is generated when a WTP has had a
         decryption error since the last report."
    REFERENCE
        "Section 4.6.17 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifications 3 }

capwapBaseJoinFailure NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfJoinFailureReason
                }
    STATUS      current
    DESCRIPTION
        "This notification is generated when a WTP fails to join."
    REFERENCE
        "Section 4.6.35 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifications 4 }

capwapBaseImageUpgradeFailure NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfImageFailureReason
                }
    STATUS      current
    DESCRIPTION
        "This notification is generated when a WTP fails to update
         the firmware image."
    REFERENCE

        "Section 4.6.35 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifications 5 }

capwapBaseConfigMsgError NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfConfigMsgErrorType,
                  capwapBaseNtfMsgErrorElements
                }
    STATUS      current
    DESCRIPTION
        "This notification is generated when a WTP receives message
         elements in the configuration management messages that it
         is unable to apply locally."
    REFERENCE
        "Section 4.6.35 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifications 6 }

capwapBaseRadioOperableStatus NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfRadioId,
                  capwapBaseNtfRadioOperStatusFlag,
                  capwapBaseNtfRadioStatusCause
                }
    STATUS      current
    DESCRIPTION
        "The notification is generated when a radio's operational state
         has changed."
    REFERENCE
        "Section 4.6.34 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifications 7 }

capwapBaseAuthenFailure NOTIFICATION-TYPE
    OBJECTS     {
                  capwapBaseNtfWtpId,
                  capwapBaseNtfChannelType,
                  capwapBaseNtfAuthenMethod,
                  capwapBaseNtfAuthenFailureReason
                }
    STATUS      current
    DESCRIPTION
        "This is notification of an authentication failure event
         and provides the reason for it."
    ::= { capwapBaseNotifications 8 }

-- Objects used only in notifications
-- Notification Objects
capwapBaseNotifyVarObjects OBJECT IDENTIFIER
    ::= { capwapBaseObjects 5 }

capwapBaseNtfWtpId OBJECT-TYPE
    SYNTAX      CapwapBaseWtpIdTC
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the unique identifier of a WTP."
    ::= { capwapBaseNotifyVarObjects 1 }

capwapBaseNtfRadioId OBJECT-TYPE
    SYNTAX      CapwapBaseRadioIdTC
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the identifier of a PHY radio on a WTP, which is
         only required to be unique on a WTP.
         For example, WTP A and WTP B can use the same value of
         capwapBaseNtfRadioId for their first radio."
    REFERENCE
        "Section 4.3 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 2 }

capwapBaseNtfChannelType OBJECT-TYPE
    SYNTAX      CapwapBaseChannelTypeTC
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the channel type for the CAPWAP protocol."
    ::= { capwapBaseNotifyVarObjects 3 }

capwapBaseNtfAuthenMethod OBJECT-TYPE
    SYNTAX      CapwapBaseAuthenMethodTC
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the authentication method for the CAPWAP Channel."
    ::= { capwapBaseNotifyVarObjects 4 }

Okay bestie, we're picking up right where the notification objects left off 🦋 First up is the reason a channel went down, which is basically the "why did we get disconnected" field 💀

capwapBaseNtfChannelDownReason OBJECT-TYPE
    SYNTAX      INTEGER {
                  timeout(1),
                  rekeyFailure(2),
                  acRebootWtp(3),
                  dtlsError(4),
                  maxRetransmit(5)

                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the reason the channel is down.
         The following enumerated values are supported:
           timeout(1)       - The keepalive timed out
           rekeyFailure(2)  - Rekey process failed; channel will be
                              broken
           acRebootWtp(3)   - The AC rebooted the WTP
           dtlsError(4)     - DTLS notifications: DTLSAborted,
                              DTLSReassemblyFailure, DTLSPeerDisconnect,
                              or frequent DTLSDecapFailure
           maxRetransmit(5) - The underlying reliable transport's
                              RetransmitCount counter has reached the
                              MaxRetransmit variable"
    ::= { capwapBaseNotifyVarObjects 5 }

Next up is the station list 👑 It's a bunch of station MAC addresses all mashed together with semicolons, so it's giving group chat roster 🌸

capwapBaseNtfStationIdList OBJECT-TYPE
    SYNTAX      LongUtf8String (SIZE (6..1024))
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents a list of station MAC addresses separated by
         semicolons."
    REFERENCE
        "Section 4.6.17 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 6 }

Now the reason an authentication failed 🙈 This one has a whole menu, including a "we have no clue" option (unknown(8)). Notice there's no 7 in the list, so don't go looking for it 🧚

capwapBaseNtfAuthenFailureReason OBJECT-TYPE
    SYNTAX      INTEGER {
                  keyMismatch(1),
                  invalidCert(2),
                  reassemblyFailure(3),
                  decapFailure(4),
                  encapFailure(5),
                  timeout(6),
                  unknown(8)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the reason for WTP authorization failure.
         The following enumerated values are supported:
           keyMismatch(1)       - WTP's and AC's keys did not match
           invalidCert(2)       - Certification is not valid
           reassemblyFailure(3) - Fragment reassembly failure
           decapFailure(4)      - Decapsulation error
           encapFailure(5)      - Encapsulation error
           timeout(6)           - WaitDTLS timer timeout
           unknown(8)           - Unknown reason"
    REFERENCE
        "Section 2.3.1 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 7 }

Next is whether a radio is operable 📡 It's a yes/no switch, and if it's a no, the next object explains the reason 💅

capwapBaseNtfRadioOperStatusFlag OBJECT-TYPE
    SYNTAX      INTEGER {
                  operable(0),
                  inoperable(1)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the operation status of a radio.
         The following enumerated values are supported:
           operable(0)   - The radio is operable
           inoperable(1) - The radio is inoperable, and the
                           capwapBaseNtfRadioStatusCause object
                           gives the reason in detail
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object
         follows that rule."
    REFERENCE
        "Section 4.6.34 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 8 }

Here's the detailed "why" for the radio being out of service ✨ Note that this one also counts from zero, same as the CAPWAP field it models 🫶

capwapBaseNtfRadioStatusCause OBJECT-TYPE
    SYNTAX      INTEGER {
                  normal(0),
                  hwError(1),
                  swError(2),
                  adminSet(3)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the reason why the radio is out of service.
         The following enumerated values are supported:
           normal(0)   - Normal status
           hwError(1)  - Radio failure
           swError(2)  - Software failure
           adminSet(3) - Administratively set
         Note that the CAPWAP field [RFC5415] modeled by this
         object takes zero as starting value; this MIB object
         follows that rule."
    REFERENCE

        "Section 4.6.34 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 9 }

Next is why a join failed 🚪 Spoiler: the list starts at 1 here, not 0, so keep your eyes open 👀

capwapBaseNtfJoinFailureReason  OBJECT-TYPE
    SYNTAX      INTEGER {
                  unspecified(1),
                  resDepletion(2),
                  unknownSource(3),
                  incorrectData(4),
                  sessionIdInUse(5),
                  unsupportedHw(6),
                  unsupportedBinding(7)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the reason of join failure.
         The following enumerated values are supported:
           unspecified(1)        - Unspecified failure
           resDepletion(2)       - Resource depletion
           unknownSource(3)      - Unknown source
           incorrectData(4)      - Incorrect data
           sessionIdInUse(5)     - Session ID already in use
           unsupportedHw(6)      - WTP hardware not supported
           unsupportedBinding(7) - Binding not supported"
    REFERENCE
        "Section 4.6.35 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 10 }

Next up is image failure reasons 💾 Same deal: the menu starts at 1 🌈

capwapBaseNtfImageFailureReason  OBJECT-TYPE
    SYNTAX      INTEGER {
                  invalidChecksum(1),
                  invalidLength(2),
                  other(3),
                  inStorage(4)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the reason of image failure.
         The following enumerated values are supported:
           invalidChecksum(1) - Invalid checksum
           invalidLength(2)   - Invalid data length
           other(3)           - Other error
           inStorage(4)       - Image already present"
    REFERENCE
        "Section 4.6.35 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 11 }

Next is the type of configuration message error 🛠️

capwapBaseNtfConfigMsgErrorType  OBJECT-TYPE
    SYNTAX      INTEGER {
                  unknownElement(1),
                  unsupportedElement(2),
                  unknownValue(3),
                  unsupportedValue(4)
                }
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the type of configuration message error.
         The following enumerated values are supported:
           unknownElement(1)     - Unknown message element
           unsupportedElement(2) - Unsupported message element
           unknownValue(3)       - Unknown message element value
           unsupportedValue(4)   - Unsupported message element value"
    REFERENCE
        "Section 4.6.36 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 12 }

And the last notification object is the list of message elements that caused the error 🧾

capwapBaseNtfMsgErrorElements  OBJECT-TYPE
    SYNTAX      SnmpAdminString
    MAX-ACCESS  accessible-for-notify
    STATUS      current
    DESCRIPTION
        "Represents the message elements sent by the AC in the
         Configuration Status Response message that caused the error."
    REFERENCE
        "Section 4.6.36 of CAPWAP Protocol Specification, RFC 5415."
    ::= { capwapBaseNotifyVarObjects 13 }

Now we get to the notification control objects 🎛️ These are the on/off switches for each notification. Heads up, some default to true and some default to false, so read the DEFVAL lines carefully 🙈

-- Notification Control
capwapBaseNotifyControlObjects OBJECT IDENTIFIER
    ::= { capwapBaseObjects 6 }

capwapBaseChannelUpDownNotifyEnable  OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the Channel Up / Channel Down notification
         should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { false }
    ::= { capwapBaseNotifyControlObjects 1 }

capwapBaseDecryptErrorNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the decryption error notification should
         be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { true }
    ::= { capwapBaseNotifyControlObjects 2 }

capwapBaseJoinFailureNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the notification of a WTP join failure
         should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { true }
    ::= { capwapBaseNotifyControlObjects 3 }

capwapBaseImageUpgradeFailureNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the notification of a WTP image upgrade
         failure should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { true }
    ::= { capwapBaseNotifyControlObjects 4 }

capwapBaseConfigMsgErrorNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the notification of configuration message
         error should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.

         The value of the object is persistent at restart/reboot."
    DEFVAL { false }
    ::= { capwapBaseNotifyControlObjects 5 }

capwapBaseRadioOperableStatusNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the notification of a radio's operational
         state change should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { false }
    ::= { capwapBaseNotifyControlObjects 6 }

capwapBaseAuthenFailureNotifyEnable OBJECT-TYPE
    SYNTAX      TruthValue
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Represents whether the notification of authentication failure
         should be generated.
         A value of true(1) means that the notification is enabled.
         A value of false(2) means that the notification is disabled.
         The value of the object is persistent at restart/reboot."
    DEFVAL { true }
    ::= { capwapBaseNotifyControlObjects 7 }

Last stop for this part: the compliance and group containers 📚 These are just the empty buckets that the compliance statements and object groups get filed into later 🧺

-- Module compliance

capwapBaseCompliances OBJECT IDENTIFIER
    ::= { capwapBaseConformance 1 }

capwapBaseGroups OBJECT IDENTIFIER
    ::= { capwapBaseConformance 2 }

okay bestie, we're picking up right where the compliance stuff starts 💖 this part is all about which groups an implementation MUST have and which ones are optional, so pay attention 👀

capwapBaseCompliance MODULE-COMPLIANCE
    STATUS current
    DESCRIPTION
       "Describes the requirements for conformance to the
        CAPWAP-BASE-MIB module."

    MODULE IF-MIB -- The Interfaces MIB, RFC 2863
    MANDATORY-GROUPS {
       ifGeneralInformationGroup
    }
    MODULE -- this module
     MANDATORY-GROUPS {
       capwapBaseAcNodeGroup,
       capwapBaseWtpProfileGroup,
       capwapBaseWtpStateGroup,
       capwapBaseWtpGroup,
       capwapBaseRadioGroup,
       capwapBaseStationGroup
     }

     GROUP capwapBaseAcNodeGroup2
     DESCRIPTION
         "The capwapBaseAcNodeGroup2 group is optional."

     GROUP capwapBaseAcNameListGroup
     DESCRIPTION
         "The capwapBaseAcNameListGroup group is optional."

     GROUP capwapBaseMacAclsGroup
     DESCRIPTION
         "The capwapBaseMacAclsGroup group is optional."

     GROUP capwapBaseWtpProfileGroup2
     DESCRIPTION
         "The capwapBaseWtpProfileGroup2 group is optional."

     GROUP capwapBaseWtpGroup2
     DESCRIPTION
         "The capwapBaseWtpGroup2 group is optional."

     GROUP capwapBaseWtpEventsStatsGroup
     DESCRIPTION
         "The capwapBaseWtpEventsStatsGroup group is optional."

     GROUP capwapBaseRadioEventsStatsGroup
     DESCRIPTION
         "The capwapBaseRadioEventsStatsGroup group is optional."

     GROUP capwapBaseParametersGroup
     DESCRIPTION
         "The capwapBaseParametersGroup group is optional."

     GROUP capwapBaseStatsGroup
     DESCRIPTION
         "The capwapBaseStatsGroup group is optional."

     GROUP capwapBaseNotificationsGroup
     DESCRIPTION

          "The capwapBaseNotificationsGroup group is optional."

     GROUP capwapBaseNotifyVarsGroup
     DESCRIPTION
         "The capwapBaseNotifyVarsGroup group is optional.
          If capwapBaseNotificationsGroup is supported,
          this group must be implemented."

     GROUP capwapBaseNotifyControlGroup
     DESCRIPTION
        "The capwapBaseNotifyControlGroup group is optional.
         If capwapBaseNotificationsGroup is supported,
         this group must be implemented."
     ::= { capwapBaseCompliances 1 }

capwapBaseAcNodeGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpSessions,
      capwapBaseWtpSessionsLimit,
      capwapBaseStationSessions,
      capwapBaseStationSessionsLimit
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the basic properties of the AC from the CAPWAP
         protocol perspective."
    ::= { capwapBaseGroups 1 }

capwapBaseAcNodeGroup2   OBJECT-GROUP
    OBJECTS {
      capwapBaseDataChannelDTLSPolicyOptions,
      capwapBaseControlChannelAuthenOptions
     }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the other properties (such as security) of the AC from
         the CAPWAP protocol perspective."
    ::= { capwapBaseGroups 2 }

capwapBaseAcNameListGroup  OBJECT-GROUP
    OBJECTS {
      capwapBaseAcNameListName,
      capwapBaseAcNameListPriority,
      capwapBaseAcNameListRowStatus
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to configure
         the AC name list."
    ::= { capwapBaseGroups 3 }

capwapBaseMacAclsGroup  OBJECT-GROUP
    OBJECTS {
      capwapBaseMacAclStationId,
      capwapBaseMacAclRowStatus
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to configure
         the stations ACL."
    ::= { capwapBaseGroups 4 }

capwapBaseWtpProfileGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpProfileName,
      capwapBaseWtpProfileWtpMacAddress,
      capwapBaseWtpProfileWtpModelNumber,
      capwapBaseWtpProfileWtpName,
      capwapBaseWtpProfileWtpLocation,
      capwapBaseWtpProfileRowStatus
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to configure
         the WTP profile."
    ::= { capwapBaseGroups 5 }

capwapBaseWtpProfileGroup2    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpProfileWtpStaticIpEnable,
      capwapBaseWtpProfileWtpStaticIpType,
      capwapBaseWtpProfileWtpStaticIpAddress,
      capwapBaseWtpProfileWtpNetmask,
      capwapBaseWtpProfileWtpGateway,
      capwapBaseWtpProfileWtpFallbackEnable,
      capwapBaseWtpProfileWtpEchoInterval,
      capwapBaseWtpProfileWtpIdleTimeout,
      capwapBaseWtpProfileWtpMaxDiscoveryInterval,
      capwapBaseWtpProfileWtpReportInterval,
      capwapBaseWtpProfileWtpStatisticsTimer,
      capwapBaseWtpProfileWtpEcnSupport
    }
    STATUS  current
    DESCRIPTION

        "A collection of optional objects that is used to
         configure the WTP profile."
    ::= { capwapBaseGroups 6 }

capwapBaseWtpStateGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpStateWtpIpAddressType,
      capwapBaseWtpStateWtpIpAddress,
      capwapBaseWtpStateWtpLocalIpAddressType,
      capwapBaseWtpStateWtpLocalIpAddress,
      capwapBaseWtpStateWtpBaseMacAddress,
      capwapBaseWtpState,
      capwapBaseWtpStateWtpUpTime,
      capwapBaseWtpStateWtpCurrWtpProfileId
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the WTP's state information."
    ::= { capwapBaseGroups 7 }

capwapBaseWtpGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpBaseMacAddress,
      capwapBaseWtpTunnelModeOptions,
      capwapBaseWtpMacTypeOptions,
      capwapBaseWtpDiscoveryType,
      capwapBaseWtpRadiosInUseNum,
      capwapBaseWtpRadioNumLimit
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the properties information for the WTPs in running state."
    ::= { capwapBaseGroups 8 }

capwapBaseWtpGroup2   OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpPhyIndex,
      capwapBaseWtpRetransmitCount
    }
    STATUS  current
    DESCRIPTION
        "A collection of optional objects that is used to represent
         the properties of the WTPs in running state."
    ::= { capwapBaseGroups 9 }

capwapBaseRadioGroup    OBJECT-GROUP

    OBJECTS {
      capwapBaseWirelessBindingVirtualRadioIfIndex,
      capwapBaseWirelessBindingType
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the wireless binding type and the mappings between the
         ifIndexes of WLAN Virtual Radio Interfaces and PHY radios."
    ::= { capwapBaseGroups 10 }

capwapBaseStationGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseStationWtpId,
      capwapBaseStationWtpRadioId,
      capwapBaseStationAddedTime,
      capwapBaseStationVlanName
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used to represent
         the stations' basic properties."
    ::= { capwapBaseGroups 11 }

capwapBaseWtpEventsStatsGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseWtpEventsStatsRebootCount,
      capwapBaseWtpEventsStatsInitCount,
      capwapBaseWtpEventsStatsLinkFailureCount,
      capwapBaseWtpEventsStatsSwFailureCount,
      capwapBaseWtpEventsStatsHwFailureCount,
      capwapBaseWtpEventsStatsOtherFailureCount,
      capwapBaseWtpEventsStatsUnknownFailureCount,
      capwapBaseWtpEventsStatsLastFailureType
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used for collecting
         WTP reboot count, link failure count, hardware failure
         count, and so on."
    ::= { capwapBaseGroups 12 }

capwapBaseRadioEventsStatsGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseRadioEventsStatsResetCount,
      capwapBaseRadioEventsStatsSwFailureCount,
      capwapBaseRadioEventsStatsHwFailureCount,
      capwapBaseRadioEventsStatsOtherFailureCount,
      capwapBaseRadioEventsStatsUnknownFailureCount,
      capwapBaseRadioEventsStatsConfigUpdateCount,
      capwapBaseRadioEventsStatsChannelChangeCount,
      capwapBaseRadioEventsStatsBandChangeCount,
      capwapBaseRadioEventsStatsCurrNoiseFloor,
      capwapBaseRadioEventsStatsDecryptErrorCount,
      capwapBaseRadioEventsStatsLastFailureType
    }
    STATUS  current
    DESCRIPTION
        "A collection of objects that is used for collecting
         radio reset count, channel change count, hardware failure
         count, and so on"
    ::= { capwapBaseGroups 13 }

capwapBaseParametersGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseAcMaxRetransmit,
      capwapBaseAcChangeStatePendingTimer,
      capwapBaseAcDataCheckTimer,
      capwapBaseAcDTLSSessionDeleteTimer,
      capwapBaseAcEchoInterval,
      capwapBaseAcRetransmitInterval,
      capwapBaseAcSilentInterval,
      capwapBaseAcWaitDTLSTimer,
      capwapBaseAcWaitJoinTimer,
      capwapBaseAcEcnSupport
    }
    STATUS  current
    DESCRIPTION
        "Objects used for the CAPWAP protocol's parameters."
    ::= { capwapBaseGroups 14 }

capwapBaseStatsGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseFailedDTLSAuthFailureCount,
      capwapBaseFailedDTLSSessionCount
    }
    STATUS  current
    DESCRIPTION
        "Objects used for collecting the CAPWAP protocol's statistics."
    ::= { capwapBaseGroups 15 }

capwapBaseNotificationsGroup    NOTIFICATION-GROUP
    NOTIFICATIONS {
      capwapBaseChannelUp,
      capwapBaseChannelDown,
      capwapBaseDecryptErrorReport,
      capwapBaseJoinFailure,
      capwapBaseImageUpgradeFailure,
      capwapBaseConfigMsgError,
      capwapBaseRadioOperableStatus,
      capwapBaseAuthenFailure
    }
    STATUS  current
    DESCRIPTION
        "A collection of notifications in this MIB module."
    ::= { capwapBaseGroups 16 }

capwapBaseNotifyVarsGroup    OBJECT-GROUP
    OBJECTS {
      capwapBaseNtfWtpId,
      capwapBaseNtfRadioId,
      capwapBaseNtfChannelType,
      capwapBaseNtfAuthenMethod,
      capwapBaseNtfChannelDownReason,
      capwapBaseNtfStationIdList,
      capwapBaseNtfAuthenFailureReason,
      capwapBaseNtfRadioOperStatusFlag,
      capwapBaseNtfRadioStatusCause,
      capwapBaseNtfJoinFailureReason,
      capwapBaseNtfImageFailureReason,
      capwapBaseNtfConfigMsgErrorType,
      capwapBaseNtfMsgErrorElements
    }
    STATUS  current
    DESCRIPTION
        "Objects used for notifications."
    ::= { capwapBaseGroups 17 }

capwapBaseNotifyControlGroup OBJECT-GROUP
    OBJECTS {
      capwapBaseChannelUpDownNotifyEnable,
      capwapBaseDecryptErrorNotifyEnable,
      capwapBaseJoinFailureNotifyEnable,
      capwapBaseImageUpgradeFailureNotifyEnable,
      capwapBaseConfigMsgErrorNotifyEnable,
      capwapBaseRadioOperableStatusNotifyEnable,
      capwapBaseAuthenFailureNotifyEnable
   }
   STATUS  current
   DESCRIPTION
        "Objects used to enable or disable notifications."
   ::= { capwapBaseGroups 18 }

END

10. Security Considerations 🔐✨

Okay bestie, this part is SERIOUS 😭🔥. A bunch of the management objects in this MIB module have a MAX-ACCESS of read-write and/or read-create. Those objects MAY be considered sensitive or vulnerable in some network environments. SET operations in a non-secure environment, without proper protection, can seriously mess with network operations 💀. Here are the tables and objects and how sensitive or vulnerable each one is:

  • Unauthorized changes to the capwapBaseWtProfileTable and writable objects under capwapBaseAcs group MAY disrupt allocation of resources in the network. For example, a WTP's static IP address could be changed by setting the capwapBaseWtpProfileWtpStaticIpAddress object.
  • Unauthorized changes to writable objects under the capwapBaseAc group MAY disrupt allocation of resources in the network. For example, an invalid value for the capwapBaseWtpSessionsLimit object will increase the AC's traffic burden 😩.
  • Unauthorized changes to the capwapBaseMacAclTable MAY prevent legal stations from being able to access the network, while illegal stations are able to access it 🙃.
  • Unauthorized changes to writable objects under the capwapBaseParameters group MAY influence CAPWAP protocol behavior and status. For example, an invalid value set for the capwapBaseAcDataCheckTimer MAY influence the CAPWAP state machine 🌀.

Some of the readable objects in this MIB module (the ones with a MAX-ACCESS other than not-accessible) MAY be considered sensitive or vulnerable in some network environments. So it's important to control even GET and/or NOTIFY access to these objects, and possibly even encrypt their values when they're sent over the network via SNMP 🫶. Here are the tables and objects and their sensitivity/vulnerability:

  • The capwapBaseDataChannelDTLSPolicyOptions and capwapBaseControlChannelAuthenOptions under the capwapBaseAc group expose the current security option for CAPWAP data and control channels 👀.
  • The capwapBaseWtpTable exposes a WTP's important info, like tunnel mode, MAC type, and so on.
  • The capwapBaseWtpEventsStatsTable exposes a WTP's failure information.
  • The capwapBaseRadioEventsStatsTable exposes a radio's failure information.

SNMP versions before SNMPv3 did not include adequate security. Even if the network itself is secure (for example, by using IPsec), there's still no control over who on that secure network is allowed to access and GET/SET (read/change/create/delete) the objects in this MIB module. Lowkey scary, ngl 😭.

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

Further, deploying SNMP versions before SNMPv3 is NOT RECOMMENDED. Instead, it is RECOMMENDED to deploy SNMPv3 and enable cryptographic security. It's then a customer/operator responsibility to make sure the SNMP entity that gives access to an instance of this MIB module is properly configured, so that access to the objects is only given to the principals (users) who have legitimate rights to GET or SET (change/create/delete) them. Main character energy for the security team 👑💅.


11. IANA Considerations 🦋

11.1. IANA Considerations for CAPWAP-BASE-MIB Module

The MIB module in this document uses the following IANA-assigned OBJECT IDENTIFIER value, recorded in the SMI Numbers registry 🌸:

Descriptor     OBJECT IDENTIFIER value
----------     -----------------------
capwapBaseMIB  { mib-2 196 }

11.2. IANA Considerations for ifType

IANA has assigned the following ifType 🎀:

Decimal   Name                   Description
-------   ------------           -------------------------------
254       capwapWtpVirtualRadio  WTP Virtual Radio Interface

12. Contributors 🧚

This MIB module is based on contributions from Long Gao 💜.

13. Acknowledgements 🫶

Thanks to David Harrington, Dan Romascanu, Abhijit Choudhury, Bert Wijnen, and David L. Black for helpful comments on this document and for guiding some of the technical solutions. They're literally the best 😭✨.

The authors also thank the following friends and coworkers: Fei Fang, Xuebin Zhu, Hao Song, Yu Liu, Sachin Dutta, Ju Wang, Hao Wang, Yujin Zhao, Haitao Zhang, Xiansen Cai, and Xiaolan Wan 🥹💖.

14. References 📚

14.1. Normative References

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

[RFC2287]           Krupczak, C. and J. Saperia, "Definitions of
                    System-Level Managed Objects for Applications",
                    RFC 2287, February 1998.

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

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

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

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

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

[RFC3418]           Presuhn, R., "Management Information Base (MIB)
                    for the Simple Network Management Protocol
                    (SNMP)", STD 62, RFC 3418, December 2002.

[RFC4001]           Daniele, M., Haberman, B., Routhier, S., and J.
                    Schoenwaelder, "Textual Conventions for Internet
                    Network Addresses", RFC 4001, February 2005.

[RFC4133]           Bierman, A. and K. McCloghrie, "Entity MIB
                    (Version 3)", RFC 4133, August 2005.

[RFC5415]           Calhoun, P., Montemurro, M., and D. Stanley,
                    "Control And Provisioning of Wireless Access
                    Points (CAPWAP) Protocol Specification",
                    RFC 5415, March 2009.

14.2. Informative References

[Err1832]           RFC Errata, "Errata ID 1832", for RFC 5415,
                    <http://www.rfc-editor.org>.

[IEEE.802-11.2007]  "Information technology - Telecommunications and
                    information exchange between systems  - Local and
                    metropolitan area networks - Specific
                    requirements - Part 11: Wireless LAN Medium
                    Access Control (MAC) and Physical Layer (PHY)
                    specifications", IEEE Standard 802.11, 2007, <htt
                    p://standards.ieee.org/getieee802/download/
                    802.11-2007.pdf>.

[RFC3168]           Ramakrishnan, K., Floyd, S., and D. Black, "The
                    Addition of Explicit Congestion Notification
                    (ECN) to IP", RFC 3168, September 2001.

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

[RFC4118]           Yang, L., Zerfos, P., and E. Sadot, "Architecture
                    Taxonomy for Control and Provisioning of Wireless
                    Access Points (CAPWAP)", RFC 4118, June 2005.

[RFC4347]           Rescorla, E. and N. Modadugu, "Datagram Transport
                    Layer Security", RFC 4347, April 2006.

[RFC5416]           Calhoun, P., Montemurro, M., and D. Stanley,
                    "Control and Provisioning of Wireless Access
                    Points (CAPWAP) Protocol Binding for IEEE
                    802.11", RFC 5416, March 2009.

[RFC5834]           Shi, Y., Ed., Perkins, D., Ed., Elliott, C., Ed.,
                    and Y. Zhang, Ed., "Control and Provisioning of
                    Wireless Access Points (CAPWAP) Protocol Binding
                    MIB for IEEE 802.11", RFC 5834, May 2010.

Authors' Addresses 🎀

Yang Shi (editor)
Hangzhou H3C Tech. Co., Ltd.
Beijing R&D Center of H3C, Digital Technology Plaza
NO. 9 Shangdi 9th Street, Haidian District
Beijing  100085
China

Phone: +86 010 82775276
EMail: rishyang@gmail.com


David T. Perkins (editor)
228 Bayview Dr.
San Carlos, CA  94070
USA

Phone: +1 408 394-8702
EMail: dperkins@dsperkins.com


Chris Elliott (editor)
1516 Kent St.
Durham, NC  27707
USA

Phone: +1 919-308-1216
EMail: chelliot@pobox.com


Yong Zhang (editor)
Fortinet, Inc.
1090 Kifer Road
Sunnyvale, CA  94086
USA

EMail: yzhang@fortinet.com
📦 where this page comes from