bluetooth: Add support for HCI_EVENT_INQUIRY_RESULT_WITH_RSSI

Follow up of a4e1f4d8ce, details given
in that commit message on parsing of this event message

Change-Id: Icc0b54bdafe3cb167553d2fda3f62762d2d2595e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/10485
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
vighnesh-sawant
2026-03-12 17:01:16 +00:00
committed by waddlesplash
parent 6e270b5f8c
commit 230470d6d4
6 changed files with 55 additions and 18 deletions
+1 -16
View File
@@ -21,14 +21,6 @@ struct hci_event_header {
#define HCI_EVENT_INQUIRY_COMPLETE 0x01 #define HCI_EVENT_INQUIRY_COMPLETE 0x01
#define HCI_EVENT_INQUIRY_RESULT 0x02 #define HCI_EVENT_INQUIRY_RESULT 0x02
struct inquiry_info {
bdaddr_t bdaddr;
uint8 pscan_rep_mode;
uint8 pscan_period_mode;
uint8 pscan_mode;
uint8 dev_class[3];
uint16 clock_offset;
} __attribute__ ((packed));
#define HCI_EVENT_CONN_COMPLETE 0x03 #define HCI_EVENT_CONN_COMPLETE 0x03
struct hci_ev_conn_complete { struct hci_ev_conn_complete {
@@ -248,14 +240,7 @@ struct hci_ev_flow_specification {
} __attribute__ ((packed)); } __attribute__ ((packed));
#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 #define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22
struct hci_ev_inquiry_info_with_rssi { #define HCI_RSSI_INVALID 127
bdaddr_t bdaddr;
uint8 pscan_rep_mode;
uint8 pscan_period_mode;
uint8 dev_class[3];
uint16 clock_offset;
int8 rssi;
} __attribute__ ((packed));
#define HCI_EVENT_REMOTE_EXTENDED_FEATURES 0x23 #define HCI_EVENT_REMOTE_EXTENDED_FEATURES 0x23
struct hci_ev_remote_extended_features { struct hci_ev_remote_extended_features {
+1 -1
View File
@@ -68,7 +68,7 @@ private:
uint8 fScanPeriodMode; uint8 fScanPeriodMode;
uint8 fScanMode; uint8 fScanMode;
uint16 fClockOffset; uint16 fClockOffset;
int8 fRSSI;
}; };
} }
+1
View File
@@ -82,6 +82,7 @@ DiscoveryAgent::StartInquiry(uint32 accessCode, DiscoveryListener* listener,
// For getting each discovered message // For getting each discovered message
request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_RESULT); request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_RESULT);
request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_RESULT_WITH_RSSI);
// For finishing each discovered message // For finishing each discovered message
request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_COMPLETE); request.AddInt16("eventExpected", HCI_EVENT_INQUIRY_COMPLETE);
+9 -1
View File
@@ -83,9 +83,11 @@ DiscoveryListener::MessageReceived(BMessage* message)
const uint8* devClass; const uint8* devClass;
uint8 pageRepetitionMode = 0; uint8 pageRepetitionMode = 0;
uint8 scanPeriodMode = 0; uint8 scanPeriodMode = 0;
// default value is 0 only, in newer specs this has been removed in such case it
// should be set to zero
uint8 scanMode = 0; uint8 scanMode = 0;
uint16 clockOffset = 0; uint16 clockOffset = 0;
bool duplicatedFound = false; int8 rssi = HCI_RSSI_INVALID;
if (message->FindData("bdaddr", B_ANY_TYPE, i, (const void**)&bdaddr, &size) != B_OK if (message->FindData("bdaddr", B_ANY_TYPE, i, (const void**)&bdaddr, &size) != B_OK
|| message->FindData("dev_class", B_ANY_TYPE, i, (const void**)&devClass, &size) || message->FindData("dev_class", B_ANY_TYPE, i, (const void**)&devClass, &size)
@@ -95,10 +97,14 @@ DiscoveryListener::MessageReceived(BMessage* message)
message->FindUInt8("page_repetition_mode", i, &pageRepetitionMode); message->FindUInt8("page_repetition_mode", i, &pageRepetitionMode);
message->FindUInt8("scan_period_mode", i, &scanPeriodMode); message->FindUInt8("scan_period_mode", i, &scanPeriodMode);
// if not present, the default value of these fields will be used
message->FindUInt8("scan_mode", i, &scanMode); message->FindUInt8("scan_mode", i, &scanMode);
message->FindUInt16("clock_offset", i, &clockOffset); message->FindUInt16("clock_offset", i, &clockOffset);
message->FindInt8("rssi", i, &rssi);
// Skip duplicated replies // Skip duplicated replies
bool duplicatedFound = false;
for (int32 index = 0; index < fRemoteDevicesList.CountItems(); index++) { for (int32 index = 0; index < fRemoteDevicesList.CountItems(); index++) {
RemoteDevice* existingDevice = fRemoteDevicesList.ItemAt(index); RemoteDevice* existingDevice = fRemoteDevicesList.ItemAt(index);
bdaddr_t b1 = existingDevice->GetBluetoothAddress(); bdaddr_t b1 = existingDevice->GetBluetoothAddress();
@@ -108,6 +114,7 @@ DiscoveryListener::MessageReceived(BMessage* message)
existingDevice->fScanPeriodMode = scanPeriodMode; existingDevice->fScanPeriodMode = scanPeriodMode;
existingDevice->fScanMode = scanMode; existingDevice->fScanMode = scanMode;
existingDevice->fClockOffset = clockOffset; existingDevice->fClockOffset = clockOffset;
existingDevice->fRSSI = rssi;
duplicatedFound = true; duplicatedFound = true;
break; break;
} }
@@ -122,6 +129,7 @@ DiscoveryListener::MessageReceived(BMessage* message)
rd->fScanPeriodMode = scanPeriodMode; rd->fScanPeriodMode = scanPeriodMode;
rd->fScanMode = scanMode; rd->fScanMode = scanMode;
rd->fClockOffset = clockOffset; rd->fClockOffset = clockOffset;
rd->fRSSI = rssi;
DeviceDiscovered(rd, rd->GetDeviceClass()); DeviceDiscovered(rd, rd->GetDeviceClass());
} }
} }
+42
View File
@@ -253,6 +253,7 @@ LocalDeviceImpl::HandleExpectedRequest(struct hci_event_header* event,
break; break;
case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI: case HCI_EVENT_INQUIRY_RESULT_WITH_RSSI:
InquiryResultWithRSSI(JumpEventHeader<uint8>(event), request);
break; break;
case HCI_EVENT_REMOTE_EXTENDED_FEATURES: case HCI_EVENT_REMOTE_EXTENDED_FEATURES:
@@ -820,6 +821,47 @@ LocalDeviceImpl::InquiryResult(uint8* numberOfResponses, BMessage* request)
} }
void
LocalDeviceImpl::InquiryResultWithRSSI(uint8* numberOfResponses, BMessage* request)
{
uint8 count = *numberOfResponses;
TRACE_BT("LocalDeviceImpl: %s #responses=%d\n", __FUNCTION__, count);
if (count == 0 || request == NULL)
return;
uint8* base_ptr = numberOfResponses + 1;
// get pointers ready for the parallel arrays
bdaddr_t* bdaddr_array = (bdaddr_t*)base_ptr;
uint8* page_repetition_mode_array = (uint8*)(bdaddr_array + count);
uint8* scan_period_mode_array = page_repetition_mode_array + count;
uint8* dev_class_array = scan_period_mode_array + count;
uint16* clock_offset_array = (uint16*)(dev_class_array + (count * 3));
int8* rssi_array = (int8*)(clock_offset_array + count);
BMessage reply(BT_MSG_INQUIRY_DEVICE);
reply.AddUInt8("count", count);
for (uint8 i = 0; i < count; i++) {
TRACE_BT("LocalDeviceImpl: page_rep=%d scan_period=%d clock=%d rssi=%d\n",
page_repetition_mode_array[i], scan_period_mode_array[i], clock_offset_array[i],
rssi_array[i]);
reply.AddData("bdaddr", B_ANY_TYPE, &bdaddr_array[i], sizeof(bdaddr_t));
reply.AddData("dev_class", B_ANY_TYPE, &dev_class_array[i * 3], 3);
reply.AddUInt8("page_repetition_mode", page_repetition_mode_array[i]);
reply.AddUInt8("scan_period_mode", scan_period_mode_array[i]);
reply.AddUInt16("clock_offset", clock_offset_array[i]);
reply.AddInt8("rssi", rssi_array[i]);
}
printf("%s: Sending reply...\n", __func__);
status_t status = request->SendReply(&reply);
if (status < B_OK)
printf("%s: Error sending reply!\n", __func__);
}
void void
LocalDeviceImpl::InquiryComplete(uint8* status, BMessage* request) LocalDeviceImpl::InquiryComplete(uint8* status, BMessage* request)
{ {
+1
View File
@@ -48,6 +48,7 @@ private:
// Inquiry // Inquiry
void InquiryResult(uint8* numberOfResponses, BMessage* request); void InquiryResult(uint8* numberOfResponses, BMessage* request);
void InquiryResultWithRSSI(uint8* numberOfResponses, BMessage* request);
void InquiryComplete(uint8* status, BMessage* request); void InquiryComplete(uint8* status, BMessage* request);
void RemoteNameRequestComplete(struct hci_ev_remote_name_request_complete_reply* void RemoteNameRequestComplete(struct hci_ev_remote_name_request_complete_reply*
remotename, BMessage* request); remotename, BMessage* request);