diff options
author | Sven Gothel <[email protected]> | 2021-07-27 14:01:02 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2021-07-27 14:01:02 +0200 |
commit | 927678e3b739cc2b6efdc1ea43513333838df2ae (patch) | |
tree | 01df9a4e400b9a8880e793c6d2def0606ec7eea0 /api | |
parent | 6fe79f792dcfe31227c40de3cc0cd63ecfe2a92b (diff) |
Clarify EInfoReport ownership between MgmtEvtDeviceFound, HCIHandler and BTAdapter; Add AD_EIR debug flag
MgmtEvtDeviceFound changes: Stringent ownership
- field eireport type `std::shared_ptr<EInfoReport>` -> `std::unique_ptr<EInfoReport>`
- getEIR() returns immutable EInfoReport pointer
BTAdapter::mgmtEvDeviceFoundHCI(): Cleanup confusion
- Expect coming from HCIHandler (we only listen to it), ABORT otherwise
- Cleanup confusion of ownership etc
Debug:
- HCIHandler env.DEBUG_SCAN_AD_EIR `direct_bt.debug.hci.scan_ad_eir`
Diffstat (limited to 'api')
-rw-r--r-- | api/direct_bt/BTTypes0.hpp | 2 | ||||
-rw-r--r-- | api/direct_bt/HCIHandler.hpp | 8 | ||||
-rw-r--r-- | api/direct_bt/MgmtTypes.hpp | 22 |
3 files changed, 19 insertions, 13 deletions
diff --git a/api/direct_bt/BTTypes0.hpp b/api/direct_bt/BTTypes0.hpp index a9b5c3f5..fe56c986 100644 --- a/api/direct_bt/BTTypes0.hpp +++ b/api/direct_bt/BTTypes0.hpp @@ -699,7 +699,7 @@ namespace direct_bt { * https://www.bluetooth.com/specifications/archived-specifications/ * </p> */ - static jau::darray<std::shared_ptr<EInfoReport>> read_ad_reports(uint8_t const * data, jau::nsize_t const data_length) noexcept; + static jau::darray<std::unique_ptr<EInfoReport>> read_ad_reports(uint8_t const * data, jau::nsize_t const data_length) noexcept; /** * Reads the Extended Inquiry Response (EIR) or Advertising Data (AD) segments diff --git a/api/direct_bt/HCIHandler.hpp b/api/direct_bt/HCIHandler.hpp index a4dcd8dc..b1467c82 100644 --- a/api/direct_bt/HCIHandler.hpp +++ b/api/direct_bt/HCIHandler.hpp @@ -126,6 +126,14 @@ namespace direct_bt { */ const bool DEBUG_EVENT; + /** + * Debug all scanned HCI 'Advertising Data' (AD) 'Extended Inquiry Response' (EIR) packages. + * <p> + * Environment variable is 'direct_bt.debug.hci.scan_ad_eir'. + * </p> + */ + const bool DEBUG_SCAN_AD_EIR; + private: /** Maximum number of packets to wait for until matching a sequential command. Won't block as timeout will limit. */ const int32_t HCI_READ_PACKET_MAX_RETRY; diff --git a/api/direct_bt/MgmtTypes.hpp b/api/direct_bt/MgmtTypes.hpp index c1d53c95..90382539 100644 --- a/api/direct_bt/MgmtTypes.hpp +++ b/api/direct_bt/MgmtTypes.hpp @@ -1769,7 +1769,7 @@ namespace direct_bt { class MgmtEvtDeviceFound : public MgmtEvent { private: - std::shared_ptr<EInfoReport> eireport; + std::unique_ptr<EInfoReport> eireport; protected: std::string baseString() const noexcept override { @@ -1785,24 +1785,22 @@ namespace direct_bt { public: MgmtEvtDeviceFound(const uint8_t* buffer, const jau::nsize_t buffer_len) - : MgmtEvent(buffer, buffer_len, 14) + : MgmtEvent(buffer, buffer_len, 14), eireport(nullptr) { checkOpcode(getOpcode(), Opcode::DEVICE_FOUND); - eireport = nullptr; } - MgmtEvtDeviceFound(const uint16_t dev_id, std::shared_ptr<EInfoReport> eir) - : MgmtEvent(Opcode::DEVICE_FOUND, dev_id, 6+1+1+4+2+0) + MgmtEvtDeviceFound(const uint16_t dev_id, std::unique_ptr<EInfoReport> && eir) + : MgmtEvent(Opcode::DEVICE_FOUND, dev_id, 6+1+1+4+2+0), eireport(std::move(eir)) { - pdu.put_eui48_nc(MGMT_HEADER_SIZE, eir->getAddress()); - pdu.put_uint8_nc(MGMT_HEADER_SIZE+6, direct_bt::number(eir->getAddressType())); - pdu.put_int8_nc(MGMT_HEADER_SIZE+6+1, eir->getRSSI()); - pdu.put_uint32_nc(MGMT_HEADER_SIZE+6+1+1, eir->getFlags()); // EIR flags only 8bit, Mgmt uses 32bit? + pdu.put_eui48_nc(MGMT_HEADER_SIZE, eireport->getAddress()); + pdu.put_uint8_nc(MGMT_HEADER_SIZE+6, direct_bt::number(eireport->getAddressType())); + pdu.put_int8_nc(MGMT_HEADER_SIZE+6+1, eireport->getRSSI()); + pdu.put_uint32_nc(MGMT_HEADER_SIZE+6+1+1, eireport->getFlags()); // EIR flags only 8bit, Mgmt uses 32bit? pdu.put_uint16_nc(MGMT_HEADER_SIZE+6+1+1+4, 0); // eir_len - eireport = eir; } - /** Returns the EInfoReport, assuming creation occurred via HCIHandler. Otherwise nullptr. */ - std::shared_ptr<EInfoReport> getEIR() const noexcept { return eireport; } + /** Returns reference to the immutable EInfoReport, assuming creation occurred via HCIHandler. Otherwise nullptr. */ + const EInfoReport* getEIR() const noexcept { return eireport.get(); } const EUI48& getAddress() const noexcept { return *reinterpret_cast<const EUI48 *>( pdu.get_ptr_nc(MGMT_HEADER_SIZE + 0) ); } // mgmt_addr_info BDAddressType getAddressType() const noexcept { return static_cast<BDAddressType>(pdu.get_uint8_nc(MGMT_HEADER_SIZE+6)); } // mgmt_addr_info |