mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-29 22:20:37 +00:00
use single packet handler per protocol layer: l2cap
This commit is contained in:
parent
2718e2e7a1
commit
b502e1b06d
20
src/daemon.c
20
src/daemon.c
@ -223,7 +223,7 @@ static int daemon_client_handler(connection_t *connection, uint16_t packet_type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void daemon_event_handler(connection_t *connection, uint8_t *packet, uint16_t size){
|
||||
static void daemon_event_handler(connection_t *connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||
// local cache
|
||||
static HCI_STATE hci_state = HCI_STATE_OFF;
|
||||
static int num_connections = 0;
|
||||
@ -267,10 +267,23 @@ static void daemon_event_handler(connection_t *connection, uint8_t *packet, uint
|
||||
}
|
||||
}
|
||||
|
||||
static void daemon_data_handler(connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size){
|
||||
static void daemon_data_handler(connection_t * connection, uint8_t packet_type, uint16_t local_cid, uint8_t *packet, uint16_t size){
|
||||
socket_connection_send_packet(connection, L2CAP_DATA_PACKET, local_cid, packet, size);
|
||||
}
|
||||
|
||||
static void daemon_packet_handler(connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||
switch (packet_type) {
|
||||
case HCI_EVENT_PACKET:
|
||||
daemon_event_handler(connection, packet_type, channel, packet, size);
|
||||
break;
|
||||
case L2CAP_DATA_PACKET:
|
||||
daemon_data_handler(connection, packet_type, channel, packet, size);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void daemon_sigint_handler(int param){
|
||||
printf(" <= SIGINT received, shutting down..\n");
|
||||
hci_power_control( HCI_POWER_OFF);
|
||||
@ -361,8 +374,7 @@ int main (int argc, char * const * argv){
|
||||
|
||||
// init L2CAP
|
||||
l2cap_init();
|
||||
l2cap_register_data_packet_handler(daemon_data_handler);
|
||||
l2cap_register_event_packet_handler(daemon_event_handler);
|
||||
l2cap_register_packet_handler(daemon_packet_handler);
|
||||
timeout.process = daemon_no_connections_timeout;
|
||||
|
||||
// init SDP
|
||||
|
27
src/l2cap.c
27
src/l2cap.c
@ -59,16 +59,14 @@
|
||||
#define L2CAP_SIGNALING_COMMAND_LENGTH_OFFSET 2
|
||||
#define L2CAP_SIGNALING_COMMAND_DATA_OFFSET 4
|
||||
|
||||
static void null_event_handler(connection_t * connection, uint8_t *packet, uint16_t size);
|
||||
static void null_data_handler(connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size);
|
||||
static void l2cap_packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size );
|
||||
static void null_packet_handler(connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
|
||||
static void l2cap_packet_handler(uint8_t packet_type, uint8_t *packet, uint16_t size);
|
||||
|
||||
static uint8_t * sig_buffer = NULL;
|
||||
static linked_list_t l2cap_channels = NULL;
|
||||
static linked_list_t l2cap_services = NULL;
|
||||
static uint8_t * acl_buffer = NULL;
|
||||
static void (*event_packet_handler) (connection_t * connection, uint8_t *packet, uint16_t size) = null_event_handler;
|
||||
static void (*data_packet_handler) (connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size) = null_data_handler;
|
||||
static void (*packet_handler) (connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) = null_packet_handler;
|
||||
static connection_t * capture_connection = NULL;
|
||||
|
||||
static uint8_t config_options[] = { 1, 2, 150, 0}; // mtu = 48
|
||||
@ -86,15 +84,10 @@ void l2cap_init(){
|
||||
|
||||
|
||||
/** Register L2CAP packet handlers */
|
||||
static void null_event_handler(connection_t * connection, uint8_t *packet, uint16_t size){
|
||||
static void null_packet_handler(connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
|
||||
}
|
||||
static void null_data_handler(connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size){
|
||||
}
|
||||
void l2cap_register_event_packet_handler(void (*handler)(connection_t * connection, uint8_t *packet, uint16_t size)){
|
||||
event_packet_handler = handler;
|
||||
}
|
||||
void l2cap_register_data_packet_handler (void (*handler)(connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size)){
|
||||
data_packet_handler = handler;
|
||||
void l2cap_register_packet_handler(void (*handler)(connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)){
|
||||
packet_handler = handler;
|
||||
}
|
||||
|
||||
// notify client/protocol handler
|
||||
@ -104,10 +97,10 @@ void l2cap_dispatch(l2cap_channel_t *channel, uint8_t type, uint8_t * data, uint
|
||||
} else {
|
||||
switch (type){
|
||||
case HCI_EVENT_PACKET:
|
||||
(*event_packet_handler)(channel->connection, data, size);
|
||||
(*packet_handler)(channel->connection, HCI_EVENT_PACKET, 0, data, size);
|
||||
break;
|
||||
case L2CAP_DATA_PACKET:
|
||||
(*data_packet_handler)(channel->connection, channel->local_cid, data, size);
|
||||
(*packet_handler)(channel->connection, L2CAP_DATA_PACKET, channel->local_cid, data, size);
|
||||
break;
|
||||
default:
|
||||
// ??
|
||||
@ -340,7 +333,7 @@ void l2cap_event_handler( uint8_t *packet, uint16_t size ){
|
||||
}
|
||||
|
||||
// pass on
|
||||
(*event_packet_handler)(NULL, packet, size);
|
||||
(*packet_handler)(NULL, HCI_EVENT_PACKET, 0, packet, size);
|
||||
}
|
||||
|
||||
static void l2cap_handle_disconnect_request(l2cap_channel_t *channel, uint16_t identifier){
|
||||
@ -646,7 +639,7 @@ void l2cap_acl_handler( uint8_t *packet, uint16_t size ){
|
||||
|
||||
// Capturing?
|
||||
if (capture_connection) {
|
||||
(*data_packet_handler)(capture_connection, 0, packet, size);
|
||||
(*packet_handler)(capture_connection, HCI_ACL_DATA_PACKET, 0, packet, size);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -107,8 +107,7 @@ typedef struct {
|
||||
} l2cap_service_t;
|
||||
|
||||
void l2cap_init();
|
||||
void l2cap_register_event_packet_handler(void (*handler)(connection_t * connection, uint8_t *packet, uint16_t size));
|
||||
void l2cap_register_data_packet_handler(void (*handler)(connection_t * connection, uint16_t local_cid, uint8_t *packet, uint16_t size));
|
||||
void l2cap_register_packet_handler(void (*handler)(connection_t * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size));
|
||||
void l2cap_create_channel_internal(connection_t * connection, bd_addr_t address, uint16_t psm);
|
||||
void l2cap_disconnect_internal(uint16_t local_cid, uint8_t reason);
|
||||
void l2cap_send_internal(uint16_t local_cid, uint8_t *data, uint16_t len);
|
||||
|
Loading…
x
Reference in New Issue
Block a user