Record eight-peer UDP bridge builds and validation limits

This commit is contained in:
mikecarper committed 2026-10-22 12:30:01 -07:00
1 parent f4a9a05f75
commit 624efe152d
3 files changed
+198

No files matched your search

+1
View File
@@ -11,6 +11,7 @@ Completed validation reports, experiments, and test guides are collected here. O
## Radio and RF
- [Eight-peer WiFi UDP bridge: V3/V4/R8 Full build and host validation, 2026-10-22](udp_bridge_2026-10-22.md)
- [RS-232 bridge diagnostics: host/build checks and existing RAK Full RAM failure, 2026-10-22](rs232_bridge_diagnostics_2026-10-22.md)
- [ESP-NOW bridge diagnostics: V4 and V4 R8 TFT Full build/host validation, 2026-10-22](espnow_bridge_diagnostics_2026-10-22.md)
- [V3/V4/T096 radio2 with two fixed witnesses, matched SF7/BW62.5 at preamble 32, 2026-10-22](radio2_simultaneous_receivers_2026-10-22.md)
@@ -0,0 +1,97 @@
<!-- meshcore-hosted-doc-link:start -->
<p class="meshcore-hosted-doc-link"><a href="https://mikecarper.github.io/MeshCore/test-results/udp_bridge_2026-10-22/">View this page on MeshCore Docs</a>.</p>
<!-- meshcore-hosted-doc-link:end -->
# Eight-peer WiFi UDP bridge, 22 October 2026
Status: **host tests and all three Full repeater builds PASS**. No radio was
flashed or contacted. Physical WiFi/UDP delivery, router policy, LoRa forwarding
and OTA operation remain outside this validation.
Clean firmware source
[`f4a9a05f7`](https://github.com/mikecarper/MeshCore/commit/f4a9a05f7)
was built with the canonical builder, version
`v1.18.0.1-halo-keymind-cascade-dev`, Cascade runtime defaults and the USA
Cascade preset. The [safe receipt](udp_bridge_2026-10-22.safe.json) binds
source, build recipes, linked memory measurements and package hashes.
## Resulting behavior
Supported ESP32 Full repeaters gain a default-off UDP bridge with eight
explicit IPv4/port peer slots. One bounded, nonblocking socket runs only on a
connected station with an IP address and exact station-only SDK mode. It
pauses on disconnection, AP/AP+STA, browser/deferred WiFi OTA and manual WiFi
shutdown, then restores eligible saved intent. It can join using existing
WiFi credentials without an MQTT broker or a running MQTT worker.
Packets use versioned HMAC-SHA256 authentication with the existing
`bridge.secret`; no new password is added. Fresh challenge/proof exchanges
establish boot sessions, with receiver-boot binding and monotonic receive
sequences rejecting replayed mesh packets and probes. Changing the shared secret
closes old sessions and discards old queued work before further socket service.
Authentication does not encrypt the UDP payload.
Local LoRa traffic can fan out to the eight direct destinations. Incoming
UDP enters the local LoRa mesh, with the usual filters and admission rules;
it is not forwarded to other UDP peers. A volatile packet-origin marker
prevents later LoRa TX callbacks, including OTA retries, from exporting that
same UDP ingress packet again. The marker survives retry copies, is never
serialized, and fits existing packet padding. Unrelated builds do not gain it.
The [setup and diagnostic guide](../udp_bridge_setup.md) covers saved settings,
status, counters, one-way probes and runtime USB summaries. `ready` counts
authenticated boot sessions, not current peer liveness. Match a fresh probe's
ID and increased receive count on the destination to establish reachability.
Probes do not allocate mesh packets, echo, retry or reach LoRa. Automatic
handshake controls have their own bounded retry policy.
## Embedded build results
| Requested target | Selected Full environment | Available internal bytes | Required heap bytes | Model margin | Result |
| --- | --- | ---: | ---: | ---: | --- |
| `Heltec_v3_repeater` | `Heltec_v3_repeater_observer_mqtt` | 209,392 | 209,040 | 352 | PASS |
| `heltec_v4_repeater` | `heltec_v4_repeater_observer_mqtt` | 202,496 | 197,776 | 4,720 | PASS |
| `heltec_v4_r8_tft_repeater` | `heltec_v4_r8_tft_repeater_observer_mqtt` | 200,264 | 195,728 | 4,536 | PASS |
Each image passes application and merged packaging, linked capability checks
including `bridge.udp`, and unchanged memory/size gates. All capability
receipts have empty feature-reduction lists. No feature or reserve was removed.
The enabled-case model adds 5,120 bytes even though UDP defaults off: a source-
asserted 3,072-byte object allowance and 2,048 bytes for the bounded socket and
receive buffering. The socket requires a successful 768-byte receive-limit
configuration. WiFi stack memory is counted once alongside MQTT, with UART
and other existing allocations still reserved. The V3 model margin is small;
these linked capacity estimates are not running free-heap, fragmentation or
maximum-load measurements. Physical startup/load/soak checks remain necessary.
An initial compile attempt at `5e25faa3d` exposed aggregate initialization
unsupported by the pinned ESP32 compiler. `f4a9a05f7` uses explicit field
assignment. The host suite now compiles the production UDP implementation
with strict C++11 before linking its test driver. The earlier failure is
retained privately and excluded from qualifying packages.
## Host checks
- Eight sanitized core methods in both native-USB and ordinary-console builds:
strict framing and a Python HMAC known-answer vector, mutations/oversize,
old-session and reboot replay rejection, simultaneous eight-peer startup,
fan-out, targeted probes, key rotation, pool/backpressure, socket errors,
network changes and bounded logging.
- Three config/OTA methods: strict CLI and local-only test/reset, checked
standalone settings, write faults/power interruption, unchanged common
preferences, and correct pause/restore including manually paused UDP.
- Two integration methods across owner combinations: exact STA versus AP and
stale SDK state, reconnect, manual-off grace, MQTT independence, foreground
power ownership, setup/OTA transitions and failed settings saves.
- Production packet/pool/dispatcher checks: nonserialized origin, retry-copy
preservation, reuse/parser reset and unchanged packet size. Bridge-only USB
formatter checks include a UDP-only build with compile-time debug off.
- Build-profile, allocation-boundary, existing network/wireless/power/RAM,
bridge recovery/filter/ingress, MQTT/UART and USB preference regressions.
- Hosted documentation links and strict documentation rendering.
Router client isolation cannot be diagnosed conclusively from a successful
WiFi association alone. The physical network must allow the configured peers
to exchange UDP. This work did not change router settings or attempt to bypass
network isolation.
@@ -0,0 +1,100 @@
{
"schema_version": 1,
"date": "2026-10-22",
"source_commit": "f4a9a05f7574d7a0cabd16749bc7a4c5f8b18ad9",
"source_clean_at_build": true,
"firmware_version": "v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f",
"runtime_profile": "cascade",
"radio_preset": "usa-cascade-fixed",
"scope": "Host and build/package validation only. No hardware flashed or contacted. No physical UDP, LoRa or OTA operation was performed.",
"physical_validation_performed": false,
"builds": [
{
"requested_target": "Heltec_v3_repeater",
"environment": "Heltec_v3_repeater_observer_mqtt",
"build_profile": "full",
"capability_verification_passed": true,
"feature_reductions": [],
"capabilities_sha256": "6c954ddafd0d5ee4d36132690768ce46a496d732724469aa8d645dc49fca8956",
"build_recipe_sha256": "0243c8212027f3e917ad7dcb2f0a816baf98d7c5078a7b009698870caa5cf3a8",
"memory": {
"passed": true,
"available_internal_bytes": 209392,
"largest_internal_region_bytes": 176624,
"required_heap_bytes": 209040,
"required_contiguous_bytes": 21184,
"scope": "Linked capacity before runtime allocation; physical boot/load/soak validation remains required."
},
"artifacts": [
{
"file": "Heltec_v3_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f-merged.bin",
"bytes": 2351832,
"sha256": "66fb35aa36fe5e1132c6e7af18fc30ed7bddf253e687b4b6fd77314cc0328571"
},
{
"file": "Heltec_v3_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f.bin",
"bytes": 2286296,
"sha256": "edf4b5ec0a19193b993d060a7b0091404dad20e5aed6a3c0499df6bcbe782bdd"
}
]
},
{
"requested_target": "heltec_v4_repeater",
"environment": "heltec_v4_repeater_observer_mqtt",
"build_profile": "full",
"capability_verification_passed": true,
"feature_reductions": [],
"capabilities_sha256": "175c10f43a3ca20aca3b0dacc8efe958fa9e20a0a2859ca15dcc9c588ea91964",
"build_recipe_sha256": "5c45f84cc75c5c95fd541ee426bd7d486057726fc7abbfcf4e551bbb79d2e1ef",
"memory": {
"passed": true,
"available_internal_bytes": 202496,
"largest_internal_region_bytes": 169728,
"required_heap_bytes": 197776,
"required_contiguous_bytes": 21184,
"scope": "Linked capacity before runtime allocation; physical boot/load/soak validation remains required."
},
"artifacts": [
{
"file": "heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f-merged.bin",
"bytes": 2393368,
"sha256": "cb4e7bbf483b41c038af2fbe5aa072b75d88fe76acf27b352e2d51262129b921"
},
{
"file": "heltec_v4_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f.bin",
"bytes": 2327832,
"sha256": "be1128f7b0687964a93afd496bcad2f7a3a30d95d9b9393ea079284b9959603d"
}
]
},
{
"requested_target": "heltec_v4_r8_tft_repeater",
"environment": "heltec_v4_r8_tft_repeater_observer_mqtt",
"build_profile": "full",
"capability_verification_passed": true,
"feature_reductions": [],
"capabilities_sha256": "4c8562503bc0b5f359f8c0eb49365cac2136d3713ab30803015333a844bbe6f7",
"build_recipe_sha256": "d4fa8acc970de47faa0812d3e19f297af21f1cdeff32c2426b76bca63e197801",
"memory": {
"passed": true,
"available_internal_bytes": 200264,
"largest_internal_region_bytes": 167496,
"required_heap_bytes": 195728,
"required_contiguous_bytes": 21184,
"scope": "Linked capacity before runtime allocation; physical boot/load/soak validation remains required."
},
"artifacts": [
{
"file": "heltec_v4_r8_tft_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f-merged.bin",
"bytes": 2407368,
"sha256": "915df5f10c27da036a8c97052d360ce42dcbee3c51c654c1cab57b19039b7513"
},
{
"file": "heltec_v4_r8_tft_repeater_observer_mqtt-full-usb-wifi-ota-v1.18.0.1-halo-keymind-cascade-dev-f4a9a05f.bin",
"bytes": 2341832,
"sha256": "0ad127295e5ec0b810d69627a8d2b6aadc9ef6b8db54fd0d4d5ca7b09d867144"
}
]
}
]
}