diff --git a/src/daemon.c b/src/daemon.c index d7a6175b9..3dde67677 100644 --- a/src/daemon.c +++ b/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 diff --git a/src/l2cap.c b/src/l2cap.c index dbe894423..cd9f33565 100644 --- a/src/l2cap.c +++ b/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; } diff --git a/src/l2cap.h b/src/l2cap.h index 06826e55c..be2d20743 100644 --- a/src/l2cap.h +++ b/src/l2cap.h @@ -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);