240 lines
9.3 KiB
Plaintext
240 lines
9.3 KiB
Plaintext
# ESP32-C5 WiFi Monitor GDB Configuration
|
|
# Auto-loaded for WiFi frame analysis with PHY rate and duration
|
|
|
|
# ============================================================
|
|
# THRESHOLD TUNING COMMANDS
|
|
# ============================================================
|
|
|
|
define show_thresholds
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "WiFi Monitor Thresholds (GDB-tunable)\n"
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "High NAV threshold: %u us\n", threshold_high_nav_us
|
|
printf "Duration mismatch log: %u us\n", threshold_duration_mismatch_us
|
|
printf "PHY rate fallback: %u Mbps\n", threshold_phy_rate_fallback_mbps
|
|
printf "Duration multiplier: %ux expected\n", threshold_duration_multiplier
|
|
printf "\n"
|
|
printf "Collapse Detection:\n"
|
|
printf " Retry rate threshold: %.1f%%\n", threshold_retry_rate_percent
|
|
printf " Avg NAV collapse: %u us\n", threshold_avg_nav_collapse_us
|
|
printf " Collision percentage: %.1f%%\n", threshold_collision_percent
|
|
printf " Mismatch percentage: %.1f%%\n", threshold_mismatch_percent
|
|
printf "\n"
|
|
printf "Logging Control:\n"
|
|
printf " Log every N mismatches: %u (1=all, 10=every 10th)\n", log_every_n_mismatches
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
end
|
|
|
|
define set_high_nav
|
|
if $argc != 1
|
|
printf "Usage: set_high_nav <microseconds>\n"
|
|
printf "Example: set_high_nav 8000 (set to 8ms)\n"
|
|
else
|
|
set threshold_high_nav_us = $arg0
|
|
printf "High NAV threshold set to %u us\n", threshold_high_nav_us
|
|
end
|
|
end
|
|
|
|
define set_mismatch_log
|
|
if $argc != 1
|
|
printf "Usage: set_mismatch_log <microseconds>\n"
|
|
printf "Example: set_mismatch_log 15000 (log when NAV > 15ms)\n"
|
|
else
|
|
set threshold_duration_mismatch_us = $arg0
|
|
printf "Duration mismatch logging threshold set to %u us\n", threshold_duration_mismatch_us
|
|
end
|
|
end
|
|
|
|
define set_rate_fallback
|
|
if $argc != 1
|
|
printf "Usage: set_rate_fallback <mbps>\n"
|
|
printf "Example: set_rate_fallback 50 (fallback if < 50 Mbps)\n"
|
|
else
|
|
set threshold_phy_rate_fallback_mbps = $arg0
|
|
printf "PHY rate fallback threshold set to %u Mbps\n", threshold_phy_rate_fallback_mbps
|
|
end
|
|
end
|
|
|
|
define set_multiplier
|
|
if $argc != 1
|
|
printf "Usage: set_multiplier <factor>\n"
|
|
printf "Example: set_multiplier 3 (NAV > 3x expected = mismatch)\n"
|
|
else
|
|
set threshold_duration_multiplier = $arg0
|
|
printf "Duration multiplier set to %ux expected\n", threshold_duration_multiplier
|
|
end
|
|
end
|
|
|
|
define set_log_rate
|
|
if $argc != 1
|
|
printf "Usage: set_log_rate <n>\n"
|
|
printf "Example: set_log_rate 10 (log every 10th mismatch)\n"
|
|
printf " set_log_rate 1 (log all mismatches)\n"
|
|
else
|
|
set log_every_n_mismatches = $arg0
|
|
printf "Logging every %u mismatch(es)\n", log_every_n_mismatches
|
|
end
|
|
end
|
|
|
|
define tune_sensitive
|
|
set threshold_high_nav_us = 3000
|
|
set threshold_duration_mismatch_us = 5000
|
|
set threshold_phy_rate_fallback_mbps = 150
|
|
set threshold_duration_multiplier = 1.5
|
|
set threshold_retry_rate_percent = 15.0
|
|
set threshold_avg_nav_collapse_us = 5000
|
|
set threshold_collision_percent = 5.0
|
|
set threshold_mismatch_percent = 3.0
|
|
printf "Thresholds set to SENSITIVE (catch more issues)\n"
|
|
show_thresholds
|
|
end
|
|
|
|
define tune_normal
|
|
set threshold_high_nav_us = 5000
|
|
set threshold_duration_mismatch_us = 10000
|
|
set threshold_phy_rate_fallback_mbps = 100
|
|
set threshold_duration_multiplier = 2
|
|
set threshold_retry_rate_percent = 20.0
|
|
set threshold_avg_nav_collapse_us = 10000
|
|
set threshold_collision_percent = 10.0
|
|
set threshold_mismatch_percent = 5.0
|
|
printf "Thresholds set to NORMAL (default)\n"
|
|
show_thresholds
|
|
end
|
|
|
|
define tune_relaxed
|
|
set threshold_high_nav_us = 10000
|
|
set threshold_duration_mismatch_us = 20000
|
|
set threshold_phy_rate_fallback_mbps = 50
|
|
set threshold_duration_multiplier = 3
|
|
set threshold_retry_rate_percent = 30.0
|
|
set threshold_avg_nav_collapse_us = 15000
|
|
set threshold_collision_percent = 15.0
|
|
set threshold_mismatch_percent = 10.0
|
|
printf "Thresholds set to RELAXED (fewer false positives)\n"
|
|
show_thresholds
|
|
end
|
|
|
|
# ============================================================
|
|
# FRAME ANALYSIS COMMANDS
|
|
# ============================================================
|
|
|
|
define show_frame_full
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "Frame: %s\n", wifi_frame_type_str(frame->type, frame->subtype)
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "RSSI: %d dBm\n", frame->rssi
|
|
printf "Channel: %d\n", frame->channel
|
|
printf "Retry: %s\n", frame->retry ? "YES" : "no"
|
|
printf "\n"
|
|
set $bw_str = "20MHz"
|
|
if frame->bandwidth == 1
|
|
set $bw_str = "40MHz"
|
|
end
|
|
if frame->bandwidth == 2
|
|
set $bw_str = "80MHz"
|
|
end
|
|
printf "PHY Rate: %u Kbps (%.1f Mbps)\n", frame->phy_rate_kbps, frame->phy_rate_kbps / 1000.0
|
|
printf "Mode: MCS %d, BW %s, SGI %s\n", frame->mcs, $bw_str, frame->sgi ? "Yes" : "No"
|
|
printf "\n"
|
|
printf "Byte Count: %u bytes\n", frame->frame_len
|
|
if frame->phy_rate_kbps > 0
|
|
set $tx_us = (frame->frame_len * 8000) / frame->phy_rate_kbps
|
|
set $overhead = 44
|
|
set $expected = $tx_us + $overhead
|
|
printf "Expected Duration: %u us (%u tx + %u overhead)\n", $expected, $tx_us, $overhead
|
|
printf "Actual Duration (NAV): %u us\n", frame->duration_id
|
|
set $diff = frame->duration_id - $expected
|
|
if $diff > 0
|
|
printf "Difference: +%d us LONGER than expected", $diff
|
|
if $diff > 5000
|
|
printf " ⚠⚠⚠ HIGH!\n"
|
|
else
|
|
printf "\n"
|
|
end
|
|
else
|
|
set $diff = -$diff
|
|
printf "Difference: -%d us shorter\n", $diff
|
|
end
|
|
else
|
|
printf "Actual Duration (NAV): %u us\n", frame->duration_id
|
|
end
|
|
printf "\n"
|
|
printf "Dest: %02x:%02x:%02x:%02x:%02x:%02x\n", frame->addr1[0], frame->addr1[1], frame->addr1[2], frame->addr1[3], frame->addr1[4], frame->addr1[5]
|
|
printf "Source: %02x:%02x:%02x:%02x:%02x:%02x\n", frame->addr2[0], frame->addr2[1], frame->addr2[2], frame->addr2[3], frame->addr2[4], frame->addr2[5]
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
end
|
|
|
|
define show_duration
|
|
set $tx_us = 0
|
|
if frame->phy_rate_kbps > 0
|
|
set $tx_us = (frame->frame_len * 8000) / frame->phy_rate_kbps
|
|
set $expected = $tx_us + 44
|
|
printf "%s: %u bytes @ %.1f Mbps → Expected %u us, NAV %u us", wifi_frame_type_str(frame->type, frame->subtype), frame->frame_len, frame->phy_rate_kbps/1000.0, $expected, frame->duration_id
|
|
set $diff = frame->duration_id - $expected
|
|
if $diff > 0
|
|
printf " (+%d)\n", $diff
|
|
else
|
|
set $diff = -$diff
|
|
printf " (-%d)\n", $diff
|
|
end
|
|
else
|
|
printf "%s: %u bytes, NAV %u us\n", wifi_frame_type_str(frame->type, frame->subtype), frame->frame_len, frame->duration_id
|
|
end
|
|
end
|
|
|
|
define find_high_nav
|
|
break monitor_frame_callback if frame->duration_id > 10000
|
|
commands
|
|
silent
|
|
printf "⚠ HIGH NAV: "
|
|
show_duration
|
|
continue
|
|
end
|
|
printf "Watching for NAV > 10000 us\n"
|
|
continue
|
|
end
|
|
|
|
define find_mismatch
|
|
break monitor_frame_callback if frame->phy_rate_kbps > 0 && frame->duration_id > ((frame->frame_len * 8000) / frame->phy_rate_kbps + 44) * 2
|
|
printf "Watching for NAV 2x+ expected duration\n"
|
|
continue
|
|
end
|
|
|
|
define watch_data
|
|
break monitor_frame_callback if frame->type == 2
|
|
commands
|
|
silent
|
|
show_duration
|
|
continue
|
|
end
|
|
printf "Watching DATA frames\n"
|
|
continue
|
|
end
|
|
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "WiFi Monitor GDB Commands Loaded\n"
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "Frame Analysis:\n"
|
|
printf " show_frame_full - Complete frame analysis\n"
|
|
printf " show_duration - Quick duration comparison\n"
|
|
printf " find_high_nav - Auto-break on high NAV\n"
|
|
printf " find_mismatch - Auto-break on NAV mismatch\n"
|
|
printf " watch_data - Monitor DATA frames\n"
|
|
printf "\n"
|
|
printf "Threshold Tuning:\n"
|
|
printf " show_thresholds - Display current thresholds\n"
|
|
printf " set_high_nav <us> - Set high NAV threshold\n"
|
|
printf " set_mismatch_log <us> - Set mismatch log threshold\n"
|
|
printf " set_rate_fallback <mbps> - Set rate fallback threshold\n"
|
|
printf " set_multiplier <n> - Set duration multiplier\n"
|
|
printf " set_log_rate <n> - Log every Nth mismatch\n"
|
|
printf "\n"
|
|
printf "Preset Profiles:\n"
|
|
printf " tune_sensitive - Catch more issues (stricter)\n"
|
|
printf " tune_normal - Default settings (balanced)\n"
|
|
printf " tune_relaxed - Fewer false positives (lenient)\n"
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|
|
printf "Type 'show_thresholds' to see current settings\n"
|
|
printf "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
|