From 82bb0e22403a46f7517ab3b6554d55d8745464eb Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Fri, 21 Jul 2017 17:13:55 +0200 Subject: [PATCH] l2cap-ertm: prepare for segmentation --- src/l2cap.c | 14 +++++++++++--- src/l2cap.h | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/l2cap.c b/src/l2cap.c index 01483e766..f47056844 100644 --- a/src/l2cap.c +++ b/src/l2cap.c @@ -618,7 +618,7 @@ static int l2cap_ertm_send_information_frame(l2cap_channel_t * channel, int inde l2cap_ertm_tx_packet_state_t * tx_state = &channel->tx_packets_state[index]; hci_reserve_packet_buffer(); uint8_t *acl_buffer = hci_get_outgoing_packet_buffer(); - uint16_t control = l2cap_encanced_control_field_for_information_frame(tx_state->tx_seq, final, channel->req_seq, L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU); + uint16_t control = l2cap_encanced_control_field_for_information_frame(tx_state->tx_seq, final, channel->req_seq, tx_state->sar); log_info("I-Frame: control 0x%04x", control); little_endian_store_16(acl_buffer, 8, control); memcpy(&acl_buffer[8+2], &channel->tx_packets_data[index * channel->local_mtu], tx_state->len); @@ -630,22 +630,30 @@ static int l2cap_ertm_send(l2cap_channel_t * channel, uint8_t * data, uint16_t l log_error("l2cap_send cid 0x%02x, data length exceeds remote MTU.", channel->local_cid); return L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU; } - // TODO: check tx_transmit + // TODO: fragment if neccessary + // store int tx packet bufferx int index = channel->tx_write_index; + l2cap_ertm_tx_packet_state_t * tx_state = &channel->tx_packets_state[index]; tx_state->tx_seq = channel->next_tx_seq; tx_state->len = len; + tx_state->sar = L2CAP_SEGMENTATION_AND_REASSEMBLY_UNSEGMENTED_L2CAP_SDU; tx_state->retry_count = 0; - memcpy(&channel->tx_packets_data[index * channel->local_mtu], data, len); + + uint8_t * tx_packet = &channel->tx_packets_data[index * channel->local_mtu]; + memcpy(&tx_packet[0], data, len); + // update channel->next_tx_seq = l2cap_next_ertm_seq_nr(channel->next_tx_seq); l2cap_ertm_next_tx_write_index(channel); + // set retransmission timer btstack_run_loop_set_timer_handler(&tx_state->retransmission_timer, &l2cap_ertm_retransmission_timeout_callback); btstack_run_loop_set_timer_context(&tx_state->retransmission_timer, channel); btstack_run_loop_set_timer(&tx_state->retransmission_timer, channel->local_retransmission_timeout_ms); btstack_run_loop_add_timer(&tx_state->retransmission_timer); + // try to send l2cap_run(); return 0; diff --git a/src/l2cap.h b/src/l2cap.h index 0c634da2b..84f1996d3 100644 --- a/src/l2cap.h +++ b/src/l2cap.h @@ -124,6 +124,7 @@ typedef struct { typedef struct { btstack_timer_source_t retransmission_timer; btstack_timer_source_t monitor_timer; + l2cap_segmentation_and_reassembly_t sar; uint16_t len; uint8_t tx_seq; uint8_t retry_count;