From fc6cde64da1ae59d3297ec16f431290c45445678 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Mon, 23 Jul 2018 14:14:14 +0200 Subject: [PATCH] Replaced HCI_PACKET_BUFFER_SIZE with HCI_INCOMING_PACKET_BUFFER_SIZE and HCI_OUTGOING_PACKET_BUFFER_SIZE --- CHANGELOG.md | 1 + port/esp32/components/btstack/main.c | 2 +- port/ios/src/hci_transport_h4_iphone.c | 2 +- port/mtk/hci_transport_h4_mtk.c | 4 +-- port/wiced-h4/hci_transport_h4_wiced.c | 2 +- src/hci.h | 35 ++++++++++++++++++-------- src/hci_transport_em9304_spi.c | 6 ++--- src/hci_transport_h4.c | 6 ++--- src/hci_transport_h5.c | 6 ++--- 9 files changed, 40 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b31e8d2a1..f7a674d83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - SM: Generate new EC Public Keypair after each pairing - btstack.h: only include classic headers if ENABLE_CLASSIC is defined - windows: ignore virtual Bluetooth adapter provided by VMware +- Replaced HCI_PACKET_BUFFER_SIZE with HCI_INCOMING_PACKET_BUFFER_SIZE and HCI_OUTGOING_PACKET_BUFFER_SIZE ## Changes June 2018 diff --git a/port/esp32/components/btstack/main.c b/port/esp32/components/btstack/main.c index 57266be25..6b75f4aef 100644 --- a/port/esp32/components/btstack/main.c +++ b/port/esp32/components/btstack/main.c @@ -86,7 +86,7 @@ static uint8_t hci_ringbuffer_storage[HCI_HOST_ACL_PACKET_NUM * (2 + 1 + HCI_A MAX_NR_HOST_EVENT_PACKETS * (2 + 1 + HCI_EVENT_BUFFER_SIZE)]; static btstack_ring_buffer_t hci_ringbuffer; -static uint8_t hci_receive_buffer[1 + HCI_PACKET_BUFFER_SIZE]; +static uint8_t hci_receive_buffer[1 + HCI_INCOMING_PACKET_BUFFER_SIZE]; static SemaphoreHandle_t ring_buffer_mutex; // data source for integration with BTstack Runloop diff --git a/port/ios/src/hci_transport_h4_iphone.c b/port/ios/src/hci_transport_h4_iphone.c index 1e9979ce4..1e1fab263 100644 --- a/port/ios/src/hci_transport_h4_iphone.c +++ b/port/ios/src/hci_transport_h4_iphone.c @@ -131,7 +131,7 @@ static H4_STATE h4_state; static int bytes_to_read; static int read_pos; -static uint8_t hci_packet[1+HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) +static uint8_t hci_packet[1+HCI_INCOMING_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) static void h4_init(const void * transport_config){ // check for hci_transport_config_uart_t diff --git a/port/mtk/hci_transport_h4_mtk.c b/port/mtk/hci_transport_h4_mtk.c index 3779a72f8..e65600246 100644 --- a/port/mtk/hci_transport_h4_mtk.c +++ b/port/mtk/hci_transport_h4_mtk.c @@ -70,8 +70,8 @@ static hci_transport_h4_t * hci_transport_h4 = NULL; static void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size) = dummy_handler; // packet bufffers -static uint8_t hci_packet_out[1+HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) -static uint8_t hci_packet_in[1+HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) +static uint8_t hci_packet_out[1+HCI_OUTGOING_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, cmd header + cmd data) +static uint8_t hci_packet_in[ 1+HCI_INCOMING_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) static int h4_open(void){ int fd = mtk_bt_enable(); diff --git a/port/wiced-h4/hci_transport_h4_wiced.c b/port/wiced-h4/hci_transport_h4_wiced.c index 6d1671aae..4e7c64d94 100644 --- a/port/wiced-h4/hci_transport_h4_wiced.c +++ b/port/wiced-h4/hci_transport_h4_wiced.c @@ -95,7 +95,7 @@ static uint16_t tx_worker_data_size; static wiced_worker_thread_t rx_worker_thread; static int rx_worker_read_pos; -static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 1 + HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) +static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + HCI_INCOMING_PACKET_BUFFER_SIZE + 1]; // packet type + max(acl header + acl payload, event header + event data) static uint8_t * hci_packet = &hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE]; #ifdef WICED_BT_UART_MANUAL_CTS_RTS diff --git a/src/hci.h b/src/hci.h index b1fdb768f..c29e8ccd3 100644 --- a/src/hci.h +++ b/src/hci.h @@ -91,20 +91,35 @@ extern "C" { #define HCI_ACL_BUFFER_SIZE (HCI_ACL_HEADER_SIZE + HCI_ACL_PAYLOAD_SIZE) -// size of hci buffers, big enough for command, event, or acl packet without H4 packet type -// @note cmd buffer is bigger than event buffer -#ifdef HCI_PACKET_BUFFER_SIZE - #if HCI_PACKET_BUFFER_SIZE < HCI_ACL_BUFFER_SIZE - #error HCI_PACKET_BUFFER_SIZE must be equal or larger than HCI_ACL_BUFFER_SIZE +// size of hci incoming buffer, big enough for event or acl packet without H4 packet type +#ifdef HCI_INCOMING_PACKET_BUFFER_SIZE + #if HCI_INCOMING_PACKET_BUFFER_SIZE < HCI_ACL_BUFFER_SIZE + #error HCI_INCOMING_PACKET_BUFFER_SIZE must be equal or larger than HCI_ACL_BUFFER_SIZE #endif - #if HCI_PACKET_BUFFER_SIZE < HCI_CMD_BUFFER_SIZE - #error HCI_PACKET_BUFFER_SIZE must be equal or larger than HCI_CMD_BUFFER_SIZE + #if HCI_INCOMING_PACKET_BUFFER_SIZE < HCI_EVENT_BUFFER_SIZE + #error HCI_INCOMING_PACKET_BUFFER_SIZE must be equal or larger than HCI_EVENT_BUFFER_SIZE + #endif +#else + #if HCI_ACL_BUFFER_SIZE > HCI_EVENT_BUFFER_SIZE + #define HCI_INCOMING_PACKET_BUFFER_SIZE HCI_ACL_BUFFER_SIZE + #else + #define HCI_INCOMING_PACKET_BUFFER_SIZE HCI_EVENT_BUFFER_SIZE + #endif +#endif + +// size of hci outgoing buffer, big enough for command or acl packet without H4 packet type +#ifdef HCI_OUTGOING_PACKET_BUFFER_SIZE + #if HCI_OUTGOING_PACKET_BUFFER_SIZE < HCI_ACL_BUFFER_SIZE + #error HCI_OUTGOING_PACKET_BUFFER_SIZE must be equal or larger than HCI_ACL_BUFFER_SIZE + #endif + #if HCI_OUTGOING_PACKET_BUFFER_SIZE < HCI_CMD_BUFFER_SIZE + #error HCI_OUTGOING_PACKET_BUFFER_SIZE must be equal or larger than HCI_CMD_BUFFER_SIZE #endif #else #if HCI_ACL_BUFFER_SIZE > HCI_CMD_BUFFER_SIZE - #define HCI_PACKET_BUFFER_SIZE HCI_ACL_BUFFER_SIZE + #define HCI_OUTGOING_PACKET_BUFFER_SIZE HCI_ACL_BUFFER_SIZE #else - #define HCI_PACKET_BUFFER_SIZE HCI_CMD_BUFFER_SIZE + #define HCI_OUTGOING_PACKET_BUFFER_SIZE HCI_CMD_BUFFER_SIZE #endif #endif @@ -688,7 +703,7 @@ typedef struct { // single buffer for HCI packet assembly + additional prebuffer for H4 drivers uint8_t * hci_packet_buffer; - uint8_t hci_packet_buffer_data[HCI_OUTGOING_PRE_BUFFER_SIZE + HCI_PACKET_BUFFER_SIZE]; + uint8_t hci_packet_buffer_data[HCI_OUTGOING_PRE_BUFFER_SIZE + HCI_OUTGOING_PACKET_BUFFER_SIZE]; uint8_t hci_packet_buffer_reserved; uint16_t acl_fragmentation_pos; uint16_t acl_fragmentation_total_size; diff --git a/src/hci_transport_em9304_spi.c b/src/hci_transport_em9304_spi.c index 3e7289c18..9a427fa6b 100644 --- a/src/hci_transport_em9304_spi.c +++ b/src/hci_transport_em9304_spi.c @@ -384,7 +384,7 @@ static uint16_t hci_transport_em9304_spi_bytes_to_read; static uint16_t hci_transport_em9304_spi_read_pos; // incoming packet buffer -static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 1 + HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) +static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + HCI_INCOMING_PACKET_BUFFER_SIZE + 1]; // packet type + max(acl header + acl payload, event header + event data) static uint8_t * hci_packet = &hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE]; static void hci_transport_em9304_spi_block_read(void); @@ -443,8 +443,8 @@ static void hci_transport_em9304_spi_block_read(void){ case H4_W4_ACL_HEADER: hci_transport_em9304_spi_bytes_to_read = little_endian_read_16( hci_packet, 3); // check ACL length - if (HCI_ACL_HEADER_SIZE + hci_transport_em9304_spi_bytes_to_read > HCI_PACKET_BUFFER_SIZE){ - log_error("invalid ACL payload len %d - only space for %u", hci_transport_em9304_spi_bytes_to_read, HCI_PACKET_BUFFER_SIZE - HCI_ACL_HEADER_SIZE); + if (HCI_ACL_HEADER_SIZE + hci_transport_em9304_spi_bytes_to_read > HCI_INCOMING_PACKET_BUFFER_SIZE){ + log_error("invalid ACL payload len %d - only space for %u", hci_transport_em9304_spi_bytes_to_read, HCI_INCOMING_PACKET_BUFFER_SIZE - HCI_ACL_HEADER_SIZE); hci_transport_em9304_spi_reset_statemachine(); break; } diff --git a/src/hci_transport_h4.c b/src/hci_transport_h4.c index 729f2f2c5..ac8af3547 100644 --- a/src/hci_transport_h4.c +++ b/src/hci_transport_h4.c @@ -144,7 +144,7 @@ static int bytes_to_read; static int read_pos; // incoming packet buffer -static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 1 + HCI_PACKET_BUFFER_SIZE]; // packet type + max(acl header + acl payload, event header + event data) +static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + HCI_INCOMING_PACKET_BUFFER_SIZE + 1]; // packet type + max(acl header + acl payload, event header + event data) static uint8_t * hci_packet = &hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE]; #ifdef ENABLE_CC256X_BAUDRATE_CHANGE_FLOWCONTROL_BUG_WORKAROUND @@ -217,8 +217,8 @@ static void hci_transport_h4_block_read(void){ case H4_W4_ACL_HEADER: bytes_to_read = little_endian_read_16( hci_packet, 3); // check ACL length - if (HCI_ACL_HEADER_SIZE + bytes_to_read > HCI_PACKET_BUFFER_SIZE){ - log_error("hci_transport_h4: invalid ACL payload len %d - only space for %u", bytes_to_read, HCI_PACKET_BUFFER_SIZE - HCI_ACL_HEADER_SIZE); + if (HCI_ACL_HEADER_SIZE + bytes_to_read > HCI_INCOMING_PACKET_BUFFER_SIZE){ + log_error("hci_transport_h4: invalid ACL payload len %d - only space for %u", bytes_to_read, HCI_INCOMING_PACKET_BUFFER_SIZE - HCI_ACL_HEADER_SIZE); hci_transport_h4_reset_statemachine(); break; } diff --git a/src/hci_transport_h5.c b/src/hci_transport_h5.c index dbb2eab36..0b89c776f 100644 --- a/src/hci_transport_h5.c +++ b/src/hci_transport_h5.c @@ -110,7 +110,7 @@ static const uint8_t link_control_sleep[] = { 0x07, 0x78}; #define LINK_CONTROL_MAX_LEN 3 // incoming pre-bufffer + 4 bytes H5 header + max(acl header + acl payload, event header + event data) + 2 bytes opt CRC -static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 6 + HCI_PACKET_BUFFER_SIZE]; +static uint8_t hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 6 + HCI_INCOMING_PACKET_BUFFER_SIZE]; // outgoing slip encoded buffer. +4 to assert that DIC fits in buffer. +1 to assert that last SOF fits in buffer. static uint8_t slip_outgoing_buffer[LINK_SLIP_TX_CHUNK_LEN+4+1]; @@ -276,7 +276,7 @@ static void hci_transport_slip_send_frame(const uint8_t * header, const uint8_t // SLIP Incoming static void hci_transport_slip_init(void){ - btstack_slip_decoder_init(&hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE], 6 + HCI_PACKET_BUFFER_SIZE); + btstack_slip_decoder_init(&hci_packet_with_pre_buffer[HCI_INCOMING_PRE_BUFFER_SIZE], 6 + HCI_INCOMING_PACKET_BUFFER_SIZE); } // H5 Three-Wire Implementation @@ -711,7 +711,7 @@ static void hci_transport_h5_process_frame(uint16_t frame_size){ // recommendet time until resend: 3 * time of largest packet static uint16_t hci_transport_link_calc_resend_timeout(uint32_t baudrate){ - uint32_t max_packet_size_in_bit = (HCI_PACKET_BUFFER_SIZE + 6) << 3; + uint32_t max_packet_size_in_bit = (HCI_INCOMING_PACKET_BUFFER_SIZE + 6) << 3; uint32_t t_max_x3_ms = max_packet_size_in_bit * 3000 / baudrate; // allow for BTstack logging and other delays