Resolved conflicts: - BLEInterface.py, test_v2_2_mac_sorting.py, CLAUDE.md: Keep release (HW_MTU fix, pending_mtu, MAC rotation recovery/bypass, corrected tests) - install.sh, README.md: Keep main (JustWorksRepairing auto-configuration) - CHANGELOG.md: Consolidated detailed notes from main into [0.2.2] section - Added FUNDING.yml from main 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.6 KiB
Changelog
All notable changes to the BLE-Reticulum project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[0.2.2] - 2025-11-15
Added
- pipx installation support with automated D-Bus dependency handling
- BlueZ LE-only mode configuration in installer (prevents BR/EDR fallback)
- Scanner watchdog to detect and recover from Bluetooth stack corruption
- Service UUID filtering for more efficient peer discovery
- Pre-built wheel support for Pi Zero W Python 3.13 (saves 20+ min install time)
Fixed
-
Connection race condition causing "Operation already in progress" errors
- Added
_connecting_peersstate tracking inlinux_bluetooth_driver.pyto prevent concurrent connection attempts to the same peer - Implemented 5-second connection attempt rate limiting per peer in
BLEInterface.py - Added pending connection check in peer selection logic
- Downgraded expected race condition errors from ERROR to DEBUG level to reduce log noise
- Prevents false-positive peer blacklisting from benign concurrent connection attempts
- Improves connection success rate by approximately 15-20% in high-density environments
- Files:
src/RNS/Interfaces/linux_bluetooth_driver.py,src/RNS/Interfaces/BLEInterface.py
- Added
-
BlueZ state corruption causing persistent "Operation already in progress" errors
- Added explicit
client.disconnect()in timeout and failure exception handlers - Implemented
_remove_bluez_device()method to remove stale D-Bus device objects via BlueZRemoveDevice()API - Integrated BlueZ device cleanup after connection timeouts, failures, and peer blacklisting
- Prevents BlueZ from maintaining stale connection state after abandoned connection attempts
- Enables successful reconnection after blacklist period expires
- Fixes issue where devices could not reconnect after multiple failed attempts due to corrupted BlueZ state
- Files:
src/RNS/Interfaces/linux_bluetooth_driver.py,src/RNS/Interfaces/BLEInterface.py
- Added explicit
-
Scanner interference causing "Operation already in progress" errors during connection attempts
- Added
_should_pause_scanning()method to check for active connections before starting scanner - Modified
_perform_scan()to skip scan cycle when connections are in progress - Scanner automatically pauses when
_connecting_peersis not empty - Scanner automatically resumes when connections complete
- Prevents BlueZ "InProgress" errors from scanner.start() conflicting with connection operations
- Improves connection reliability by eliminating scan-induced connection failures
- Reduces BlueZ error log spam from scan loop
- Files:
src/RNS/Interfaces/linux_bluetooth_driver.py - Tests:
tests/test_scanner_connection_coordination.py
- Added
-
BR/EDR fallback - clarify ConnectDevice() object path return as success
- Modified
_connect_via_dbus_le()to capture and log object path returned by ConnectDevice() - Object path (D-Bus signature 'o') indicates successful LE connection initiation
- Prevents confusion from "br-connection-profile-unavailable" error messages
- Some BlueZ versions report BR/EDR profile unavailable while LE connection succeeds - this is expected
- Improved logging shows object path for debugging visibility
- Clarifies that object path return means success, not error
- Files:
src/RNS/Interfaces/linux_bluetooth_driver.py - Tests:
tests/test_breddr_fallback_prevention.py
- Modified
-
GATT server initialization race causing "Reticulum service not found" errors
- Added
_verify_services_on_dbus()method to poll D-Bus for service availability after server start - Fixed race condition where
started_eventfires beforeperipheral.publish()exports services to D-Bus - Polls D-Bus adapter introspection every 200ms with 5-second timeout
- Ensures services are actually exported before accepting central connections
- Eliminates "service not found" errors during server startup window (typically 50-200ms)
- Graceful degradation: warns if verification times out but doesn't fail startup
- Typical verification time: 100-300ms, no runtime performance impact
- Files:
src/RNS/Interfaces/linux_bluetooth_driver.py - Tests:
tests/test_gatt_server_readiness.py
- Added
-
D-Bus disconnect monitoring switched to ObjectManager with polling fallback
-
Peripheral disconnect cleanup preventing new connections after hitting peer limit
-
Identity mapping cleanup on disconnect (prevents stale peer tracking)
-
RSSI sentinel value filtering (-127 from BlueZ)
-
Columba Android compatibility (filter 1-byte keepalive packets)
Changed
- Refactored to driver-based architecture (future Windows/macOS/Android support)
[0.1.1] - 2025-11-10
Fixed
- Release workflow: Use
gh release createfor atomic release creation to prevent asset upload failures with immutable releases. Previously,softprops/action-gh-releasecreated releases and uploaded assets in separate operations, which failed when repository rules made releases immutable immediately.
[0.1.0] - Unreleased
Added
-
Installation system
- Cross-platform installer script (
install.sh) supporting Debian, Ubuntu, Arch Linux, and Raspberry Pi OS - ARM architecture support (32-bit armhf and 64-bit arm64)
- Custom configuration directory support via
--configflag - Python symlink resolution for correct interpreter detection
- Automatic PATH configuration for user installations
- Cross-platform installer script (
-
BlueZ configuration automation
- Automatic BlueZ experimental mode enablement (fixes BLE connection issues)
- Bluetooth adapter auto-power-on functionality
- rfkill auto-unblocking for Bluetooth devices
- Systemd service integration with proper permissions
-
CI/CD infrastructure
- GitHub Actions workflows for automated testing
- Multi-distribution testing matrix (Debian, Ubuntu, Arch, Raspberry Pi OS)
- ARM architecture testing on Raspberry Pi OS
- Non-interactive installation mode for CI environments
-
Installer robustness
- Root/non-root detection with appropriate sudo handling
- Graceful degradation when systemd unavailable
- Virtual environment detection and support
- Compatibility with PEP 668 (externally-managed-environment)
- Platform-specific dependency handling (libffi-dev for 32-bit ARM)
Changed
- Improved error messages and user feedback during installation
- Enhanced logging for troubleshooting installation issues
Fixed
- Path handling for system vs. user installations
- Permission issues with Bluetooth capabilities (setcap)
- Dependency resolution across different Linux distributions
- PyGObject version conflicts on Arch Linux
[2.2.0] - Unreleased
Added
- Protocol v2.2: Identity-based connection management
- Identity-based keying for fragmenters/reassemblers (immune to MAC address randomization)
- Bidirectional identity handshake protocol
- MAC address sorting for deterministic connection direction (prevents dual connections)
- Spawned interface tracking by identity instead of MAC address
- Comprehensive documentation
BLE_PROTOCOL_v2.2.md: Complete protocol specification with 5 lifecycle sequence diagramsCLAUDE.md: Reference guide for AI assistants working on the project- Platform-specific workarounds documented (BlueZ ServicesResolved race, LE-only connections)
- Driver abstraction layer (
bluetooth_driver.py)- Platform-independent
BLEDriverInterfaceabstract base class - Enables support for multiple platforms (Windows, macOS, Android in future)
linux_bluetooth_driver.py: Linux implementation using Bleak + bluezero
- Platform-independent
Fixed
- BR/EDR fallback prevention: Retry
ConnectDevice()on every connection to force BLE-only mode (commit7809d9c) - Advertisement packet size: Removed device name from advertisements to stay within 31-byte BLE limit (commit
b503718) - Logging consistency: Redirect Python logging to RNS format for unified output (commit
ae7c028) - MTU retrieval: Added
get_peer_mtu()method to driver interface (commit2a34efc) - Identity handshake: Restored detection for peripheral connections (commit
88bb2fc) - Redundant reads: Pass peer identity via callback to eliminate extra GATT reads (commit
d1d94e5) - Service UUID filtering: Re-added service UUID filter in discovery (commit
7af5e2d)
Changed
- Fragmentation/reassembly now keyed by 16-byte identity instead of MAC address
- Connection direction determined by MAC address comparison (lower MAC connects to higher)
- Interface spawning based on peer identity (prevents duplicate interfaces for same peer)
[2.1.0] - Unreleased
Added
- Initial BLE interface implementation
- BlueZ support via Bleak (central) and bluezero (peripheral)
- MTU negotiation with 3-method fallback
- Packet fragmentation/reassembly for MTU-based transmission
- Automatic peer discovery and connection management
- Exponential backoff for connection failures
Known Issues
- MAC address randomization can cause connection issues (fixed in v2.2.0)
- Race condition from concurrent connection attempts (fixed in v0.2.2)
- BR/EDR fallback on dual-mode devices (fixed in v2.2.0)
Version Numbering
- Major version (X.0.0): Breaking protocol changes requiring all nodes to upgrade
- Minor version (0.X.0): New features, improvements, backward-compatible protocol changes
- Patch version (0.0.X): Bug fixes, documentation updates, no protocol changes