From 461a2bc4b085abdabe6c7af40c278636bcefb607 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 20 Oct 2021 12:10:42 +0200 Subject: [PATCH] hci: query remote features only once --- src/hci.c | 5 +++-- src/hci.h | 37 ++++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/hci.c b/src/hci.c index 13812dc08..2089eee9b 100644 --- a/src/hci.c +++ b/src/hci.c @@ -2082,6 +2082,7 @@ static void hci_handle_remote_features_page_2(hci_connection_t * conn, const uin } static void hci_handle_remote_features_received(hci_connection_t * conn){ + conn->bonding_flags &= ~BONDING_REMOTE_FEATURES_QUERY_ACTIVE; conn->bonding_flags |= BONDING_RECEIVED_REMOTE_FEATURES; log_info("Remote features %02x, bonding flags %x", conn->remote_supported_features[0], conn->bonding_flags); if (conn->bonding_flags & BONDING_DEDICATED){ @@ -5611,8 +5612,8 @@ bool hci_remote_features_available(hci_con_handle_t handle){ void hci_remote_features_query(hci_con_handle_t con_handle){ hci_connection_t * connection = hci_connection_for_handle(con_handle); if (!connection) return; - if ((connection->bonding_flags & BONDING_RECEIVED_REMOTE_FEATURES) != 0) return; - connection->bonding_flags |= BONDING_REQUEST_REMOTE_FEATURES_PAGE_0; + if ((connection->bonding_flags & (BONDING_REMOTE_FEATURES_QUERY_ACTIVE | BONDING_RECEIVED_REMOTE_FEATURES)) != 0) return; + connection->bonding_flags |= BONDING_REMOTE_FEATURES_QUERY_ACTIVE | BONDING_REQUEST_REMOTE_FEATURES_PAGE_0; hci_run(); } diff --git a/src/hci.h b/src/hci.h index dca471f34..e43af2abb 100644 --- a/src/hci.h +++ b/src/hci.h @@ -246,22 +246,25 @@ typedef enum { // bonding flags enum { - BONDING_REQUEST_REMOTE_FEATURES_PAGE_0 = 0x0001, - BONDING_REQUEST_REMOTE_FEATURES_PAGE_1 = 0x0002, - BONDING_REQUEST_REMOTE_FEATURES_PAGE_2 = 0x0004, - BONDING_RECEIVED_REMOTE_FEATURES = 0x0008, - BONDING_REMOTE_SUPPORTS_SSP_CONTROLLER = 0x0010, - BONDING_REMOTE_SUPPORTS_SSP_HOST = 0x0020, - BONDING_REMOTE_SUPPORTS_SC_CONTROLLER = 0x0040, - BONDING_REMOTE_SUPPORTS_SC_HOST = 0x0080, - BONDING_DISCONNECT_SECURITY_BLOCK = 0x0100, - BONDING_DISCONNECT_DEDICATED_DONE = 0x0200, - BONDING_SEND_AUTHENTICATE_REQUEST = 0x0400, - BONDING_SEND_ENCRYPTION_REQUEST = 0x0800, - BONDING_SEND_READ_ENCRYPTION_KEY_SIZE = 0x1000, - BONDING_DEDICATED = 0x2000, - BONDING_EMIT_COMPLETE_ON_DISCONNECT = 0x4000, - BONDING_SENT_AUTHENTICATE_REQUEST = 0x8000 + // remote features + BONDING_REMOTE_FEATURES_QUERY_ACTIVE = 0x0001, + BONDING_REQUEST_REMOTE_FEATURES_PAGE_0 = 0x0002, + BONDING_REQUEST_REMOTE_FEATURES_PAGE_1 = 0x0004, + BONDING_REQUEST_REMOTE_FEATURES_PAGE_2 = 0x0008, + BONDING_RECEIVED_REMOTE_FEATURES = 0x0010, + BONDING_REMOTE_SUPPORTS_SSP_CONTROLLER = 0x0020, + BONDING_REMOTE_SUPPORTS_SSP_HOST = 0x0040, + BONDING_REMOTE_SUPPORTS_SC_CONTROLLER = 0x0080, + BONDING_REMOTE_SUPPORTS_SC_HOST = 0x0100, + // other + BONDING_DISCONNECT_SECURITY_BLOCK = 0x0200, + BONDING_DISCONNECT_DEDICATED_DONE = 0x0400, + BONDING_SEND_AUTHENTICATE_REQUEST = 0x0800, + BONDING_SENT_AUTHENTICATE_REQUEST = 0x1000, + BONDING_SEND_ENCRYPTION_REQUEST = 0x2000, + BONDING_SEND_READ_ENCRYPTION_KEY_SIZE = 0x4000, + BONDING_DEDICATED = 0x8000, + BONDING_EMIT_COMPLETE_ON_DISCONNECT = 0x10000, }; typedef enum { @@ -529,7 +532,7 @@ typedef struct { CONNECTION_STATE state; // bonding - uint16_t bonding_flags; + uint32_t bonding_flags; uint8_t bonding_status; // encryption key size (in octets)