mesh: free chunks correctly, trigger segmented pdu resend

This commit is contained in:
Matthias Ringwald 2020-05-13 17:43:44 +02:00
parent 972841451c
commit 6dac9d64fd
2 changed files with 5 additions and 11 deletions

View File

@ -425,6 +425,7 @@ uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){
case MESH_PDU_TYPE_NETWORK: case MESH_PDU_TYPE_NETWORK:
return mesh_network_dst((mesh_network_pdu_t *) pdu); return mesh_network_dst((mesh_network_pdu_t *) pdu);
case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS: case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS:
case MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS:
return ((mesh_upper_transport_pdu_t *) pdu)->dst; return ((mesh_upper_transport_pdu_t *) pdu)->dst;
default: default:
btstack_assert(false); btstack_assert(false);

View File

@ -114,13 +114,6 @@ void mesh_segmented_pdu_free(mesh_segmented_pdu_t * message_pdu){
// INCOMING // // INCOMING //
static void mesh_lower_transport_incoming_report_segments_as_processed(mesh_segmented_pdu_t * message_pdu) {
while (message_pdu->segments){
mesh_network_pdu_t * segment = (mesh_network_pdu_t *) btstack_linked_list_pop(&message_pdu->segments);
mesh_network_message_processed_by_higher_layer(segment);
}
}
static void mesh_lower_transport_incoming_deliver_to_higher_layer(void){ static void mesh_lower_transport_incoming_deliver_to_higher_layer(void){
if (mesh_lower_transport_higher_layer_pdu == NULL && !btstack_linked_list_empty(&mesh_lower_transport_queued_for_higher_layer)){ if (mesh_lower_transport_higher_layer_pdu == NULL && !btstack_linked_list_empty(&mesh_lower_transport_queued_for_higher_layer)){
mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_pop(&mesh_lower_transport_queued_for_higher_layer); mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_pop(&mesh_lower_transport_queued_for_higher_layer);
@ -245,10 +238,8 @@ static void mesh_lower_transport_incoming_incomplete_timeout(btstack_timer_sourc
printf("mesh_lower_transport_incoming_incomplete_timeout for %p - give up\n", segmented_pdu); printf("mesh_lower_transport_incoming_incomplete_timeout for %p - give up\n", segmented_pdu);
#endif #endif
mesh_lower_transport_incoming_segmented_message_complete(segmented_pdu); mesh_lower_transport_incoming_segmented_message_complete(segmented_pdu);
// free segments
mesh_lower_transport_incoming_report_segments_as_processed(segmented_pdu);
// free message // free message
btstack_memory_mesh_segmented_pdu_free(segmented_pdu); mesh_segmented_pdu_free(segmented_pdu);
} }
static void mesh_lower_transport_incoming_start_acknowledgment_timer(mesh_segmented_pdu_t * segmented_pdu, uint32_t timeout){ static void mesh_lower_transport_incoming_start_acknowledgment_timer(mesh_segmented_pdu_t * segmented_pdu, uint32_t timeout){
@ -458,7 +449,6 @@ void mesh_lower_transport_message_processed_by_higher_layer(mesh_pdu_t * pdu){
switch (pdu->pdu_type){ switch (pdu->pdu_type){
case MESH_PDU_TYPE_SEGMENTED: case MESH_PDU_TYPE_SEGMENTED:
// free segments // free segments
mesh_lower_transport_incoming_report_segments_as_processed((mesh_segmented_pdu_t *) pdu);
mesh_segmented_pdu_free((mesh_segmented_pdu_t *) pdu); mesh_segmented_pdu_free((mesh_segmented_pdu_t *) pdu);
break; break;
case MESH_PDU_TYPE_UNSEGMENTED: case MESH_PDU_TYPE_UNSEGMENTED:
@ -748,6 +738,9 @@ static void mesh_lower_transport_outgoing_segment_transmission_fired(mesh_segmen
// re-queue message for sending remaining segments // re-queue message for sending remaining segments
btstack_linked_list_remove(&lower_transport_outgoing_waiting, (btstack_linked_item_t *) segmented_pdu); btstack_linked_list_remove(&lower_transport_outgoing_waiting, (btstack_linked_item_t *) segmented_pdu);
btstack_linked_list_add_tail(&lower_transport_outgoing_ready, (btstack_linked_item_t *) segmented_pdu); btstack_linked_list_add_tail(&lower_transport_outgoing_ready, (btstack_linked_item_t *) segmented_pdu);
// continue
mesh_lower_transport_run();
} }
static void mesh_lower_transport_outgoing_segment_transmission_timeout(btstack_timer_source_t * ts){ static void mesh_lower_transport_outgoing_segment_transmission_timeout(btstack_timer_source_t * ts){