aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2022-09-10 17:59:36 +0200
committerSven Gothel <[email protected]>2022-09-10 17:59:36 +0200
commitaf2f7527de795e040b9dc37edd0c5462cf29acd4 (patch)
treefc5ea3456bd27afb331837df528be6778bcc7596
parent912ba0d64da2455e3769291f256290ee3d10e9ec (diff)
Extracting CHANGES.mdv2.8.1
-rw-r--r--CHANGES.md226
-rw-r--r--README.md223
2 files changed, 228 insertions, 221 deletions
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 00000000..b3167b6a
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,226 @@
+# Direct-BT LE and BREDR Library
+
+[Original document location](https://jausoft.com/cgit/direct_bt.git/about/).
+
+## Changes
+
+**2.8.1 *Direct-BT* Maturity (Bluetooth LE)**
+
+**2.8.0**
+* Misc cleanup and adoption of jaulib v0.14.0
+* Support Ubuntu 22.04 and 20.04
+* C++: Shorten `is*Set()` -> `is_set()`, fix test requiring all bits set to `bit == ( mask & bit )`
+* Fix bringup tests (C++, Java): They run w/o elevated permissions, hence don't toggle state and require nothing
+
+**2.7.0**
+* `AdapterstatusListener::deviceFound()` is only called if not already connected and if initially found.
+* Use `noexcept` where possible
+ - `BTGattHandler::send*()`
+ - `BTGattHandler::GattServerHandler`, `BTGattChar`, `BTGattDesc`
+* BTManager is passed as `shared_ptr<BTManager>`, aligning with JNI lifecycle
+* AdapterStatusListener, BTGattCharListener: Adopt full Java/Native link via DBTNativeDownlink and JavaUplink, clean API, impl and lifecycle
+* Robustness of JNI
+ - Passing `trial.org.direct_bt.TestDBTProvokeClientServer_i470` w/o crash
+ - Use `std::shared_ptr<T>` instead of a `naked pointer` for sane lifcycle, see new `shared_ptr_ref<T>`.
+
+**2.6.5**
+* Fix several memory leaks and uninitialized fields using valgrind analysis (native and w/ JVM)
+ - BTGattHandler::disconnect(): Check weak BTDevice before using resources
+ - BTGattHandler::l2capReaderEndLocked(): Remove off-thread BTDevice::disconnect() on io-error, use BT host's disconnect (simplify tear down)
+ - BTGattHandler's l2capReader data race (use after free)
+* Trial `TestDBClientServer1*` test changes
+ - Split tests into NoEnc, SC0 and SC1 classes
+ - Have client/server adapter names unique, allowing multi-machine testing in one room
+* Bump jaulib v0.8.0
+* BTAdapter Server: Offload waiting for L2CAP client connection to BTDevice::processL2CAPSetup() dedicated thread
+* [L2CAP, HCI]Comm: Hold external interrupted delegate from `service_runner` for complete interrupted() query
+* WIP: BTAdapter::startDiscovery(): Retry up to `MAX_BACKGROUND_DISCOVERY_RETRY` (3), mitigating failure to start discovery
+* BTDevice::notifyLEFeature(): Remove HCIStatusCode param and only call with SUCCESS status code
+* Fix and [document default connection paramter](doc/Connection_Parameter.md), leaning to the higher performance side
+* Resolve legacy security (SC 0) BlueZ/Kernel Mgmt LTK role of `master` or `initiator` field
+
+**2.6.3**
+* Have trial `TestDBClientServer1*` test in both client/server directions, legacy and secure connections (SC)
+* Fix BTAdapter's server mode key handling
+* Have failed pairing issue disconnect, posting indicative reason
+* Use global `inline constexpr` instead of `#define` macros
+* Bump jaulib v0.7.14
+
+**2.6.2**
+* Adopt jaulib detailed git version info: Using post-tag `VERSION_COMMITS` and `VERSION_SHA1_SHORT`. `VERSION_LONG` reflects post-tag and dirty.
+* Bump jaulib v0.7.12-1
+* Added *online* unit testing using actual BT adapter, testing *client* with *server* functionality.
+* BTAdapter/HCIHandler: Fix advertising state: Active until either disabled or connected.
+* DBTAdapter: Fix removeAllStatusListener(): Re-add internal listener to maintain functionality.
+* GATT Server enhancements, incl new DBGattServer::Mode and `dbt_repeater00` implementation.
+* BTDevice::getGattServices(): MTU and remote GATT Services shall be processed from here at request only, moved from BTDevice::connectGATT().
+* jaulib v0.7.11 fixes
+* JNI `DBGatt[Server|Service|Char]_ctorImpl()` fix for 32-bit platforms
+* BlueZ/Linux >= 5.13 (?) Bug Workaround on 'set_local_name(..)'
+
+**2.5.4**
+* Fixing clang++ 11.0.1 and g++ 8.3.0 compilation issues
+* Refine BTAdapter API on commands in powerd-off state only: `setName()`, `setSecureConnections()`, `setDefaultConnParam()`
+* Proper definition of `BTDevice::getName()`
+* Expose refined EInfoReport via `BTDevice::getEIR()` and use it in `BTAdapter::startAdvertising()`
+* Add `DBGattServer::Listener::write[Char|Desc]ValueDone()` callback
+* Add and use `[BTAdapter|BTManager]::setDefaultConnParam(..)` essential in server mode
+* Consolidated `BTDevice::setConnSecurity*(..)` and added `BTAdapter::setServerConnSecurity(...)`
+* Server fixes GATT sendNotification/Indication, `BTDevice::connectGATT()`, `AttReadNRsp`.
+* Server adding proper `AttErrorRsp` replies and supporting `AttFindByTypeValueReq/Rsp`.
+* Server: Using L2CapServer socket/accept services while in advertising mode.
+* Reuse `jau::service_runner`, replacing code duplication
+* Enhance SMP and key managment, LTK validation
+* jaulib v0.7.9 fixes
+
+**2.5.2**
+
+* jaulib v0.7.5 fixes
+
+**2.5.1**
+
+* `BTAdapter::pausing_discovery_devices`: Use `std::weak_ptr<BTDevice>` list
+* Add `BTAdapter::removeDevicePausingDiscovery()` and `getCurrentDiscoveryPolicy()`
+* DBTAdapter.cxx: Fix AdapterStatusListener.discoveringChanged(..) signature
+* Add BTObject::checkValid() implementation overriding jau:JavaUplink, to actually validate whether instance is still valid.
+
+**2.5.0**
+
+* Added *DiscoveryPolicy*, allowing fine tuned discovery keep-alive policy
+ and covering HCI host OS's implied discovery turn-off when connected (BlueZ/Linux).
+ API change of `BTAdapter::startDiscovery(..)` and `AdapterStatusListener::discoveringChanged(..)`
+* BTDevice::connectGATT(): Discover GATT services and parse GenericAccess ASAP before `AdapterStatusListener::deviceReady()`
+* SMPKeyBin::createAndWrite(..): Drop 'overwrite' argument as we shall set `overwrite = PairingMode::PRE_PAIRED != device.getPairingMode()`
+* Fix *PRE_PAIRED* mode for !SC (legacy): Master needs to upload init LTK 1st, then responder LTK (regression)
+* Robustness: Reader-Callback Shutdown after 8s and use SC atomic for state
+* BTAdapter::startDiscovery(..): Add 'bool filter_dup=true' as last parameter
+* Unlock mutex before `notify_all` to avoid pessimistic re-block of notified `wait()` thread
+
+**2.4.0**
+
+* Completed Java support for LE slave/server (*peripheral*) mode incl *GATT-Server*.
+* Add `BTAdapter's Slave Peripheral SMP Key Management`
+ - Full SMP key persistence in *peripheral* mode
+* Reshape *SMPKeyBin* design: Set and upload from BTDevice (split functionality), v5.
+* BTDevice::unpair() is now issued directly by *Direct-BT*
+ to have a consistent and stable security workflow:
+ - when a BTRole::Slave BTDevice is discovered, see AdapterStatusListener::deviceFound().
+ - when a BTRole::Slave BTDevice is disconnected, see AdapterStatusListener::deviceDisconnected().
+ - when a BTRole::Master BTDevice gets connected, see AdapterStatusListener::deviceConnected().
+* LE slave/server mode (*peripheral*): 1st Milestone
+ - BTRole separation implemented and tested
+ - Advertising implemented and tested
+ - GATT Server implemented and tested
+ - Slave / Server SMP Security implemented and testing
+* SMPKeyBin v4, added localAddress (adapter) to filename + bin-fmt.
+* Simplified `SMP*Key` class names and `set[Default|Connected]LE_PHY()` args.
+* Added EUI48 endian conversion when passing/receiving to Bluetooth
+* Passed validation of [multiple BT5 adapter](doc/adapter/adapter.md).
+* Fixed `EInfoReport::read_[ext_]ad_reports()` multiple reports
+* Added Link-Key support in our SMP processing and SMPKeyBin, supporting non-legacy SC.
+* Aligned `BTGatt* findGatt*()` methods across Java/C++
+* Moved `EUI48`, `EUI48Sub` (C++/Java) and `uuid_t`, `Octets` (C++) to `jaulib` for general use.
+* Added BTRole and GATTRole for full master/client and slave/server support.
+* Added BTAdapter advertising support
+* Only use and program selected BTAdapter via BTAdapter::initialize() (required now)
+ - Supports using multiple applications, each using one adapter, or
+ - One application using multiple adapter for different tasks and BTRole
+
+**2.3.0**
+
+* Removal of *TinyB*
+
+**2.2.14**
+
+* Bluetooth 5.0 Support
+ - Using HCI extended scanning and connecting if supported (old API may not work on new adapter)
+ - Parsing and translating extended and enhanced event types, etc
+ - TODO: User selection of `LE_2M` and `L2_CODED`, ... ???
+
+**2.2.13**
+
+* Revised API: BTGattChar::addCharListener(..) in C++ and Java for a more intuitive use.
+* Fix EUI48Sub::scanEUI48Sub(..): Fail on missing expected colon, i.e. after each two digits
+* Fix JNIAdapterStatusListener::deviceConnected(..): NewObject(.., deviceClazzCtor, ..) used wrong argument order
+
+**2.2.11**
+
+* Fix EUI48 unit test and refine on application permissions for launching applications
+* Make `BTDeviceRegistry` and `BTSecurityRegistry` universal
+* Move `BTDeviceRegistry` and `BTSecurityRegistry` to `direct_bt` library (from examples)
+* EUI48Sub: Complement with `hash_code()`, `clear()`, `indexOf()`, `contains()`, ...
+* SMPKeyBin: Tighten constraints, `readAndApply(..)` must validate `minSecLevel`.
+* `BTAdapter::mgmtEvDeviceFoundHCI(..)`: Clarify code path, covering name change via AD EIR.
+* Passthrough all paramter `BTAdapter::startDiscovery(..)` -> `HCIHandler::le_set_scan_param(..)`: Add `le_scan_active` and `filter_policy`.
+ Active scanning is used to gather device name in discovery mode (AD EIR).
+* Add `-dbt_debug` argument for AD EIR `direct_bt.debug.hci.scan_ad_eir` and parse EIR GAPFlags
+* Fix BTGattHandler: Gather all Descriptors from all Characteristics (only queried 1st Char.)
+* SMPKeyBin's base filename compatibility with FAT32 Long Filename (LFN)
+
+**2.2.5**
+
+* Complete SMPKeyBin user API: Convenient static 'one shot' entries + support no-encryption case
+* Fix leaked AdapterStatusListener
+* Fixed HCIHandler and l2cap related issues
+* Unified free function to_string(..) and member toString()
+* Tested key regeneration use-case: Pairing failure (bad key), key removal and auto security negotiation.
+* Adding SMPKeyBin file removal support.
+* Tested negative passkey/boolean input, requested via auto security negotiation.
+* Using negative passkey response via `setPairingPasskey(passkey = 0)` for performance.
+
+**2.2.4**
+
+* Providing full featured `SMPKeyBin` for LTK, CSRK and secure connection param setup persistence and upload.
+* Added Auto Security mode, negotiating the security setup with any device.
+* Bugfixes in HCIHandler and ACL/SMP packet processing.
+* Enhanced robusteness of underlying C++ API and implementation.
+
+**2.2.00**
+
+* Kicked off junit testing for Java implementation
+* Adding *direct_bt-fat.jar* (fat jar) bootstrapping its contained native libraries using merged-in `jaulib`.
+* Java API renaming, incl package: *org.tinyb* to *org.direct_bt*.
+* Completing SMP/Security implementation (WIP)
+* Replaced std::vector and jau::cow_vector with jau::darray and jau::cow_darray
+
+**2.1.33**
+
+* Added AdapterStatusListener callback methods devicePairingState(..) and deviceReady(..), supporting security/pairing.
+* Added support for *LE Secure Connections* and *LE legacy pairing* utilizing SMP and BlueZ/Kernel features.
+* Exposing BTSecurityLevel and SMPIOCapability for connection oriented security setup on BlueZ/Kernel, see DBTDevice and BluetoothDevice.
+* Covering SMP over L2CAP messaging via SMPPDUMsg types and retrieval via HCI/ACL/L2CAP on BlueZ/Kernel
+
+**2.1.30**
+
+* Use read lock-free jau::cow_vector for all callback-lists, avoiding locks in callback iteration
+* Passed GCC all warnings, compile clean
+* Passed GCC sanitizer runtime checks
+* Using extracted *Jau C++ Support Library*, enhanced encapsulation
+* Passed valgrind's memcheck, helgrind and drd validating no memory leak nor data race or deadlock using dbt_scanner10
+* Added native de-mangled backtrace support using *libunwind* and and *abi::__cxa_demangle*
+* Reaching robust implementation state of *Direct-BT*, including recovery from L2CAP transmission breakdown on Raspberry Pi.
+* Resolved race conditions on rapid device discovery and connect, using one thread per device.
+* API documentation with examples
+* Tested on GNU/Linux x86_64, arm32 and arm64 with native and Java examples.
+* Tested on Bluetooth Adapter: Intel, CSR and Raspberry Pi
+* Almost removed non-standard *Linux/BlueZ-Mngr* kernel dependency using the universal HCI protocol, remaining portion configures the adapter.
+
+**2.0.0**
+
+* Java D-Bus implementation details of package 'tinyb' moved to *tinyb.dbus*.
+* The *tinyb.jar* jar file has been renamed to *tinyb2.jar*, avoiding conflicts.
+* General interfaces matching the original implementation and following [BlueZ API](http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/device-api.txt)
+were created in package *org.tinyb*.
+* Class *org.tinyb.BluetoothFactory* provides a factory to instantiate the initial root *org.tinyb.BluetoothManager*, either using the original D-Bus implementation or an alternative implementation.
+* C++ namespace and implementation kept unchanged.
+
+**0.5.0**
+
+* Added notifications API
+* Capitalized RSSI and UUID properly in Java
+* Added JNI Helper classes for managing lifetime of JNIEnv and Global Refences
+
+**0.4.0**
+
+* Added asynchronous methods for discovering BluetoothObjects
+
diff --git a/README.md b/README.md
index 4fb430ef..47dd87a9 100644
--- a/README.md
+++ b/README.md
@@ -488,225 +488,6 @@ and the *Intel Corporation* holds its copyright
from the year 2016.
## Changes
-**3.0.0 *Direct-BT* Maturity (Bluetooth LE)**
-
-* TODO
-
-**2.8.0**
-* Misc cleanup and adoption of jaulib v0.14.0
-* Support Ubuntu 22.04 and 20.04
-* C++: Shorten `is*Set()` -> `is_set()`, fix test requiring all bits set to `bit == ( mask & bit )`
-* Fix bringup tests (C++, Java): They run w/o elevated permissions, hence don't toggle state and require nothing
-
-**2.7.0**
-* `AdapterstatusListener::deviceFound()` is only called if not already connected and if initially found.
-* Use `noexcept` where possible
- - `BTGattHandler::send*()`
- - `BTGattHandler::GattServerHandler`, `BTGattChar`, `BTGattDesc`
-* BTManager is passed as `shared_ptr<BTManager>`, aligning with JNI lifecycle
-* AdapterStatusListener, BTGattCharListener: Adopt full Java/Native link via DBTNativeDownlink and JavaUplink, clean API, impl and lifecycle
-* Robustness of JNI
- - Passing `trial.org.direct_bt.TestDBTProvokeClientServer_i470` w/o crash
- - Use `std::shared_ptr<T>` instead of a `naked pointer` for sane lifcycle, see new `shared_ptr_ref<T>`.
-
-**2.6.5**
-* Fix several memory leaks and uninitialized fields using valgrind analysis (native and w/ JVM)
- - BTGattHandler::disconnect(): Check weak BTDevice before using resources
- - BTGattHandler::l2capReaderEndLocked(): Remove off-thread BTDevice::disconnect() on io-error, use BT host's disconnect (simplify tear down)
- - BTGattHandler's l2capReader data race (use after free)
-* Trial `TestDBClientServer1*` test changes
- - Split tests into NoEnc, SC0 and SC1 classes
- - Have client/server adapter names unique, allowing multi-machine testing in one room
-* Bump jaulib v0.8.0
-* BTAdapter Server: Offload waiting for L2CAP client connection to BTDevice::processL2CAPSetup() dedicated thread
-* [L2CAP, HCI]Comm: Hold external interrupted delegate from `service_runner` for complete interrupted() query
-* WIP: BTAdapter::startDiscovery(): Retry up to `MAX_BACKGROUND_DISCOVERY_RETRY` (3), mitigating failure to start discovery
-* BTDevice::notifyLEFeature(): Remove HCIStatusCode param and only call with SUCCESS status code
-* Fix and [document default connection paramter](doc/Connection_Parameter.md), leaning to the higher performance side
-* Resolve legacy security (SC 0) BlueZ/Kernel Mgmt LTK role of `master` or `initiator` field
-
-**2.6.3**
-* Have trial `TestDBClientServer1*` test in both client/server directions, legacy and secure connections (SC)
-* Fix BTAdapter's server mode key handling
-* Have failed pairing issue disconnect, posting indicative reason
-* Use global `inline constexpr` instead of `#define` macros
-* Bump jaulib v0.7.14
-
-**2.6.2**
-* Adopt jaulib detailed git version info: Using post-tag `VERSION_COMMITS` and `VERSION_SHA1_SHORT`. `VERSION_LONG` reflects post-tag and dirty.
-* Bump jaulib v0.7.12-1
-* Added *online* unit testing using actual BT adapter, testing *client* with *server* functionality.
-* BTAdapter/HCIHandler: Fix advertising state: Active until either disabled or connected.
-* DBTAdapter: Fix removeAllStatusListener(): Re-add internal listener to maintain functionality.
-* GATT Server enhancements, incl new DBGattServer::Mode and `dbt_repeater00` implementation.
-* BTDevice::getGattServices(): MTU and remote GATT Services shall be processed from here at request only, moved from BTDevice::connectGATT().
-* jaulib v0.7.11 fixes
-* JNI `DBGatt[Server|Service|Char]_ctorImpl()` fix for 32-bit platforms
-* BlueZ/Linux >= 5.13 (?) Bug Workaround on 'set_local_name(..)'
-
-**2.5.4**
-* Fixing clang++ 11.0.1 and g++ 8.3.0 compilation issues
-* Refine BTAdapter API on commands in powerd-off state only: `setName()`, `setSecureConnections()`, `setDefaultConnParam()`
-* Proper definition of `BTDevice::getName()`
-* Expose refined EInfoReport via `BTDevice::getEIR()` and use it in `BTAdapter::startAdvertising()`
-* Add `DBGattServer::Listener::write[Char|Desc]ValueDone()` callback
-* Add and use `[BTAdapter|BTManager]::setDefaultConnParam(..)` essential in server mode
-* Consolidated `BTDevice::setConnSecurity*(..)` and added `BTAdapter::setServerConnSecurity(...)`
-* Server fixes GATT sendNotification/Indication, `BTDevice::connectGATT()`, `AttReadNRsp`.
-* Server adding proper `AttErrorRsp` replies and supporting `AttFindByTypeValueReq/Rsp`.
-* Server: Using L2CapServer socket/accept services while in advertising mode.
-* Reuse `jau::service_runner`, replacing code duplication
-* Enhance SMP and key managment, LTK validation
-* jaulib v0.7.9 fixes
-
-**2.5.2**
-
-* jaulib v0.7.5 fixes
-
-**2.5.1**
-
-* `BTAdapter::pausing_discovery_devices`: Use `std::weak_ptr<BTDevice>` list
-* Add `BTAdapter::removeDevicePausingDiscovery()` and `getCurrentDiscoveryPolicy()`
-* DBTAdapter.cxx: Fix AdapterStatusListener.discoveringChanged(..) signature
-* Add BTObject::checkValid() implementation overriding jau:JavaUplink, to actually validate whether instance is still valid.
-
-**2.5.0**
-
-* Added *DiscoveryPolicy*, allowing fine tuned discovery keep-alive policy
- and covering HCI host OS's implied discovery turn-off when connected (BlueZ/Linux).
- API change of `BTAdapter::startDiscovery(..)` and `AdapterStatusListener::discoveringChanged(..)`
-* BTDevice::connectGATT(): Discover GATT services and parse GenericAccess ASAP before `AdapterStatusListener::deviceReady()`
-* SMPKeyBin::createAndWrite(..): Drop 'overwrite' argument as we shall set `overwrite = PairingMode::PRE_PAIRED != device.getPairingMode()`
-* Fix *PRE_PAIRED* mode for !SC (legacy): Master needs to upload init LTK 1st, then responder LTK (regression)
-* Robustness: Reader-Callback Shutdown after 8s and use SC atomic for state
-* BTAdapter::startDiscovery(..): Add 'bool filter_dup=true' as last parameter
-* Unlock mutex before `notify_all` to avoid pessimistic re-block of notified `wait()` thread
-
-**2.4.0**
-
-* Completed Java support for LE slave/server (*peripheral*) mode incl *GATT-Server*.
-* Add `BTAdapter's Slave Peripheral SMP Key Management`
- - Full SMP key persistence in *peripheral* mode
-* Reshape *SMPKeyBin* design: Set and upload from BTDevice (split functionality), v5.
-* BTDevice::unpair() is now issued directly by *Direct-BT*
- to have a consistent and stable security workflow:
- - when a BTRole::Slave BTDevice is discovered, see AdapterStatusListener::deviceFound().
- - when a BTRole::Slave BTDevice is disconnected, see AdapterStatusListener::deviceDisconnected().
- - when a BTRole::Master BTDevice gets connected, see AdapterStatusListener::deviceConnected().
-* LE slave/server mode (*peripheral*): 1st Milestone
- - BTRole separation implemented and tested
- - Advertising implemented and tested
- - GATT Server implemented and tested
- - Slave / Server SMP Security implemented and testing
-* SMPKeyBin v4, added localAddress (adapter) to filename + bin-fmt.
-* Simplified `SMP*Key` class names and `set[Default|Connected]LE_PHY()` args.
-* Added EUI48 endian conversion when passing/receiving to Bluetooth
-* Passed validation of [multiple BT5 adapter](doc/adapter/adapter.md).
-* Fixed `EInfoReport::read_[ext_]ad_reports()` multiple reports
-* Added Link-Key support in our SMP processing and SMPKeyBin, supporting non-legacy SC.
-* Aligned `BTGatt* findGatt*()` methods across Java/C++
-* Moved `EUI48`, `EUI48Sub` (C++/Java) and `uuid_t`, `Octets` (C++) to `jaulib` for general use.
-* Added BTRole and GATTRole for full master/client and slave/server support.
-* Added BTAdapter advertising support
-* Only use and program selected BTAdapter via BTAdapter::initialize() (required now)
- - Supports using multiple applications, each using one adapter, or
- - One application using multiple adapter for different tasks and BTRole
-
-**2.3.0**
-
-* Removal of *TinyB*
-
-**2.2.14**
-
-* Bluetooth 5.0 Support
- - Using HCI extended scanning and connecting if supported (old API may not work on new adapter)
- - Parsing and translating extended and enhanced event types, etc
- - TODO: User selection of `LE_2M` and `L2_CODED`, ... ???
-
-**2.2.13**
-
-* Revised API: BTGattChar::addCharListener(..) in C++ and Java for a more intuitive use.
-* Fix EUI48Sub::scanEUI48Sub(..): Fail on missing expected colon, i.e. after each two digits
-* Fix JNIAdapterStatusListener::deviceConnected(..): NewObject(.., deviceClazzCtor, ..) used wrong argument order
-
-**2.2.11**
-
-* Fix EUI48 unit test and refine on application permissions for launching applications
-* Make `BTDeviceRegistry` and `BTSecurityRegistry` universal
-* Move `BTDeviceRegistry` and `BTSecurityRegistry` to `direct_bt` library (from examples)
-* EUI48Sub: Complement with `hash_code()`, `clear()`, `indexOf()`, `contains()`, ...
-* SMPKeyBin: Tighten constraints, `readAndApply(..)` must validate `minSecLevel`.
-* `BTAdapter::mgmtEvDeviceFoundHCI(..)`: Clarify code path, covering name change via AD EIR.
-* Passthrough all paramter `BTAdapter::startDiscovery(..)` -> `HCIHandler::le_set_scan_param(..)`: Add `le_scan_active` and `filter_policy`.
- Active scanning is used to gather device name in discovery mode (AD EIR).
-* Add `-dbt_debug` argument for AD EIR `direct_bt.debug.hci.scan_ad_eir` and parse EIR GAPFlags
-* Fix BTGattHandler: Gather all Descriptors from all Characteristics (only queried 1st Char.)
-* SMPKeyBin's base filename compatibility with FAT32 Long Filename (LFN)
-
-**2.2.5**
-
-* Complete SMPKeyBin user API: Convenient static 'one shot' entries + support no-encryption case
-* Fix leaked AdapterStatusListener
-* Fixed HCIHandler and l2cap related issues
-* Unified free function to_string(..) and member toString()
-* Tested key regeneration use-case: Pairing failure (bad key), key removal and auto security negotiation.
-* Adding SMPKeyBin file removal support.
-* Tested negative passkey/boolean input, requested via auto security negotiation.
-* Using negative passkey response via `setPairingPasskey(passkey = 0)` for performance.
-
-**2.2.4**
-
-* Providing full featured `SMPKeyBin` for LTK, CSRK and secure connection param setup persistence and upload.
-* Added Auto Security mode, negotiating the security setup with any device.
-* Bugfixes in HCIHandler and ACL/SMP packet processing.
-* Enhanced robusteness of underlying C++ API and implementation.
-
-**2.2.00**
-
-* Kicked off junit testing for Java implementation
-* Adding *direct_bt-fat.jar* (fat jar) bootstrapping its contained native libraries using merged-in `jaulib`.
-* Java API renaming, incl package: *org.tinyb* to *org.direct_bt*.
-* Completing SMP/Security implementation (WIP)
-* Replaced std::vector and jau::cow_vector with jau::darray and jau::cow_darray
-
-**2.1.33**
-
-* Added AdapterStatusListener callback methods devicePairingState(..) and deviceReady(..), supporting security/pairing.
-* Added support for *LE Secure Connections* and *LE legacy pairing* utilizing SMP and BlueZ/Kernel features.
-* Exposing BTSecurityLevel and SMPIOCapability for connection oriented security setup on BlueZ/Kernel, see DBTDevice and BluetoothDevice.
-* Covering SMP over L2CAP messaging via SMPPDUMsg types and retrieval via HCI/ACL/L2CAP on BlueZ/Kernel
-
-**2.1.30**
-
-* Use read lock-free jau::cow_vector for all callback-lists, avoiding locks in callback iteration
-* Passed GCC all warnings, compile clean
-* Passed GCC sanitizer runtime checks
-* Using extracted *Jau C++ Support Library*, enhanced encapsulation
-* Passed valgrind's memcheck, helgrind and drd validating no memory leak nor data race or deadlock using dbt_scanner10
-* Added native de-mangled backtrace support using *libunwind* and and *abi::__cxa_demangle*
-* Reaching robust implementation state of *Direct-BT*, including recovery from L2CAP transmission breakdown on Raspberry Pi.
-* Resolved race conditions on rapid device discovery and connect, using one thread per device.
-* API documentation with examples
-* Tested on GNU/Linux x86_64, arm32 and arm64 with native and Java examples.
-* Tested on Bluetooth Adapter: Intel, CSR and Raspberry Pi
-* Almost removed non-standard *Linux/BlueZ-Mngr* kernel dependency using the universal HCI protocol, remaining portion configures the adapter.
-
-**2.0.0**
-
-* Java D-Bus implementation details of package 'tinyb' moved to *tinyb.dbus*.
-* The *tinyb.jar* jar file has been renamed to *tinyb2.jar*, avoiding conflicts.
-* General interfaces matching the original implementation and following [BlueZ API](http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/device-api.txt)
-were created in package *org.tinyb*.
-* Class *org.tinyb.BluetoothFactory* provides a factory to instantiate the initial root *org.tinyb.BluetoothManager*, either using the original D-Bus implementation or an alternative implementation.
-* C++ namespace and implementation kept unchanged.
-
-**0.5.0**
-
-* Added notifications API
-* Capitalized RSSI and UUID properly in Java
-* Added JNI Helper classes for managing lifetime of JNIEnv and Global Refences
-
-**0.4.0**
-
-* Added asynchronous methods for discovering BluetoothObjects
+
+See [Changes](CHANGES.md).