diff --git a/src/mesh/mesh_access.c b/src/mesh/mesh_access.c index 27d8c6b12..35db6c1c2 100644 --- a/src/mesh/mesh_access.c +++ b/src/mesh/mesh_access.c @@ -425,6 +425,7 @@ uint16_t mesh_pdu_dst(mesh_pdu_t * pdu){ case MESH_PDU_TYPE_NETWORK: return mesh_network_dst((mesh_network_pdu_t *) pdu); case MESH_PDU_TYPE_UPPER_UNSEGMENTED_ACCESS: + case MESH_PDU_TYPE_UPPER_SEGMENTED_ACCESS: return ((mesh_upper_transport_pdu_t *) pdu)->dst; default: btstack_assert(false); diff --git a/src/mesh/mesh_lower_transport.c b/src/mesh/mesh_lower_transport.c index 04b4b3576..50f7e5381 100644 --- a/src/mesh/mesh_lower_transport.c +++ b/src/mesh/mesh_lower_transport.c @@ -114,13 +114,6 @@ void mesh_segmented_pdu_free(mesh_segmented_pdu_t * message_pdu){ // 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){ 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); @@ -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); #endif mesh_lower_transport_incoming_segmented_message_complete(segmented_pdu); - // free segments - mesh_lower_transport_incoming_report_segments_as_processed(segmented_pdu); // 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){ @@ -458,7 +449,6 @@ void mesh_lower_transport_message_processed_by_higher_layer(mesh_pdu_t * pdu){ switch (pdu->pdu_type){ case MESH_PDU_TYPE_SEGMENTED: // free segments - mesh_lower_transport_incoming_report_segments_as_processed((mesh_segmented_pdu_t *) pdu); mesh_segmented_pdu_free((mesh_segmented_pdu_t *) pdu); break; 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 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); + + // continue + mesh_lower_transport_run(); } static void mesh_lower_transport_outgoing_segment_transmission_timeout(btstack_timer_source_t * ts){