From 70efece18612cf0375429498813bc3a97dee6959 Mon Sep 17 00:00:00 2001 From: "matthias.ringwald@gmail.com" Date: Tue, 18 Feb 2014 21:26:46 +0000 Subject: [PATCH] prepare for sending command_reject on le signaling channel --- src/l2cap.c | 27 +++++++++++++++++++++++++-- src/l2cap_signaling.h | 3 ++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/l2cap.c b/src/l2cap.c index 7f4eebbdc..9bac68db8 100644 --- a/src/l2cap.c +++ b/src/l2cap.c @@ -310,12 +310,31 @@ int l2cap_send_signaling_packet(hci_con_handle_t handle, L2CAP_SIGNALING_COMMAND uint8_t *acl_buffer = hci_get_outgoing_acl_packet_buffer(); va_list argptr; va_start(argptr, identifier); - uint16_t len = l2cap_create_signaling_internal(acl_buffer, handle, cmd, identifier, argptr); + uint16_t len = l2cap_create_signaling_classic(acl_buffer, handle, cmd, identifier, argptr); va_end(argptr); // log_info("l2cap_send_signaling_packet con %u!\n", handle); return hci_send_acl_packet(acl_buffer, len); } +#ifdef HAVE_BLE +int l2cap_send_le_signaling_packet(hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, uint8_t identifier, ...){ + + if (!hci_can_send_packet_now(HCI_ACL_DATA_PACKET)){ + log_info("l2cap_send_signaling_packet, cannot send\n"); + return BTSTACK_ACL_BUFFERS_FULL; + } + + // log_info("l2cap_send_signaling_packet type %u\n", cmd); + uint8_t *acl_buffer = hci_get_outgoing_acl_packet_buffer(); + va_list argptr; + va_start(argptr, identifier); + uint16_t len = l2cap_create_signaling_le(acl_buffer, handle, cmd, identifier, argptr); + va_end(argptr); + // log_info("l2cap_send_signaling_packet con %u!\n", handle); + return hci_send_acl_packet(acl_buffer, len); +} +#endif + uint8_t *l2cap_get_outgoing_buffer(void){ return hci_get_outgoing_acl_packet_buffer() + COMPLETE_L2CAP_HEADER; // 8 bytes } @@ -440,7 +459,7 @@ void l2cap_run(void){ if (!hci_can_send_packet_now(HCI_ACL_DATA_PACKET)) break; hci_con_handle_t handle = signaling_responses[0].handle; - uint8_t sig_id = signaling_responses[0].sig_id; + uint8_t sig_id = signaling_responses[0].sig_id; uint16_t infoType = signaling_responses[0].data; // INFORMATION_REQUEST uint16_t result = signaling_responses[0].data; // CONNECTION_REQUEST, COMMAND_REJECT @@ -481,7 +500,11 @@ void l2cap_run(void){ break; case COMMAND_REJECT: l2cap_send_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL); +#ifdef HAVE_BLE + case COMMAND_REJECT_LE: + l2cap_send_le_signaling_packet(handle, COMMAND_REJECT, sig_id, result, 0, NULL); break; +#endif default: // should not happen break; diff --git a/src/l2cap_signaling.h b/src/l2cap_signaling.h index fc8f7197b..59cf953a3 100644 --- a/src/l2cap_signaling.h +++ b/src/l2cap_signaling.h @@ -65,7 +65,8 @@ typedef enum { INFORMATION_REQUEST, INFORMATION_RESPONSE, CONNECTION_PARAMETER_UPDATE_REQUEST = 0x12, - CONNECTION_PARAMETER_UPDATE_RESPONSE + CONNECTION_PARAMETER_UPDATE_RESPONSE, + COMMAND_REJECT_LE = 0x14, // internal to BTstack } L2CAP_SIGNALING_COMMANDS; uint16_t l2cap_create_signaling_classic(uint8_t * acl_buffer,hci_con_handle_t handle, L2CAP_SIGNALING_COMMANDS cmd, uint8_t identifier, va_list argptr);