# 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:** ```bash # 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:** ```bash # 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) ```bash # 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) ```bash # 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:** ```c bool wifi_cfg_get_bandwidth(char *buf, size_t buf_size); ``` Returns the bandwidth string from NVS ("HT20", "HT40", "VHT80"). ### Display Logic **main.c:** ```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 ```bash 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.