hci: query remote features only once

This commit is contained in:
Matthias Ringwald 2021-10-20 12:10:42 +02:00
parent 1a96727d73
commit 461a2bc4b0
2 changed files with 23 additions and 19 deletions

View File

@ -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){ 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; conn->bonding_flags |= BONDING_RECEIVED_REMOTE_FEATURES;
log_info("Remote features %02x, bonding flags %x", conn->remote_supported_features[0], conn->bonding_flags); log_info("Remote features %02x, bonding flags %x", conn->remote_supported_features[0], conn->bonding_flags);
if (conn->bonding_flags & BONDING_DEDICATED){ 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){ void hci_remote_features_query(hci_con_handle_t con_handle){
hci_connection_t * connection = hci_connection_for_handle(con_handle); hci_connection_t * connection = hci_connection_for_handle(con_handle);
if (!connection) return; if (!connection) return;
if ((connection->bonding_flags & BONDING_RECEIVED_REMOTE_FEATURES) != 0) return; if ((connection->bonding_flags & (BONDING_REMOTE_FEATURES_QUERY_ACTIVE | BONDING_RECEIVED_REMOTE_FEATURES)) != 0) return;
connection->bonding_flags |= BONDING_REQUEST_REMOTE_FEATURES_PAGE_0; connection->bonding_flags |= BONDING_REMOTE_FEATURES_QUERY_ACTIVE | BONDING_REQUEST_REMOTE_FEATURES_PAGE_0;
hci_run(); hci_run();
} }

View File

@ -246,22 +246,25 @@ typedef enum {
// bonding flags // bonding flags
enum { enum {
BONDING_REQUEST_REMOTE_FEATURES_PAGE_0 = 0x0001, // remote features
BONDING_REQUEST_REMOTE_FEATURES_PAGE_1 = 0x0002, BONDING_REMOTE_FEATURES_QUERY_ACTIVE = 0x0001,
BONDING_REQUEST_REMOTE_FEATURES_PAGE_2 = 0x0004, BONDING_REQUEST_REMOTE_FEATURES_PAGE_0 = 0x0002,
BONDING_RECEIVED_REMOTE_FEATURES = 0x0008, BONDING_REQUEST_REMOTE_FEATURES_PAGE_1 = 0x0004,
BONDING_REMOTE_SUPPORTS_SSP_CONTROLLER = 0x0010, BONDING_REQUEST_REMOTE_FEATURES_PAGE_2 = 0x0008,
BONDING_REMOTE_SUPPORTS_SSP_HOST = 0x0020, BONDING_RECEIVED_REMOTE_FEATURES = 0x0010,
BONDING_REMOTE_SUPPORTS_SC_CONTROLLER = 0x0040, BONDING_REMOTE_SUPPORTS_SSP_CONTROLLER = 0x0020,
BONDING_REMOTE_SUPPORTS_SC_HOST = 0x0080, BONDING_REMOTE_SUPPORTS_SSP_HOST = 0x0040,
BONDING_DISCONNECT_SECURITY_BLOCK = 0x0100, BONDING_REMOTE_SUPPORTS_SC_CONTROLLER = 0x0080,
BONDING_DISCONNECT_DEDICATED_DONE = 0x0200, BONDING_REMOTE_SUPPORTS_SC_HOST = 0x0100,
BONDING_SEND_AUTHENTICATE_REQUEST = 0x0400, // other
BONDING_SEND_ENCRYPTION_REQUEST = 0x0800, BONDING_DISCONNECT_SECURITY_BLOCK = 0x0200,
BONDING_SEND_READ_ENCRYPTION_KEY_SIZE = 0x1000, BONDING_DISCONNECT_DEDICATED_DONE = 0x0400,
BONDING_DEDICATED = 0x2000, BONDING_SEND_AUTHENTICATE_REQUEST = 0x0800,
BONDING_EMIT_COMPLETE_ON_DISCONNECT = 0x4000, BONDING_SENT_AUTHENTICATE_REQUEST = 0x1000,
BONDING_SENT_AUTHENTICATE_REQUEST = 0x8000 BONDING_SEND_ENCRYPTION_REQUEST = 0x2000,
BONDING_SEND_READ_ENCRYPTION_KEY_SIZE = 0x4000,
BONDING_DEDICATED = 0x8000,
BONDING_EMIT_COMPLETE_ON_DISCONNECT = 0x10000,
}; };
typedef enum { typedef enum {
@ -529,7 +532,7 @@ typedef struct {
CONNECTION_STATE state; CONNECTION_STATE state;
// bonding // bonding
uint16_t bonding_flags; uint32_t bonding_flags;
uint8_t bonding_status; uint8_t bonding_status;
// encryption key size (in octets) // encryption key size (in octets)