From ccb8ddfbd85a7477f952605374c0d42261686cc0 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Fri, 5 Feb 2016 11:50:47 +0100 Subject: [PATCH] rfcomm: pass packet handler for create service or channel. store in service and channel structs --- example/embedded/spp_and_le_counter.c | 2 +- example/embedded/spp_counter.c | 2 +- example/embedded/spp_streamer.c | 2 +- platform/daemon/daemon.c | 2 +- port/ez430-rf2560/example/ant_test.c | 2 +- port/ez430-rf2560/example/spp_accel.c | 2 +- .../example/ant_test.c | 2 +- .../example/spp_accel.c | 2 +- src/classic/hfp.c | 3 +- src/classic/hfp.h | 2 +- src/classic/hfp_ag.c | 4 +- src/classic/hfp_hf.c | 3 +- src/classic/hsp_ag.c | 2 +- src/classic/hsp_hs.c | 8 +-- src/classic/rfcomm.c | 54 +++++++++++-------- src/classic/rfcomm.h | 49 +++++++++++------ test/hfp/mock.c | 3 +- test/pts/classic_test.c | 2 +- test/pts/hfp_test.c | 6 +-- 19 files changed, 86 insertions(+), 66 deletions(-) diff --git a/example/embedded/spp_and_le_counter.c b/example/embedded/spp_and_le_counter.c index ff3eda1f2..4d3bf4643 100644 --- a/example/embedded/spp_and_le_counter.c +++ b/example/embedded/spp_and_le_counter.c @@ -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(); diff --git a/example/embedded/spp_counter.c b/example/embedded/spp_counter.c index b77bcd8e8..57888ab3a 100644 --- a/example/embedded/spp_counter.c +++ b/example/embedded/spp_counter.c @@ -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(); diff --git a/example/embedded/spp_streamer.c b/example/embedded/spp_streamer.c index e39c3ce1e..8899cd6c6 100644 --- a/example/embedded/spp_streamer.c +++ b/example/embedded/spp_streamer.c @@ -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; diff --git a/platform/daemon/daemon.c b/platform/daemon/daemon.c index 4abff240b..43f09e988 100644 --- a/platform/daemon/daemon.c +++ b/platform/daemon/daemon.c @@ -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: diff --git a/port/ez430-rf2560/example/ant_test.c b/port/ez430-rf2560/example/ant_test.c index ce87321f4..14955985d 100644 --- a/port/ez430-rf2560/example/ant_test.c +++ b/port/ez430-rf2560/example/ant_test.c @@ -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(); diff --git a/port/ez430-rf2560/example/spp_accel.c b/port/ez430-rf2560/example/spp_accel.c index b666410a0..2a148bd37 100644 --- a/port/ez430-rf2560/example/spp_accel.c +++ b/port/ez430-rf2560/example/spp_accel.c @@ -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(); diff --git a/port/msp-exp430f5438-cc2564b/example/ant_test.c b/port/msp-exp430f5438-cc2564b/example/ant_test.c index 33e42cf92..98fe71495 100644 --- a/port/msp-exp430f5438-cc2564b/example/ant_test.c +++ b/port/msp-exp430f5438-cc2564b/example/ant_test.c @@ -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(); diff --git a/port/msp-exp430f5438-cc2564b/example/spp_accel.c b/port/msp-exp430f5438-cc2564b/example/spp_accel.c index 0ec9f8b7f..5c282cea2 100644 --- a/port/msp-exp430f5438-cc2564b/example/spp_accel.c +++ b/port/msp-exp430f5438-cc2564b/example/spp_accel.c @@ -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(); diff --git a/src/classic/hfp.c b/src/classic/hfp.c index d06d477de..7ab717030 100644 --- a/src/classic/hfp.c +++ b/src/classic/hfp.c @@ -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); } diff --git a/src/classic/hfp.h b/src/classic/hfp.h index 6a66b70c0..c4b3e531f 100644 --- a/src/classic/hfp.h +++ b/src/classic/hfp.h @@ -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); diff --git a/src/classic/hfp_ag.c b/src/classic/hfp_ag.c index dd7bab27f..4860cca76 100644 --- a/src/classic/hfp_ag.c +++ b/src/classic/hfp_ag.c @@ -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; diff --git a/src/classic/hfp_hf.c b/src/classic/hfp_hf.c index 23d30d5a8..d9cc217bb 100644 --- a/src/classic/hfp_hf.c +++ b/src/classic/hfp_hf.c @@ -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; diff --git a/src/classic/hsp_ag.c b/src/classic/hsp_ag.c index 8c37c34e0..52e1765d0 100644 --- a/src/classic/hsp_ag.c +++ b/src/classic/hsp_ag.c @@ -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); diff --git a/src/classic/hsp_hs.c b/src/classic/hsp_hs.c index f639c9d4c..bdb50a65a 100644 --- a/src/classic/hsp_hs.c +++ b/src/classic/hsp_hs.c @@ -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(); } - - - - diff --git a/src/classic/rfcomm.c b/src/classic/rfcomm.c index 07b7538d5..e5c0a9ec3 100644 --- a/src/classic/rfcomm.c +++ b/src/classic/rfcomm.c @@ -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){ diff --git a/src/classic/rfcomm.h b/src/classic/rfcomm.h index 2d4acebf0..57a97a638 100644 --- a/src/classic/rfcomm.h +++ b/src/classic/rfcomm.h @@ -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. diff --git a/test/hfp/mock.c b/test/hfp/mock.c index 5c9a37232..769b5e229 100644 --- a/test/hfp/mock.c +++ b/test/hfp/mock.c @@ -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; } diff --git a/test/pts/classic_test.c b/test/pts/classic_test.c index 68dae2e0f..e0d63509b 100644 --- a/test/pts/classic_test.c +++ b/test/pts/classic_test.c @@ -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(); diff --git a/test/pts/hfp_test.c b/test/pts/hfp_test.c index b73480b65..e969102f8 100644 --- a/test/pts/hfp_test.c +++ b/test/pts/hfp_test.c @@ -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);