mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-09 12:39:56 +00:00
l2cap: use table for fixed channels
This commit is contained in:
parent
b31d33b270
commit
5628cf69b5
70
src/l2cap.c
70
src/l2cap.c
@ -66,6 +66,12 @@
|
|||||||
#define L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET 2
|
#define L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET 2
|
||||||
#define L2CAP_SIGNALING_COMMAND_DATA_OFFSET 4
|
#define L2CAP_SIGNALING_COMMAND_DATA_OFFSET 4
|
||||||
|
|
||||||
|
// internal table
|
||||||
|
#define L2CAP_FIXED_CHANNEL_TABLE_INDEX_ATTRIBUTE_PROTOCOL 0
|
||||||
|
#define L2CAP_FIXED_CHANNEL_TABLE_INDEX_SECURITY_MANAGER_PROTOCOL 1
|
||||||
|
#define L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL 2
|
||||||
|
#define L2CAP_FIXED_CHANNEL_TABLE_SIZE (L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL+1)
|
||||||
|
|
||||||
// prototypes
|
// prototypes
|
||||||
static void l2cap_finialize_channel_close(l2cap_channel_t *channel);
|
static void l2cap_finialize_channel_close(l2cap_channel_t *channel);
|
||||||
static inline l2cap_service_t * l2cap_get_service(uint16_t psm);
|
static inline l2cap_service_t * l2cap_get_service(uint16_t psm);
|
||||||
@ -77,6 +83,15 @@ static int l2cap_channel_ready_for_open(l2cap_channel_t *channel);
|
|||||||
static void l2cap_hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
|
static void l2cap_hci_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
|
||||||
static void l2cap_acl_handler(uint8_t packet_type, uint8_t *packet, uint16_t size );
|
static void l2cap_acl_handler(uint8_t packet_type, uint8_t *packet, uint16_t size );
|
||||||
|
|
||||||
|
typedef struct l2cap_fixed_channel {
|
||||||
|
btstack_packet_handler_t callback;
|
||||||
|
// uint8_t waiting_for_can_send_now;
|
||||||
|
} l2cap_fixed_channel_t;
|
||||||
|
|
||||||
|
static btstack_linked_list_t l2cap_channels;
|
||||||
|
static btstack_linked_list_t l2cap_services;
|
||||||
|
static btstack_linked_list_t l2cap_le_channels;
|
||||||
|
static btstack_linked_list_t l2cap_le_services;
|
||||||
|
|
||||||
// used to cache l2cap rejects, echo, and informational requests
|
// used to cache l2cap rejects, echo, and informational requests
|
||||||
static l2cap_signaling_response_t signaling_responses[NR_PENDING_SIGNALING_RESPONSES];
|
static l2cap_signaling_response_t signaling_responses[NR_PENDING_SIGNALING_RESPONSES];
|
||||||
@ -86,16 +101,25 @@ static uint8_t require_security_level2_for_outgoing_sdp;
|
|||||||
|
|
||||||
static btstack_packet_callback_registration_t hci_event_callback_registration;
|
static btstack_packet_callback_registration_t hci_event_callback_registration;
|
||||||
|
|
||||||
static btstack_linked_list_t l2cap_channels;
|
|
||||||
static btstack_linked_list_t l2cap_services;
|
|
||||||
static btstack_linked_list_t l2cap_le_channels;
|
|
||||||
static btstack_linked_list_t l2cap_le_services;
|
|
||||||
|
|
||||||
static btstack_packet_handler_t attribute_protocol_packet_handler;
|
|
||||||
static btstack_packet_handler_t security_protocol_packet_handler;
|
|
||||||
static btstack_packet_handler_t connectionless_channel_packet_handler;
|
|
||||||
static btstack_packet_handler_t l2cap_event_packet_handler;
|
static btstack_packet_handler_t l2cap_event_packet_handler;
|
||||||
|
static l2cap_fixed_channel_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_SIZE];
|
||||||
|
|
||||||
|
// static btstack_packet_handler_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_ATTRIBUTE_PROTOCOL];
|
||||||
|
// static btstack_packet_handler_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_SECURITY_MANAGER_PROTOCOL];
|
||||||
|
// static btstack_packet_handler_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL];
|
||||||
|
|
||||||
|
static int l2cap_fixed_channel_table_index_for_channel_id(uint16_t channel_id){
|
||||||
|
switch (channel_id){
|
||||||
|
case L2CAP_CID_ATTRIBUTE_PROTOCOL:
|
||||||
|
return L2CAP_FIXED_CHANNEL_TABLE_INDEX_ATTRIBUTE_PROTOCOL;
|
||||||
|
case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
|
||||||
|
return L2CAP_FIXED_CHANNEL_TABLE_INDEX_SECURITY_MANAGER_PROTOCOL;
|
||||||
|
case L2CAP_CID_CONNECTIONLESS_CHANNEL:
|
||||||
|
return L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void l2cap_init(void){
|
void l2cap_init(void){
|
||||||
signaling_responses_pending = 0;
|
signaling_responses_pending = 0;
|
||||||
@ -106,9 +130,7 @@ void l2cap_init(void){
|
|||||||
l2cap_le_channels = NULL;
|
l2cap_le_channels = NULL;
|
||||||
|
|
||||||
l2cap_event_packet_handler = NULL;
|
l2cap_event_packet_handler = NULL;
|
||||||
attribute_protocol_packet_handler = NULL;
|
memset(fixed_channels, 0, sizeof(fixed_channels));
|
||||||
security_protocol_packet_handler = NULL;
|
|
||||||
connectionless_channel_packet_handler = NULL;
|
|
||||||
|
|
||||||
require_security_level2_for_outgoing_sdp = 0;
|
require_security_level2_for_outgoing_sdp = 0;
|
||||||
|
|
||||||
@ -1348,20 +1370,20 @@ static void l2cap_acl_handler(uint8_t packet_type, uint8_t *packet, uint16_t siz
|
|||||||
}
|
}
|
||||||
|
|
||||||
case L2CAP_CID_ATTRIBUTE_PROTOCOL:
|
case L2CAP_CID_ATTRIBUTE_PROTOCOL:
|
||||||
if (attribute_protocol_packet_handler) {
|
if (fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_ATTRIBUTE_PROTOCOL].callback) {
|
||||||
(*attribute_protocol_packet_handler)(ATT_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
(*fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_ATTRIBUTE_PROTOCOL].callback)(ATT_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
|
case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
|
||||||
if (security_protocol_packet_handler) {
|
if (fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_SECURITY_MANAGER_PROTOCOL].callback) {
|
||||||
(*security_protocol_packet_handler)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
(*fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_SECURITY_MANAGER_PROTOCOL].callback)(SM_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case L2CAP_CID_CONNECTIONLESS_CHANNEL:
|
case L2CAP_CID_CONNECTIONLESS_CHANNEL:
|
||||||
if (connectionless_channel_packet_handler) {
|
if (fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL].callback) {
|
||||||
(*connectionless_channel_packet_handler)(UCD_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
(*fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_INDEX_CONNECTIONLESS_CHANNEL].callback)(UCD_DATA_PACKET, handle, &packet[COMPLETE_L2CAP_HEADER], size-COMPLETE_L2CAP_HEADER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1520,17 +1542,9 @@ void l2cap_unregister_service(uint16_t psm){
|
|||||||
|
|
||||||
// Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
|
// Bluetooth 4.0 - allows to register handler for Attribute Protocol and Security Manager Protocol
|
||||||
void l2cap_register_fixed_channel(btstack_packet_handler_t the_packet_handler, uint16_t channel_id) {
|
void l2cap_register_fixed_channel(btstack_packet_handler_t the_packet_handler, uint16_t channel_id) {
|
||||||
switch(channel_id){
|
int index = l2cap_fixed_channel_table_index_for_channel_id(channel_id);
|
||||||
case L2CAP_CID_ATTRIBUTE_PROTOCOL:
|
if (index < 0) return;
|
||||||
attribute_protocol_packet_handler = the_packet_handler;
|
fixed_channels[index].callback = the_packet_handler;
|
||||||
break;
|
|
||||||
case L2CAP_CID_SECURITY_MANAGER_PROTOCOL:
|
|
||||||
security_protocol_packet_handler = the_packet_handler;
|
|
||||||
break;
|
|
||||||
case L2CAP_CID_CONNECTIONLESS_CHANNEL:
|
|
||||||
connectionless_channel_packet_handler = the_packet_handler;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_BLE
|
#ifdef ENABLE_BLE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user