mesh: set retry count for segmented messages in mesh_lower_transport_send_dpu

This commit is contained in:
Matthias Ringwald 2020-03-31 14:28:10 +02:00
parent 79eb95b0a5
commit b4977f3541

View File

@ -62,9 +62,12 @@ static void mesh_lower_transport_segment_transmission_timeout(btstack_timer_sour
// lower transport outgoing state // lower transport outgoing state
// queue mesh_segmented_pdu_t or mesh_network_pdu_t // queued mesh_segmented_pdu_t or mesh_network_pdu_t
static btstack_linked_list_t lower_transport_outgoing_ready; static btstack_linked_list_t lower_transport_outgoing_ready;
// mesh_segmented_pdu_t to unicast address, segment transmission timer is active
static btstack_linked_list_t lower_transport_outgoing_waiting;
// active outgoing segmented message // active outgoing segmented message
static mesh_segmented_pdu_t * lower_transport_outgoing_message; static mesh_segmented_pdu_t * lower_transport_outgoing_message;
static uint16_t lower_transport_outgoing_seg_o; static uint16_t lower_transport_outgoing_seg_o;
@ -735,23 +738,31 @@ static void mesh_lower_transport_send_next_segment(void){
lower_transport_outgoing_seg_o = 0; lower_transport_outgoing_seg_o = 0;
// done for unicast, ack timer already set, too // done for unicast, ack timer already set, too
if (mesh_network_address_unicast(lower_transport_outgoing_message->dst)) return; if (mesh_network_address_unicast(lower_transport_outgoing_message->dst)) {
// btstack_linked_list_add(&lower_transport_outgoing_waiting, (btstack_linked_item_t *) lower_transport_outgoing_message);
// lower_transport_outgoing_message = NULL;
return;
}
// done, more? // done for group/virtual, no more retries?
if (lower_transport_outgoing_message->retry_count == 0){ if (lower_transport_outgoing_message->retry_count == 0){
#ifdef LOG_LOWER_TRANSPORT #ifdef LOG_LOWER_TRANSPORT
printf("[+] Lower Transport, message unacknowledged -> free\n"); printf("[+] Lower Transport, message unacknowledged -> free\n");
#endif #endif
// notify upper transport // notify upper transport, sets lower_transport_outgoing_message = NULL
mesh_lower_transport_outgoing_complete(); mesh_lower_transport_outgoing_complete();
return; return;
} }
// start retry // re-queue mssage;
#ifdef LOG_LOWER_TRANSPORT #ifdef LOG_LOWER_TRANSPORT
printf("[+] Lower Transport, message unacknowledged retry count %u\n", lower_transport_outgoing_message->retry_count); printf("[+] Lower Transport, message unacknowledged retry count %u\n", lower_transport_outgoing_message->retry_count);
#endif #endif
lower_transport_outgoing_message->retry_count--; lower_transport_outgoing_message->retry_count--;
// btstack_linked_list_add(&lower_transport_outgoing_ready, (btstack_linked_item_t *) lower_transport_outgoing_message);
// lower_transport_outgoing_message = NULL;
// mesh_lower_transport_run();
// return;
} }
// restart segment transmission timer for unicast dst // restart segment transmission timer for unicast dst
@ -860,6 +871,7 @@ static void mesh_lower_transport_setup_block_ack(mesh_segmented_pdu_t *message_p
void mesh_lower_transport_send_pdu(mesh_pdu_t *pdu){ void mesh_lower_transport_send_pdu(mesh_pdu_t *pdu){
mesh_network_pdu_t * network_pdu; mesh_network_pdu_t * network_pdu;
mesh_segmented_pdu_t * segmented_pdu;
switch (pdu->pdu_type){ switch (pdu->pdu_type){
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS: case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS:
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL: case MESH_PDU_TYPE_UPPER_UNSEGMENTED_CONTROL:
@ -867,6 +879,8 @@ void mesh_lower_transport_send_pdu(mesh_pdu_t *pdu){
btstack_assert(network_pdu->len >= 9); btstack_assert(network_pdu->len >= 9);
break; break;
case MESH_PDU_TYPE_SEGMENTED: case MESH_PDU_TYPE_SEGMENTED:
segmented_pdu = (mesh_segmented_pdu_t *) pdu;
segmented_pdu->retry_count = 3;
break; break;
default: default:
btstack_assert(false); btstack_assert(false);
@ -916,7 +930,6 @@ static void mesh_lower_transport_run(void){
message_pdu->seq); message_pdu->seq);
// start sending segmented pdu // start sending segmented pdu
lower_transport_outgoing_message = message_pdu; lower_transport_outgoing_message = message_pdu;
lower_transport_outgoing_message->retry_count = 3;
lower_transport_outgoing_transmission_timeout = false; lower_transport_outgoing_transmission_timeout = false;
lower_transport_outgoing_transmission_complete = false; lower_transport_outgoing_transmission_complete = false;
mesh_lower_transport_setup_block_ack(message_pdu); mesh_lower_transport_setup_block_ack(message_pdu);