Cisco Wireless Troubleshooting Toolkit

A platform-implementation reference for engineers supporting Cisco's wireless portfolio — Catalyst 9800, Meraki, AireOS, Mobility Express, outdoor mesh, and location services. Each finding is marked by its level of confirmation, so documented behavior can be distinguished from inference that still requires validation through TAC or Bug Search.

How confidence is marked

Three statuses appear throughout this guide, next to every claim that isn't plain fact:

Documented — confirmed directly from a cited Cisco source: a config guide, a TAC troubleshooting doc, a DevNet reference, or Cisco Press.

Inference — a reasonable extrapolation from documented principles, not a verbatim Cisco statement.

Unconfirmed — a plausible hypothesis that couldn't be verified in this pass. Needs TAC, Bug Search, or further digging before you rely on it.

What this intentionally leaves out

This guide stays scoped to Cisco-platform implementation — not RF/802.11 theory. Channels, modulation, MIMO, spectrum analysis, and roaming fundamentals are CWNP's domain (CWNA/CWDP/CWNE), and this guide defers to it rather than duplicating it. It's also not a customer case tracker: the one case pattern included here has every identifying detail stripped out.

Related work — check internally first

This guide's scope overlaps with other internal Cisco efforts covering wireless troubleshooting methodology and ISE deployment/configuration guidance. Those are other engineers' internal projects and aren't detailed in this public document — check internally at Cisco before assuming this is the only resource on a given topic.

Troubleshoot by symptom

answer what you're seeing, land on the matching finding

This walks the same documented findings as the rest of the guide, just reached by symptom instead of by platform. Nothing here is a new claim — every stop links back to its full writeup and sources.

Wireless speed test

download, upload & latency, run from this device right now

This measures the throughput and latency this browser is actually getting right now — useful as a first data point before diving into any of the topics above. It can't see RSSI, channel, or PHY rate; a browser has no access to that layer on any OS. See Pulling your own connection details below the results for how to get that from the OS directly.

Download
—
Mbps
Upload
—
Mbps
Idle latency
—
ms
Jitter
—
ms

What this does and doesn't tell you

  • Download/upload — real throughput to a nearby Cloudflare edge node, over HTTPS, from this browser tab. It reflects the whole path: Wi-Fi link, LAN, router, and the ISP uplink — not Wi-Fi in isolation. A slow result here doesn't by itself tell you which hop is the bottleneck.
  • Idle latency/jitter — round-trip time and its variance to that same edge node, measured with the link otherwise quiet. High jitter with otherwise fine throughput is a classic sign of airtime contention or a congested channel, worth cross-checking against the QoS & voice/video section.
  • Loaded latency (bufferbloat) — the same latency measurement, taken again while the download and upload tests are actively saturating the link. The gap between idle and loaded latency is a real, well-known diagnostic: a large jump means something in the path (often a consumer router's own buffer, sometimes the AP itself) is queuing packets under load rather than dropping or prioritizing them. This matters directly for voice/video and gaming, which degrade from added latency long before raw throughput becomes the problem.
  • Connection detail (RTT, retransmits, packets lost) — these come from Cloudflare's own edge, reported back for the specific TCP connection this test used, via a Server-Timing response header their network stack sets. This is the server's measurement of that one connection, not a browser estimate layered on top — but it's one connection's data, not a long-run average, so treat a single bad reading as a prompt to re-run the test rather than a confirmed diagnosis.
  • Not measured, and not measurable from any browser on any OS: RSSI, SNR, channel, channel width, PHY mode (802.11n/ac/ax/be), MCS index, spatial streams, or negotiated Tx rate. Browsers deliberately have no API for this — it's an OS/driver privacy boundary, not a limitation of this page specifically. This page does not estimate or infer any of those values from throughput, latency, or any other number above — too many non-Wi-Fi factors (server distance, TCP window scaling, ISP congestion) affect those same numbers for a correlation to mean anything.

Pulling your own connection details

To get the radio-level detail a speed test can't show (what this looks like on a Mac, as an example):

PlatformHow
macOSOption-click the Wi-Fi icon in the menu bar — shows RSSI, noise, Tx rate, PHY mode, MCS index, channel, and security directly, no extra app needed.
Windowsnetsh wlan show interfaces in a terminal — signal %, channel, radio type, and transmit/receive rate.
iOSNo built-in detailed view; a third-party Wi-Fi analyzer app is required for RSSI/channel detail.
AndroidSettings > Wi-Fi > tap the connected network for signal strength and link speed; a Wi-Fi analyzer app for channel/band detail.
Cisco 9800 (network-side)show wireless client mac-address <mac> detail — gives the controller's own view of that client's RSSI, SNR, data rate, and PHY mode, independent of what the client itself reports.

Pulling a packet capture or crash/support bundle from the network side

inference — a browser cannot run a packet capture or reach into a remote device's filesystem; both are a flat OS/network-security boundary, not something this page can route around. The commands below run on the controller itself, over SSH/console — this page can't execute them for you, but it can save you from guessing the syntax.

Live packet capture (Embedded Packet Capture)

documented — confirmed Catalyst 9800 EPC syntax, verbatim from Cisco's own troubleshooting doc:

monitor capture uplink interface <interface> both
! optional: filter to specific traffic first
ip access-list extended CAPFILTER
 permit ip host <src-ip> host <dst-ip>
monitor capture uplink access-list CAPFILTER
monitor capture uplink buffer circular size 50
monitor capture uplink start
monitor capture uplink stop
monitor capture uplink export ftp://<server>/capture.pcap
no monitor capture uplink   ! remove the capture definition once done

Full support/crash bundle (the "give TAC everything" command)

documented, confirmed verbatim from Cisco's official Catalyst 9800 Command Reference — the wireless-specific TAC bundle:

show tech-support wireless                      ! full wireless bundle (no arguments)
show tech-support wireless ap                   ! AP-specific subset
show tech-support wireless client [mac-address <mac>]
show tech-support wireless mobility              ! mobility-tunnel-specific subset
show tech-support wireless datapath

On IOS-XE 17.15.1+, request tech-support (no arguments) is a documented convenience wrapper: it runs show tech-support internally and writes the combined output plus the system report to a single timestamped file on bootflash/flash — "this debug bundle file will have all the files included in the system report and latest show tech-support file." Cisco's own usage note: don't run this during an active crash or system-triggered switchover.

Actual crash/coredump artifacts

documented — a true crash file is a separate, specific artifact, not the general tech-support bundle above:

show ap crash-file                                              ! AP-side crash files
dir all | i crash                                                ! list crash files on the WLC
more bootflash:system-report*                                   ! view the auto-generated system report
copy bootflash:system-report-<timestamp>.tar.gz tftp:           ! copy it off-box

The system report is generated automatically by the controller when it crashes — there's no command to "create" one on demand outside of the request tech-support bundle above.

unconfirmed — request platform software trace archive last <N> {days|hours|minutes|seconds} target {bootflash:|flash:|...} is real and documented (IOS-XE 17.12.1+), but it archives platform/radioactive trace logs specifically, not a tech-support or crash bundle. Don't substitute it for show tech-support wireless when TAC asks for "the tech-support file" — it collects a different, narrower thing.

Sources

  • speed.cloudflare.com (public, CORS-open test endpoints — the same infrastructure speed.cloudflare.com's own UI uses)
  • speed.cloudflare.com's own edge response headers (Server-Timing: cfL4) — the source of the connection-detail numbers above, read directly from live responses, not from a published Cloudflare field-reference doc (none was found describing this specific header's field names)
  • developer.apple.com — Wi-Fi diagnostics menu-bar detail (Option-click)
  • learn.microsoft.com/windows-server/networking/technologies/netsh/netsh-wlan
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/213949-wireless-debugging-and-log-collection-on.html — EPC (monitor capture) syntax
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/command-reference/b_wireless_cr.html — show tech-support wireless, request tech-support (Cisco Catalyst 9800 Command Reference)
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/215523-quick-start-guide-on-what-logs-and-debug.html — show ap crash-file, system-report bundle

Channel & regulatory lookup

2.4 / 5 / 6 GHz channel-to-frequency, UNII bands, DFS, 6 GHz power modes

Pure reference, no network calls — channel/frequency math is a fixed IEEE formula, and band/DFS/regulatory membership is published FCC/ETSI/Cisco data. Type a channel number to see its frequency and band membership; the tables below cover the full picture for a quick lookup without typing anything.

Center frequency
—
MHz
Band
—
UNII / DFS
—

2.4 GHz — channels 1–14

documented — frequency (MHz) = 2407 + 5 × channel for channels 1–13; channel 14 is a fixed special case at 2484 MHz (Japan-only, 802.11b only, not legal for 802.11g/n). Only channels 1, 6, and 11 are non-overlapping at 20 MHz width in the US — every other channel overlaps at least one neighbor's spectrum, which is why "channel 1/6/11 only" remains the standard field recommendation for 2.4 GHz deployments.

5 GHz — UNII bands and DFS

BandChannelsFrequency rangeDFS required (US)
UNII-136, 40, 44, 485150–5250 MHzNo
UNII-2 (UNII-2A)52, 56, 60, 645250–5350 MHzYes
UNII-2 Extended (UNII-2C)100–1445470–5725 MHzYes
UNII-3149, 153, 157, 161, 1655725–5850 MHzNo
UNII-4169, 173, 177, 1815850–5925 MHzNo (US-specific allocation)

documented — frequency (MHz) = 5000 + 5 × channel across the entire 5 GHz range. DFS-required channels (UNII-2/2A/2C, 52–144) must monitor for radar for 60 seconds before transmitting (Channel Availability Check) and vacate within 10 seconds if radar is detected — a mesh or AP link that drops specifically on these channels during weather radar activity isn't a config problem (see the Outdoor & mesh section).

inference — exact channel/DFS allocations vary by regulatory domain (Cisco's own domain codes: -A, -B, -E, -N, -Q, etc.) — the table above reflects current US (FCC) allocation. Always confirm against show controllers dot11Radio <n> | include Reg|Country or the AP's configured country code before assuming a channel is legal to use at a given site.

6 GHz — new band, new power-mode complexity

Power modeMax EIRPRequires AFC?Typical use
LPI (Low Power Indoor)5 dBm/MHz (24 dBm total, 20 MHz)NoStandard indoor AP, no coordination needed
Standard PowerUp to 36 dBm EIRPYesOutdoor or higher-power indoor, must query an AFC system first
VLP (Very Low Power)14 dBm EIRPNoPortable/client-to-client, short range

documented — frequency (MHz) = 5950 + 5 × channel for 6 GHz (channels 1–233, odd-numbered in the standard 20 MHz plan). The entire 6 GHz band in the US is unconditionally unlicensed-use for LPI/VLP — there is no DFS requirement in 6 GHz, since there's no legacy radar/satellite incumbent in the same way as 5 GHz UNII-2. The tradeoff is Standard Power's AFC (Automated Frequency Coordination) requirement: an AP must query an FCC-approved AFC system for a clear channel/power allocation before transmitting above LPI limits — this is new infrastructure most engineers haven't dealt with on prior Wi-Fi generations.

Verifying what's actually configured

show ap config general                              ! country code, regulatory domain
show controllers dot11Radio <n>                      ! per-radio channel, power, DFS state
show ap dot11 5ghz channel                           ! current 5GHz channel assignment
show ap dot11 6ghz summary                           ! 6GHz radio state, power mode

Sources

  • IEEE 802.11-2020 — channel/frequency numbering formulas (2.4/5/6 GHz)
  • fcc.gov/wireless/bureau-divisions/mobility-division/unlicensed-national-information-infrastructure-u-nii-devices — UNII band definitions
  • fcc.gov — 6 GHz (UNII-5/6/7/8) Report and Order, LPI/Standard Power/VLP definitions and AFC requirement
  • cisco.com — Catalyst 9800 country code / regulatory domain configuration guides (per-domain allocations referenced in-section)

802.11 standards & capability matrix

quick reference — amendment, year, max PHY rate, key feature

Pure reference table — published IEEE amendment history and PHY-rate ceilings. Useful for a fast "what can this standard actually do" check mid-conversation, not a substitute for CWNP's full theory treatment of any of these.

Marketing nameAmendmentRatifiedBandsMax PHY rateKey feature introduced
Wi-Fi 1 (unbranded)802.11b19992.4 GHz11 MbpsDSSS, first mass-market Wi-Fi
Wi-Fi 2 (unbranded)802.11a19995 GHz54 MbpsOFDM
Wi-Fi 3 (unbranded)802.11g20032.4 GHz54 MbpsOFDM brought to 2.4 GHz
Wi-Fi 4802.11n20092.4 & 5 GHz600 Mbps (4x4, 40 MHz)MIMO, channel bonding (40 MHz)
Wi-Fi 5802.11ac20135 GHz6.93 Gbps (8x8, 160 MHz)MU-MIMO (downlink only), 80/160 MHz channels
Wi-Fi 6802.11ax20212.4 & 5 GHz9.6 Gbps (8x8, 160 MHz)OFDMA, uplink+downlink MU-MIMO, TWT, BSS Coloring
Wi-Fi 6E802.11ax (extended)2021+6 GHzsame PHY as Wi-Fi 66 GHz spectrum, no legacy device backward-compat traffic
Wi-Fi 7802.11be20242.4, 5 & 6 GHz46 Gbps (theoretical, 320 MHz, 16x16)Multi-Link Operation (MLO), 320 MHz channels, 4K-QAM

documented — the "Wi-Fi N" marketing numbers (Wi-Fi Alliance branding, introduced retroactively in 2018) and the IEEE amendment letters are not 1:1 synonyms in every case — Wi-Fi 6E is the same PHY as Wi-Fi 6 (802.11ax) just operating in newly-available 6 GHz spectrum, not a separate amendment. Wi-Fi 7's headline 46 Gbps figure is a theoretical ceiling at maximum spatial streams/channel width/MCS — no currently shipping AP hardware approaches it; real-world Wi-Fi 7 AP throughput is bounded by actual radio chain count (typically 2x2 or 4x4 on current Catalyst/Meraki hardware), not the amendment's theoretical maximum.

MU-MIMO vs. OFDMA — the distinction that actually matters operationally

inference — these are frequently conflated but solve different problems. MU-MIMO (introduced 11ac, improved in 11ax) lets the AP talk to multiple clients simultaneously using spatial separation — most valuable with few, high-throughput clients. OFDMA (new in 11ax/Wi-Fi 6) subdivides a channel into resource units so many clients can each get a small efficient slice at once — most valuable in high-density, many-small-packet environments (IoT, dense classrooms/stadiums). A dense-client-count problem is an OFDMA story; a few-clients-need-max-throughput problem is a MU-MIMO story — picking the wrong lever to tune for a given symptom wastes field time.

Sources

  • IEEE 802.11-2020 and amendment history (802.11a/b/g/n/ac/ax/be) — ratification years, PHY rate ceilings
  • wi-fi.org — Wi-Fi Alliance generational branding (Wi-Fi 4/5/6/6E/7) mapping to IEEE amendments
  • cisco.com — Catalyst 9100/9130/9136/9163/9166/9178 AP datasheets (real-world radio chain counts vs. theoretical amendment ceilings)

PoE budget calculator

802.3af/at/bt class wattage, cable-length derating — pairs with the PoE & AP power reference section

Pure calculator — the IEEE 802.3 class-to-wattage table is fixed by spec; this just does the arithmetic across however many ports/APs you're planning. For the field-triage reference (switch-side show commands, LED codes, syslog signatures), see the PoE & AP power section — this tool is for planning a deployment, that section is for troubleshooting one already in the field.

Watts — check your switch's datasheet
Total demand
—
Watts, nameplate class draw
Headroom
—
Watts remaining
Fits the budget?
—

Why this uses nameplate class draw, not "typical" draw

inference — this calculator intentionally sizes against the full negotiated class wattage, not a lower "typical" real-world draw figure, because the switch itself reserves budget by negotiated class regardless of what the AP actually pulls moment-to-moment. Most Wi-Fi 6E/7 APs draw meaningfully less than their class ceiling in normal operation (see the PoE & AP power reference section for Cisco's own documented per-model derating at full radio load) — but the switch doesn't know that in advance, so budget planning against nameplate class is the conservative, correct approach, even though it will usually overestimate real consumption.

IEEE 802.3 PoE class reference

StandardClassPSE outputPD guaranteed
802.3afClass 315.4 W12.95 W (cable loss reserved)
802.3at (PoE+)Class 430 W25.5 W
802.3bt Type 3 (PoE++)Class 5/660 W51 W
802.3bt Type 4Class 7/890 W71.3 W

documented — the gap between PSE output and PD-guaranteed wattage is the IEEE spec's own cable-loss reserve, not a vendor margin — standard Category 5e/6 cabling at 100m is accounted for in that delta. Longer runs on lower-category cable can still derate further; Cisco documents cable category/quality (not a shorter max length) as the lever at higher power classes.

Sources

  • IEEE 802.3-2022 (af/at/bt amendments) — PSE/PD class wattage table
  • cisco.com/c/en/us/support/docs/switches/catalyst-9200-series-switches/215636-troubleshooting-power-over-ethernet-poe.html — cable category/quality as the derating lever at higher classes

Egress / ASN lookup

confirm where your traffic is actually exiting to the internet — real BGP/routing data, not an estimate

Queries Cloudflare's own trace endpoint (same one the Speed Test uses) for your current public egress IP, then RIPE NCC's public RIPEstat API — the regional internet registry's own data, not a third-party geolocation guess — for the real ASN (Autonomous System Number) and network name that IP belongs to. Useful for confirming an anchor-WLC/guest-NAT setup is actually egressing where you expect, or that FlexConnect local-switching traffic isn't quietly routing through an unexpected path.

Public egress IP
—
ASN
—
Network / holder
—
Announced prefix
—

Why this matters for a WLAN-side troubleshooting conversation

  • A guest WLAN anchored to a DMZ controller should egress through that DMZ's own ASN/path, not accidentally fall back through the corporate path — this is a fast way to confirm which one is actually happening without digging through routing tables.
  • If a client's traffic reports an ASN/network that doesn't match any expected egress point at all, that's a routing or NAT misconfiguration worth escalating, not a Wi-Fi symptom.
  • inference — this reports the ASN of whatever IP Cloudflare's edge sees as your current source address, which is correct for confirming NAT/egress behavior, but it says nothing about Wi-Fi link quality or RF state — it's a routing-path tool, not a radio-layer one.

Sources

  • speed.cloudflare.com/cdn-cgi/trace — public egress IP (same endpoint the Speed Test uses)
  • stat.ripe.net (RIPEstat, RIPE NCC's public data API) — real ASN/prefix/holder lookup, no API key required, CORS-enabled

MAC vendor (OUI) lookup

identify a device manufacturer from a MAC address — real IEEE registry data

Paste a MAC address or just its first three octets (the OUI). This fetches and caches Wireshark's own mirror of the IEEE OUI registry — the same data a packet-capture tool like the Beacon Finder resolves vendors from, just as a quick standalone lookup when you don't have a full capture, e.g. for identifying a rogue AP or unrecognized client fast from its BSSID alone.

Vendor
—

Data freshness

documented — the source file explicitly asks consumers "please don't download it more often than [weekly]," since it's regenerated on that cadence from IEEE's own registry. This tool respects that: the OUI list is fetched once and cached in this browser's local storage for 7 days before refetching, not re-fetched on every lookup.

Sources

  • wireshark.org/download/automated/data/manuf — Wireshark's maintained mirror of the IEEE OUI registry (CORS-enabled; the canonical IEEE CSV at standards-oui.ieee.org is real but has no CORS header, so it can't be fetched directly from a browser)
  • standards-oui.ieee.org — the registry this data is ultimately sourced from

AP join failures & AAA

Catalyst 9800 (IOS-XE) · mostly documented

The misconception to rule out first

Default CAPWAP join on a 9800 has no AAA/RADIUS step at all. The sequence is purely certificate/DTLS-based:

Discovery → DTLS handshake (cert exchange) → Join → image check → Config → Run

Where AAA actually enters the picture

  • An optional, off by default feature — "Authorize APs against MAC" — checks the AP's MAC/cert against a local DB or RADIUS before join.
  • 802.1X AP-as-supplicant: a separate, often-confused mechanism that authenticates the AP's wired port to the switch, not the WLC.

The real, documented causes

CauseSignature
Certificate (MIC/SSC) expiry or invalidity%PKI-3-CERTIFICATE_INVALID_EXPIRED
Image-signing cert expiration stalls downloadField Notice FN72524 (CSCwd80290)
AP count / licensing limitse.g. 9800-CL caps at 50 APs without active Smart Licensing
Country code / regulatory mismatchSyslog: "country code (GA) and regulatory domain (-A) mismatch"
Image/version mismatchCaught at the join process's image-check step

Telling AAA-driven apart from cert/CAPWAP-driven

show ap join stats detail
show wireless stats ap discovery
show wireless stats ap join
show dtls connection          (AP-side)

show ap join stats detail returns a distinct reason string per cause — "Radius authorization of the AP has failed" reads very differently from "Certificate payload in join request contains invalid certificate."

Field takeaway inference

AAA sits in exactly one narrow, opt-in path, while cert, licensing, country, and version failures dominate the documented literature. If an AP won't join and nobody deliberately turned on AP authorization, chase the certificate or the license before you chase ISE.

Sources

  • cisco.com/.../221056-understand-the-ap-join-process-with-the.html
  • cisco.com/.../218396-troubleshoot-catalyst-9800-ap-join-or-di.html
  • cisco.com/.../213916-catalyst-9800-wireless-controllers-ap-au.html
  • cisco.com/.../217848-configure-802-1x-supplicant-for-access-p.html
  • cisco.com/.../217734-connect-and-join-a-row-domain-access-po.html
  • cisco.com/c/en/us/support/docs/field-notices/725/fn72524.html

AP count & license limits

Catalyst 9800 (IOS-XE) · mixed confidence, see panels

9800-CL without Smart Licensing — a hard, enforced cap

documented — Cisco states "there is a limit of 50 access points enforced on the device" for a 9800-CL that isn't connected to Smart Licensing/CSSM. This is a real technical cap, not a compliance warning — the restriction "disappears" once the box reports to CSSM or a CSLU satellite. Confirm connectivity before chasing anything else:

show license status
show license summary

Licensed platforms over their purchased AP count

On a licensed (non-CL) platform, APs beyond the purchased count are not blocked from joining — Cisco frames this as an audit/compliance matter: APs over the licensed count are simply "out of compliance," and "Cisco retains the right to conduct audits to check license compliance." inference — a 90-day evaluation license expiring does "not affect Catalyst 9800 functionalities" beyond syslog warnings; don't expect APs to drop on day 91.

unconfirmed — Cisco's Smart Licensing Using Policy (SLUP) documentation describes evolving "Day 0 enforcement for unlicensed APs and Day N enforcement for devices with expired licenses" tied to image upgrades. Check the current SLUP documentation against your running release before assuming today's non-enforcement behavior still holds on a future upgrade.

show license summary
show license status
show license air entities summary   ! per-AP license reporting detail

Field takeaway

No Cisco documentation gives a hard numeric join-blocking threshold for any platform except the 9800-CL's 50-AP no-license cap. Everywhere else, "over the license count" is a compliance finding to resolve, not a join failure to troubleshoot.

Sources

  • cisco.com/c/en/us/products/collateral/wireless/catalyst-9800-series-wireless-controllers/impl-catalyst-9800-wrls-lan-ctrlr-licens-faq.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/217348-configure-troubleshoot-catalyst-9800-w.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-16/config-guide/b_wl_17_16_cg/m_slup.html

AP crash & reboot loops

Catalyst 9800 (IOS-XE) · mostly documented

Stuck pre-join: a corrupted-image boot loop

documented — Field Notice FN74109 (CSCvx32806, plus CSCwc72021/CSCwd90081) documents Wave 2 11ac APs (2800/3800/4800/1560/IW6330/ESW6300) and Catalyst 9100 Wi-Fi 6/6E APs downloading a corrupted image over CAPWAP from a 9800 controller, then boot-looping on it. Exact console signature:

verify signature failed for /bootpart/part1/ramfs_data_cisco.cpio.lzma
Image signature verification failure: -3

On the uplink switch, the affected AP shows as generic "Ieee PD" rather than its model name in show power inline. Fixed in 8.10.185.0, 17.3.7, 17.6.6, 17.9.3, and 17.11.1+. APs with the alt-boot enhancement self-recover after 5 failed attempts by falling back to their backup partition; older u-boot versions need console-level ubi remove/ubi create recovery.

Joins fine, then reboots/rejoins repeatedly afterward

documented — work this from the WLC side first, not the AP console:

show ap crash                                              ! AP crash files stored on the WLC
dir all | i crash
show wireless stats ap history mac-address <mac>           ! last reboot type/reason
show wireless stats ap mac <radio-mac> join detailed        ! disconnect type/reason/count

Cisco's own diagnostic logic: look for APs with abnormally low "Assoc Uptime" relative to overall uptime (a sign of repeated reload), then check whether the affected APs share a switch, a wncd process, or a recent config change:

show wireless loadbalance ap affinity mac <mac>
sh proc cpu platform | i wncd

Sources

  • cisco.com/c/en/us/support/docs/field-notices/741/fn74109.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/220443-how-to-avoid-boot-loop-due-to-corrupted.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/218396-troubleshoot-catalyst-9800-ap-join-or-di.html
  • community.cisco.com/t5/networking-knowledge-base/continuous-reboot-of-the-access-point-due-to-a-corrupted/ta-p/3132543

Mass AP disconnects

Catalyst 9800 (IOS-XE) · mostly documented

Same switch or stack

documented — Cisco's documented correlation step for simultaneous AP drops is explicitly to check "if those APs were in same switch." A shared uplink, a switch reload, a spanning-tree event, or total PoE power-budget exhaustion on that one switch (see the PoE & AP power section — ILPOWER_POWER_DENY) all produce this exact signature.

Scattered across different, unrelated switches

documented — this points at the controller side, specifically per-process load, not the access layer. Cisco's own troubleshooting flow checks wncd (the per-AP-group wireless control process) utilization: "disconnections could be due to high wncd CPU utilization and WLC not been able to process packets received from APs."

show wireless loadbalance ap affinity wncd <0-7>   ! which APs share a wncd instance
sh proc cpu platform | i wncd                       ! per-process CPU

If every affected AP maps to the same wncd instance, that instance — not the network — is the shared cause.

Sources

  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/218396-troubleshoot-catalyst-9800-ap-join-or-di.html

Roaming: Fast Transition (802.11r), 802.11k, 802.11v

Catalyst 9800 (IOS-XE 17.12) · mostly documented

802.11r Fast Transition — what it actually does

FT lets a client pre-negotiate keys with a target AP before it roams: "enables the initial handshake with a new AP even before the corresponding client roams to the target access point," letting client and AP "do the Pairwise Transient Key (PTK) calculation in advance." Keys are applied "after the client responds to the reassociation request." The WLAN config carries this as its own AKM type — Fast Transition (FT) — separate from the WPA2/802.1X AKMs.

Over-the-Air vs. Over-the-DS

  • Over-the-Air: "The client communicates directly with the target AP using IEEE 802.11 authentication with the FT authentication algorithm."
  • Over-the-DS: "The client communicates with the target AP through the current AP" — FT action frames are relayed via the current AP/controller.
  • FT-SAE uses a new AKM OUI (00-0F-AC:9); the STA includes a Mobility Domain Element (MDE) and RSNE in the (re)association request, the AP echoes FTE/MDE/RSNE back, and the two sides run a Fast Transition 4-way handshake after SAE auth. A mismatched MDE returns STATUS_INVALID_MDE; an AKM mismatch returns STATUS_INVALID_AKMP.

Mobility Domain ID (MDID) — the roaming boundary FT actually uses

"The MDID is used by 802.11r to define the network boundary where fast roaming is supported." Inside one domain, "APs share PMKs," letting clients "roam quickly without fully reauthenticating." Two ways to form a domain: static MDID assignment, or dynamic site-tag-based grouping. If an MDID is configured, it overrides the site tag for PMK sharing control — a frequent source of "FT works on some APs but not others" when a subset of APs got an explicit MDID and the rest didn't.

MDID has no CLI/GUI path — "you can configure MDID only through the open configuration model" (RESTCONF/NETCONF/YANG). Scale: up to 100 APs and 1,000 PMK cache entries per AP per domain (17.2.1). It does not function for Flex APs in standalone mode, since controller coordination is required.

Configuration (CLI)

wlan <profile-name>
 shutdown
 security ft
 security wpa akm ft dot1x        ! or: ft psk | ft sae
 no shutdown

Disabling specific behavior: no security ft {adaptive | over-the-ds | reassociation-timeout <sec>}. FT-over-DS is enabled by default on WLAN creation — a WLAN can be "FT-capable" without anyone deliberately turning on the DS path.

Restrictions — the real failure modes, quoted directly

  • "EAP LEAP method is not supported."
  • "Traffic Specification (TSPEC) is not supported for 802.11r fast roaming. Therefore, RIC IE handling is not supported."
  • "Legacy clients cannot associate with a WLAN that has 802.11r enabled if the driver of the supplicant…is old and not aware of the additional AKM suites in the IE." Workaround: run two SSIDs with the same name but different security settings (FT vs. non-FT) — or clients that are 802.11r-capable can still associate as plain 802.11i if both AKM types are enabled on the WLAN.
  • "To avoid any Denial of Service (DoS) attack, each Cisco WLC allows a maximum of three Fast Transition handshakes with different APs."
  • "FT-SAE Over-the-DS roam is not supported in FlexConnect local authentication mode." Cisco's general recommendation is Over-the-Air FT for FlexConnect deployments.
  • "In Cisco Wave 2 APs, local switching local authentication with 802.11r is not supported."
  • FlexConnect local-auth FT specifically: supports Over-the-Air roaming only (no Over-the-DS); supports adaptive 11r for Apple clients; supports both FT+802.1X and FT+PSK; up to 100 APs per PMK-sharing group by default (300 in high-scale mode), 1,000 PMK entries/AP. Pre-17.2.1, local-auth FlexConnect clients couldn't use FT at all — only centrally authenticated clients could.

OKC — the non-11r fast-roam alternative, for context

Opportunistic Key Caching caches one PMK per client across APs sharing a WLAN, "even when roaming between multiple APs," and "works with WPA2-EAP as a fast roaming technique." Client support splits by vendor: "Microsoft and some Android clients support OKC," while "Apple and few Android clients support 802.11r." OKC is on by default per WLAN (okc / no okc under the WLAN); disabling it disables it even for clients that could use it. If a mixed-client SSID shows some clients fast-roaming and others doing full reauth, this split is the first thing to check — not a controller defect.

Verification

show wireless client summary                         ! shows FT-SAE role
show wireless client mac-address <mac> detail        ! "Authentication Key Management : FT-SAE"
show wireless client mac-address <mac> mobility history
show wireless pmk-cache                               ! cache type "Dot11R"
show wlan name <profile>                              ! "FT SAE : [Enabled|Disabled]"
show wireless stats client detail | sec roam           ! 11r ft auth requests, PMKR0-Name mismatch counters
show flexconnect dot11R                                ! AP-side, FlexConnect FT cache entries

802.11k — Assisted Roaming (neighbor reports)

documented — "Assisted Roaming" on the 9800 is really two features. First, genuine 802.11k: the controller "allows an AP to inform 802.11k-capable clients of neighboring BSSIDs (APs in the same SSID)" so the client doesn't have to blind-scan every channel to find a roam target. Second, a Cisco-proprietary addition for clients that don't speak 802.11k: a prediction neighbor list built from each client's probe-RSSI history, which the controller then uses to actively deny association to a sub-optimal AP (up to a configurable denial count) if the client ignores the predicted list.

  • Restriction: "This feature is supported only on 802.11n capable indoor access points."
  • Single-band WLANs advertise up to 6 neighbors; dual-band up to 12.
  • "You can configure assisted roaming only using the CLI" — beyond the WLAN-level enable checkboxes, there's no GUI path for the prediction/denial tuning parameters.
  • Avoid two SSIDs sharing the exact same name — Cisco calls this out as a cause of roaming issues independent of 11k.

802.11k configuration (CLI)

! Global:
wireless assisted-roaming floor-bias <5-25 dBm>        ! default 15
wireless assisted-roaming prediction-minimum <count>   ! default 3
wireless assisted-roaming denial-maximum <1-10>        ! default 5

! Per-WLAN:
wlan <wlan-id>
 assisted-roaming neighbor-list     ! 11k neighbor list — ON by default at WLAN creation
 assisted-roaming dual-list         ! dual-band list — ON by default
 assisted-roaming prediction        ! prediction-list denial feature — OFF by default

Turning on assisted-roaming prediction on a WLAN that already has load balancing enabled silently disables load balancing on that WLAN (Cisco documents a warning being shown, but it's easy to miss in a scripted push). If client distribution across APs changes right after someone enables assisted-roaming prediction, this is the first thing to check.

Verification: show wlan id <wlan-id> shows the neighbor-list/dual-list/prediction state per WLAN.

802.11v — BSS Transition Management

documented — 802.11v covers two different benefits that are easy to conflate: network-assisted power savings (Directed Multicast Service, BSS Max Idle Period) and network-assisted roaming (BSS Transition Management, "BTM"). BTM covers three triggers: a client-initiated query before it roams on its own; an AP-initiated request "when an AP is heavily loaded"; and an AP-initiated request "when a client's RSSI and rate do not meet the requirements."

The request is advisory unless you force it. Cisco states plainly that a BTM request "is a suggestion (or advice) given to a client, which the client can choose to follow or ignore" — unless disassociation-imminent is enabled, which turns it into a forced transition. A client "ignoring" a steering attempt is often this setting, not a client-side bug.

802.11v configuration (CLI)

wlan <profile-name>
 shutdown
 bss-transition
 bss-transition disassociation-imminent   ! optional — forces the transition
 no shutdown

GUI equivalents (Configuration > Tags & Profiles > WLANs > Advanced): BSS Transition (the base enable), Dual Neighbor List (includes neighbors from the AP's other radio slot — 2.4/5 GHz — in the BTM response), BSS Max Idle Service / BSS Max Idle Protected (power-save idle timer; "Protected" requires authenticated frames to reset the counter), and Directed Multicast Service (converts a multicast stream to unicast for any DMS-capable client).

802.11v prerequisites and restrictions

  • "Client needs to support 802.11v BSS Transition" — there's no fallback behavior for clients that don't; a BTM request to a non-supporting client is simply ignored.
  • Explicitly called out for "Apple clients like Apple iPad, iPhone…that run on Apple iOS version 7 or later."
  • "Supports local mode; also supports FlexConnect access points in central authentication modes only" — BTM on a FlexConnect AP doing local authentication is not supported.

gap — no dedicated show/verification command for BSS Transition Management state appears in the 9800 17.12 config guide chapter itself; the only confirmed check is reading the WLAN's configured BTM settings back via show wlan name <profile> / show run wlan, by analogy with how OKC and assisted-roaming settings are verified elsewhere in the same guide. Treat that command as a reasonable inference, not a cited one-to-one for this specific feature.

Field recommendation inference

If a client completes an FT roam, gets deleted seconds later with an AUTH_EXPIRED-style reason, retries FT and fails with Invalid PMKID, then recovers via full 802.1X — escalate the deletion timing, not the PMKID failure. The PMKID failure is downstream, not the trigger. (This pattern was originally observed on a WLAN with no CWA involved; if you hit it on a CWA WLAN, see the Identity Services Engine section for the open questions specific to that overlap.)

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_fast_transition_ewlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_dot11r.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_11i_mdid.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_okc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_assisted_roam_9800.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_802_11v_ewlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_vewlc_mobility.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_client_roaming_policy_profile.html
  • developer.cisco.com/docs/wireless-troubleshooting-tools/client-delete-reasons/

Identity Services Engine (ISE)

deployment & PSN sizing, plus Central Web Authentication · mixed confidence, see panels

Deployment & PSN sizing

Sizing is session-based, not WLC-based

TierConcurrent sessionsMax PSNs
Small≤ 50k2-node pair, all personas co-located
Medium≤ 150k6, PSNs dedicated
Large> 150k50, every persona dedicated

There's no fixed PSN-per-WLC ratio. Redundancy is built per workload group — RADIUS/Guest/CWA, 802.1X, TACACS+ — not per controller.

Hardware & placement gotchas

  • ISE appliance hardware can't be upgraded after purchase — undersizing at buy time is permanent.
  • SNS-3895 is PAN/MnT-only; using it as a PSN gives "no additional value" per Cisco.
  • Only 2 MnT nodes are supported total — no horizontal MnT scaling.
  • PAN auto-failover needs 3+ nodes; a health-check node per site if PANs split across data centers.
  • Mismatched ISE versions between PAN and a joining node blocks registration outright.

9800-side pairing gotchas

  • Mobility MAC defaults to chassis base MAC; in HA SSO pairs, set it manually or it changes on failover and silently breaks mobility tunnels.
  • N+1 is not HA SSO — SSO is a same-chassis stateful pair, N+1 is AP site-tag failover to a separate standby. Different mechanisms, often conflated.
  • On a Catalyst-Center-managed 9800, manual CLI changes get silently overwritten on the next provisioning sync.

Central Web Authentication (CWA)

Redirect ACL logic — the core mechanism

Cisco's own CWA troubleshooting docs call the 9800 redirect ACL a punt ACL, not a security ACL:

  • permit — traffic is redirected to the portal
  • deny — traffic is exempted from redirection, passes through normally

That's the inverse of normal ACL semantics, confirmed verbatim by two independent Cisco sources.

Correct ACL shape

ip access-list extended REDIRECT
 deny ip any host <ISE-IP>
 deny ip host <ISE-IP> any
 deny udp any any eq domain
 deny udp any eq domain any
 permit tcp any any eq 80

Deny traffic to ISE PSNs and DNS; permit the rest to redirect. Skip the DNS/ISE exemptions and you get a redirect loop.

The AireOS trap

Semantics flip again on legacy AireOS: there, deny means redirect and permit means pass-through — exactly backwards from 9800. An engineer carrying habits from one platform to the other will build the ACL exactly backwards, with no obvious error on screen.

FlexConnect caveat

For locally-switched APs, the controller swaps every permit/deny when pushing the ACL to the AP. The AP-local view (show ip access list) looks inverted relative to the WLC side — expected, not corruption.

Most common real failure

ACL name mismatch between what ISE sends and what's configured on the WLC. Surfaces as:

SANET_AUTHZ_FAILURE - Redirect ACL Failure
Failed attribute name REDIRECT

ISE's default ACL name is ACL_WEBAUTH_REDIRECT (underscores) — frequently retyped with dashes, which breaks the match silently.

Verifying the redirect

show wireless client mac-address <mac> detail   (ACL under "Server Policies")
show ip access list                               (AP CLI, FlexConnect only)
debug wireless mac <mac> monitor-time <sec>

unconfirmed — show ip access-lists (plural, WLC-side) with hit counters for this specific flow is a standard IOS-XE command that almost certainly works, but no CWA-specific doc spells out this exact use.

CWA doesn't support PSN load balancing

CWA's flow is multi-stage: MAB auth → redirect → second RADIUS auth → CoA, and all of it must land on the same PSN. A load balancer that splits the second-stage auth or CoA to a different node breaks the flow intermittently — exactly the shape of a "random" failure that's hard to reproduce on demand. Cisco's own "least outstanding" method is called out as unsuitable here.

Documented alternative: a WLC-driven ordered RADIUS server list with dead-server detection tuned, not an external load balancer, unless it specifically guarantees affinity across the whole CWA flow.

Is combining 802.11r FT with CWA on one WLAN supported?

documented as intentional. Cisco's CWA chapter says CWA "initiates user redirection and authentication at Layer 2, often in combination with MAC filtering or 802.1X authentication." Dot1x-then-webauth is sanctioned design, not an accidental overlap.

FT + CWA open documentation gaps — confirmed unresolved across two research passes

QuestionStatus
Does the FT PMK cache survive while a client sits in CWA / WEBAUTH_REQUIRED?gap
Does the session-timeout timer reset on an FT roam, or keep ticking from the original association?unconfirmed
Is "Invalid PMKID" after a roam a mobility/anchor cache-sync defect, not an AAA issue?unconfirmed — Bug Search Tool is login-gated, blocked both passes
Does Cisco discourage pairing 802.11r with CWA/guest portals?no statement found — neither chapter references the other feature at all

A second independent research pass re-checked the current 9800 17.12 Fast Transition and CWA/webauth chapters directly. The FT chapter's full restrictions list (LEAP unsupported, TSPEC unsupported, legacy-client association limits, max three FT handshakes with different APs, FT-SAE over-the-DS unsupported in FlexConnect local auth) contains no mention of CWA or web-auth. The webauth chapters contain only a generic, non-roam-specific statement on session timeout: "The switch applies either the session timeout configured locally or provided by the server." Treat these four questions as genuinely undocumented by Cisco, not merely unresearched — the next step for any of them is a live lab reproduction or a logged-in Bug Search / TAC case, not another documentation search.

If you hit this combination in the field: a client completes an FT roam, gets deleted seconds later with an AUTH_EXPIRED-style reason, retries FT and fails with Invalid PMKID, then recovers via full 802.1X and lands in CWA — escalate the deletion timing, not the PMKID failure or the portal timeout. See the Roaming: Fast Transition section for the pure FT mechanics behind this pattern.

Sources

  • cisco.com/c/en/us/td/docs/security/ise/performance_and_scalability/b_ise_perf_and_scale.html
  • cisco.com/.../m_radius_server_load_balancing.html
  • cisco.com/.../213913-building-mobility-tunnels-on-catalyst-98.html
  • cisco.com/.../220277-configure-high-availability-sso-on-catal.html
  • cisco.com/c/en/us/td/docs/security/ise/3-4/admin_guide/b_ise_admin_3_4/b_ISE_admin_deployment.html
  • cisco.com/.../220852-troubleshoot-central-web-authentication.html
  • cisco.com/.../213920-central-web-authentication-cwa-on-cata.html
  • cisco.com/.../216500-catalyst-9800-central-web-authenticati.html
  • cisco.com/.../221941-configure-troubleshoot-downloadable-ac.html
  • community.cisco.com/t5/security-knowledge-base/ise-and-catalyst-9800-series-integration-guide/ta-p/3753060
  • ciscopress.com/articles/article.asp?p=3100059&seqNum=3
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_fast_transition_ewlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_vewlc_central_web_authentication.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_vewlc_sec_webauth_cg.html
  • developer.cisco.com/docs/wireless-troubleshooting-tools/client-delete-reasons/

Intermittent failure checklist

mostly documented

For symptoms that look random, hit different users unpredictably, and resist reproduction — work this list in order.

1. RADIUS/AAA health, WLC side

  • Client exclusion when the server returns a VLAN/ACL name that doesn't exist locally.
  • EAP timeout from dot1x timeout / retry windows — often client/driver-side, not server-side.
  • debug wireless mac <addr> monitor-time <N> elevates one MAC to debug across every process.

2. ISE-side signals

  • A node out of sync with the Primary Admin node delays Application Server init (normally 15–35 min).
  • Self-signed/untrusted ISE certs show as "Alert (Level: Fatal, Description: Certificate Unknown)" in captures.
  • Check per-node CPU/latency/memory before assuming a logic bug.

3. Infrastructure signals mistaken for wireless

  • DHCP Required mismatch across foreign/anchor controllers → stale IP retained across a roam → NAK.
  • Internal 9800 DHCP defaults to an infinite lease — can quietly exhaust the pool.
  • VLAN/trunk or FlexConnect native-VLAN mismatch explains behavior that's fine at some sites, broken at others.

4. Standard correlation method

Controller:  RadioActive trace by client MAC + exact timestamp
AP:          AP-side client debug (bundle collector)
ISE:         Live Logs for the same MAC/timestamp

TAC's first ask is always the same: exact reproduction timestamp, client MAC/IP/username/session ID, and a trace captured live — continued logging overwrites debug buffers, so this can't be reconstructed after the fact.

Sources

  • cisco.com/.../213970-catalyst-9800-wireless-controllers-commo.html
  • cisco.com/.../222906-understand-ise-services-purpose-and-tro.html
  • cisco.com/.../221973-troubleshoot-dhcp-client-connectivity-is.html

Meraki cloud-managed (MR)

mostly documented

The architecture inverts the usual model

Meraki is event-driven RPC: the cloud initiates calls to devices for config push and telemetry — the opposite of a WLC pulling AP state. User traffic never touches the cloud; it goes direct to LAN/WAN. There's no CAPWAP and no controller to tunnel to — APs are independently intelligent.

Documented: on cloud connectivity loss, "the Meraki hardware device will continue to run with its last known configuration until cloud connectivity is restored." inference: SSIDs keep broadcasting and clients keep associating locally during an outage — only dashboard-dependent functions (new config, Live Tools, Sign-on-splash auth, see below) are affected.

Guest / web auth splash types

  • Click-through — acknowledgment only, no credentials.
  • Sign-on — via Meraki auth, RADIUS, LDAP, AD, or Google/Entra. With Sign-on + RADIUS, the client's credentials route through the Meraki Cloud Controller, which issues the Access-Request to the external server (e.g. ISE) — the cloud is in the auth path, not the local AP.

802.1X / MAB with ISE

Shared secret must match on the SSID config and the RADIUS server. Enabling "Cisco ISE Authentication" lets Meraki honor ISE's url-redirect AVPair for CWA and auto-enables CoA.

CoA/Disconnect port is platform-specific — a frequent source of "RADIUS works but CoA doesn't": the AP's UDP port must be reachable from the RADIUS server at 1700 for ISE, 3799 for other NAC vendors. CoA behavior itself changed between firmware MR25 and MR26 (full disassociation vs. in-session EAP reauth). Cloud RADIUS proxy does not support CoA at all.

The RADIUS test tool has a specific blind spot

Dashboard's built-in RADIUS test triggers an EAP-PEAP/MS-CHAPv2 exchange to confirm reachability and credentials. It fails for EAP-TLS every time, because the test has no client certificate to present — that failure means nothing about whether real EAP-TLS clients will work. Test those with an actual device.

Connectivity requirements & "unreachable" alerts

TrafficPort
DNSUDP/53
NTPUDP/123
Primary cloud tunnelUDP/7351 (falls back to HTTP/HTTPS if blocked)
AutoVPN registriesUDP/9350–9381

Authentication specifically has no backup-connection fallback — it requires UDP/7351 even when the general tunnel has already fallen back to HTTP/HTTPS. A site that looks "online" via the fallback path can still fail auth for this exact reason.

An "unreachable device" alert means the device was online and has stopped talking to the cloud — Dashboard's guided workflow: check the Meraki Status page, identify the upstream neighbor, packet capture, cable/LED/power check, local status page, support data bundle, reboot as last resort.

Live Tools — and the one that doesn't exist on MR

Monitor > Access Points > Tools: Ping (to client or AP), ARP table, Traceroute, Dashboard throughput test (AP↔dashboard only, not internet), blink LEDs, reboot, splash page test.

"Cable Test" is documented for MS switches, not MR access points. An engineer looking for it on an AP's tool list won't find it — easy platform-confusion mistake, not a missing feature on your specific AP.

No internet access — AP itself vs. a specific client

documented — check which side is actually failing before troubleshooting. The AP converts itself to repeater mode if it "cannot receive an ARP reply packet from the default gateway on the LAN," or "cannot obtain a valid IP address via DHCP" — in either case it broadcasts a <SSID>-bad-gateway or <SSID>-scanning SSID as the signal, which is an AP-side symptom, not a client-side one. Diagnose with a laptop/Wireshark on the same switch port.

For a client that associates fine but has no internet: Meraki's own resolution guide starts with "verify that the gateway is correct and reachable" — ping the gateway from both the client and the AP (Wireless > Access point > Tools). DNS is called out separately as "one of the most common causes of client connection problems" — switching the client to a public resolver (8.8.8.8) is Meraki's own suggested isolation step. If that doesn't clear it, check Network-wide > Client for a firewall rule or group policy applied to that client or subnet.

DHCP failures — Bridge mode vs. NAT mode

documented — in Bridge mode, "wireless and wired clients connected to Meraki APs receive an IP address from the DHCP server on the wired LAN" — the AP does no DHCP of its own. Check pool exhaustion first (a sudden client surge is the most commonly cited trigger); then ping the DHCP server from Wireless > Access point > Tools — no response means "a connection issue exists somewhere upstream from the AP," not a Wi-Fi problem. If the DHCP server sits on a different broadcast domain, confirm an IP helper / DHCP relay agent is configured — Meraki documents a missing relay as a direct cause of the no_offers_received condition. Last check: an SSID VLAN tag colliding with the upstream trunk's native VLAN, since "the upstream port drops packets tagged with its native VLAN."

In NAT mode, DHCP is handled entirely by the AP, so the bridge-mode causes (pool/relay/VLAN) don't apply. Capture on the client with Wireshark to confirm an ACK actually comes back — "the DHCP process will not complete without an ACK message" — and check the event log (Network Wide > Monitor > Client) for the exact step that failed. If a PSK or RADIUS credential is involved, re-verify it in a private browser window first; a previously-saved key can be stale in a browser's autofill cache.

Mixed Meraki + Catalyst 9800 fleets

Dashboard can cloud-monitor a 9800 via Cloud-Managed Hybrid Operating Mode — a reverse "Meraki Tunnel" from the 9800 to the cloud (show meraki connect on IOS-XE shows tunnel/registration state). This is onboarding/monitoring only, not native MR-equivalent management. Documented gotchas are all 9800-side: onboarding needs privilege-15 credentials with correct AAA (aaa authentication login default local / aaa authorization exec default local), and conflicts can come from VTY line limits, HTTP/NETCONF ACL conflicts, SSH port/rotary conflicts, or unsupported SSH encryption algorithms.

inference — two assumptions that don't carry over between platforms: 9800 CLI diagnostics (show wireless client, CAPWAP state) have no Meraki equivalent at all — everything is Dashboard Live Tools or API; and CoA port convention isn't shared either, since MR explicitly uses 1700/3799 while 9800/IOS-XE configures its own CoA listener.

Sources

  • documentation.meraki.com/.../Meraki_Cloud_Architecture
  • documentation.meraki.com/.../Enabling_Click-through_splash-page
  • documentation.meraki.com/.../RADIUS_Authentication_and_Accounting_with_a_Sign-On_Splash_Page
  • documentation.meraki.com/.../Change_of_Authorization_with_RADIUS_(CoA)_on_MR_Access_Points
  • documentation.meraki.com/.../MR_RADIUS_Troubleshooting
  • documentation.meraki.com/.../Upstream_Firewall_Rules_for_Cloud_Connectivity
  • documentation.meraki.com/.../Suggested_Actions_on_Unreachable_Devices_Alert
  • documentation.meraki.com/.../Using_the_MR_Live_Tools
  • documentation.meraki.com/.../Troubleshooting_Dashboard_Connectivity_to_Catalyst_9800_Wireless_Controllers
  • documentation.meraki.com/Wireless/Troubleshooting_and_Support/Troubleshooting/Wireless_Issue_Resolution_Guide
  • documentation.meraki.com/Wireless/Troubleshooting_and_Support/Troubleshooting/Troubleshooting_local_connection_issues_using_default_SSID_on_MR_Access_Points
  • documentation.meraki.com/Wireless/Troubleshooting_and_Support/Troubleshooting/DHCP_Option_issue

Outdoor & mesh

documented

RAP, MAP, and the backhaul protocol

RAPs have a wired link to the controller. MAPs connect wirelessly, shipping with radio role = MAP by default (config ap role {rootAP|meshAP} to change it). MAPs find the best wireless path back to a RAP using Cisco's Adaptive Wireless Path Protocol (AWPP), forming a tree with keepalive adjacency request/response messages; VLAN-tagged traffic tunnels over that backhaul link.

The join sequence has an extra step

On a 9800, Ethernet-connected MAPs get MAC-authorized during a normal CAPWAP join — same as any indoor AP. A wirelessly-joining MAP is only authorized once it secures an AWPP link to its parent. The backhaul link has to exist before controller authorization completes, which indoor wired-join APs never have to do.

Bridge Group Name — the most common connectivity cause

Default BGN from manufacturing is NULL, which lets a MAP join before an admin assigns a network-specific BGN (max 10 characters). BGNs segment mesh networks sharing a channel. A MAP with a mismatched BGN scans 10 times for its correct parent; after 10 failed scans, it joins a non-matching BGN parent for 15 minutes before retrying its own. Cisco's documented fix order: reconfigure the farthest node first, then work back toward the RAP — reconfiguring in the wrong order can strand nodes mid-change.

Limits and timers worth knowing cold

SettingValue
Default max hop count4
Backhaul SNR thresholdsLow 12 dB, High 60 dB (DFS-heavy regions like Europe: 20 dB minimum recommended)
Convergence — Standard mode21s parent-loss detection / 3s keepalive
Convergence — Fast mode7s / 3s
Convergence — Very Fast mode4s / 2s

Why hop count matters more than it sounds like it should

Hop count isn't just added latency — it's a throughput multiplier against the whole backhaul. A client two hops out getting 5 Mbps can be consuming 40 Mbps of total backhaul capacity to deliver it. CAPWAP encapsulation itself costs up to 15% throughput on top of that.

Backhaul interference indoor troubleshooting doesn't prepare you for

  • Weather radar occupies 5600–5650 MHz (channels 124/128) and triggers DFS "quiet"/"silent" mode — a mesh link that drops specifically on those channels isn't a config problem.
  • Collocated mesh nodes need physical separation — 10 ft vertical or 100 ft horizontal — to avoid self-interference between the node's own radios.

Backhaul up with decent SNR, but link rate/throughput is still bad

documented — confirm antenna gain configuration matches the installed hardware before touching anything RF-related. Cisco states the antenna gain for a mesh AP "must be configured to match that of the antenna installed" (entered in 0.5 dBm units) — this is a required configuration step, not an optional tuning knob, and a mismatch here is invisible in a basic SNR check. Also confirm backhaul band: the mesh backhaul on these platforms defaults to, and is locked to, 802.11a — "You cannot change the backhaul interface to 802.11b/g" — so any plan assuming 2.4 GHz backhaul capacity starts from a wrong premise. Cisco's own recommendation is to leave the backhaul rate set to Auto rather than a fixed rate, which is exactly the setting that self-corrects a rate mismatch like this.

If this is specifically two collocated/closely-mounted mesh nodes: the 10 ft vertical / 100 ft horizontal spacing requirement above exists precisely to avoid the nodes' own radios interfering with each other. Nodes mounted closer than that will show self-interference that looks exactly like a generic weak/unstable backhaul, and no channel or power change will fix it.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/8-10/config-guide/b_cg810/connecting-mesh-aps.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-10/config-guide/b_cg810/troubleshooting-mesh-aps.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_mesh_ewlc.html

CMX & Cisco Spaces

mostly documented

How RF data becomes a location

The controller pulls RSSI from up to 16 APs per client/tag/rogue. Probing clients send probe requests that APs forward to the controller — acknowledged probes by default, with unacknowledged probes available as an accuracy option. The controller relays all of this over NMSP: to an on-prem CMX appliance directly, or to cloud Cisco Spaces via "NMSP cloud-services" over HTTPS.

inference — Cisco Spaces reads as CMX's cloud-hosted evolution: the 9800's own config chapter is titled "Cisco Spaces," but every command inside it still says cmx. Not a direct Cisco statement, but the naming is hard to read any other way.

Accuracy add-ons — and what they actually require

FeatureRequirementAccuracy
Standard RSSINo special hardware≈10m
HyperlocationDedicated AoA hardware on specific Aironet models; all APs on a floor grouped together, NTP-synced≈1m, only within the AP group's "convex hull"
FastLocateWave2/9100-series APs; uses data packets, not just probes; needs NTP sync≈10m

Hyperlocation's 1m figure only holds inside the convex hull of the AP group that's been deployed together and NTP-synced. A test point placed outside that geometric boundary will read far less accurately, and that's expected behavior, not a defect.

Turning on cloud Cisco Spaces from a 9800

nmsp cloud-services enable
! configure DNS resolution
crypto pki trustpool import         ! import Root CA certs
! optionally configure an HTTP proxy
! then register, and set:
nmsp cloud-services server url <url>
nmsp cloud-services server token <token>

For on-prem CMX instead: NMSP (TCP port 16113) must be open between the controller and the CMX appliance. show nmsp status verifies the connection either way.

Cisco Spaces licensing tiers

documented, not verbatim-verified — Cisco publishes three Spaces tiers at spaces.cisco.com/packages/: Advantage (bundled into unified/Meraki licensing or added to DNA-Advantage; AI-maps, indoor location, occupancy, Wi-Fi onboarding, Spaces API/data export, Space Utilization Analytics), Premier (adds indoor turn-by-turn navigation, space-explorer kiosks, smart desking — "everything in Advantage" plus those), and a Collaboration tier (turns Cisco collaboration devices and the wireless network into sensors — "everything in Advantage & Premier"). This was retrieved via a summarized fetch rather than raw HTML, so treat the tier names and feature lists as high-confidence but re-check the live page before quoting exact wording to a customer.

Cisco Spaces Connector

documented — a real, current Connector doc tree exists (on-prem appliance bridging infrastructure to the Spaces cloud, now on "Connector 3," service-oriented/modular architecture), including the Configuration/Deployment Guide with OVA sizing: minimum spec is 2 vCPU, 4 GB RAM, 120 GB hard disk, with a full deployment walkthrough covering Standard/Advanced1/Advanced2 tiers and single- vs. dual-interface options. Cisco's Spaces doc URLs shift frequently, so start from the confirmed-live installation-guides index if the direct link below has moved: cisco.com/c/en/us/support/wireless/dna-spaces/products-installation-guides-list.html

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/8-10/config-guide/b_cg810/location_services.html
  • cisco.com/c/en/us/td/docs/wireless/mse/10-6/cmx_config/b_cg_cmx106/the_cisco_cmx_detect_and_locate_service.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_cmx_cloud.html
  • spaces.cisco.com/packages/
  • cisco.com/c/en/us/td/docs/wireless/spaces/connector/article/m-migrating.html
  • cisco.com/c/en/us/support/wireless/dna-spaces/products-installation-guides-list.html
  • cisco.com/c/en/us/td/docs/wireless/spaces/connector/config/b_connector_30/m_ova_30.html

HA SSO & N+1 failover

Catalyst 9800 · mostly documented, with real gaps noted

RMI and RP — the link that has to be right

The Redundancy Management Interface (RMI) and Redundancy Port (RP) must sit on the same subnet, isolated from every other interface on the box. Cisco's documented addressing recommendation is a 169.254.x.x/16 block derived from the management interface — explicitly not 10.10.10.x/24. RP round-trip time must stay under 80ms, and the HA port maps only to a 1Gbps interface (SFP takes priority over RJ-45 if both are present).

Split-brain is a named, documented condition

If RP goes down and RMI becomes unreachable at the same time, Cisco calls this a double fault: "Both controllers may become active, causing a network conflict." Role negotiation only resumes once connectivity is restored, and the controller that came up last stays active — not the one that was active before the fault. If RP alone drops during HA sync, the standby intentionally crashes when IPC communication fails, rather than risk running split.

If RP is down but RMI/gateway is still reachable: the standby becomes active, and the previous active enters rp-rec-mode (visible in the hostname) with every interface admin-down except the wireless management interface on the RMI IP.

Verification commands

show romvar                              ! exact HA config: CHASSIS_HA_REMOTE_IP,
                                          !   CHASSIS_HA_LOCAL_IP, CHASSIS_HA_IFNAME, CHASSIS_HA_IFMAC
show chassis                             ! chassis state (caveat below)
show redundancy                          ! active/standby box details
show redundancy switchover history       ! switchover count, reason, timestamp
show wireless stat redundancy summary    ! AP recovery duration (ms), SSO HA sync timer expired
test wireless redundancy packetdump start
test wireless redundancy rping

Documented caveat on show chassis: "When the peer timeout and retries are configured, the show chassis ha-status command output may show incorrect values." Don't trust that field blindly if custom peer-timeout values are in play.

documented — the 9800's show redundancy states output is not the classic IOS/IOS-XR "Current Software state = ACTIVE" phrasing. The real field names are my state and peer state, each a numeric code with the human label appended after a dash:

Device# show redundancy states
my state = 13 -ACTIVE
peer state = 8  -STANDBY HOT
Mode = Duplex
Unit = Primary
Unit ID = 1
Redundancy Mode (Operational) = sso
Redundancy Mode (Configured) = sso
Redundancy State = sso
Maintenance Mode = Disabled
Manual Swact = enabled
Communications = Up

On the standby unit, Manual Swact reads "cannot be initiated from this the standby unit" (Cisco's own grammar, not a transcription error) — a quick way to confirm which box you're actually logged into before issuing a swact.

What a clean SSO actually preserves

Only one CAPWAP tunnel is maintained between APs and the active controller at a time — "zero downtime for client services and no SSID outages" is the documented target, and database mirroring prevents APs from re-entering discovery.

What does not survive a switchover, documented explicitly: clients not yet in RUN state are removed, and purged entirely after 300 seconds if they haven't reconnected; NBAR flow state in local mode is lost; AVC flow context must be relearned; voice calls can't be recognized post-switchover because RTP/RTCP-based policy breaks; TCP sessions must re-establish; statistics tables aren't synchronized at all.

N+1 — a terminology gap, now resolved with sourced nuance

documented — the mechanism most engineers mean by "N+1" (AP failover to a separate standby controller, not a chassis pair) maps to Cisco's documented AP priming profile system: primary/secondary/tertiary controller statements pushed to APs via priming-override, mapped by name-regex filter or directly by AP MAC address. Confirmed directly against the 9800 config guide: the term "N+1" there primarily names the N+1 Hitless Rolling AP Upgrade feature — "a controller-assisted method that migrates APs to a temporary controller during upgrade, avoiding service disruption" — not chassis HA SSO.

The same chapter does use "N+1" once in a looser, redundancy-architecture sense, under "Best practices for N+1 redundancy deployments": "Use spare controllers in N+1 redundancy deployments to allow APs to fail over when the primary controller becomes non-operational. This approach ensures minimal network downtime, typically lasting 30 to 40 seconds, as APs discover and join the network in local mode." That's the spare-controller failover idea engineers mean — but Cisco never equates it with AP priming terminology in any reachable document. Treat "N+1" on the 9800 as the rolling-upgrade/spare-controller term, and AP priming as the separate, actual failover mechanism — related in effect, not the same documented concept.

Documented failover logic: an AP always returns to its primary once that controller is available again. Tertiary is only used if both primary and secondary are down, and if secondary recovers while primary is still down, the AP stays on tertiary — there's no mid-outage fallback to secondary.

show ap filters all type priming
show ap filters active type priming
show wireless profile ap priming summary
show wireless profile ap priming all
show ap name <ap-name> config general | sec Priming   ! Priming Profile, Override, Source (MAC/FILTER/NONE)

That last command is the one that actually answers "why didn't this AP fail over as expected" — it shows whether the AP received the priming configuration at all.

Root causes Cisco documents

  • Active and standby must run the same mode (Install or Bundle) and the same image version. Auto-upgrade exists specifically to handle "one of the redundancy port is upgraded to a newer version, and the other one is not upgraded at the same time."
  • Mismatched wireless trustpoints — same name, different keys — prevent the trustpoint from coming up after SSO forms.
  • Don't enable hyper-threading on HA VMs: "HA keepalives are lost, and a stack merge may occur."
  • VM snapshots of HA hosts are unsupported and can crash the controller.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_vewlc_high_availability.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_ap_fb_wlcs.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_vewlc_high_availability.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_hitless_upgrade.html

Client exclusion & rogue management

mixed confidence — see panels

Exclusion categories and their fixed thresholds

PolicyExcluded on
Excessive 802.11 association failures6th attempt, after 5 consecutive failures
Excessive 802.11 authentication failures6th attempt, after 5 consecutive failures
Excessive 802.1X authentication failures4th attempt, after 3 consecutive failures
Maximum 802.1X-AAA failure attemptsconfigurable 1–10, default 3
IP theft / IP reuseon detection — IP already assigned elsewhere
Excessive web authentication failures4th attempt, after 3 consecutive failures

All exclusion policies are enabled by default, globally. Per-WLAN, each is independently toggleable, and the exclusion timeout itself is configurable. Documented default exclusion timeout (AireOS): 60 seconds before release 8.5, 180 seconds from 8.5 onward; Cisco's own tuning guidance is 60–300 seconds, noting "values higher than 300 seconds provide better protection but can trigger user complaints."

inference — no 9800/IOS-XE-specific document could confirm whether the current default timeout matches the AireOS-era 180 seconds. Treat that figure as a carried-forward assumption, not a confirmed 17.x default, until checked on a live box.

Why this gets misdiagnosed as an active failure

documented — the exclusion-state field does not live where most engineers look first. show wireless client mac-address <mac> detail carries no exclusion field at all (confirmed against the full documented field list for that command). The real command is show wireless exclusionlist client mac <mac> detail, which documents exactly these fields:

Device# show wireless exclusionlist client mac 12da.4820.cce9 detail
Client State : Excluded
Client MAC Address : 12da.4820.cce9
Client IPv4 Address: 20.20.20.6
Exclusion Reason : IP address theft
AP Name: charlie2
Wireless LAN Name: mhe-ewlc
VLAN Id : 20

A client that's actively failing right now will show up in neither the plain client-detail output nor the exclusion list with a current reason — a client that's been excluded will show Client State : Excluded here. Check this specific command first, before spending time on a live trace.

community-sourced, not Cisco-documented — a real-world controller log posted to Cisco Community shows the exclusion syslog facility as %CLIENT_EXCLUSION_SERVER-5-ADD_TO_EXCLUSIONLIST_REASON_DYNAMIC, e.g. "...was added to exclusion list associated with AP Name:AP013... reason:Wrong PSK." This string could not be located on any official Cisco documentation page — treat it as field-observed, not vendor-confirmed, until seen on your own box.

The failure pattern worth knowing by heart: fixed threshold → timed exclusion → client retries once the timer expires → same threshold trips again. From the outside this looks exactly like a continuous, unresolved auth failure. It is not currently failing — it's cycling through a timeout. inference, consistent with the documented mechanics above but not a named Cisco troubleshooting pattern in any single source found.

Rogue classification

Four categories, exactly as Cisco documents them: Friendly, Malicious, Unclassified, Custom. Malicious is reached specifically when "AP authentication failure count field exceeds its threshold." Custom classification is rule-driven only — it can never be assigned manually.

show wireless wps rogue ap summary
show wireless wps rogue ap detailed <mac>
show wireless wps rogue ap {friendly|malicious|unclassified|custom} summary
show wireless wps rogue client summary
show wireless wps rogue adhoc summary
show wireless wps rogue containment summary
show wireless wps rogue rule summary

Containment has a documented exception and a hard restriction

Containment sends unicast disassociation/deauthentication frames — and for rogue APs specifically, "containment frames are sent only if a rogue client is associated." When the rogue has 802.11w/PMF enabled, the controller does not actively contain it; it marks the rogue "Contained Pending" and raises an alarm instead. Separately, and documented as a hard restriction: containment is not supported on DFS channels, full stop.

not Cisco-sourced — a commonly cited field caution is that containment transmits deauth/disassoc frames against third-party devices the operator doesn't own, which carries real regulatory exposure in some jurisdictions (the FCC's 2015 enforcement action against a hotel operator for exactly this is the usual reference point). No Cisco documentation page states this caution directly; if this belongs in your organization's playbook, cite the FCC action itself, not Cisco, as the source.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/wlan_security.html
  • cisco.com/c/en/us/support/docs/lan-switching/8021x/214466-802-1x-client-exclusion-on-an-aireos-wlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_manage_rogue.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_classify_rogue_aps_ewlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-18/config-guide/b_wl_17_18_cg/m_ip_theft.html
  • community.cisco.com/t5/wireless/9800-cl-wlc-repeated-client-exclusion-for-wrong-psk/td-p/5013067 (community-sourced, not official docs)

802.1X supplicant-side failures

strong sourcing on the core thesis

The single error code that hides four different causes

Cisco's own "Cheat Sheet for Common Wireless Issues" documents AAA Error "-4" (Authentication Failed) as the WLC's single, most common error — and its documented cause list includes mismatched EAP methods between client and server, an expired client certificate, and an expired server certificate, all collapsed into the same error code. This is the concrete, Cisco-documented proof that a basic "auth failed" symptom cannot by itself distinguish a client problem from a server problem. Don't let that one error code drive an escalation decision on its own.

Machine vs. user auth ordering (EAP chaining / TEAP)

In a chained TEAP session, user identity is attempted first (ISE log 11573 Selected identity type 'User'), then machine (11574 Selected identity type 'Machine'). If user auth fails but machine auth succeeds, ISE still completes the session: 11566 TEAP inner method finished with failure for the user attempt, followed by 33517 Sent TEAP Intermediate Result TLV indicating failure, then a successful machine attempt (12528 Inner EAP-TLS authentication succeeded), and the overall session can still return 11002 Returned RADIUS Access-Accept.

Authorization is then driven by the Network Access.EapChainingResult attribute — Cisco's own documentation describes policy rules written explicitly around "machine authenticated but user not" versus "both now authenticated," confirming this differential treatment is intentional, documented design, not an edge case.

Client-side certificate trust

The WLC-side signature for a client that never responds is unambiguous: DOT1X-5-FAIL with reason (Timeout), repeated Retrying (count 3) method dot1x, ending in CO_CLIENT_DELETE_REASON_CONNECT_TIMEOUT. Cisco's own remediation text for this exact scenario reads: "Ensure wireless client trust RADIUS' certificate" — stated as a client-side action item, not a server fix.

ISE's own error 5440 corroborates from the other side: "the endpoint supplicant does not complete the EAP authentication within the configured timeout," logged as "ISE sending 'Access-Challenge' but ISE didn't receive any response." ISE did its job; the client went silent. The same abandonment pattern — "Endpoint <MAC> abandoned EAP session <session-id> and started EAP session" — recurs as a named, numbered event across independent Cisco troubleshooting documents, not an ad hoc string.

unconfirmed — no Cisco documentation found states the exact log text for "untrusted root CA," "certificate expired," or "clock skew" as distinct, separately-coded failure reasons. These are well-established real-world causes, but any specific wording attributed to them should be treated as inference, not a cited string, until confirmed against a live ISE instance or TAC case.

Localizing the fault from the 9800 side

debug wireless mac <mac> monitor-time <seconds>      ! default 1800s
more bootflash:ra_trace_MAC_<mac>_*.log
show wireless client mac-address <mac> detail | inc Policy Profile
show logging profile wireless internal filter

Cisco's own distinction, stated directly: an EAP timeout (client never answers) is client-side; "ACL acl-sent-by-ise is missing in configuration for mac" or an EPM VLAN plug-in conflict — "the ACL/VLAN sent by the RADIUS server does not exist on 9800 WLC" — is server-side. That single line is the fastest way to know which team to involve before escalating.

documented — Policy Manager State is a real, confirmed field in show wireless client mac-address <mac> detail output, after two research passes failed to pin it down. Sample output shows:

Policy Manager State: Run
Last Policy Manager State : IP Learn Complete

A client stuck mid-CWA shows the transition state Webauth_reqd instead of Run — documented separately in Cisco's DNA Spaces captive-portal integration doc as the state the client policy manager moves to during web-auth redirect. That's the field to grep for when you need to know whether a client is actually stuck in web-auth versus everywhere else in the join sequence.

The decision rule for not escalating prematurely

ISE's own 5440 troubleshooting methodology states it plainly: test the same NAD/PSN/policy against a known-good endpoint, and if only certain endpoints fail, "focus the investigation on the endpoint configuration or supplicant." Combined with the WLC-side timeout+deauth signature above, that's the documented basis for keeping an issue on the endpoint rather than routing it to the RADIUS/ISE team.

Sources

  • cisco.com/c/en/us/support/docs/wireless/5508-wireless-controller/200072-Cheat-Sheet-Common-Wireless-issues.html
  • cisco.com/c/en/us/support/docs/security/identity-services-engine/216510-eap-chaining-with-teap.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/213970-catalyst-9800-wireless-controllers-commo.html
  • cisco.com/c/en/us/support/docs/security/identity-services-engine/226277-troubleshooting-5440-endpoint.html
  • cisco.com/c/en/us/support/docs/security/identity-services-engine/226150-troubleshoot-ise-3-4-vpn-and-radius.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/213949-wireless-debugging-and-log-collection-on.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-6/config-guide/b_wl_17_6_cg/m_client_roaming_policy_profile.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-15/config-guide/b_wl_17_15_cg/m-802-11w.html
  • cisco.com/c/en/us/support/docs/wireless/dna-spaces/215423-dna-spaces-captive-portal-with-9800-cont.html

Multicast & broadcast over WLAN

mostly documented

IGMP snooping doesn't stop at the controller

The controller still forwards multicast to every AP over CAPWAP — snooping suppresses flooding at the AP-to-client, over-the-air hop, not the controller-to-AP hop. Only APs with an actively subscribed client send the multicast stream on a given WLAN. The controller builds unique MGIDs from the (L3 group, VLAN) pair and tracks per-AP client membership against them.

IGMPv1/MLDv1 snooping is fully supported; IGMPv2/v3 support is explicitly documented as "limited" — if the upstream switch doesn't recognize IGMPv3, hosts simply don't get traffic.

show wireless multicast
show wireless multicast group summary
show wireless multicast [source <src>] group <grp> vlan <vlanid>
show ip igmp snooping wireless mgid
show ip igmp snooping igmpv2-tracking
show wireless profile policy detail <policy-profile>    ! Multicast VLAN, Multicast Filter field

DTIM interval — a documented, hard recommendation

documented — Cisco states this without qualification: "The only recommended DTIM values are 1 and 2; higher DTIM values will likely cause communications problems." The AP buffers broadcast/multicast frames and only releases them at the DTIM beacon — a 100ms beacon period with DTIM=1 delivers multicast 10 times per second; raising DTIM delays delivery proportionally.

inference — raising DTIM on APs serving battery-saving handhelds, badge scanners, or IoT devices delays multicast/broadcast delivery in exact proportion to beacon-interval × DTIM value. This is commonly misdiagnosed as a flaky application ("my paging app is slow," "discovery is unreliable") rather than traced back to the RF profile's DTIM setting.

Multicast-to-unicast conversion — a real platform split

AireOS — "Media Stream"9800 — "MCUC mode"
Why it existsNo 802.11 ACK/retry for multicast — a lost frame is simply gone. Converting to unicast lets each client acknowledge receipt.
Platform support7.0.98.0+, clients must associate at 802.11n speedsOnly 9800-CL small template and 9800-L — explicitly NOT 9800-40, 9800-80, or CW9800M/H1/H2
LimitsMax streams per radio/client (0–20, default unlimited); Max Retry % default 80 (exceeding it = "video will not start" or client demoted); Max Media Bandwidth default 85%; 100 multicast groups/VLAN/controller maxNo documented numeric client threshold found — don't assert one
Verifyshow media-stream group summary, show media-stream group detail <name>show wireless multicast source <src> group <grp> vlan <vlanid> — shows per-client MC2UC status

The platform-support restriction for 9800 MCUC is the detail most likely to catch an engineer off guard moving from AireOS: the feature doesn't carry over uniformly across the 9800 line.

mDNS/Bonjour — cross-VLAN failure is by design

mDNS uses link-local multicast (224.0.0.251 / UDP 5353), which Cisco states plainly is "only forwarded to the local Layer 2 network." A printer or AirPlay device not discoverable across VLANs is expected behavior, not a defect — the 9800 mDNS Gateway exists specifically to bridge this via caching and service policies. mDNS AP (flood-and-learn, CAPWAP-tunneled) caps at 10 wired VLANs, supports Local/Monitor mode only, IPv4-only for wired providers, and stale wired cache entries can persist up to 4500 seconds.

show mdns-sd summary
show mdns-sd cache
show mdns-sd cache wired
show mdns-sd cache type {PTR|SRV|A-AAA|TXT}
show mdns-sd statistics
show mdns-sd ap

confirmed gap, two research passes — the 9800 multicast config guide's own verification table lists WLC-side commands only (show wireless multicast group summary, show ip igmp snooping wireless mgid, show ap multicast mom for AP multicast-over-multicast receipt). No AP-side debug/trace command analogous to AireOS's debug ap command "show capwap mcast mgid all" <AP> exists in that document — this looks like a genuine capability gap, not just an unresearched one. Also still unconfirmed after a second pass: any Cisco statement that standard WLAN QoS profiles rate-limit multicast specifically — the only documented QoS-adjacent interaction remains Media Stream's own retry-percentage-driven demotion.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m-vewlc-multicast-cg.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_wlan_9800.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-10/config-guide/b_cg810/multicast_broadcast_setup.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_mdns_gateway.html

QoS & voice/video over WLAN

strong on 9800 marking, thin on 9800 CAC

Metal policies, not classic AC names

9800 names its QoS tiers Platinum/Gold/Silver/Bronze rather than the raw WMM access categories: Platinum = Voice (AC_VO), Gold = Video (AC_VI), Silver = Best Effort (AC_BE, the default), Bronze = Background (AC_BK). Max DSCP per metal: Bronze 8, Silver 0, Gold 34 (AF41), Platinum 46 (EF).

Documented client-vs-WLC marking mismatch worth memorizing: the WLC maps DSCP 46 to UP 6 (Voice), while Windows maps the same DSCP 46 to UP 5 (Video). Reading a packet capture without knowing this will make a correctly-marked voice flow look misclassified when it isn't. Default behavior since 17.4 is qos-map trust-dscp-upstream.

show wireless client mac-address <mac> detail
show wireless client summary
show policy-map interface wireless <ap> input
show wireless profile policy detailed <name>    ! QBSS Load status
show dot11 qos                                    ! AP-side
show controllers dot11Radio 1 | begin EDCA         ! AP-side

Call Admission Control — a real documentation gap between platforms

AireOS has full, documented CAC: static (radio-based) and load-based (channel-based, the default) modes, voice max-bandwidth defaulting to 75% (configurable 5–85%), with rejection counters in show ap stats ("Num of calls rejected due to insufficient bw" / "...invalid params/PHY rate/QoS policy") and per-client diagnostics via show client voice-diag {status|tspec|qos-map|avrg_rssi|roam-history}.

On 9800/IOS-XE, the documentation is thin. The only confirmed CAC-related text found is "SIP CAC is not supported" for centrally-switched traffic, plus an undocumented CLI fragment (ap dot11 {24|5|6}ghz cac voice acm) with no accompanying bandwidth percentage, rejection statistics, or show commands. Commands that sound plausible by analogy — show ap dot11 24ghz call-admission, show call-admission statistics — could not be verified anywhere and should not be published or relied on as real syntax.

The untrusted uplink problem, in two distinct forms

Catalyst 9000 switchports default to trusted, but two separate documented failure modes still happen in the field:

  • Wired-side remarking — an intermediate switch remarks DSCP 46 down to CS1, degrading WMM all the way to Background before the traffic ever reaches the AP.
  • Outer-header-only remarking — a switch on the AP's own uplink can only see the outer CAPWAP header, not the tunneled client traffic inside it. The inner client DSCP survives untouched, so the client-side marking looks perfectly fine — but the AP-to-WLC transport itself is deprioritized at every hop, producing jitter and loss that a client-side-only inspection will never explain.

Cisco's documented 5-step verification: capture at the source, check every intermediate switch config, capture before and after each switch plus at the WLC and the destination, simulate the path, then cross-check against the 9800 best-practice document. Current trust-boundary commands on 9000-series: trust device <type>, auto qos trust {cos|dscp}, auto qos voip {cisco-phone|cisco-softphone|trust}, verified via show auto qos and show policy-map interface. An untrusted/mismatched peer causes both CoS and DSCP to reset to 0.

Troubleshooting order — stated plainly as a synthesis

inference — no single Cisco flowchart unifies "choppy voice/video" troubleshooting. Two separate documented paths exist: general connectivity troubleshooting checks RF retries and RSSI first via show wireless stats client summary, but never reaches QoS; the QoS-specific document uses the DSCP hop-by-hop capture methodology instead. A "check RF, then QoS, then CAC, then CPU" ordering is a reasonable synthesis of both, not a Cisco-stated sequence — present it to a reader as a suggested approach, not a quoted procedure.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_wireless_qos_cg_vewlc1_from_17_3_1_onwards.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/222241-configure-validate-and-troubleshoot-wire.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-10/config-guide/b_cg810/wireless_quality_of_service.html

NTP & certificate time dependencies

commands/best-practice documented; the core thesis is sound inference

stated plainly — the idea that clock skew causes a valid certificate to be falsely rejected as expired is sound engineering reasoning, built from documented NTP/stratum behavior, documented CAPWAP DTLS cert-failure syslogs, and standard X.509 validity-window semantics. It is not a sentence Cisco has published verbatim for either the CAPWAP (AP↔controller) or EAP-TLS (client↔ISE) trust chain. Present it to a reader as a well-grounded troubleshooting hypothesis, not a quoted Cisco statement.

Checking sync state

show ntp status          ! "Clock is synchronized, stratum 2, reference is 10.4.2.254"
show ntp associations    ! * = synced/configured, # = selected but unsynced
show clock detail

A clock divergence beyond roughly 4000 seconds from the reference is Cisco's own documented threshold for flagging a real problem.

documented — confirmed sample show clock detail output from Cisco's own IOS/IOS-XE Configuration Fundamentals Command Reference (general command surface, not a 9800-specific capture, but applies directly to IOS-XE):

Router> show clock detail
15:29:03.158 PST Tue Feb 25 2003
Time source is NTP

Prefix symbols carry the real signal: no prefix = authoritative/in sync; . prefix = authoritative but NTP has since lost contact with all configured servers; * prefix = not authoritative, never synced or clock never set. Check for that leading . specifically — it's the signature of a clock that was fine and silently drifted.

The one confirmed syslog tie-in

The 9800 Data DTLS guide documents a "MIC expiration bypass for AP join" feature alongside real CAPWAP cert-validation failure syslogs: %DTLS_TRACE_MSG-3-WLC_DTLS_ERR...Certificate validation failed and %CAPWAPAC_SMGR_TRACE_MESSAGE-5-AP_JOIN_DISJOIN...cause: DTLS handshake error. This confirms the mechanism exists and has real log output — it does not confirm that clock skew specifically (versus an actually-expired cert) is what triggers it.

documented — confirmed verbatim in Cisco's System Error Messages Guide for Access and Edge Routers:

%PKI-3-CERTIFICATE_INVALID_EXPIRED: Certificate chain validation has
  failed. The certificate (SN: [chars]) has expired. Validity period
  ended on [chars]
  Recommended Action: Check the system clock to see if its set correctly

%PKI-3-CERTIFICATE_INVALID_NOT_YET_VALID: Certificate chain validation
  has failed. The certificate (SN: [chars]) is not yet valid
  Validity period starts on [chars]
  Recommended Action: Check the system clock to see if its set correctly

Cisco's own recommended action for both messages is literally "check the system clock" — direct confirmation that the clock-skew hypothesis above is the vendor's own first troubleshooting step, not just field reasoning. Methodology to distinguish real expiry from skew-induced false rejection: compare show clock detail on the WLC, AP, and ISE against the NotBefore/NotAfter fields from show crypto pki certificates on each device.

Shared NTP source — this one is directly documented

ISE's own Administration Guide states it without qualification: "Choose the same Network Time Protocol (NTP) server for all the nodes... This setting ensures that reports and logs... are always synchronized." ISE supports up to 3 NTP servers.

A correction worth flagging: APs are not necessarily a single point of failure

It would be easy to assume APs simply inherit the controller's clock via CAPWAP with no independent source — making a wrong controller clock a single point of failure for every AP's cert validation. That's not what Cisco documents: the 9800/EWC AP-group NTP feature lets an AP group point at its own, independent NTP server (ntp ip <addr>), separate from the controller, specifically to support location-accuracy features. timezone use-controller only syncs the timezone offset — not the clock itself. A Cisco Community thread (not an authoritative source) claims an AP falls back to controller-inherited time only if it has no independent source configured; cite that as a forum claim if you use it at all, not as documented fact.

Two separate trust chains

unconfirmed — no Cisco document directly compares the CAPWAP (AP↔controller) and EAP-TLS (client↔ISE) PKI chains side by side. That they are architecturally separate and independently validated is correct X.509/CAPWAP theory, not something found stated in a single Cisco source.

Sources

  • cisco.com/c/en/us/support/docs/technical-details/220303-verify-ntp-status-with-the-show-ntp-asso.html
  • cisco.com/c/en/us/support/docs/ip/network-time-protocol-ntp/116161-trouble-ntp-00.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-3/config-guide/b_wl_17_3_cg/m_data_dtls.html
  • cisco.com/c/en/us/td/docs/security/ise/3-4/admin_guide/b_ise_admin_3_4/b_ISE_admin_deployment.html
  • cisco.com/c/en/us/td/docs/wireless/controller/ewc/17-6/config-guide/ewc_cg_17_6/ap-group_ntp-server.html
  • cisco.com/c/en/us/td/docs/ios-xml/ios/16_xe/smg/ent-rout-smg.html
  • cisco.com/c/en/us/td/docs/ios-xml/ios/bsm/command/bsm-cr-book/m_bsm-cr-n1.html

9800 ISSU upgrade methodology

documented, with explicit internal inconsistencies noted

ISSU requires a real HA pair — there's no standalone fallback

ISSU "upgrades the controller software image to a later release while the network continues to forward packets," on 9800-80/40/L/CL/M/H1/H2, install mode only. Cisco's own prerequisite check in show issu state detail validates "Standby Online" and "SSO Mode" before allowing activation. There is no documented standalone ISSU workflow anywhere in the config guide — the state machine depends on a standby to absorb traffic, so a standalone 9800 has nothing to activate first.

gap — Cisco does not document what happens if install activate issu is attempted on a standalone controller. It may fail the prerequisite check cleanly, or it may not — this is unconfirmed. For non-HA controllers, Cisco instead documents "N+1 Hitless Rolling AP Upgrade" (a separate controller pair, APs move site-tag by site-tag) as the hitless alternative. That is not ISSU and shouldn't be conflated with it.

The process flow and what to monitor

Image syncs to standby → AP predownload (no service impact) → standby reloads to the new version first while the active continues serving on the old version, forming a temporary mixed-version SSO pair → switchover (the upgraded unit becomes active) → former active reloads to match → staggered AP rejoin cycle → install commit.

show issu state detail      ! primary monitor; shows state transitions and abort-timer countdown
show redundancy              ! Active/Standby roles, "Communications = Up", peer "STANDBY HOT"
show install summary         ! I/U/C/D package flags, abort-timer status
show chassis rmi
show ap image                ! AP predownload tracking

Minor documentation inconsistency worth knowing: show redundancy appears in the separate upgrade and troubleshooting guides but not in the core ISSU config-guide chapter itself.

Rollback — default timer and real triggers

Default auto-abort timer: 360 minutes (6 hours), configurable 30–1200 via install activate issu auto-abort-timer <min>. If install commit isn't issued before expiry, the device reloads back to the previous version automatically.

install commit                      ! persist the upgrade
install abort issu                   ! manual rollback — pre-commit only
install auto-abort-timer stop        ! disables the timer; still requires a manual commit later

Documented rollback triggers: TFTP/image download failure, checksum mismatch, activating before AP predownload completes, auto-abort timer expiry, and config incompatibility causing MCL/PRC sync failures — Cisco cites specific real examples: the domain command removed in 17.6.x, snmp-server enable traps hsrp removed in 17.4.x, and invalid WPA3 AKM configuration.

Cisco's own tech note tells engineers to avoid ISSU entirely on specific builds — known defects CSCws19380 and CSCws35670 cause instability specifically in 17.15.1–17.15.4d and 17.18.1–17.18.2, and Cisco recommends a standard upgrade instead of ISSU on those exact releases. This is worth stating directly: the "safe" path is not universally safe, and Cisco documents that itself.

Confirming a supported path before you start

ISSU is supported EM-to-EM within the same train, not more than three years apart, and within any release of the same EM. Not supported: cross-major-train moves (16.x→17.x, 17.x→18.x), SM-to-EM or EM-to-SM moves, special/engineering images, LDPE↔NPE moves, downgrades, and a hard break at 27.1.1 with no ISSU path into it from any prior release. There is no live show issu capability command — Cisco publishes a static compatibility matrix instead, which has to be checked as a lookup, not queried from the CLI. show issu state detail's system check only validates runtime readiness, not version-pair eligibility — passing that check does not mean the version pair is actually supported.

AP-side behavior — even "successful" ISSU involves a rejoin

APs stay joined through most of the process, and predownload itself has no service impact — but after cutover, APs move in staggered sub-groups via ap upgrade staggered, and Cisco's documentation states directly: "when the APs rejoin, they rejoin with V2." That's a real reload and CAPWAP rejoin per AP sub-group, staggered to limit blast radius — not a seamless failover with zero rejoin, even on a fully successful run.

Cisco's own documentation is internally inconsistent on one point: one section says a mid-process SSO/HA event stops the rolling AP upgrade and requires a manual resume; another section says switchover auto-resumes it. This isn't resolved here — treat it as a known documentation gap rather than picking a side. Known defect CSCws53690 (fixed in 17.18.3) caused unwanted AP disjoin specifically during ISSU from 17.12.6a to 17.18.2, confirming AP disjoin is a real documented failure mode even on an otherwise-supported upgrade path.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_issu.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/tech-notes/b_issu_9800.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/222405-upgrade-catalyst-9800-wlc-ha-sso-using-i.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/221693-troubleshoot-issu-upgrade-on-c9800.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/215550-hitless-software-upgrade-on-catalyst-980.html

PoE & AP power troubleshooting

documented

What an AP gives up when it's underpowered

Current Wi-Fi 6/6E/7 APs document an explicit, tiered feature loss by power class — this is not a vague "may underperform," it's a specific published tradeoff table per model:

ModelFull power802.3at (PoE+)802.3af
9130AX802.3bt/UPOE, 8x8 5GHz, USB on8x8 w/ USB off, or 4x4 w/ USB onBoth radios to 1x1, uplink to 1GbE, USB off
9136UPOE/bt (47.3W), tri-radio 4x4/8x8/4x4, 2x5G, 9W USBDrops to 2x2/4x4/2x2, 1x2.5G, USB disabledAll radios off (staging only)
9166 / 9178 / 9163EFull radio set, USB enabledRadios typically retained, USB disabled and/or link speed halvedAll radios off (staging only)

All of these models separately document a thermal derating behavior above 40°C ambient (e.g., 8x8→4x4 on 5GHz) that is completely independent of PoE class — a hot IDF closet can reproduce the exact same symptom as an underpowered port.

AP-side LED signature for underpower — confirmed, documented

documented — all five current Wi-Fi 6/6E/7 AP hardware guides (9130AX, 9136, 9166, 9178, and the 9164I guide covering the 9163E's chassis family) carry an identical LED Status Indications table with a row specifically for insufficient inline power:

LED patternCategoryMeaning
Cycling Red → Off → Green → Off → Blue → OffAccess point operating system errorsGeneral warning; insufficient inline power
Steady Green / BlueNormalAssociated, operating normally
Blinking GreenBoot errorBoot loader signature failure
Blinking BlueIn progressSoftware upgrade in progress
Alternating Green / RedIn progressController discovery/join in progress

This is genuinely diagnostic, not a generic fault light — the underpower pattern is distinct from boot failure, upgrade-in-progress, and discovery/join states. No 9163E-titled guide exists separately from the 9164I family document; the table is identical across both.

confirmed gap, real search effort — no AP-side syslog string (visible via show logging on the AP console/SSH, or in a radioactive trace) explicitly meaning "underpowered" or "reduced power mode" was found. Checked: the IOS-XE System Message Guide, AP command references, and candidate substrings LWAPP_POWER, CAPWAP_POWER, AP_POWER — only a generic AP_POWER_PROFILE_TRACE_MESSAGE-3-WLC_GEN_ERR facility turned up, unrelated to power deficiency specifically. The LED pattern above is the only confirmed AP-side underpower signal; the switch-side ILPOWER_POWER_DENY counter below remains the only confirmed log-based signal, and it lives on the switch, not the AP.

Reading the switch-side power state — per port

show power inline detail
show platform software ilpower system 1
show environment all
show environment power

Key fields: Device Detected, Device Type, Connection Check, IEEE Class (Alt-A/B), discovery mechanism ("Ieee and Cisco"), Power Allocated vs. actual consumption, and fault counters — Absent, Over Current, Short Current, Invalid Signature, and critically, Power Denied. A nonzero Power Denied counter plus an operational state of "off" is the documented signature of a port that asked for power and didn't get it.

Reading the switch-side power state — the whole chassis/stack budget

Every individual port can negotiate successfully while the switch as a whole runs out of total PoE wattage — a wiring closet populated with enough 802.3bt/UPOE Wi-Fi 6E APs to exceed the stack's aggregate budget is a different failure mode than a single port being denied, and it's the one engineers miss most often when planning a deployment.

show power inline                      ! per-module Available/Used/Remaining (Watts), Catalyst 9300
show power                             ! chassis-level System Power / Inline Power totals, Catalyst 9400
show env power switch [switch-number]  ! internal PSU status per stack member

Catalyst 9300 example fields: a module row reading 3 1310.0 660.0 650.0 under Available / Used / Remaining (Watts) headers. Catalyst 9400 chassis-level show power shows paired totals like System Power 3505 3505 and Inline Power 0 9295.

PSU redundancy mode — a direct tradeoff against usable PoE budget

On Catalyst 9400 (modular chassis, multiple internal PSUs): power redundancy-mode redundant n+1 <standby-PS-slot> or n+n <slots> reserves one or more PSUs purely as failover capacity. power redundancy-mode combined instead sums every PSU's capacity into the usable budget — roughly doubling available PoE wattage, at the cost of zero failover protection: "If you have too many IP phones drawing power from the system, power to IP phones is cut" is Cisco's own stated consequence of running too close to budget in combined mode.

Catalyst 9300 (fixed-config stack) doesn't expose this same power redundancy-mode command — it uses StackPower instead, which pools PSU capacity across up to 4 stack members (8 with an XPS-2200 appliance). Cisco's own recommendation: "Power-sharing mode is the recommended configuration for Cisco Catalyst 9300 Series Switches." Not supported on 9300L models.

Planning the budget before you rack anything

Catalyst 9300 total PoE budgets are PSU-combination-specific, not flat per-tier numbers — check the actual datasheet row for the exact PSU pairing you're ordering, not a rule of thumb:

ModelSingle PSUDual/max PSU
C9300-24P445W720W ("limited by port number and port rating")
C9300-48U822W1800W ("limited by design")
C9300X-48HX590Wup to 2490W depending on secondary PSU
C9300L-48PF-4G890W1440W

Cisco's datasheet gives worked per-port examples rather than one formula sentence: e.g. "PoE+ on all ports (30W per port)" or "UPOE+ (90W per port) / 802.3bt Type 4 on 21 ports" as the way to size a chassis against planned load. The practical check for an AP deployment: multiply planned AP count by the actual negotiated class (not nameplate max — most Wi-Fi 6E APs draw well under their 60W 802.3bt ceiling in real operation) and compare against the Available/Remaining fields above, not just whether each individual port came up.

CDP/LLDP negotiation — the silent failure mode

An AP boots at low power (under 7W) and negotiates upward via CDP. Cisco documents directly that "CDP is not supported on third-party-powered devices," which forces classification down to IEEE class alone — and 802.3at LLDP power-via-MDI is the standards-based fallback for exactly that case.

inference — no Cisco document explicitly states "a non-Cisco switch without 802.3at LLDP support will silently cap the AP at its IEEE class." But it follows directly from the documented mechanism: that switch classifies by IEEE class only, caps the AP there, and the negotiation reports success — just at a lower tier, with no error anywhere. 2-event classification (hardware class-4 detection that bypasses CDP/LLDP entirely) is Cisco's own documented mitigation for this exact gap.

The TAC troubleshooting split

SymptomLikely causeCheckSyslog
No PoE on multiple/all portsBudget exhaustionshow power inline detail, show environment allILPOWER_POWER_DENY
Single port failsPer-port negotiation failureshow interface status, check for power inline never misconfigCONTROLLER_PORT_ERR, INVALID_IEEE_CLASS, SHUT_OVERDRAWN, IEEE_DISCONNECT
Negotiation disagreementCDP/LLDP conflictdisable one — no lldp tlv-select power-managementPOWER_CDP_SHUT

Cabling: 100m max total run including patch panels, with cutoff power calculated as rated PD consumption plus worst-case cable power loss. UPOE requires Class D or better cabling; 802.3bt requires Category 5e or above. Cisco documents cable category/quality, not a shorter max length, as the lever at higher power classes. Diagnostics: show post, platform-specific DiagPoETest/TestPoE, debug ilpower event/controller/powerman.

Sources

  • cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-12/configuration_guide/int_hw/b_1712_int_and_hw_9300_cg/configuring_poe.html
  • cisco.com/c/en/us/products/collateral/wireless/catalyst-9100ax-access-points/nb-06-cat-9130-ser-ap-ds-cte-en.html
  • cisco.com/c/en/us/products/collateral/wireless/catalyst-9100ax-access-points/nb-06-cat9136-access-point-ds-cte-en.html
  • cisco.com/c/en/us/td/docs/wireless/access_point/9130ax/quick/guide/ap9130ax-getstart.html
  • cisco.com/c/en/us/td/docs/wireless/access_point/c9136i/install-guide/b-hig-9136i/configure-and-deploy-your-ap.html
  • cisco.com/c/en/us/td/docs/wireless/access_point/cw916x/cw9166/install-guide/b-hig-cw9166i/configure-and-deploy-your-ap.html
  • cisco.com/c/en/us/td/docs/wireless/access_point/cw917x/c9178I/b-hig-cw9178i/configure-and-deploy-your-ap/controller-discovery-process.html
  • cisco.com/c/en/us/td/docs/wireless/access_point/cw916x/cw9164/install-guide/b-hig-cw9164i/configure-and-deploy-your-ap.html
  • cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-12/configuration_guide/int_hw/b_1712_int_and_hw_9300_cg/configuring_2_event_classification.html
  • cisco.com/c/en/us/support/docs/switches/catalyst-9200-series-switches/215636-troubleshooting-power-over-ethernet-poe.html
  • cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-9/configuration_guide/int_hw/b_179_int_and_hw_9300_cg/configuring_poe.html
  • cisco.com/c/en/us/td/docs/switches/lan/catalyst9400/software/release/17-6/configuration_guide/sys_mgmt/b_176_sys_mgmt_9400_cg/environmental_monitoring_and_power_management.html
  • cisco.com/c/en/us/products/collateral/switches/catalyst-9300-series-switches/nb-06-cat9300-ser-data-sheet-cte-en.html

Layer 2 switching for AP uplinks

mixed confidence — see panels. Scope: Layer 2 only, no routing/L3

This is the section to bounce back to whenever a client-side or AAA investigation stalls, and the real cause turns out to be sitting one layer down. Everything here is Layer 2 switching only — trunk/access ports, 802.1Q tagging, native VLAN. No routing protocols, no SVIs, no inter-VLAN routing. An AP that never joins the WLC is extremely often an untagged-VLAN or trunk/access mismatch, not an AAA/RADIUS problem — misdiagnosing which layer the fault lives on wastes more field time than almost anything else in this guide.

Trunk vs. access port — what's actually documented for AP uplinks

documented for FlexConnect specifically: Cisco's 9800 FlexConnect chapter shows the AP uplink on a trunk port, explicitly for wired-VLAN separation of locally-switched WLANs: switchport mode trunk, switchport trunk native vlan 100, switchport trunk allowed vlan 101, with the AP needing "IP connectivity on the native VLAN."

inference — for standard local-mode/central-switching deployments, Cisco never states outright "configure the AP switchport as access mode." That's near-universal field practice, consistent with how CAPWAP actually works: in local/central-switching mode, client VLAN tagging happens inside the CAPWAP tunnel at the WLC, not via 802.1Q on the AP's physical wire — so the AP's own uplink only needs a single VLAN (access mode) to reach the controller. FlexConnect is the one mode Cisco's own docs show genuinely needing a trunk, because that's the mode where VLANs are switched locally at the AP instead of tunneled to the WLC.

802.1Q native VLAN — the documented mismatch symptom isn't what most engineers expect

documented — Cisco's Catalyst 9300 VLAN Trunks guide is explicit: "the device forwards untagged traffic in the native VLAN configured for the port," and "make sure the native VLAN for an IEEE 802.1Q trunk is the same on both ends of the trunk link." The documented symptom of a mismatch is a spanning-tree loop — "if the native VLAN on one end of the trunk is different from the native VLAN on the other end, spanning-tree loops might result" — not primarily a clean error message.

CDP does have a documented mismatch-detection role: an "enhanced reporting mechanism" flags "mismatched native VLAN IDs (IEEE 802.1Q) on connected ports," with messages sendable "to the console or to a logging server." unverified — the specific, widely field-quoted syslog string %CDP-4-NATIVE_VLAN_MISMATCH could not be confirmed on any live Cisco.com page despite real search effort. Treat that exact mnemonic as commonly-seen-in-the-field, not vendor-confirmed, until you see it on your own switch.

Why the untagged VLAN matters for AP join specifically

When no client VLAN is explicitly configured for a policy profile, Cisco documents that "the AP native VLAN is used" — so an AP sitting on the wrong native/untagged VLAN doesn't throw a clean "wrong VLAN" error. It silently loses IP reachability to the controller, and the symptom shows up as a stuck or endlessly-retrying CAPWAP discovery, which is easy to misroute to an AAA/RADIUS investigation that was never going to find anything. Rule out the native VLAN before escalating a join failure as an authentication problem.

Verification commands — confirmed field names

show interfaces interface-id trunk      ! trunk config, allowed/active VLANs
show interfaces interface-id switchport ! Administrative Mode, Trunking Native Mode VLAN, Trunking VLANs Enabled
show vlan                               ! confirms the VLAN actually exists in the database

unverified — show vlan brief is standard IOS-XE syntax and almost certainly works, but wasn't quote-confirmed against a fetched Cisco page this pass; the three commands above are the ones with confirmed exact field names.

CDP/LLDP automatic VLAN assignment for APs — not documented, don't assume it

not found — no Cisco documentation confirms CDP/LLDP-based automatic VLAN assignment for AP ports analogous to the IP-phone voice-VLAN mechanism. CDP/LLDP power negotiation for APs is real and documented (see the PoE section), but automatic data-VLAN assignment via the same discovery protocols is not — don't present that as a thing to rely on.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_vewlc_flex_connect.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_config_vlan_ewlc_cg.html
  • cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-9/configuration_guide/vlan/b_179_vlan_9300_cg/configuring_vlan_trunks.html
  • cisco.com/c/en/us/td/docs/ios-xml/ios/cdp/configuration/15-mt/cdp-15-mt-book/nm-cdp-discover.html

Mobility & FlexConnect

Catalyst 9800 (IOS-XE) · mostly documented, legacy-vs-current terminology verified directly against current config guides

This section covers everything about wireless traffic and roaming behavior that happens outside a single local-mode AP talking to one controller: mobility groups between controllers, anchor/foreign designation for guest traffic, the mobility tunnel that carries all of it, and FlexConnect for branch/remote-site APs. The Roaming: FT/11k/11v section covers 802.11r fast-transition roaming mechanics specifically; this section covers the mobility-tunnel/anchor architecture those roams actually run on top of. The Layer 2 switching section covers switch-side VLAN/trunk config; this section covers what FlexConnect does with those VLANs once traffic reaches the AP.

Mobility groups — still the live mechanism on IOS-XE, not an AireOS holdover

documented — a mobility group "defines a set of controllers identified by the same mobility group name" and "enables seamless roaming and state and context sharing for wireless clients." Members "dynamically share information and forward data traffic when inter-controller or inter-subnet roaming occurs," and they "share the context and state of client devices and their list of access points," which "prevents controllers from identifying access points from other controllers as rogue devices." This is current 9800 config-guide language, not an AireOS-era concept carried over by habit — the CLI below is native IOS-XE.

Discovery/peering is explicit, not automatic: "each controller is configured with a list of the other mobility group members." On a client join, "the controller sends a unicast message, or a multicast message if mobility multicast is configured, to all controllers in the mobility group."

! Set the local group name and mobility MAC (do this before adding peers)
wireless mobility group name Mygroup
wireless mobility mac-address AAAA.BBBB.CCCC

! Add a peer controller to the group (9800-to-9800)
wireless mobility group member mac-address 001E.BD0C.5AFF ip 9.12.32.10 group test-group data-link-encryption

! 9800-to-AireOS peer (entered on the 9800 side)
wireless mobility group member mac-address 001E.BD0C.5AFF ip 9.12.32.10 group test-group

show wireless mobility summary          ! Mobility Group Name, MAC, Keepalive Interval/Count, Domain ID, per-peer status
show run | i mobility                   ! confirm the mobility MAC is actually saved in the running config

not found — current 9800 documentation does not use "mobility controller" (MC) / "mobility agent" (MA) role terminology at all. If you've seen that vocabulary, it's from a different Cisco architecture document (or AireOS-era material); don't present it as the current 9800 model.

The documented symptom of a mismatched mobility group

documented — the group-name requirement is explicitly tied to fast Layer 2 roaming: controllers must share the same mobility group name "when a fast layer2 roam like Fast Transition (FT) or Cisco Centralized Key Management (CCKM) is in use." inference — this is the direct mechanical explanation for the classic field symptom "client roams to a different controller and does a full 802.1X instead of a fast roam": a mobility group name mismatch (or a controller sitting outside the group entirely) forces the roam down to full re-authentication because the FT/CCKM key material can't be validated against a peer the controller doesn't recognize as a trusted group member.

show wireless stats mobility tracks this as a named, counted condition — a "Group mismatch" field appears under both "Handoff Status Received" and "Handoff Status Sent." A nonzero counter there is hard evidence, not a guess.

Separately documented, not a mobility-group issue: "client roaming is not supported if there is a WLAN profile mismatch" between controllers — a different root cause with the same symptom (roam fails or falls back to full auth), so don't assume group name is the only thing to check.

Anchor vs. foreign — current 9800 terms and CLI

documented definitions: "Anchor controller: the original controller where the client is first authenticated and where session anchoring remains, maintaining the primary client database entry." "Foreign controller: the new controller to which the client connects after roaming, which receives a copy of the client database entry marked as a foreign entry." For guest deployments this is the controller pair most engineers mean by "auto-anchor mobility" — Cisco's current 9800 docs describe the mechanism this way without using that exact phrase as a feature name; the GUI/CLI feature name is Export Anchor.

Role split, quoted directly from the Cisco TAC configuration doc: "Foreign controller: This WLC owns layer 2 or the wireless side… All client traffic for the anchored WLANs is encapsulated into the mobility tunnel to be sent to the anchor." "Anchor controller: This is the layer 3 exit point… decapsulates or terminates the client traffic into the exit point (VLAN)."

A hard matching requirement, stated directly: "it is mandatory that WLAN and Policy Profile names and configurations match on both foreign 9800 WLC and anchor 9800 WLC with the exception of VLAN under the Policy Profile." The VLAN itself is intentionally allowed to differ — that's the whole point of anchoring guest traffic to a DMZ VLAN that doesn't exist on the foreign controller.

! FOREIGN controller (WLAN-based, non-wired guest)
wireless profile policy anchor-policy
 mobility anchor 10.88.173.105 priority 3
 no shutdown
wireless tag policy PT1
 wlan anchor-ssid policy anchor-policy

! ANCHOR controller (profile name must match the foreign side exactly)
wireless profile policy anchor-policy
 mobility anchor
 vlan 29
 no shutdown

Two explicit, documented constraints that produce silent breakage if ignored:

  • "You must not configure mobility peers and export anchor at the same time. That is an invalid configuration scenario."
  • "You must not use the Export Anchor setting, for any policy profile tied to a WLAN profile on a controller with access points." (The anchor controller is a Layer-3 exit point, not an AP-serving controller for that WLAN.)

Wired guest-LAN variant (same anchor/foreign split, different commands)

! FOREIGN side — wired VLAN is configured only here
guest-lan profile-name gstpro-1 1 wired-vlan 25
 no security web-auth              ! for open auth

! ANCHOR side — no wired-vlan parameter; VLAN comes from the policy profile
guest-lan profile-name testpro-2 1

documented restriction: "Ensure that the Anchor VLAN ID and the wired VLAN ID configured on the Foreign controller is not the same." Also capacity limits: "A maximum of five guest LANs are supported on the foreign controller," "A maximum of 2000 clients per foreign are supported," and "You can map only one wired VLAN to a guest LAN" / "only one guest LAN to one policy profile."

Verifying anchoring is actually happening

show wireless mobility summary
show wireless client summary                               ! on foreign: client shows up here
show wireless client mac-address <mac> detail                ! look for:
                                                             !   Mobility Role : Export Foreign
                                                             !   Mobility Roam Type : L3 Requested
show wireless config validate                               ! surfaces VLAN/guest-LAN mismatches directly, e.g.:
                                                             !   "Error in No record found for VLAN 9,
                                                             !    needed by Guest-LAN open-wired"

community-reported, not a Cisco doc claim — a real field case on Cisco Community (9800-to-9800 guest anchor) describes clients that "try and connect and State is mobility, but the clients do not get a IP address or redirected to the splash page," and never appear on the anchor controller at all. The responding troubleshooter's documented checklist for that exact symptom: confirm the policy-profile config actually matches between anchor and foreign (copy foreign's profiles/tags via CLI and paste to the anchor, changing only the mobility settings), confirm Export Anchor is actually checked on the anchor's policy profile, and confirm there's a real SVI for the anchor VLAN rather than relying on the WLC's own DHCP server (called out as "not a recommended practice"). Treat this as a credible field pattern, not a vendor-confirmed root cause list.

Separately documented and easy to misdiagnose as "anchoring doesn't work": if an AP physically moves between controllers that are mobility peers of each other, a client can "remain anchored" to the original controller. The documented fix is "remove the mobility peer configuration from that controller" — not to chase the anchor config itself.

The mobility tunnel — CAPWAP on IOS-XE, not EoIP

documented, directly confirmed — "the Cisco Catalyst 9800 Series Wireless Controller mobility tunnel is a CAPWAP tunnel with a control path (UDP 16666) and a data path (UDP 16667)." The control path "uses DTLS encryption by default," supported DTLS version 1.2. Data-path encryption (data-link-encryption / data-DTLS) is optional and must be matched on both ends — "If the configurations do not match, the system disables the mobility data path."

documented, platform distinction confirmed by direct comparison rather than assumed: EoIP (Ethernet over IP) is an AireOS-era term, not a current IOS-XE/9800 term. The AireOS 8.5 configuration guide uses it directly, describing the encrypted mobility tunnel as using "UDP port 16667, instead of EoIP, to send the data traffic" — i.e. on AireOS, EoIP is the default unencrypted data-path encapsulation that the encrypted tunnel replaces. The 9800 mobility-tunnel documentation never mentions EoIP at all; its data path is CAPWAP/UDP 16667 unconditionally, encrypted or not.

inference — in a mixed AireOS+9800 (IRCM) deployment, "control plane encryption is always enabled" regardless of platform, and if you enable data encryption on the 9800 side you must also enable it on the AireOS side with config mobility group member data-dtls enable — a mismatch here, not a missing EoIP tunnel, is the documented failure mode on mixed deployments.

Mobility tunnels have two platform-specific restrictions worth knowing before troubleshooting a cert error: "Mobility tunnels do not support ECDSA-based certificates or ECDSA-based trustpoints," and 9800-CL peers using self-signed certs need an additional SSC hash validation step.

Tunnel health — verification and documented failure signatures

show wireless mobility summary                 ! Mobility Group Name, MAC, Keepalive Interval/Count,
                                                 !   Domain Identifier, per-peer IP/Public-IP/Group/Status/PMTU
show wireless mobility peer ip <peer-ip>         ! single-peer detail
show wireless mobility ap-list                  ! APs known to the mobility group
show wireless stats mobility                    ! event stats, handoff status (incl. "Group mismatch"),
                                                 !   export anchor/foreign counters, L2/L3 roam counts
show wireless stats mobility messages           ! per-message-type Tx/Rx counters
show wireless management trustpoint             ! cert hash, for peer validation issues
show crypto pki trustpoints
Documented syslog / error textMeaning
keepalive ctrl packet missed, total missed packet = 10Peer unreachable — check that UDP 16666/16667 are open end-to-end between the controllers.
Failed to validate endpoint: Invalid argumentGeneral endpoint validation failure during peer setup.
Failed to validate endpoint. reason: Group name hash mismatch.Mobility group names don't match between peers — the exact, named error for the symptom in the section above.
Failed to validate endpoint. reason: MAC address mismatch.The configured peer MAC doesn't match the peer's actual mobility MAC.
Mobility DTLS Ctrl handshake failed for <ip> HB is downControl-path DTLS handshake failure — check trustpoint/certificate state, not basic reachability.
MAC_CONFLICT warning, once per minuteDocumented as cosmetic in specific Layer2/Layer3 topology scenarios — Cisco states it "does not impact functionality or performance."

documented HA SSO gotcha, and already cross-referenced in this guide's ISE section: "mobility MAC address is not configured by default and it can cause the mobility tunnel to go down if a failover happens." The fix is to explicitly set and save wireless mobility mac-address so a chassis failover doesn't silently change the mobility identity the rest of the group has peered with.

FlexConnect — local vs. central switching

documented definitions, current 9800 FlexConnect chapter: Locally switched — "the AP forwards client data directly to the local LAN or VLAN at the site instead of tunneling it through the controller." Centrally switched — "the AP forwards the client's data traffic to the controller, depending on the WLAN configuration."

FlexConnect exists specifically for "branch office and remote office deployments," letting branch APs be managed "through a wide area network (WAN) link without deploying a controller in each office." Documented WAN requirements: round-trip latency "must not exceed 300 milliseconds (ms) between the access point and the controller," and FlexConnect "supports up to 4 fragmented packets or a 576-byte MTU WAN link." Local authentication specifically is called out as useful when you "cannot maintain a remote office setup of a minimum bandwidth of 128 kbps with the round-trip latency no greater than 100 ms."

Documented stateValid in
Central authentication, central switchingConnected mode only
Central authentication, local switchingConnected mode only
Local authentication, local switchingConnected and standalone mode
Authentication down, switch downConnected and standalone (centrally-switched WLANs when auth is down)
Authentication down, local switchingStandalone mode (locally-switched WLANs when auth is down)

Standalone mode — what happens when the WAN/controller link drops

documented, exact trigger: "Whenever a FlexConnect AP disassociates from controller, it moves to the standalone mode." Effect: "Centrally switched clients are disassociated. However, the FlexConnect access point continues to serve locally switched clients." This is the single most important FlexConnect fact for sizing a design — a branch WLAN that must survive a WAN outage has to be locally switched; a centrally-switched WLAN at a branch site is defined to drop its clients the moment the WAN link does.

Security-type behavior in standalone mode is also explicit: open/shared/WPA-PSK/WPA2-PSK WLANs "enter the local authentication, local switching state and continue new client authentications" with no controller needed. 802.1X/WPA-802.1X/WPA2-802.1X/CCKM WLANs "require an external or local RADIUS server to remain operational" — i.e. 802.1X branch clients only keep working in standalone mode if local EAP/RADIUS is configured on the AP itself, not by default.

documented recovery sequence, quoted directly — this is the exact, field-relevant timeline for "AP stuck in standalone": "The AP attempts to discover for five times and if it still cannot find the controller, it tries to renew the DHCP on the ethernet interface to get a new DHCP IP." "The AP will retry for five times, and if that fails, the AP will renew the IP address of the interface again, this will happen for three attempts." "If the three attempts fail, the AP will fall back to the static IP and will reboot (only if the AP is configured with a static IP)." Reboot rationale given directly: "Reboot is done to remove the possibility of any unknown error the AP configuration." On reconnecting: "the AP disassociates clients, applies new configuration, and resumes normal connectivity."

Also documented: a controller normally doesn't use a backup RADIUS server for 802.1X — "A controller does not use a backup RADIUS server. The controller uses the backup RADIUS server in local authentication mode." That only applies once the AP is already in local/standalone authentication, not in normal connected operation.

FlexConnect ACLs, VLAN mapping, and the site-tag model

On the 9800, FlexConnect ACLs attach via a Flex Profile, not centrally like a redirect ACL on the WLC. VLAN mapping and ACL assignment live in the same place:

wireless profile flex Flex-profile-1
 acl-policy ACL1
 native-vlan-id 25
 vlan-name VLAN0169
  vlan-id 169
  acl ACL1

documented limitation worth flagging up front: "FlexConnect access points with locally switched WLANs cannot perform IP source guard and prevent ARP spoofing." Also: "FlexConnect mode can support only 16 VLANs per AP." Hitting that ceiling at a branch with many SSID/VLAN combinations is a documented capacity wall, not a bug.

9800/IOS-XE does not use the AireOS term "FlexConnect Group" — the current grouping/config-distribution mechanism is the site tag, which "allows you to efficiently manage AP profiles and flex profiles associated with specific network sites."

wireless tag site default-site-tag
 no local-site                     ! must be set before configuring flex-profile — this is what
                                    !   actually puts the AP in FlexConnect mode
 flex-profile rr-xyz-flex-profile
 ap-profile xyz-ap-profile

show wireless tag site summary
show ap tag summary
show ap name <ap-name> tag info

documented, and a genuinely common misconfiguration: "In the FlexConnect mode, use a named site tag instead of default-site-tag," because leaving an AP on default-site-tag means "the client Pairwise Master Key (PMK) is not sent to APs," causing "client roam and reassociation issues." A branch AP that was never explicitly moved onto a real site tag will show exactly that symptom — roams that work on paper but keep failing or re-authenticating in the field. Capacity note: "You can have a maximum of 100 access points for each flex connect site."

Split tunneling and DNS during web authentication

During web-auth on a locally-switched FlexConnect WLAN, DNS has a documented, deliberately centralized exception: "client DNS replies must pass through the controller during authentication" — specifically, "the FlexConnect APs allows only DNS and DHCP messages; the APs forward the DNS reply messages to the controller before web-authentication… is complete." Only after web-auth completes does traffic switch fully locally: "all traffic switches locally." A branch guest/webauth SSID that seems to redirect correctly but then can't resolve anything post-login, or vice versa, is a sign this handoff point is misconfigured rather than a generic DNS problem.

Split tunneling itself is configured as an ACL path: define the ACL, attach it as an ACL policy under the flex profile, map a split MAC ACL name within the wireless policy profile, then apply the site/policy tags — the same ACL-via-flex-profile mechanism used for general FlexConnect ACLs above, not a separate feature.

documented operational caveat, easy to trigger by accident during a "quick fix": "When you apply a configuration change to a locally switched WLAN, the access point resets the radio, causing associated client devices to disassociate… Modify the configuration only during a maintenance window." A VLAN-mapping tweak pushed mid-day to fix one client will knock every other client on that AP's radio off at the same moment.

Field triage — common failure modes

SymptomLikely documented causeCheck
Client roams to another controller, does full 802.1X instead of fast roamMobility group name mismatch breaking FT/CCKM validation, or WLAN profile mismatchshow wireless stats mobility — "Group mismatch" counter; confirm group name identical on both controllers
Guest client sits in "mobility" state, never gets an IP, never redirects, never appears on anchorPolicy-profile/WLAN name mismatch between anchor and foreign, Export Anchor not actually set, or no real SVI for the anchor VLANshow wireless config validate; diff anchor/foreign policy-profile config; confirm Export Anchor flag; confirm anchor VLAN has a routed SVI, not WLC-hosted DHCP
Mobility tunnel won't come up / flapsUDP 16666/16667 blocked, group-name hash mismatch, mobility MAC mismatch, or DTLS cert/trustpoint issueshow wireless mobility summary; look for the named error strings in the table above
Mobility tunnel drops after an HA SSO failoverMobility MAC left at default (chassis-derived), which changes on failovershow run | i mobility — confirm wireless mobility mac-address is explicitly set and saved
Branch AP stuck in standalone / clients on centrally-switched WLAN all drop when WAN blipsExpected, documented behavior for centrally-switched WLANs — not a defectConfirm which WLANs at that site are locally vs. centrally switched; only locally-switched WLANs are designed to survive the outage
Branch 802.1X clients can't authenticate during a WAN outageNo local EAP/RADIUS configured on the AP for standalone modeConfirm local-auth AP EAP method and local RADIUS/backup-RADIUS config exist for that flex profile
Branch AP roams/reassociations keep failing even though config "looks right"AP left on default-site-tag instead of a named site tag — PMK not pushed to the APshow ap name <ap> tag info — confirm it's on a named site tag, not default
Clients on a locally-switched VLAN get the wrong traffic / wrong networkVLAN-name/VLAN-id mismatch under the flex profile, or the 16-VLANs-per-AP ceiling hit silentlyshow wireless profile flex detailed <name>; count mapped VLANs against the AP

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-12/config-guide/b_wl_17_12_cg/m_vewlc_mobility.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/213913-building-mobility-tunnels-on-catalyst-98.html
  • cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/213912-configure-mobility-anchor-on-catalyst-98.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-3/config-guide/b_wl_17_3_cg/m_wired-guest-access.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-5/config-guide/b_cg85/encrypted_mobility_tunnel.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/17-9/config-guide/b_wl_17_9_cg/m_vewlc_flex_connect.html
  • community.cisco.com/t5/wireless/guest-devices-unable-to-connect-to-mobility-anchor-cisco-9800/td-p/4440453
  • community.cisco.com/t5/networking-knowledge-base/configure-wlan-anchor-mobility-feature-on-catalyst-9800/ta-p/4772377

AireOS & Mobility Express

documented

The CLI isn't just "older" — it's a different shape

AireOS is flat and non-modal: commands fully qualify their target in one line (config wlan create, config wlan interface), with no config-mode sub-shell to step into. There's also no running/startup split — config lives as XML in RAM and only reaches NVRAM via an explicit save config; logging out or resetting prompts you to save first. 9800/IOS-XE uses the modal config-mode convention most engineers already expect.

The config model itself is restructured, not just renamed

AireOS binds a WLAN directly to a VLAN interface, with AP Groups remapping that WLAN-to-VLAN binding per site. The 9800 decouples the same idea into five pieces: WLAN Profile (SSID/L2 security) + Policy Profile (VLAN/ACL/QoS) + Policy Tag (binds the two) + RF Tag + Site Tag + AP Join Profile. Changing any tag forces an AP rejoin — a side effect that surprises engineers used to AireOS's more direct model.

Debugging works completely differently

AireOS9800 / IOS-XE
debug client <mac> or debug mac addr — one global debug session, filterable by up to 10 MACsdebug platform condition feature wireless mac <mac> then debug platform condition start — radioactive tracing across every process
save configwrite memory

On AireOS, starting a new debug session kills any other active one — a second engineer debugging a different client on the same box will silently stop your trace. There's no equivalent collision on the 9800's condition-based model.

Mobility Express is not the same thing as the 9800's EWC

Classic Mobility Express is AireOS running on an AP acting as its own controller — no separate WLC hardware. Scale depends on which AP holds the Primary role: 1540/1815/1830/1850 top out at 50 APs/1000 clients; 1560/2800/3800/4800 reach 100 APs/2000 clients; the hard ceiling across the line is 100 APs/2000 clients. No Cisco table extends this to Wi-Fi 6 APs under classic ME.

Confirm you're looking at an ME deployment, not a true WLC, with show version on the AP — it reports AP Image Type: MOBILITY EXPRESS IMAGE when it's acting as its own controller.

Don't confuse this with the Catalyst 9800 Embedded Wireless Controller (EWC) — a separate, IOS-XE-based product, not AireOS ME. EWC itself is now end-of-sale (11/29/2024) with support ending 11/30/2029 and no replacement product. If you're inheriting an EWC deployment, there's no "upgrade path" to plan for — only a platform change.

Primary AP election and failover

Election priority, in order: a pinned "User Defined Master" > "Next Preferred Master" > highest-capability hardware > lowest client load > lowest MAC address. Mechanism is VRRP under the hood. No consolidated ME-vs-full-WLC feature parity table exists on Cisco.com — that gap is confirmed, not just unresearched; don't assume one platform's feature set carries over to the other without checking the specific feature.

EOL dates and the IRCM migration path

PlatformEnd of SaleLast Date of Support
35041/31/211/31/27
552012/10/211/31/27
85401/31/221/31/27
WiSM2—already passed (4/30/22)

Migration path runs through the Technology Migration Program toward 9800-40/9800-CL. For mixed-fleet transitions, IRCM (Inter-Release Controller Mobility) lets AireOS and 9800 roam together — always treated as L3 — over a Secure Mobility Tunnel (UDP 16666/16667), replacing the older unencrypted AireOS-only EoIP tunnel.

IRCM has real exclusions, not just a version floor: it requires 9800 on IOS-XE 16.10.1+ and AireOS on IRCM-specific image 8.5.14x or mainline 8.8.111+. 2504, 7510, and WiSM2 are explicitly unsupported for IRCM regardless of software version. FlexConnect and Application Visibility & Control (AVC) don't work under IRCM at all — plan the migration order around what you'd lose mid-transition, not just whether the controllers can see each other.

Web GUI won't load / management access blocked

documented — check HTTP vs. HTTPS state before anything else. HTTP ("web mode") is disabled by default (config network webmode enable|disable); HTTPS ("secure web") is enabled by default (config network secureweb enable|disable). A browser request to http:// on a controller that's never had webmode enabled simply won't load — try https:// before assuming the management interface itself is unreachable. Cisco's own guidance runs the opposite direction from "just enable HTTP for convenience": "enable the HTTPS interface and disable the HTTP interface to ensure more robust security."

If instead you're trying to reach the GUI over a wireless client associated to that same controller/AP: Management via Wireless is disabled by default, and even when enabled it only "blocks wireless management access to the same controller that the wireless client device is currently associated with" — it does nothing to stop a wireless client associated to a different controller from reaching this one. If the real goal is blocking management access broadly by VLAN/subnet, Cisco's own guidance says plainly: "we recommend that you use access control lists (ACLs) or similar mechanism" instead of relying on this toggle. It's also not available at all for FlexConnect locally-switched clients.

Mobility groups — the legacy AireOS model

legacy terminology — AireOS's "mobility group" concept predates the 9800/IOS-XE mobility architecture and is kept here deliberately, since current IOS-XE deployment guidance is covered separately in the Mobility & FlexConnect section. On AireOS, a mobility group is a named set of controllers sharing client/AP context so clients roam seamlessly across them; group membership is a manually maintained peer list, not auto-discovered. The classic unencrypted inter-controller data tunnel on AireOS uses EoIP (Ethernet over IP) — Cisco's own 8.5 configuration guide describes the encrypted alternative as using "UDP port 16667, instead of EoIP, to send the data traffic," i.e. EoIP is the AireOS-era default that the encrypted tunnel replaces. This EoIP terminology does not carry over to IOS-XE/9800, which uses CAPWAP (UDP 16666 control / 16667 data) unconditionally for its mobility tunnel — see the Mobility & FlexConnect section for the current platform's architecture.

Rough command translation

debug client <mac>        →  debug platform condition feature wireless mac <mac>
                                  debug platform condition start
save config                 →  write memory
AP Groups                   →  Policy Tag + Site Tag + RF Tag (structural, not a rename)

unconfirmed — no Cisco source directly pairs show client detail against show wireless client mac-address detail as an equivalence. Treat that mapping as reliable general knowledge, not a cited one-to-one.

Sources

  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/wlans.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/managing_configuration.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/configuring_ap_groups.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/config-guide/b_wl_16_10_cg/new-configuration-model.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/debugging_on_cisco_wireless_controllers.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/config-guide/b_wl_16_10_cg/conditional-debug-and-radioactive-tracing.html
  • cisco.com/c/en/us/td/docs/wireless/controller/technotes/8-8/b_cisco_mobility_express_8_8.html
  • cisco.com/c/en/us/td/docs/wireless/controller/technotes/8-8/b_cisco_mobility_express_8_8/m_master_ap_failover.html
  • cisco.com/c/en/us/products/collateral/wireless/embedded-wireless-controller-catalyst-access-points/wireless-ewc-access-point-eol.html
  • cisco.com/c/en/us/td/docs/wireless/controller/9800/config-guide/ConfiguringIRCM/b-configuring-inter-release-controller-mobility-in-wireless-deployments-supporting-aireos-and-catalyst-9800-controllers.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-8/config-guide/b_cg88/administration_of_cisco_wlc.html
  • cisco.com/c/en/us/td/docs/wireless/controller/8-5/config-guide/b_cg85/encrypted_mobility_tunnel.html

Field case pattern

anonymized

No customer name, case number, or network specifics appear here — this is the generalized technical pattern only. The case-specific writeup lives in a separate, private, access-controlled repository.

Observed pattern

  1. Client completes an 802.11r FT roam successfully, reaches RUN state.
  2. About three seconds later, the controller deletes the client with an AUTH_EXPIRED-family reason — despite the client having been fully associated.
  3. About one second after that, the client retries FT and fails with Invalid PMKID — downstream of the deletion, not the cause.
  4. Client recovers via a fresh full 802.1X association.
  5. Client later stalls in CWA / WEBAUTH_REQUIRED and times out.

Why this is worth escalating

Cisco's own DevNet reference defines the AUTH_EXPIRED-family delete reason as a pre-association timeout — "client did auth phase, but never completed association." That doesn't match a client that had already reached RUN. This contradiction, not the downstream PMKID failure, is what belongs in front of TAC or Bug Search. See Identity Services Engine for the open questions it raises.