From c0336fd7887575ae69a467e9ab35a46474be87b1 Mon Sep 17 00:00:00 2001 From: vighnesh-sawant Date: Wed, 11 Mar 2026 23:32:07 +0530 Subject: [PATCH] bluetooth: Add support for HCI_EVENT_EXTENDED_INQUIRY_RESULT Follow up of a4e1f4d8ce0a602c22fefe78d75dc9f8df56ffb4, this contains only response per event. Change-Id: I6582f9530a273699048c04481fa0ef4a31a315ae Reviewed-on: https://review.haiku-os.org/c/haiku/+/10486 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- headers/os/bluetooth/HCI/btHCI_event.h | 9 ++++++ src/kits/bluetooth/DiscoveryAgent.cpp | 1 + src/servers/bluetooth/LocalDeviceImpl.cpp | 36 +++++++++++++++++++++++ src/servers/bluetooth/LocalDeviceImpl.h | 1 + 4 files changed, 47 insertions(+) diff --git a/headers/os/bluetooth/HCI/btHCI_event.h b/headers/os/bluetooth/HCI/btHCI_event.h index d08f0b4675..e87fd75cc6 100644 --- a/headers/os/bluetooth/HCI/btHCI_event.h +++ b/headers/os/bluetooth/HCI/btHCI_event.h @@ -276,6 +276,15 @@ struct hci_ev_sychronous_connection_changed { // TODO: Define remaining Bluetooth 2.1 events structures #define HCI_EVENT_EXTENDED_INQUIRY_RESULT 0x2F +struct hci_ev_extended_inquiry_info { + bdaddr_t bdaddr; + uint8 page_repetition_mode; + uint8 scan_period_mode; + uint8 dev_class[3]; + uint16 clock_offset; + int8 rssi; + uint8 eir[240]; +} __attribute__((packed)); #define HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 diff --git a/src/kits/bluetooth/DiscoveryAgent.cpp b/src/kits/bluetooth/DiscoveryAgent.cpp index 03f252c311..1b5aca196d 100644 --- a/src/kits/bluetooth/DiscoveryAgent.cpp +++ b/src/kits/bluetooth/DiscoveryAgent.cpp @@ -83,6 +83,7 @@ DiscoveryAgent::StartInquiry(uint32 accessCode, DiscoveryListener* listener, // For getting each discovered message request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_RESULT); request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_RESULT_WITH_RSSI); + request.AddInt16("eventExpected", HCI_EVENT_EXTENDED_INQUIRY_RESULT); // For finishing each discovered message request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_COMPLETE); diff --git a/src/servers/bluetooth/LocalDeviceImpl.cpp b/src/servers/bluetooth/LocalDeviceImpl.cpp index 1947f321ce..7ee613ad9e 100644 --- a/src/servers/bluetooth/LocalDeviceImpl.cpp +++ b/src/servers/bluetooth/LocalDeviceImpl.cpp @@ -255,6 +255,9 @@ LocalDeviceImpl::HandleExpectedRequest(struct hci_event_header* event, case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI: InquiryResultWithRSSI(JumpEventHeader(event), request); break; + case HCI_EVENT_EXTENDED_INQUIRY_RESULT: + ExtendedInquiryResult(JumpEventHeader(event), request); + break; case HCI_EVENT_REMOTE_EXTENDED_FEATURES: break; @@ -862,6 +865,39 @@ LocalDeviceImpl::InquiryResultWithRSSI(uint8* numberOfResponses, BMessage* reque } +void +LocalDeviceImpl::ExtendedInquiryResult(uint8* numberOfResponses, BMessage* request) +{ + uint8 count = *numberOfResponses; + TRACE_BT("LocalDeviceImpl: %s #responses=%d\n", __FUNCTION__, count); + + // the spec says count always equals 1 + if (count != 1 || request == NULL) + return; + + hci_ev_extended_inquiry_info* info = (hci_ev_extended_inquiry_info*)(numberOfResponses + 1); + + BMessage reply(BT_MSG_INQUIRY_DEVICE); + reply.AddUInt8("count", count); + + TRACE_BT("LocalDeviceImpl: page_rep=%d scan_period=%d clock=%d rssi=%d\n", + info->page_repetition_mode, info->scan_period_mode, info->clock_offset, info->rssi); + + reply.AddData("bdaddr", B_ANY_TYPE, &info->bdaddr, sizeof(bdaddr_t)); + reply.AddData("dev_class", B_ANY_TYPE, info->dev_class, 3); + reply.AddUInt8("page_repetition_mode", info->page_repetition_mode); + reply.AddUInt8("scan_period_mode", info->scan_period_mode); + reply.AddUInt16("clock_offset", info->clock_offset); + reply.AddInt8("rssi", info->rssi); + + // need to implement eir parsing + printf("%s: Sending reply...\n", __func__); + status_t status = request->SendReply(&reply); + if (status < B_OK) + printf("%s: Error sending reply!\n", __func__); +} + + void LocalDeviceImpl::InquiryComplete(uint8* status, BMessage* request) { diff --git a/src/servers/bluetooth/LocalDeviceImpl.h b/src/servers/bluetooth/LocalDeviceImpl.h index 53e7c74645..b770e4faa7 100644 --- a/src/servers/bluetooth/LocalDeviceImpl.h +++ b/src/servers/bluetooth/LocalDeviceImpl.h @@ -49,6 +49,7 @@ private: // Inquiry void InquiryResult(uint8* numberOfResponses, BMessage* request); void InquiryResultWithRSSI(uint8* numberOfResponses, BMessage* request); + void ExtendedInquiryResult(uint8* numberOfResponses, BMessage* request); void InquiryComplete(uint8* status, BMessage* request); void RemoteNameRequestComplete(struct hci_ev_remote_name_request_complete_reply* remotename, BMessage* request);