Completed S4-S5 and MLS-Lite implementation: - MeshRouter with multi-hop routing - REPL commands /mesh trace, /mesh stats - MeshEnvelope V2 with truncated addresses - MLS-Lite lightweight encryption Key finding: Classical MLS (306B KeyPackage) IS LoRa-viable!
105 lines
5.5 KiB
Markdown
105 lines
5.5 KiB
Markdown
# Status Log
|
|
|
|
## 2026-03-30 — Implementation Sprint (S4-S5 + MLS-Lite)
|
|
|
|
### Completed
|
|
- **S4: Multi-hop routing** — `MeshRouter` with `send()`, `handle_incoming()`, `forward()`, `drain_store_for()`
|
|
- **S4: REPL commands** — `/mesh trace <address>` and `/mesh stats`
|
|
- **S5: Truncated addresses** — `MeshEnvelopeV2` with 16-byte addresses (~18% smaller)
|
|
- **MLS-Lite** — Lightweight symmetric mode for constrained links (`mls_lite.rs`)
|
|
- **Size measurements** — Actual MLS and envelope sizes benchmarked
|
|
|
|
### Actual Measured Sizes (Key Finding!)
|
|
|
|
| Component | Size | LoRa SF12 fragments |
|
|
|-----------|------|---------------------|
|
|
| MLS KeyPackage | 306 bytes | 6 |
|
|
| MLS Welcome | 840 bytes | 17 |
|
|
| MLS-Lite (no sig) | 129 bytes | 3 |
|
|
| MLS-Lite (with sig) | 262 bytes | 6 |
|
|
| MeshEnvelope V1 | 410 bytes | 9 |
|
|
| MeshEnvelope V2 | 336 bytes | 7 |
|
|
| MLS KeyPackage (PQ hybrid) | 2,676 bytes | 53 |
|
|
|
|
**Key insight:** Classical MLS is actually LoRa-viable! 6 fragments for KeyPackage, ~14 sec for group setup at 1% duty. PQ hybrid remains impractical.
|
|
|
|
### What's Next
|
|
1. KeyPackage distribution over mesh (announce-based)
|
|
2. Transport capability negotiation
|
|
3. Real hardware testing (LoRa boards)
|
|
4. MLS-Lite upgrade path to full MLS
|
|
|
|
---
|
|
|
|
## 2026-03-30 — Mesh Protocol Gap Analysis
|
|
|
|
### Completed
|
|
- Created `docs/plans/mesh-protocol-gaps.md` — honest assessment of QuicProChat vs. Reticulum/Meshtastic/Briar
|
|
- Created `docs/src/design-rationale/mesh-protocol-comparison.md` — technical comparison document
|
|
- Updated `docs/positioning.md` — sharper messaging + honest limitations
|
|
|
|
### Key Insight
|
|
QuicProChat has **best-in-class crypto** AND **viable mesh efficiency** (for classical MLS). PQ hybrid mode needs constrained-link fallback.
|
|
|
|
### Open Design Questions
|
|
- How to distribute KeyPackages over mesh without server?
|
|
- Should we implement LXMF compatibility for Reticulum interop?
|
|
|
|
---
|
|
|
|
## 2026-03-30 — Sprint 6: LoRa transport & integration demo
|
|
|
|
### Completed
|
|
- Added `transport_lora.rs`: `LoRaConfig`, Semtech-style airtime estimate, `DutyCycleTracker` (rolling 1 h window, `eu868_one_percent()`), `LoRaMockMedium` + `LoRaTransport` implementing `MeshTransport` (`lora` name for `TransportManager`), LR framing with automatic fragmentation/reassembly, tests (mock roundtrip, fragmentation, duty accounting, `split_for_mtu`).
|
|
- Example `mesh_lora_relay_demo`: A (LoRa mock) → B (relay) → C (TCP) and reply path; `scripts/mesh-demo.sh` runs it.
|
|
- Wired `pub mod transport_lora` in `lib.rs`.
|
|
- Adjusted `cbor_smaller_than_json` to assert CBOR is materially smaller than JSON (fixed overhead dominates; a strict half-JSON threshold failed on current envelope sizes).
|
|
|
|
### What's next
|
|
- Optional: UART-backed `LoRaTransport` behind a feature flag (modem-specific framing).
|
|
- Hardware runbook: replace mock medium with RNode / SX1262 serial when available.
|
|
|
|
## 2026-03-30 — Sprint 3: Announce & Discovery Protocol
|
|
|
|
### Completed
|
|
- Created `MeshAnnounce` struct with Ed25519 signed announcements, CBOR wire format, hop forwarding
|
|
- Created `compute_address()` — SHA-256 truncation of identity key to 16-byte mesh address
|
|
- Created `RoutingTable` with `RoutingEntry` — keyed by 16-byte address, supports lookup by address or full key, TTL-based expiry, sequence-based stale rejection
|
|
- Created `AnnounceDedup` for loop prevention (address+sequence deduplication)
|
|
- Created `AnnounceConfig` with sensible defaults (10min interval, 30min max age, 8 max hops)
|
|
- Created `create_announce()` and `process_received_announce()` — complete announce processing pipeline (verify, expiry check, dedup, routing update, propagation decision)
|
|
- Capability flags: CAP_RELAY, CAP_STORE, CAP_GATEWAY, CAP_CONSTRAINED
|
|
- Tests: 17 tests across 3 modules covering signature verification, tampering, forwarding, expiry, dedup, routing updates, stale rejection, CBOR roundtrip, address determinism
|
|
- Updated lib.rs with `announce`, `announce_protocol`, `routing_table` modules
|
|
|
|
### What's Next
|
|
- S4: Multi-Hop Routing
|
|
- Integrate announce protocol with TransportManager for actual broadcast/receive loops
|
|
- Add tokio async announce loop (periodic re-announce, GC timer)
|
|
|
|
### Notes
|
|
- Signature excludes `hop_count` (same design as MeshEnvelope) so forwarding doesn't break verification
|
|
- Protocol engine uses free functions rather than a stateful struct — simpler, more testable
|
|
- Cannot run `cargo test` in this environment (no C toolchain / linker available)
|
|
|
|
## 2026-03-30 — Sprint 2: Transport Abstraction Layer
|
|
|
|
### Completed
|
|
- Created `MeshTransport` trait with `send`, `recv`, `discover`, `close` methods
|
|
- Created `TransportAddr` enum for transport-agnostic addressing (Iroh, Socket, LoRa, Serial, Raw)
|
|
- Created `TransportInfo` struct for transport capability metadata
|
|
- Implemented `IrohTransport` wrapping iroh `Endpoint` with same length-prefixed framing as `P2pNode`
|
|
- Implemented `TcpTransport` using tokio `TcpListener`/`TcpStream` with length-prefixed framing
|
|
- Implemented `TransportManager` for multi-transport routing based on address type
|
|
- Added `async-trait` dependency, enabled tokio `net` + `io-util` features
|
|
- Tests: TransportAddr Display formatting, TCP roundtrip, TransportManager routing, error cases
|
|
|
|
### What's Next
|
|
- S3: Announce & Discovery Protocol
|
|
- Future: integrate transport layer into `HybridRouter` / replace direct iroh usage
|
|
|
|
### Notes
|
|
- New transport layer sits alongside existing `P2pNode` — no breaking changes
|
|
- `IrohTransport` uses separate ALPN (`quicprochat/mesh/1`) to avoid conflicts with `P2pNode`
|
|
- Cannot run `cargo test`/`cargo clippy` in this environment (no Rust toolchain installed)
|