rfcomm: pass packet handler for create service or channel. store in service and channel structs

This commit is contained in:
Matthias Ringwald 2016-02-05 11:50:47 +01:00
parent 7298da4764
commit ccb8ddfbd8
19 changed files with 86 additions and 66 deletions

View File

@ -260,7 +260,7 @@ int btstack_main(void)
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(RFCOMM_SERVER_CHANNEL, 0xffff);
rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff);
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -101,7 +101,7 @@ static void spp_service_setup(void){
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(RFCOMM_SERVER_CHANNEL, 0xffff); // reserved channel, mtu limited by l2cap
rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 0xffff); // reserved channel, mtu limited by l2cap
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -176,7 +176,7 @@ static void handle_query_rfcomm_event(uint8_t packet_type, uint8_t *packet, uint
// connect
printf("Requested SPP Service found, creating RFCOMM channel\n");
state = W4_RFCOMM_CHANNEL;
rfcomm_create_channel(remote, channel_nr, NULL);
rfcomm_create_channel(packet_handler, remote, channel_nr, NULL);
break;
default:
break;

View File

@ -1050,7 +1050,7 @@ static int btstack_command_handler(connection_t *connection, uint8_t *packet, ui
case RFCOMM_REGISTER_SERVICE:
rfcomm_channel = packet[3];
mtu = little_endian_read_16(packet, 4);
status = rfcomm_register_service(rfcomm_channel, mtu);
status = rfcomm_register_service(rfcomm_packet_handler, rfcomm_channel, mtu);
rfcomm_emit_service_registered(connection, status, rfcomm_channel);
break;
case RFCOMM_REGISTER_SERVICE_WITH_CREDITS:

View File

@ -226,7 +226,7 @@ int btstack_main(int argc, const char * argv[]){
// init RFCOMM
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 100); // reserved channel, mtu=100
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 100); // reserved channel, mtu=100
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -216,7 +216,7 @@ int btstack_main(int argc, const char * argv[]){
// init RFCOMM
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 100); // reserved channel, mtu=100
rfcomm_register_service(rfcomm_packet_handler, rfcomm_channel_nr, 100); // reserved channel, mtu=100
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -226,7 +226,7 @@ int btstack_main(int argc, const char * argv[]){
// init RFCOMM
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 100); // reserved channel, mtu=100
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 100); // reserved channel, mtu=100
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -217,7 +217,7 @@ int btstack_main(int argc, const char * argv[]){
// init RFCOMM
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 100); // reserved channel, mtu=100
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 100); // reserved channel, mtu=100
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -1272,8 +1272,7 @@ static void parse_sequence(hfp_connection_t * context){
}
}
void hfp_init(uint16_t rfcomm_channel_nr){
rfcomm_register_service(rfcomm_channel_nr, 0xffff);
void hfp_init(void){
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event);
}

View File

@ -632,7 +632,7 @@ void set_hfp_generic_status_indicators(hfp_generic_status_indicator_t * indicato
btstack_linked_list_t * hfp_get_connections(void);
void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree);
void hfp_init(uint16_t rfcomm_channel_nr);
void hfp_init(void);
void hfp_establish_service_level_connection(bd_addr_t bd_addr, uint16_t service_uuid);
void hfp_release_service_level_connection(hfp_connection_t * connection);
void hfp_reset_context_flags(hfp_connection_t * context);

View File

@ -1997,8 +1997,8 @@ void hfp_ag_init(uint16_t rfcomm_channel_nr, uint32_t supported_features,
l2cap_init();
rfcomm_register_packet_handler(packet_handler);
hfp_init(rfcomm_channel_nr);
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 0xffff);
hfp_init();
hfp_supported_features = supported_features;
hfp_codecs_nr = codecs_nr;

View File

@ -1057,7 +1057,8 @@ void hfp_hf_init(uint16_t rfcomm_channel_nr, uint32_t supported_features, uint16
l2cap_init();
rfcomm_register_packet_handler(packet_handler);
hfp_init(rfcomm_channel_nr);
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 0xffff);
hfp_init();
hfp_supported_features = supported_features;

View File

@ -267,7 +267,7 @@ void hsp_ag_init(uint8_t rfcomm_channel_nr){
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 0xffff); // reserved channel, mtu limited by l2cap
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 0xffff); // reserved channel, mtu limited by l2cap
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event);

View File

@ -265,7 +265,7 @@ void hsp_hs_init(uint8_t rfcomm_channel_nr){
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(rfcomm_channel_nr, 0xffff); // reserved channel, mtu limited by l2cap
rfcomm_register_service(packet_handler, rfcomm_channel_nr, 0xffff); // reserved channel, mtu limited by l2cap
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event);
@ -588,7 +588,7 @@ static void handle_query_rfcomm_event(uint8_t packet_type, uint8_t *packet, uint
if (channel_nr > 0){
hsp_state = HSP_W4_RFCOMM_CONNECTED;
printf("RFCOMM create channel.\n");
rfcomm_create_channel(remote, channel_nr, NULL);
rfcomm_create_channel(packet_handler, remote, channel_nr, NULL);
break;
}
hsp_hs_reset_state();
@ -602,7 +602,3 @@ void hsp_hs_press_button(void){
hs_send_button_press = 1;
hsp_run();
}

View File

@ -299,40 +299,38 @@ static void rfcomm_channel_initialize(rfcomm_channel_t *channel, rfcomm_multiple
// setup channel
memset(channel, 0, sizeof(rfcomm_channel_t));
channel->state = RFCOMM_CHANNEL_CLOSED;
channel->state_var = RFCOMM_CHANNEL_STATE_VAR_NONE;
// set defaults for port configuration (even for services)
rfcomm_rpn_data_set_defaults(&channel->rpn_data);
channel->state = RFCOMM_CHANNEL_CLOSED;
channel->state_var = RFCOMM_CHANNEL_STATE_VAR_NONE;
channel->multiplexer = multiplexer;
channel->service = service;
channel->rfcomm_cid = rfcomm_client_cid_generator++;
channel->max_frame_size = multiplexer->max_frame_size;
channel->credits_incoming = 0;
channel->credits_outgoing = 0;
// set defaults for port configuration (even for services)
rfcomm_rpn_data_set_defaults(&channel->rpn_data);
// incoming flow control not active
channel->new_credits_incoming =RFCOMM_CREDITS;
channel->new_credits_incoming = RFCOMM_CREDITS;
channel->incoming_flow_control = 0;
channel->rls_line_status = RFCOMM_RLS_STATUS_INVALID;
channel->rls_line_status = RFCOMM_RLS_STATUS_INVALID;
channel->service = service;
if (service) {
// incoming connection
channel->outgoing = 0;
channel->dlci = (server_channel << 1) | multiplexer->outgoing;
channel->dlci = (server_channel << 1) | multiplexer->outgoing;
if (channel->max_frame_size > service->max_frame_size) {
channel->max_frame_size = service->max_frame_size;
}
channel->incoming_flow_control = service->incoming_flow_control;
channel->new_credits_incoming = service->incoming_initial_credits;
channel->packet_handler = service->packet_handler;
} else {
// outgoing connection
channel->outgoing = 1;
channel->dlci = (server_channel << 1) | (multiplexer->outgoing ^ 1);
}
}
@ -2016,7 +2014,7 @@ int rfcomm_query_port_configuration(uint16_t rfcomm_cid){
}
static uint8_t rfcomm_create_channel_internal(bd_addr_t addr, uint8_t server_channel, uint8_t incoming_flow_control, uint8_t initial_credits, uint16_t * out_rfcomm_cid){
static uint8_t rfcomm_channel_create_internal(btstack_packet_handler_t packet_handler, bd_addr_t addr, uint8_t server_channel, uint8_t incoming_flow_control, uint8_t initial_credits, uint16_t * out_rfcomm_cid){
log_info("RFCOMM_CREATE_CHANNEL addr %s channel #%u init credits %u", bd_addr_to_str(addr), server_channel, initial_credits);
// create new multiplexer if necessary
@ -2041,9 +2039,11 @@ static uint8_t rfcomm_create_channel_internal(bd_addr_t addr, uint8_t server_cha
status = BTSTACK_MEMORY_ALLOC_FAILED;
goto fail;
}
// rfcomm_cid is already assigned by rfcomm_channel_create
channel->incoming_flow_control = incoming_flow_control;
channel->new_credits_incoming = initial_credits;
channel->packet_handler = packet_handler;
// return rfcomm_cid
if (out_rfcomm_cid){
@ -2072,12 +2072,12 @@ fail:
return status;
}
uint8_t rfcomm_create_channel_with_initial_credits(bd_addr_t addr, uint8_t server_channel, uint8_t initial_credits, uint16_t * out_rfcomm_cid){
return rfcomm_create_channel_internal(addr, server_channel, 1, initial_credits, out_rfcomm_cid);
uint8_t rfcomm_create_channel_with_initial_credits(btstack_packet_handler_t packet_handler, bd_addr_t addr, uint8_t server_channel, uint8_t initial_credits, uint16_t * out_rfcomm_cid){
return rfcomm_channel_create_internal(packet_handler, addr, server_channel, 1, initial_credits, out_rfcomm_cid);
}
uint8_t rfcomm_create_channel(bd_addr_t addr, uint8_t server_channel, uint16_t * out_rfcomm_cid){
return rfcomm_create_channel_internal(addr, server_channel, 0, RFCOMM_CREDITS, out_rfcomm_cid);
uint8_t rfcomm_create_channel(btstack_packet_handler_t packet_handler, bd_addr_t addr, uint8_t server_channel, uint16_t * out_rfcomm_cid){
return rfcomm_channel_create_internal(packet_handler, addr, server_channel, 0, RFCOMM_CREDITS, out_rfcomm_cid);
}
void rfcomm_disconnect(uint16_t rfcomm_cid){
@ -2091,7 +2091,10 @@ void rfcomm_disconnect(uint16_t rfcomm_cid){
rfcomm_run();
}
static uint8_t rfcomm_register_service_internal(uint8_t channel, uint16_t max_frame_size, uint8_t incoming_flow_control, uint8_t initial_credits){ log_info("RFCOMM_REGISTER_SERVICE channel #%u mtu %u flow_control %u credits %u",
static uint8_t rfcomm_register_service_internal(btstack_packet_handler_t packet_handler,
uint8_t channel, uint16_t max_frame_size, uint8_t incoming_flow_control, uint8_t initial_credits){
log_info("RFCOMM_REGISTER_SERVICE channel #%u mtu %u flow_control %u credits %u",
channel, max_frame_size, incoming_flow_control, initial_credits);
// check if already registered
@ -2112,6 +2115,7 @@ static uint8_t rfcomm_register_service_internal(uint8_t channel, uint16_t max_fr
}
// fill in
service->packet_handler = packet_handler;
service->server_channel = channel;
service->max_frame_size = max_frame_size;
service->incoming_flow_control = incoming_flow_control;
@ -2123,12 +2127,16 @@ static uint8_t rfcomm_register_service_internal(uint8_t channel, uint16_t max_fr
return 0;
}
uint8_t rfcomm_register_service_with_initial_credits(uint8_t channel, uint16_t max_frame_size, uint8_t initial_credits){
return rfcomm_register_service_internal(channel, max_frame_size, 1, initial_credits);
uint8_t rfcomm_register_service_with_initial_credits(btstack_packet_handler_t packet_handler,
uint8_t channel, uint16_t max_frame_size, uint8_t initial_credits){
return rfcomm_register_service_internal(packet_handler, channel, max_frame_size, 1, initial_credits);
}
uint8_t rfcomm_register_service(uint8_t channel, uint16_t max_frame_size){
return rfcomm_register_service_internal(channel, max_frame_size, 0,RFCOMM_CREDITS);
uint8_t rfcomm_register_service(btstack_packet_handler_t packet_handler, uint8_t channel,
uint16_t max_frame_size){
return rfcomm_register_service_internal(packet_handler, channel, max_frame_size, 0,RFCOMM_CREDITS);
}
void rfcomm_unregister_service(uint8_t service_channel){

View File

@ -175,6 +175,9 @@ typedef struct {
// linked list - assert: first field
btstack_linked_item_t item;
// packet handler
btstack_packet_handler_t packet_handler;
// server channel
uint8_t server_channel;
@ -187,8 +190,6 @@ typedef struct {
// initial incoming credits
uint8_t incoming_initial_credits;
// internal connection
btstack_packet_handler_t packet_handler;
} rfcomm_service_t;
@ -231,12 +232,23 @@ typedef struct {
// info regarding an actual connection
typedef struct {
// linked list - assert: first field
btstack_linked_item_t item;
rfcomm_multiplexer_t *multiplexer;
uint16_t rfcomm_cid;
uint8_t outgoing;
// packet handler
btstack_packet_handler_t packet_handler;
// server channel (see rfcomm_service_t) - NULL => outgoing channel
rfcomm_service_t * service;
// muliplexer for this channel
rfcomm_multiplexer_t *multiplexer;
// RFCOMM Channel ID
uint16_t rfcomm_cid;
//
uint8_t dlci;
// credits for outgoing traffic
@ -271,12 +283,6 @@ typedef struct {
// msc modem status.
uint8_t msc_modem_status;
// server channel (see rfcomm_service_t) - NULL => outgoing channel
rfcomm_service_t * service;
// internal connection
btstack_packet_handler_t packet_handler;
} rfcomm_channel_t;
@ -305,7 +311,7 @@ void rfcomm_register_packet_handler(void (*handler)(uint8_t packet_type, uint16_
* @param out_cid
* @result status
*/
uint8_t rfcomm_create_channel(bd_addr_t addr, uint8_t server_channel, uint16_t * out_cid);
uint8_t rfcomm_create_channel(btstack_packet_handler_t packet_handler, bd_addr_t addr, uint8_t server_channel, uint16_t * out_cid);
/*
* @brief Create RFCOMM connection to a given server channel on a remote deivce.
@ -316,7 +322,7 @@ uint8_t rfcomm_create_channel(bd_addr_t addr, uint8_t server_channel, uint16_t *
* @param out_cid
* @result status
*/
uint8_t rfcomm_create_channel_with_initial_credits(bd_addr_t addr, uint8_t server_channel, uint8_t initial_credits, uint16_t * out_cid);
uint8_t rfcomm_create_channel_with_initial_credits(btstack_packet_handler_t packet_handler, bd_addr_t addr, uint8_t server_channel, uint8_t initial_credits, uint16_t * out_cid);
/**
* @brief Disconnects RFCOMM channel with given identifier.
@ -324,14 +330,23 @@ uint8_t rfcomm_create_channel_with_initial_credits(bd_addr_t addr, uint8_t serve
void rfcomm_disconnect(uint16_t rfcomm_cid);
/**
* @brief Registers RFCOMM service for a server channel and a maximum frame size, and assigns a packet handler. On embedded systems, use NULL for connection parameter. This channel provides automatically enough credits to the remote side.
* @brief Registers RFCOMM service for a server channel and a maximum frame size, and assigns a packet handler.
* This channel provides credits automatically to the remote side -> no flow control
* @param packet handler for all channels of this service
* @param channel
* @param max_frame_size
*/
uint8_t rfcomm_register_service(uint8_t channel, uint16_t max_frame_size);
uint8_t rfcomm_register_service(btstack_packet_handler_t packet_handler, uint8_t channel, uint16_t max_frame_size);
/**
* @brief Registers RFCOMM service for a server channel and a maximum frame size, and assigns a packet handler. On embedded systems, use NULL for connection parameter. This channel will use explicit credit management. During channel establishment, an initial amount of credits is provided.
* @brief Registers RFCOMM service for a server channel and a maximum frame size, and assigns a packet handler.
* This channel will use explicit credit management. During channel establishment, an initial amount of credits is provided.
* @param packet handler for all channels of this service
* @param channel
* @param max_frame_size
* @param initial_credits
*/
uint8_t rfcomm_register_service_with_initial_credits(uint8_t channel, uint16_t max_frame_size, uint8_t initial_credits);
uint8_t rfcomm_register_service_with_initial_credits(btstack_packet_handler_t packet_handler, uint8_t channel, uint16_t max_frame_size, uint8_t initial_credits);
/**
* @brief Unregister RFCOMM service.

View File

@ -270,8 +270,9 @@ void rfcomm_register_packet_handler(void (*handler)(uint8_t packet_type, uint16_
registered_rfcomm_packet_handler = handler;
}
uint8_t rfcomm_register_service(uint8_t channel, uint16_t max_frame_size){
uint8_t rfcomm_register_service(btstack_packet_handler_t packet_handler, uint8_t channel, uint16_t max_frame_size){
printf("rfcomm_register_service\n");
registered_rfcomm_packet_handler = handler;
return 0;
}

View File

@ -781,7 +781,7 @@ int btstack_main(int argc, const char * argv[]){
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
rfcomm_register_service(RFCOMM_SERVER_CHANNEL, 150); // reserved channel, mtu=100
rfcomm_register_service(packet_handler, RFCOMM_SERVER_CHANNEL, 150); // reserved channel, mtu=100
// init SDP, create record for SPP and register with SDP
sdp_init();

View File

@ -147,7 +147,7 @@ static void hci_event_handler(uint8_t packet_type, uint8_t * packet, uint16_t si
}
void handle_query_rfcomm_event(uint8_t packet_type, uint8_t *packet, uint16_t size, void * context){
void handle_query_rfcomm_event(uint8_t packet_type, uint8_t *packet, uint16_t size){
switch (event->type){
case SDP_EVENT_QUERY_RFCOMM_SERVICE:
channel_nr = sdp_event_query_rfcomm_service_get_name(packet);
@ -156,7 +156,7 @@ void handle_query_rfcomm_event(uint8_t packet_type, uint8_t *packet, uint16_t si
case SDP_EVENT_QUERY_COMPLETE:
if (channel_nr > 0) {
printf("RFCOMM create channel.\n");
rfcomm_create_channel_internal(NULL, remote, channel_nr);
rfcomm_create_channel(packet_handler, remote, channel_nr);
break;
}
printf("Service not found.\n");
@ -179,7 +179,7 @@ int btstack_main(int argc, const char * argv[]){
rfcomm_init();
rfcomm_register_packet_handler(packet_handler);
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event, NULL);
sdp_query_rfcomm_register_callback(handle_query_rfcomm_event);
// turn on!
hci_power_control(HCI_POWER_ON);