mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-14 15:16:40 +00:00
feat(sim): sim_radio_get_params export + fix identity-collision RNG bug
meshcore-solo-site's new cross-visitor relay bridge (Phase 3) needs a way
to read a sim instance's live freq/bw/sf/cr so a WebSocket relay server
can fan traffic out only to other visitors tuned to the same params,
mirroring real LoRa channel isolation. Added sim_radio_get_params()
(examples/companion_radio/main.cpp), reading NodePrefs directly -- the
real live source of truth, since SimRadio::setParams() has always been a
complete no-op (accepts and discards its arguments). Out-params via
pointer, same buffer-pointer idiom sim_radio_poll_tx() already uses;
build_wasm.sh needed HEAPF32/HEAP32 added to EXPORTED_RUNTIME_METHODS so
JS can read them back.
While testing the relay bridge with two independent browser contexts, hit
a real bug: sim_instance_salt() (SimInstance.h) is a pure function of the
simInstanceTag STRING ('hero'/'B'/'R'), so it's only useful for telling
apart same-tab instances -- it's identical for two genuinely different
visitors who both boot a 'hero' instance. Combined with SimRNG::begin()'s
other seed ingredients -- time(NULL) (1-second resolution) and a WASM
heap pointer (no ASLR inside the sandbox, so it's fully deterministic
across independent boots of the same binary) -- two different visitors
landing on the same wall-clock second reliably generated byte-identical
Ed25519 identities (confirmed: two fresh browser contexts launched
together produced provably identical advert packets end to end).
Fixed by mixing in real crypto.getRandomValues()-sourced entropy from the
host page (new sim_instance_entropy(), read the same way simInstanceTag
already is) into both SimRNG::begin() and the twin seeding pattern in
SimRadio::getRngSeed(). Applies to every sim instance uniformly (hero/B/R
all get proper per-session entropy now), not just the new relay path --
strictly an improvement with no compatibility concern, since identity
generation only ever runs once per fresh/empty IDBFS.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iubftDmKNWmkNnhJRz8UH
This commit is contained in:
@@ -430,6 +430,22 @@ extern "C" EMSCRIPTEN_KEEPALIVE int sim_test_get_num_contacts() {
|
||||
return the_mesh.getNumContacts();
|
||||
}
|
||||
|
||||
// The live radio channel config -- lets a host page (meshcore-solo-site's
|
||||
// WebSocket relay bridge) tag this instance's outgoing packets with what
|
||||
// it's currently tuned to, so a server-side relay can fan bytes out only to
|
||||
// other instances tuned to the same freq/bw/sf/cr, mirroring real LoRa
|
||||
// channel isolation. Reads NodePrefs directly (not SimRadio, which never
|
||||
// stores the values SimRadio::setParams() is called with) since NodePrefs
|
||||
// is the actual live source of truth -- the same fields the on-device
|
||||
// Settings > Radio screen edits via UITask::applyRadioParams().
|
||||
extern "C" EMSCRIPTEN_KEEPALIVE void sim_radio_get_params(float* out_freq, float* out_bw, int* out_sf, int* out_cr) {
|
||||
NodePrefs* p = g_sim_ready ? the_mesh.getNodePrefs() : nullptr;
|
||||
*out_freq = p ? p->freq : 0;
|
||||
*out_bw = p ? p->bw : 0;
|
||||
*out_sf = p ? p->sf : 0;
|
||||
*out_cr = p ? p->cr : 0;
|
||||
}
|
||||
|
||||
// Real hardware ships with NodePrefs::HP_DEFAULT -- a curated 5-page Home
|
||||
// carousel (Clock/Tools/Shutdown/Favourites/Map) -- so a first-time user
|
||||
// isn't handed 13 pages to joystick through; the rest (Recent/Radio/
|
||||
|
||||
Reference in New Issue
Block a user