Bug fixes:
- Fix path_request_handler hops: use DestinationEntry._hops instead of
stale cached announce_packet.hops(). The cached packet retains its
original wire hops (pre-increment), but Python Transport.py explicitly
overwrites packet.hops from path_table after retrieval (line 2736).
This caused PATH_RESPONSE to report fewer hops than actual, making
the sender's expected_hops too low, which caused LRPROOF hop-count
validation to silently fail. (ROOT CAUSE of link timeout)
- Fix std::map::insert() no-op: erase before insert at 3 locations in
_announce_table. Unlike Python dict assignment, C++ map::insert()
does not overwrite existing keys. This prevented announce table
updates from taking effect. (Caused PATH-RESP delivery failure)
- Defer packet hash filtering for link table entries and LRPROOF
packets. Matching Python Transport behavior (line 1544), packets
belonging to active links are not added to the filter hashlist
until link transport processing determines it is our turn to
forward them. Prevents premature filtering that breaks link transport.
- Pass DestinationEntry and LinkEntry by reference instead of by value
to avoid stale copies and unnecessary allocations.
- Add link_table check before requesting paths for link_id destinations.
Link data packets are handled by link transport, not standard path
lookup, so spurious path requests are avoided.
- Add culling for _held_announces (60s timeout, cap 32) and
_boundary_local_addresses to prevent unbounded memory growth.
- TcpInterface: detect and log partial writes.
Performance optimizations:
- Move TLSF allocator pool to PSRAM (frees ~170KB internal SRAM)
- Raise TCP_IF_MAX_CLIENTS from 4 to 8 in BOUNDARY_MODE
- Raise path_table_maxsize from 48 to 128, persist from 16 to 32
- Add -DNDEBUG to boundary build: compiles out TRACE/DEBUG macros
- Log level defaults to LOG_VERBOSE when NDEBUG defined
- Serial baud 115200 -> 921600 in BOUNDARY_MODE (reduces CPU blocking)
Previous changes included in this commit:
- Comprehensive boundary filter with transitive whitelisting (7 checks)
- destination_table erase+insert fix (std::map::insert no-overwrite bug)
- Backbone-to-backbone routing guard in next-hop forwarding
- KISS serial output disabled for boundary mode
- flash.py updates for boundary mode support
Vendor microReticulum library with boundary mode transport fixes:
- Two-whitelist system gates backbone traffic (local addresses +
mentioned addresses from local devices)
- Allow control_hashes and local destinations through boundary filter
(fixes backbone→LoRa path discovery)
- Fix get_cached_packet() to call unpack() instead of update_hash()
(fixes empty destination_hash in path responses)
- LRPROOF Identity::recall null guard
- remaining_hops HEADER_1/BROADCAST fix for final-hop delivery
- PROOF packets excluded from boundary wrapping
- Iterator invalidation fix in transport table cleanup
- is_backbone flag replaces string matching for interface identification
Firmware changes:
- Set is_backbone(true) on backbone TCP interface
- Rename default TcpInterface name to BackboneInterface
- Update comments for dual-use TcpInterface (backbone + local AP)
- Use vendored lib/microReticulum instead of PlatformIO registry
- Fix path table insert bug: C++ map::insert() silently fails when key
exists (unlike Python dict[key]=value). Changed to erase()+insert() so
updated paths (e.g. local TCP replacing stale LoRa) actually take effect.
- Add name parameter to TcpInterface constructor to give each instance a
unique identity hash, fixing map collision between backbone and local
TCP server interfaces.
- Set TCP interface bitrate to 10 Mbps (was 500 bps) so Transport
correctly prefers TCP paths over LoRa when both exist.
- Add PRG button hold >5s white screen indicator for config portal.
- Boundary mode cull_path_table: evict backbone paths first, preserving
local paths needed for inbound routing.
Bridges LoRa mesh and TCP/WiFi backbone networks using microReticulum.
Based on microReticulum_Firmware with boundary mode additions:
- BoundaryMode.h: State management and EEPROM persistence
- BoundaryConfig.h: WiFi captive portal for configuration
- TcpInterface.h: TCP backbone interface with HDLC framing
- Display.h: Custom OLED layout with network status indicators
- Transport/Identity library patches for embedded memory constraints