From 7d00c19e810a98962dbf46f008c9d0c71eb6fb02 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 27 Jan 2016 15:36:32 +0100 Subject: [PATCH 1/3] arduino: add C++ protection --- platforms/arduino/BTstack.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/platforms/arduino/BTstack.h b/platforms/arduino/BTstack.h index ccb398afa..40d741592 100644 --- a/platforms/arduino/BTstack.h +++ b/platforms/arduino/BTstack.h @@ -1,7 +1,12 @@ /** * Arduino Wrapper for BTstack */ -#pragma once +#ifndef __ARDUINO_BTSTACK_H +#define __ARDUINO_BTSTACK_H + +#if defined __cplusplus +extern "C" { +#endif #include "att.h" #include @@ -187,4 +192,10 @@ public: uint16_t addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id); }; - extern BTstackManager BTstack; \ No newline at end of file +extern BTstackManager BTstack; + +#if defined __cplusplus +} +#endif + +#endif // __ARDUINO_BTSTACK_H \ No newline at end of file From 83e7cdd948f2a1a6e3c1630bfa189f2ebf07b275 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Thu, 28 Jan 2016 14:54:03 +0100 Subject: [PATCH 2/3] l2cap: add l2cap_can_send_prepared_packet_now --- src/l2cap.c | 6 ++++++ src/l2cap.h | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/l2cap.c b/src/l2cap.c index bc9f797ad..574d01221 100644 --- a/src/l2cap.c +++ b/src/l2cap.c @@ -240,6 +240,12 @@ int l2cap_can_send_packet_now(uint16_t local_cid){ return hci_can_send_acl_packet_now(channel->handle); } +int l2cap_can_send_prepared_packet_now(uint16_t local_cid){ + l2cap_channel_t *channel = l2cap_get_channel_for_local_cid(local_cid); + if (!channel) return 0; + return hci_can_send_prepared_acl_packet_now(channel->handle); +} + // @deprecated int l2cap_can_send_connectionless_packet_now(void){ // TODO provide real handle diff --git a/src/l2cap.h b/src/l2cap.h index 694afba00..a401d1421 100644 --- a/src/l2cap.h +++ b/src/l2cap.h @@ -201,6 +201,7 @@ typedef struct l2cap_signaling_response { } l2cap_signaling_response_t; + int l2cap_can_send_fixed_channel_packet_now(uint16_t handle); // @deprecated use l2cap_can_send_fixed_channel_packet_now instead @@ -261,7 +262,9 @@ void l2cap_decline_connection_internal(uint16_t local_cid, uint8_t reason); /** * @brief Non-blocking UART write */ -int l2cap_can_send_packet_now(uint16_t local_cid); +int l2cap_can_send_packet_now(uint16_t local_cid); +int l2cap_can_send_prepared_packet_now(uint16_t local_cid); + int l2cap_reserve_packet_buffer(void); void l2cap_release_packet_buffer(void); From 92feaef78193405c2e2beed06b260e832cb5b4db Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Thu, 28 Jan 2016 14:54:43 +0100 Subject: [PATCH 3/3] rfcomm: release outgoing packet buffer in case of error in l2cap_send_prepared --- src/rfcomm.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rfcomm.c b/src/rfcomm.c index d59666bc0..f4ddf2e09 100644 --- a/src/rfcomm.c +++ b/src/rfcomm.c @@ -2029,6 +2029,10 @@ int rfcomm_send_prepared(uint16_t rfcomm_cid, uint16_t len){ int err = rfcomm_assert_send_valid(channel, len); if (err) return err; + if (l2cap_can_send_prepared_packet_now(channel->multiplexer->l2cap_cid)){ + log_error("rfcomm_send_prepared: l2cap cannot send now"); + return BTSTACK_ACL_BUFFERS_FULL; + } // send might cause l2cap to emit new credits, update counters first channel->credits_outgoing--; @@ -2037,12 +2041,11 @@ int rfcomm_send_prepared(uint16_t rfcomm_cid, uint16_t len){ if (result != 0) { channel->credits_outgoing++; - log_info("rfcomm_send_internal: error %d", result); + log_error("rfcomm_send_prepared: error %d", result); return result; } rfcomm_hand_out_credits(); - return result; } @@ -2055,11 +2058,19 @@ int rfcomm_send_internal(uint16_t rfcomm_cid, uint8_t *data, uint16_t len){ int err = rfcomm_assert_send_valid(channel, len); if (err) return err; + if (l2cap_can_send_packet_now(channel->multiplexer->l2cap_cid)){ + log_error("rfcomm_send_internal: l2cap cannot send now"); + return BTSTACK_ACL_BUFFERS_FULL; + } rfcomm_reserve_packet_buffer(); uint8_t * rfcomm_payload = rfcomm_get_outgoing_buffer(); memcpy(rfcomm_payload, data, len); - return rfcomm_send_prepared(rfcomm_cid, len); + err = rfcomm_send_prepared(rfcomm_cid, len); + if (err){ + rfcomm_release_packet_buffer(); + } + return err; } // Sends Local Lnie Status, see LINE_STATUS_..