From d80ccd43b830a85909dba862659faa4b639d1634 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Fri, 16 Oct 2020 11:28:59 +0200 Subject: [PATCH] avdtp: streamline request to send for acceptor/initiator signaling connections avoid stream endpoint lookup by remote seid --- src/classic/avdtp.c | 119 ++++++++++++++++------------------ src/classic/avdtp.h | 10 ++- src/classic/avdtp_acceptor.c | 16 ++--- src/classic/avdtp_initiator.c | 52 +++++---------- src/classic/avdtp_initiator.h | 3 +- src/classic/avdtp_sink.c | 2 +- src/classic/avdtp_source.c | 2 +- src/classic/avdtp_util.c | 12 ++-- src/classic/avdtp_util.h | 4 +- 9 files changed, 97 insertions(+), 123 deletions(-) diff --git a/src/classic/avdtp.c b/src/classic/avdtp.c index 6ef21a943..9bc5a628a 100644 --- a/src/classic/avdtp.c +++ b/src/classic/avdtp.c @@ -127,7 +127,7 @@ static avdtp_connection_t * avdtp_get_connection_for_bd_addr(bd_addr_t addr){ } -avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){ +avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint16_t seid){ btstack_linked_list_iterator_t it; btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints()); while (btstack_linked_list_iterator_has_next(&it)){ @@ -139,6 +139,10 @@ avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){ return NULL; } +avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){ + return avdtp_get_stream_endpoint_with_seid(seid); +} + avdtp_connection_t * avdtp_get_connection_for_l2cap_signaling_cid(uint16_t l2cap_cid){ btstack_linked_list_iterator_t it; btstack_linked_list_iterator_init(&it, &connections); @@ -182,30 +186,6 @@ static avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_signaling_cid(uin return NULL; } -avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint8_t seid){ - btstack_linked_list_iterator_t it; - btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints()); - while (btstack_linked_list_iterator_has_next(&it)){ - avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it); - if (stream_endpoint->sep.seid == seid){ - return stream_endpoint; - } - } - return NULL; -} - -avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_associated_with_acp_seid(uint16_t acp_seid){ - btstack_linked_list_iterator_t it; - btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints()); - while (btstack_linked_list_iterator_has_next(&it)){ - avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it); - if (stream_endpoint->remote_sep.seid == acp_seid){ - return stream_endpoint; - } - } - return NULL; -} - uint16_t avdtp_get_next_transaction_label(void){ transaction_id_counter++; if (transaction_id_counter == 16){ @@ -419,27 +399,46 @@ void avdtp_register_media_handler(void (*callback)(uint8_t local_seid, uint8_t * avdtp_sink_handle_media_data = callback; } -/* START: tracking can send now requests pro l2cap cid */ -void avdtp_handle_can_send_now(avdtp_connection_t *connection, uint16_t l2cap_cid) { - if (connection->wait_to_send_acceptor){ - log_debug("call avdtp_acceptor_stream_config_subsm_run"); - connection->wait_to_send_acceptor = 0; - avdtp_acceptor_stream_config_subsm_run(connection); - } else if (connection->wait_to_send_initiator){ - log_debug("call avdtp_initiator_stream_config_subsm_run"); - connection->wait_to_send_initiator = 0; - avdtp_initiator_stream_config_subsm_run(connection); - } +/* START: tracking can send now requests per l2cap cid */ +static void avdtp_handle_can_send_now(uint16_t l2cap_cid) { - // re-register - bool more_to_send = connection->wait_to_send_acceptor || connection->wait_to_send_initiator; - log_debug("ask for more to send %d: acc-%d, ini-%d", more_to_send, connection->wait_to_send_acceptor, connection->wait_to_send_initiator); + log_debug("avdtp_packet_handler, L2CAP_EVENT_CAN_SEND_NOW l2cap_cid 0x%02x", l2cap_cid); - if (more_to_send){ - l2cap_request_can_send_now_event(l2cap_cid); - } + // get signaling connection for l2cap cid + avdtp_connection_t * connection = avdtp_get_connection_for_l2cap_signaling_cid(l2cap_cid); + + if (connection != NULL) { + if (connection->wait_to_send_acceptor) { + log_debug("call avdtp_acceptor_stream_config_subsm_run %p", connection); + connection->wait_to_send_acceptor = false; + avdtp_acceptor_stream_config_subsm_run(connection); + } else if (connection->wait_to_send_initiator) { + log_debug("call avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling %p", connection); + connection->wait_to_send_initiator = false; + avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(connection); + } + bool more_to_send = connection->wait_to_send_acceptor || connection->wait_to_send_initiator; + if (more_to_send){ + l2cap_request_can_send_now_event(l2cap_cid); + } + return; + } + + // get stream endpoint connection for l2cap cid + avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_for_l2cap_cid(l2cap_cid); + if (stream_endpoint != NULL) { + log_debug("call avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint %p", stream_endpoint); + if (stream_endpoint->request_can_send_now) { + stream_endpoint->request_can_send_now = 0; + avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(stream_endpoint); + } + bool more_to_send = stream_endpoint->request_can_send_now != 0; + if (more_to_send){ + l2cap_request_can_send_now_event(l2cap_cid); + } + } } -/* END: tracking can send now requests pro l2cap cid */ +/* END: tracking can send now requests per l2cap cid */ avdtp_stream_endpoint_t * avdtp_create_stream_endpoint(avdtp_sep_type_t sep_type, avdtp_media_type_t media_type){ @@ -576,7 +575,7 @@ static void avdtp_handle_sdp_query_failed(avdtp_connection_t * connection, uint8 case AVDTP_SIGNALING_CONNECTION_OPENED: // SDP query failed: try query that must be supported connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CAPABILITIES; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return; default: @@ -598,7 +597,7 @@ static void avdtp_handle_sdp_query_succeeded(avdtp_connection_t * connection){ } else { connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_ALL_CAPABILITIES; } - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); break; default: connection->state = AVDTP_SIGNALING_CONNECTION_W4_L2CAP_CONNECTED; @@ -975,13 +974,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet case L2CAP_EVENT_CAN_SEND_NOW: log_debug("avdtp_packet_handler, L2CAP_EVENT_CAN_SEND_NOW l2cap_cid 0x%02x", channel); - connection = avdtp_get_connection_for_l2cap_signaling_cid(channel); - if (!connection) { - stream_endpoint = avdtp_get_stream_endpoint_for_l2cap_cid(channel); - if (!stream_endpoint->connection) break; - connection = stream_endpoint->connection; - } - avdtp_handle_can_send_now(connection, channel); + avdtp_handle_can_send_now(channel); break; default: log_info("Unknown HCI event type %02x", hci_event_packet_get_type(packet)); @@ -1054,7 +1047,7 @@ uint8_t avdtp_open_stream(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote connection->initiator_local_seid = local_seid; stream_endpoint->initiator_config_state = AVDTP_INITIATOR_W2_OPEN_STREAM; stream_endpoint->state = AVDTP_STREAM_ENDPOINT_W2_REQUEST_OPEN_STREAM; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } @@ -1088,7 +1081,7 @@ uint8_t avdtp_start_stream(uint16_t avdtp_cid, uint8_t local_seid){ stream_endpoint->start_stream = 1; connection->initiator_local_seid = local_seid; connection->initiator_remote_seid = stream_endpoint->remote_sep.seid; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } @@ -1117,7 +1110,7 @@ uint8_t avdtp_stop_stream(uint16_t avdtp_cid, uint8_t local_seid){ stream_endpoint->close_stream = 1; connection->initiator_local_seid = local_seid; connection->initiator_remote_seid = stream_endpoint->remote_sep.seid; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } @@ -1146,7 +1139,7 @@ uint8_t avdtp_abort_stream(uint16_t avdtp_cid, uint8_t local_seid){ stream_endpoint->abort_stream = 1; connection->initiator_local_seid = local_seid; connection->initiator_remote_seid = stream_endpoint->remote_sep.seid; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } @@ -1174,7 +1167,7 @@ uint8_t avdtp_suspend_stream(uint16_t avdtp_cid, uint8_t local_seid){ stream_endpoint->suspend_stream = 1; connection->initiator_local_seid = local_seid; connection->initiator_remote_seid = stream_endpoint->remote_sep.seid; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } @@ -1191,7 +1184,7 @@ uint8_t avdtp_discover_stream_endpoints(uint16_t avdtp_cid){ connection->initiator_transaction_label= avdtp_get_next_transaction_label(); connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_DISCOVER_SEPS; - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } @@ -1209,7 +1202,7 @@ uint8_t avdtp_get_capabilities(uint16_t avdtp_cid, uint8_t remote_seid){ connection->initiator_transaction_label= avdtp_get_next_transaction_label(); connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CAPABILITIES; connection->initiator_remote_seid = remote_seid; - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } @@ -1240,7 +1233,7 @@ uint8_t avdtp_get_all_capabilities(uint16_t avdtp_cid, uint8_t remote_seid){ } else { connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_ALL_CAPABILITIES; } - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } } @@ -1258,7 +1251,7 @@ uint8_t avdtp_get_configuration(uint16_t avdtp_cid, uint8_t remote_seid){ connection->initiator_transaction_label= avdtp_get_next_transaction_label(); connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CONFIGURATION; connection->initiator_remote_seid = remote_seid; - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration){ @@ -1299,7 +1292,7 @@ uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t log_debug("SE %p, initiator_config_state: 0x%02x", stream_endpoint, stream_endpoint->initiator_config_state); - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration){ @@ -1331,7 +1324,7 @@ uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote stream_endpoint->remote_configuration_bitmap = configured_services_bitmap; stream_endpoint->remote_configuration = configuration; stream_endpoint->initiator_config_state = AVDTP_INITIATOR_W2_RECONFIGURE_STREAM_WITH_SEID; - return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + return avdtp_request_can_send_now_initiator(connection); } void avdtp_set_preferred_sampling_frequeny(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency){ diff --git a/src/classic/avdtp.h b/src/classic/avdtp.h index 3eb2dd7b5..82dfbab24 100644 --- a/src/classic/avdtp.h +++ b/src/classic/avdtp.h @@ -460,9 +460,9 @@ typedef struct { uint8_t initiator_transaction_label; uint8_t acceptor_transaction_label; - uint8_t wait_to_send_acceptor; - uint8_t wait_to_send_initiator; - + bool wait_to_send_acceptor; + bool wait_to_send_initiator; + uint8_t suspended_seids[AVDTP_MAX_NUM_SEPS]; uint8_t num_suspended_seids; @@ -560,8 +560,7 @@ btstack_linked_list_t * avdtp_get_connections(void); btstack_linked_list_t * avdtp_get_stream_endpoints(void); avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid); -avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint8_t seid); -avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_associated_with_acp_seid(uint16_t acp_seid); +avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint16_t seid); btstack_packet_handler_t avdtp_packet_handler_for_stream_endpoint(const avdtp_stream_endpoint_t *stream_endpoint); void avdtp_emit_sink_and_source(uint8_t * packet, uint16_t size); @@ -575,7 +574,6 @@ void avdtp_register_content_protection_category(avdtp_stream_endpoint_t * stream void avdtp_register_header_compression_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t back_ch, uint8_t media, uint8_t recovery); void avdtp_register_media_codec_category(avdtp_stream_endpoint_t * stream_endpoint, avdtp_media_type_t media_type, avdtp_media_codec_type_t media_codec_type, uint8_t * media_codec_info, uint16_t media_codec_info_len); void avdtp_register_multiplexing_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t fragmentation); -void avdtp_handle_can_send_now(avdtp_connection_t *connection, uint16_t l2cap_cid); // sink only void avdtp_register_media_handler(void (*callback)(uint8_t local_seid, uint8_t *packet, uint16_t size)); diff --git a/src/classic/avdtp_acceptor.c b/src/classic/avdtp_acceptor.c index 8623f4aae..a7d5ac630 100644 --- a/src/classic/avdtp_acceptor.c +++ b/src/classic/avdtp_acceptor.c @@ -151,7 +151,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t connection->error_code = BAD_LENGTH; connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_WITH_ERROR_CODE; connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier; - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; } @@ -161,7 +161,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t if (connection->state != AVDTP_SIGNALING_CONNECTION_OPENED) return; log_info("W2_ANSWER_DISCOVER_SEPS"); connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_ANSWER_DISCOVER_SEPS; - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; case AVDTP_SI_GET_CAPABILITIES: case AVDTP_SI_GET_ALL_CAPABILITIES: @@ -188,7 +188,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE; } connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier; - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; } break; @@ -211,7 +211,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t connection->reject_service_category = connection->acceptor_local_seid; connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE; connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier; - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; } // deal with first susspended seid @@ -224,7 +224,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE; connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier; connection->num_suspended_seids = 0; - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; } break; @@ -233,7 +233,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_GENERAL_REJECT_WITH_ERROR_CODE; connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier; log_info("AVDTP_CMD_MSG signal %d not implemented, general reject", connection->acceptor_signaling_packet.signal_identifier); - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); return; } @@ -425,7 +425,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t if (!request_to_send){ log_info("NOT IMPLEMENTED"); } - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); } static int avdtp_acceptor_send_seps_response(uint16_t cid, uint8_t transaction_label, avdtp_stream_endpoint_t * endpoints){ @@ -654,6 +654,6 @@ void avdtp_acceptor_stream_config_subsm_run(avdtp_connection_t *connection) { } // check fragmentation if ((connection->acceptor_signaling_packet.packet_type != AVDTP_SINGLE_PACKET) && (connection->acceptor_signaling_packet.packet_type != AVDTP_END_PACKET)){ - avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_acceptor(connection); } } diff --git a/src/classic/avdtp_initiator.c b/src/classic/avdtp_initiator.c index 0cee72ff3..a66770b73 100644 --- a/src/classic/avdtp_initiator.c +++ b/src/classic/avdtp_initiator.c @@ -82,20 +82,13 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t if (connection->initiator_connection_state == AVDTP_SIGNALING_CONNECTION_INITIATOR_W4_ANSWER) { connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_IDLE; } else { - stream_endpoint = avdtp_get_stream_endpoint_associated_with_acp_seid(connection->initiator_remote_seid); - if (stream_endpoint == NULL){ - stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid); - if (stream_endpoint == NULL){ - log_debug("no stream endpoint for local %u, remote %u", connection->initiator_local_seid, connection->initiator_remote_seid); - return; - } else { - log_debug("Using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid); - } - } else { - log_debug("Using stream endpoint %p for remote seid %u", stream_endpoint, connection->initiator_remote_seid); + stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid); + if (stream_endpoint == NULL) { + log_debug("no stream endpoint for local seid %u", connection->initiator_local_seid); + return; } + log_debug("using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid); - log_debug("SE %p, initiator_connection_state: 0x%02x, initiator_config_state: 0x%02x", stream_endpoint, connection->initiator_connection_state, stream_endpoint->initiator_config_state); sep.seid = connection->initiator_remote_seid; if (stream_endpoint->initiator_config_state != AVDTP_INITIATOR_W4_ANSWER) { @@ -386,7 +379,7 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t } l2cap_send_prepared(connection->l2cap_signaling_cid, pos); if (stream_endpoint->initiator_config_state == AVDTP_INITIATOR_FRAGMENTATED_COMMAND){ - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); } return true; } @@ -402,7 +395,7 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t } l2cap_send_prepared(connection->l2cap_signaling_cid, pos); if (stream_endpoint->initiator_config_state == AVDTP_INITIATOR_FRAGMENTATED_COMMAND){ - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); } return true; } @@ -424,25 +417,15 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t return false; } -void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection) { +void avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(avdtp_connection_t *connection) { bool sent; sent = avdtp_initiator_stream_config_subsm_run_signaling(connection); if (sent) return; - avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_associated_with_acp_seid(connection->initiator_remote_seid); - if (stream_endpoint == NULL){ - stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid); - if (stream_endpoint == NULL){ - log_debug("no stream endpoint for local %u, remote %u", connection->initiator_local_seid, connection->initiator_remote_seid); - return; - } else { - log_debug("Using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid); - } - } else { - log_debug("Using stream endpoint %p for remote seid %u", stream_endpoint, connection->initiator_remote_seid); - } + avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_for_seid(connection->initiator_local_seid); + if (stream_endpoint == NULL) return; sent = avdtp_initiator_stream_config_subsm_run_endpoint(connection, stream_endpoint); if (sent) return; @@ -507,12 +490,11 @@ void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection) { } } - if (stream_endpoint->request_can_send_now){ - stream_endpoint->request_can_send_now = 0; - if (stream_endpoint->state == AVDTP_STREAM_ENDPOINT_STREAMING){ - stream_endpoint->state = AVDTP_STREAM_ENDPOINT_STREAMING; - avdtp_streaming_emit_can_send_media_packet_now(stream_endpoint, stream_endpoint->sequence_number); - return; - } - } +} + +void avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint) { + if (stream_endpoint->state == AVDTP_STREAM_ENDPOINT_STREAMING){ + stream_endpoint->state = AVDTP_STREAM_ENDPOINT_STREAMING; + avdtp_streaming_emit_can_send_media_packet_now(stream_endpoint, stream_endpoint->sequence_number); + } } diff --git a/src/classic/avdtp_initiator.h b/src/classic/avdtp_initiator.h index 0f1fa93a7..3f24142d5 100644 --- a/src/classic/avdtp_initiator.h +++ b/src/classic/avdtp_initiator.h @@ -53,7 +53,8 @@ extern "C" { #endif void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t *packet, uint16_t size, int offset); -void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection); +void avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(avdtp_connection_t *connection); +void avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(avdtp_stream_endpoint_t *stream_endpoint); #if defined __cplusplus } diff --git a/src/classic/avdtp_sink.c b/src/classic/avdtp_sink.c index 92122dc7e..18b0d1123 100644 --- a/src/classic/avdtp_sink.c +++ b/src/classic/avdtp_sink.c @@ -196,7 +196,7 @@ uint8_t avdtp_sink_delay_report(uint16_t avdtp_cid, uint8_t local_seid, uint16_t connection->delay_ms = delay_100us; connection->initiator_local_seid = local_seid; connection->initiator_remote_seid = stream_endpoint->remote_sep.seid; - avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid); + avdtp_request_can_send_now_initiator(connection); return ERROR_CODE_SUCCESS; } diff --git a/src/classic/avdtp_source.c b/src/classic/avdtp_source.c index dac1511bd..384a49b1b 100644 --- a/src/classic/avdtp_source.c +++ b/src/classic/avdtp_source.c @@ -244,7 +244,7 @@ void avdtp_source_stream_endpoint_request_can_send_now(uint16_t avdtp_cid, uint8 return; } stream_endpoint->request_can_send_now = true; - avdtp_request_can_send_now_initiator(stream_endpoint->connection, stream_endpoint->l2cap_media_cid); + l2cap_request_can_send_now_event(stream_endpoint->l2cap_media_cid); } int avdtp_max_media_payload_size(uint16_t avdtp_cid, uint8_t local_seid){ diff --git a/src/classic/avdtp_util.c b/src/classic/avdtp_util.c index 5e078c685..bb80ea09e 100644 --- a/src/classic/avdtp_util.c +++ b/src/classic/avdtp_util.c @@ -998,17 +998,17 @@ void avdtp_streaming_emit_can_send_media_packet_now(avdtp_stream_endpoint_t *str (*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event)); } -uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid){ +uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t *connection) { if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; - connection->wait_to_send_acceptor = 1; - l2cap_request_can_send_now_event(l2cap_cid); + connection->wait_to_send_acceptor = true; + l2cap_request_can_send_now_event(connection->l2cap_signaling_cid); return ERROR_CODE_SUCCESS; } -uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid){ +uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t *connection) { if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER; - connection->wait_to_send_initiator = 1; - l2cap_request_can_send_now_event(l2cap_cid); + connection->wait_to_send_initiator = true; + l2cap_request_can_send_now_event(connection->l2cap_signaling_cid); return ERROR_CODE_SUCCESS; } diff --git a/src/classic/avdtp_util.h b/src/classic/avdtp_util.h index 08ef3a8b6..2ac98ccc9 100644 --- a/src/classic/avdtp_util.h +++ b/src/classic/avdtp_util.h @@ -107,9 +107,9 @@ void avdtp_streaming_emit_connection_released(avdtp_stream_endpoint_t *stream_en void avdtp_streaming_emit_can_send_media_packet_now(avdtp_stream_endpoint_t *stream_endpoint, uint16_t sequence_number); -uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid); +uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t *connection); -uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid); +uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t *connection); void avdtp_reset_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint);