From 37e1b22048c5dc562e27aa1edc93fa4a6eda5cb4 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 9 Dec 2024 18:24:20 +0100 Subject: [PATCH] bnep: provide setup connection response in BNEP_EVENT_CHANNEL_OPENED --- CHANGELOG.md | 1 + src/classic/bnep.c | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7bc78b3b..d66a130da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - GAP: only store link key if at least one side requests bonding during the IO Capabilities exchange. - GATT Client: use Find by Information Request to lookup CCCD for Notifications/Indications - SDP Client: trigger next SDP query callback, if registered callback does not start SDP query +- BNEP Client: provide setup connection response in BNEP_EVENT_CHANNEL_OPENED - GOEP Client: remove goep_client_create_connection. Use goep_client_connect instead. - HID Parser: cleanup of function names and signatures - HIDS Client: use error code instead of ATT status in connected event diff --git a/src/classic/bnep.c b/src/classic/bnep.c index ac278d3d1..aa7ddb0f8 100644 --- a/src/classic/bnep.c +++ b/src/classic/bnep.c @@ -111,12 +111,13 @@ static void bnep_channel_finalize(bnep_channel_t *channel); static void bnep_channel_start_timer(bnep_channel_t *channel, int timeout); inline static void bnep_channel_state_add(bnep_channel_t *channel, BNEP_CHANNEL_STATE_VAR event); static void bnep_handle_can_send_now(uint16_t cid); -static void bnep_emit_open_channel_complete(bnep_channel_t *channel, uint8_t status) + +static void bnep_emit_open_channel_complete(bnep_channel_t *channel, uint8_t status, uint8_t setup_connection_response) { log_info("BNEP_EVENT_CHANNEL_OPENED status 0x%02x bd_addr: %s, handler %p", status, bd_addr_to_str(channel->remote_addr), channel->packet_handler); if (!channel->packet_handler) return; - uint8_t event[3 + sizeof(bd_addr_t) + 4 * sizeof(uint16_t) + 2]; + uint8_t event[3 + sizeof(bd_addr_t) + 4 * sizeof(uint16_t) + 3]; event[0] = BNEP_EVENT_CHANNEL_OPENED; event[1] = sizeof(event) - 2; event[2] = status; @@ -126,6 +127,7 @@ static void bnep_emit_open_channel_complete(bnep_channel_t *channel, uint8_t sta little_endian_store_16(event, 9, channel->max_frame_size); reverse_bd_addr(channel->remote_addr, &event[11]); little_endian_store_16(event, 17, channel->con_handle); + event[19] = setup_connection_response; hci_dump_btstack_event( event, sizeof(event)); (*channel->packet_handler)(HCI_EVENT_PACKET, 0, (uint8_t *) event, sizeof(event)); } @@ -917,7 +919,6 @@ static int bnep_handle_connection_request(bnep_channel_t *channel, uint8_t *pack static int bnep_handle_connection_response(bnep_channel_t *channel, uint8_t *packet, uint16_t size) { - uint16_t response_code; /* Sanity check packet size */ if (size < (1 + 2)) { @@ -930,16 +931,17 @@ static int bnep_handle_connection_response(bnep_channel_t *channel, uint8_t *pac return 1 + 2; } - response_code = big_endian_read_16(packet, 1); + uint16_t response_code = big_endian_read_16(packet, 1); if (response_code == BNEP_RESP_SETUP_SUCCESS) { log_info("BNEP_CONNECTION_RESPONSE: Channel established to %s", bd_addr_to_str(channel->remote_addr)); channel->state = BNEP_CHANNEL_STATE_CONNECTED; /* Stop timeout timer! */ bnep_channel_stop_timer(channel); - bnep_emit_open_channel_complete(channel, 0); + bnep_emit_open_channel_complete(channel, ERROR_CODE_SUCCESS, response_code); } else { log_error("BNEP_CONNECTION_RESPONSE: Connection to %s failed. Err: %d", bd_addr_to_str(channel->remote_addr), response_code); + bnep_emit_open_channel_complete(channel, BNEP_SETUP_CONNECTION_ERROR, response_code); bnep_channel_finalize(channel); } return 1 + 2; @@ -1306,7 +1308,7 @@ static int bnep_hci_event_handler(uint8_t *packet, uint16_t size) /* On L2CAP open error discard everything */ if (status) { /* Emit bnep_open_channel_complete with status and free channel */ - bnep_emit_open_channel_complete(channel, status); + bnep_emit_open_channel_complete(channel, status, 0); /* Free BNEP channel mempory */ bnep_channel_free(channel); @@ -1549,7 +1551,7 @@ static void bnep_channel_state_machine(bnep_channel_t* channel, bnep_channel_eve bnep_channel_state_remove(channel, BNEP_CHANNEL_STATE_VAR_SND_CONNECTION_RESPONSE); bnep_send_connection_response(channel, channel->response_code); if (emit_connected){ - bnep_emit_open_channel_complete(channel, 0); + bnep_emit_open_channel_complete(channel, ERROR_CODE_SUCCESS, 0); } return; }