ESP32/doc/BANDWIDTH_CONFIGURED_VS_NEG...

6.7 KiB

Bandwidth: Configured vs Negotiated Display

New Feature

The WiFi connection info now shows both configured and negotiated bandwidth, making it easy to spot when the connection didn't get the bandwidth you requested.

Example Output

Perfect Match (80MHz)

I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main:   SSID:      'ClubHouse'
I (13032) main:   Band:      5GHz
I (13032) main:   Bandwidth: 80MHz (VHT80) (negotiated) - configured: VHT80  ← Match!
I (13032) main:   Channel:   120
I (13042) main:   RSSI:      -32 dBm

Mismatch (Configured 80MHz, Got 20MHz)

I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main:   SSID:      'ClubHouse'
I (13032) main:   Band:      5GHz
I (13032) main:   Bandwidth: 20MHz (HT20) (negotiated) - configured: VHT80  ← MISMATCH!
W (13032) main:   ⚠ Bandwidth mismatch! Configured VHT80 but negotiated 20MHz (HT20)
W (13032) main:   Check: router channel width setting, channel selection, RF interference
I (13032) main:   Channel:   120
I (13042) main:   RSSI:      -32 dBm

Match (40MHz)

I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main:   SSID:      'ClubHouse'
I (13032) main:   Band:      5GHz
I (13032) main:   Bandwidth: 40MHz (HT40) (negotiated) - configured: HT40  ← Match!
I (13032) main:   Channel:   44
I (13042) main:   RSSI:      -35 dBm

What It Shows

Field Description
Negotiated What bandwidth the device actually connected at
Configured What bandwidth you requested via config_device.py
Warning Appears when there's a mismatch

Why Mismatches Happen

Configured VHT80 → Negotiated HT20

Common causes:

  1. Router channel width - Router set to 20MHz or "Auto" picked 20MHz
  2. Channel not 80MHz capable - Some channels don't support 80MHz width
  3. DFS channel issues - Dynamic Frequency Selection interference
  4. Interference - RF environment forced downgrade
  5. Router doesn't support 802.11ac/ax - Old router (802.11n only)

Fix:

# Check router settings:
# - Channel width: 80MHz (not Auto or 20/40MHz)
# - Channel: 36, 44, 52, 100, 108, 116, 149, 157
# - Mode: 802.11ac or 802.11ax

# Try non-DFS channel
# Set router to channel 36 or 44 (most reliable for 80MHz)

# Then reconnect
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
  -s ClubHouse -b 5G -B VHT80

Configured HT40 → Negotiated HT20

Common causes:

  1. Router channel width - Router set to 20MHz only
  2. Interference - Adjacent channels occupied
  3. 2.4GHz congestion - Too many overlapping networks

Fix:

# On router:
# - Channel width: 40MHz
# - Channel: 1, 6, or 11 (2.4GHz) or any 5GHz channel

# Reconnect
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
  -s ClubHouse -b 5G -B HT40

Troubleshooting Guide

Step 1: Check WiFi Driver Log

The most reliable indicator is in the WiFi driver log:

I (12652) wifi:connected with ClubHouse, aid = 3, channel 120, BW20(BELOW, C1)
                                                                  ^^^^
  • BW20 = 20MHz
  • BW40 = 40MHz
  • BW80 = 80MHz

This is what actually happened (ground truth).

Step 2: Check Our Display

Our display gets this from the API:

I (13032) main:   Bandwidth: 20MHz (HT20) (negotiated) - configured: VHT80

Should match the WiFi driver log.

Step 3: If Mismatch, Check Router

For 80MHz on 5GHz:

  1. Router channel width = 80MHz (not Auto)
  2. Channel = 36, 44, 52, 100, 108, 116, 149, or 157
  3. No DFS interference (try channel 36 or 44)
  4. 802.11ac or 802.11ax enabled

For 40MHz:

  1. Router channel width = 40MHz minimum
  2. Adjacent channels available
  3. Low interference

For 20MHz:

  1. This is the fallback - always works
  2. Good for congested areas
  3. Best for stability

Bandwidth Performance

Bandwidth Throughput (5GHz) Use Case
20MHz (HT20) ~130 Mbps Congested areas, maximum range
40MHz (HT40) ~270 Mbps Good throughput, less congestion
80MHz (VHT80) ~530 Mbps Maximum throughput, clean RF

Testing Procedure

Test VHT80 (80MHz)

# 1. Configure router for 80MHz
# Channel: 36 or 44 (non-DFS)
# Width: 80MHz
# Mode: 802.11ac or 802.11ax

# 2. Configure ESP32-C5
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
  -s ClubHouse -b 5G -B VHT80

# 3. Check connection
idf.py -p /dev/ttyUSB1 monitor

# Look for:
# I (13032) main:   Bandwidth: 80MHz (VHT80) (negotiated) - configured: VHT80
# No warning should appear!

# 4. Test throughput
iperf -c 192.168.1.81 -t 30
# Expected: ~500 Mbps

Test HT40 (40MHz)

# 1. Configure router for 40MHz
# Width: 40MHz

# 2. Configure ESP32-C5
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
  -s ClubHouse -b 5G -B HT40

# 3. Check connection
# Should see: Bandwidth: 40MHz (HT40) (negotiated) - configured: HT40

# 4. Test throughput
iperf -c 192.168.1.81 -t 30
# Expected: ~270 Mbps

Implementation Details

New API Function

wifi_cfg.h:

bool wifi_cfg_get_bandwidth(char *buf, size_t buf_size);

Returns the bandwidth string from NVS ("HT20", "HT40", "VHT80").

Display Logic

main.c:

// Get configured from NVS
char configured_bw[16] = {0};
wifi_cfg_get_bandwidth(configured_bw, sizeof(configured_bw));

// Get negotiated from WiFi API
wifi_bandwidth_t bw = /* from esp_wifi_get_bandwidths() */;

// Compare and warn if mismatch
if (strcmp(configured_bw, "VHT80") == 0 && bw != WIFI_BW80) {
    ESP_LOGW(TAG, "⚠ Bandwidth mismatch!");
}

Warning Conditions

A warning appears when:

  • Configured VHT80 but negotiated HT20 or HT40
  • Configured HT40 but negotiated HT20
  • Configured HT20 but negotiated HT40 or VHT80 (rare)

Files Modified

wifi_cfg.h:

  • Added wifi_cfg_get_bandwidth() function declaration

wifi_cfg.c:

  • Implemented wifi_cfg_get_bandwidth() to read "bw" from NVS

main.c:

  • Updated bandwidth display to show both configured and negotiated
  • Added mismatch detection and warning
  • Added troubleshooting hints in warning

Benefits

  1. Immediate visibility - See if bandwidth negotiation failed
  2. Troubleshooting - Mismatch warning points to configuration issue
  3. Verification - Confirm router settings are correct
  4. Debugging - Know if problem is config vs negotiation
  5. Production - Catch deployment issues (wrong router settings)

Perfect for your WiFi analyzer product - you'll immediately know if the connection isn't using optimal bandwidth!

Build and Test

cd ~/Code/esp32/esp32-iperf
idf.py build flash monitor

After connecting, you'll see both configured and negotiated bandwidth, with warnings if they don't match.