Skip to content

Releases: attermann/microReticulum

0.5.0

Choose a tag to compare

@attermann attermann released this 27 Jun 14:57

microReticulum v0.5.0

microReticulum 0.5.0 is a substantial transport and provisioning update focused on improving network resilience, remote management capabilities, storage efficiency, and closer alignment with the Python Reticulum reference implementation. This release also introduces passive neighbor health monitoring and numerous improvements for constrained embedded systems.

Added

Passive Neighbor Health Detection and Recovery

  • Added passive neighbor-liveness inference with targeted probe confirmation.
  • Nodes can now identify potentially degraded neighbors by observing forwarding and proof-return behavior.
  • Introduced configurable probing thresholds and timing controls.
  • Added automatic path responsiveness tracking:
    • UNKNOWN
    • RESPONSIVE
    • UNRESPONSIVE
  • Added runtime controls for neighbor probing behavior.
  • Added metrics and extensive logging for probe activity and path state changes.

Expanded Remote Provisioning and Management

  • Added first-class remote provisioning and management support.
  • Added remote /provision request handling.
  • Added namespace commit callbacks to support grouped configuration updates.
  • Added remote reboot support.
  • Expanded built-in provisioning namespaces and available metrics.

Provisioning Transfer Optimizations

  • Added schema hashing for client-side schema caching.
  • Added compression support for provisioning transfers.
  • Embedded Heatshrink compression directly into the library to remove external dependency requirements.
  • Reduced management traffic requirements for low-bandwidth links such as LoRa.

Blackhole Identity Management

  • Added blackhole identity management with persistence support.
  • Added path filtering for blackholed identities.
  • Added optional publication of blackhole lists.
  • Added expiration and automatic cleanup handling.

Transport Metrics and Observability

  • Added transport-level traffic counters and bandwidth-rate tracking.
  • Added per-interface throughput statistics.
  • Added per-packet signal metrics:
    • RSSI
    • SNR
    • Link quality (Q)
  • Added signal-quality reporting in remote status payloads.
  • Expanded remote management metrics substantially.

Network Identity Support

  • Activated network identity destination registration.
  • Added public network identity accessors.

Interface Enhancements

  • Added interface prioritization by bitrate.
  • Added interface lifecycle hooks:
    • detach()
    • sent_announce()
    • sent_path_request()
  • Added clean interface shutdown handling.

Improved

Storage and Persistence

  • Migrated known-destination storage to microStore.
  • Migrated packet hashlist storage to microStore.
  • Updated destination persistence to MsgPack-based serialization for easier schema evolution.
  • Improved path and storage culling efficiency.
  • Reduced memory pressure across embedded targets.

Memory Usage

  • Moved Bytes allocations to container allocator pools.
  • Improved memory behavior for constrained targets such as nRF52 systems.

Routing and Path Handling

  • Added path responsiveness awareness.
  • Unresponsive paths are no longer advertised in path responses.
  • Added throttled queued discovery path requests.
  • Added interface-aware rediscovery behavior.
  • Added replay and out-of-order announce rejection.
  • Added MTU clamping for inbound link requests.
  • Improved routing behavior for roaming interfaces.
  • Added interface prioritization based on link speed.

Python Reference Alignment

Numerous transport behaviors were aligned with the Python Reticulum implementation, including:

  • Path request timing and expiration behavior
  • Interface routing logic
  • Discovery throttling
  • Transport traffic statistics
  • Announce handling behavior
  • Packet signal-stat propagation
  • Link handling behavior
  • Remote management payload formats

Fixed

  • Fixed Transport::expire_path() behavior.
  • Fixed path request gate timeout handling.
  • Fixed crash conditions when identities were missing from known destinations.
  • Fixed identity recovery from cached announces.
  • Fixed timeout callback dispatch for PacketReceipt.
  • Fixed packet deduplication edge cases during interface mismatch scenarios.
  • Fixed provisioning draft/working/effective value handling.
  • Fixed persistence test failures after schema changes.
  • Corrected multiple feature-gating behaviors.
  • Optimized path-state culling performance.

Changed

  • Added std::function callback support to PacketReceipt.
  • Legacy function-pointer callback APIs remain for compatibility but are now deprecated.
  • Increased default neighbor probe timing values.
  • Added compile-time controls for logging verbosity through RNS_LOG_LEVEL.

Notes

Persistence Migration

Path and destination persistence formats changed in this release.

Existing persisted path data may be discarded after upgrading and rebuilt automatically from network announces. This behavior is expected and should self-heal during normal operation.

Compatibility

Existing applications should continue to function without modification in most cases. Applications using internal persistence formats or callback implementations should review the updated APIs and deprecation notices.

Contributors

Thanks to all contributors to this release:

0.4.1

Choose a tag to compare

@attermann attermann released this 06 Jun 15:44
  • Return Ed25519 verify result from Identity::validate (courtesy of @SAY-5)
  • Return Ed25519 verify result from from Link::validate
  • Made Identity::validate_announce ratchet-aware
  • Added support for void-commands in Provisioning
  • Fix for bug in packet hashlist culling (courtesy of @nilu96)
  • Fix for bug in discovery pr tag culling

0.4.0

Choose a tag to compare

@attermann attermann released this 03 Jun 19:34
  • Added support for Resource and integrated with Link
  • Added initial remote management features (currently read-only)
  • Added extensive interop test harness
  • Added fluent interface to several classes (and deprecated excessive-param constructors)
  • Added "nomadnet" example application demonstrating Link+Resource ins a NomadNet client and server
  • Added support for CMake builds without PlatformIO (WIP)
  • Added Provisioning subsystem for easy management of settings, retrieval of metrics, and execution of commands
  • Restructured src directory to avoid name collision of header files

The directory structure in this library has changed!
Please note that as of version 0.4.0 the directory structure in this library has changed. A master header file microReticulum.h has been added and all other files moved to the "microReticulum" subdirectory to avoid name collision with other libraries. Most projects should only require including the master header file like <microReticulum.h>, but if individual header access is required for any reason then include like <microReticulum/Bytes.h>.

0.3.1

Choose a tag to compare

@attermann attermann released this 09 May 15:03
  • Added split-packet support to example LoRaInterface
  • Enable LoRa CRC on example LoRaInterface (courtesy of @0xSeren)
  • Correct announce random hash generation (courtesy of @thatSFguy)
  • Made path store segment size and count dynamic for dynamic storage configuration

0.3.0

Choose a tag to compare

@attermann attermann released this 06 Apr 10:00
  • Removed File/FileSystem abstraction and replaced with extended microStore File/FileSystem abstraction.
  • Refactored path table storage to use microStore log-append flash storage in place of in-memory path table serialized to flash.
  • Introduced new preprocessor directives to tune path table storage
    -DRNS_PATH_TABLE_SEGMENT_SIZE: Size in bytes of each segment file
    -DRNS_PATH_TABLE_SEGMENT_COUNT: Maximum number of segment files to rotate (minimum of 3)
  • Updated LoRa example apps to use RadioLib
  • Various link and other fixes courtesy of @jrl290
  • Interface rxb/txb accessor courtesy of @0xSeren

0.2.9

Choose a tag to compare

@attermann attermann released this 04 Mar 01:00

Major bug fixes and performance enhancements

  • Fixed bug in path table loading from flash storage wherein the raw
    (packed) announce packet associated with each path entry was not being
    unpacked prior to use.
  • Fixed bug in path table entry announce packet loading where critical
    changes to the announce packet (like hops increment) was being
    overwriteen each time packet was re-loaded from cache.
  • Optimized path table entries to lazy-load both announce packet and
    receive interface so that memory is consumed by these structures until
    if/when the path is actually used.
  • Updated several global timers and sizes to match new RNS 1.x values.
  • Bumped version to 0.2.9

0.2.8

Choose a tag to compare

@attermann attermann released this 02 Mar 01:32
  • Added RNS 1.x Link MTU handling to Transport
  • Fixed crash caused by deserializing null values

0.2.7

Choose a tag to compare

@attermann attermann released this 01 Mar 19:49

Add announce table culling, fix use-after-free, and refactor build/log

  • Add cull_announce_table() with OOM-safe min_element fallback, matching pattern from cull_path_table() and cull_known_destinations()
  • Call cull immediately after every announce/path/known-destination insert
  • Fix use-after-free: guard announce_entry access with announce_erased flag
  • remove_path() now also deletes cached packet files
  • Path table insert now removes existing entry first to prevent duplicates
  • Rename env:mcu -> env:embedded; add env:native_debug and heltec_wifi_lora_32_V4
  • Make TLSF buffer size configurable via RNS_TLSF_BUFFER_SIZE macro
  • Refactor log macros to unified RNS::log() path; add doHeadLog with callback support
  • Prefix all bad_alloc error messages with "bad_alloc -" for easier grepping

Replace string-concatenation logging with printf-style F-variants
Converted log calls across src/, examples/, and test/ to use DEBUGF/TRACEF/ERRORF/etc. macros instead of std::string + operator+. This eliminates temporary heap allocations on every log call, which matters on memory-constrained MCUs.

Fixed link compatibility with Reticulum python implementation courtesy of @O11v3r .

0.2.6

Choose a tag to compare

@attermann attermann released this 27 Feb 20:28

OOM hardening and memory tuning.

  • Transport::inbound(): pre-emptive cull before destination-table insert;
    try/catch around insert for explicit OOM diagnostics
  • Transport::jobs(): split stale-entry culling into 5 independent
    per-phase try/catch blocks so a failure in one phase doesn't abort
    the others; reserve() before push_back loops in each phase
  • cull_path_table()/cull_known_destinations(): std::min_element fallback
    when sort-index allocation fails, breaking the cull-OOM-still-full loop
  • Identity::remember(): wrapped _known_destinations.insert in try/catch
    for explicit OOM diagnostic logging
  • Destination::announce(): outer try/catch covers all OOM-prone ops
    (Bytes concat, sign, Packet ctor, send); inner _path_responses.insert
    catch preserved for degraded-mode behavior
  • Packet::unpack(): dedicated std::bad_alloc catch returns false cleanly
  • Type.h: MAX_RECEIPTS and MAX_QUEUED_ANNOUNCES now overridable at
    compile time via RNS_RECEIPTS_MAX / RNS_QUEUED_ANNOUNCES_MAX
  • Transport.h: hashlist_maxsize and max_pr_tags exposed as runtime
    accessors for dynamic capacity tuning
  • Added more defines for setting storage and persistence limits (RNS_RATE_TIMESTAMPS_MAX, RNS_RANDOM_BLOBS_PERSIST_MAX, RNS_RANDOM_BLOBS_MAX)

0.2.5

Choose a tag to compare

@attermann attermann released this 26 Feb 18:43

Fix receipt cull logic and bytes edge case courtesy of @DanBeard.