@@ -474,7 +474,6 @@ int16_t sn_coap_protocol_build(struct coap_s *handle, sn_nsdl_addr_s *dst_addr_p
474
474
memcpy (stored_blockwise_msg_ptr -> coap_msg_ptr -> payload_ptr , src_coap_msg_ptr -> payload_ptr , stored_blockwise_msg_ptr -> coap_msg_ptr -> payload_len );
475
475
476
476
stored_blockwise_msg_ptr -> coap = handle ;
477
-
478
477
ns_list_add_to_end (& handle -> linked_list_blockwise_sent_msgs , stored_blockwise_msg_ptr );
479
478
}
480
479
@@ -499,7 +498,6 @@ int16_t sn_coap_protocol_build(struct coap_s *handle, sn_nsdl_addr_s *dst_addr_p
499
498
}
500
499
501
500
stored_blockwise_msg_ptr -> coap = handle ;
502
-
503
501
ns_list_add_to_end (& handle -> linked_list_blockwise_sent_msgs , stored_blockwise_msg_ptr );
504
502
}
505
503
@@ -641,11 +639,19 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src
641
639
break ;
642
640
}
643
641
}
644
-
642
+ /* Remove from the list if not an notification message.
643
+ * Initial notification message is needed for sending rest of the blocks (GET request).
644
+ */
645
+ bool remove_from_the_list = true;
645
646
if (stored_blockwise_msg_temp_ptr ) {
646
- tr_debug ("sn_coap_protocol_parse - remove block message %d" , stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> msg_id );
647
+ if (stored_blockwise_msg_temp_ptr -> coap_msg_ptr &&
648
+ stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> options_list_ptr &&
649
+ stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> options_list_ptr -> observe != COAP_OBSERVE_NONE ) {
650
+ remove_from_the_list = false;
651
+ }
652
+ }
653
+ if (remove_from_the_list ) {
647
654
ns_list_remove (& handle -> linked_list_blockwise_sent_msgs , stored_blockwise_msg_temp_ptr );
648
-
649
655
if (stored_blockwise_msg_temp_ptr -> coap_msg_ptr ) {
650
656
if (stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> payload_ptr ){
651
657
handle -> sn_coap_protocol_free (stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> payload_ptr );
@@ -733,6 +739,10 @@ int8_t sn_coap_protocol_exec(struct coap_s *handle, uint32_t current_time)
733
739
uint16_t temp_msg_id = (stored_msg_ptr -> send_msg_ptr -> packet_ptr [2 ] << 8 );
734
740
temp_msg_id += (uint16_t )stored_msg_ptr -> send_msg_ptr -> packet_ptr [3 ];
735
741
742
+ /* Remove message from Linked list */
743
+ ns_list_remove (& handle -> linked_list_resent_msgs , stored_msg_ptr );
744
+ -- handle -> count_resent_msgs ;
745
+
736
746
/* If RX callback have been defined.. */
737
747
if (stored_msg_ptr -> coap -> sn_coap_rx_callback != 0 ) {
738
748
sn_coap_hdr_s * tmp_coap_hdr_ptr ;
@@ -747,8 +757,9 @@ int8_t sn_coap_protocol_exec(struct coap_s *handle, uint32_t current_time)
747
757
sn_coap_parser_release_allocated_coap_msg_mem (stored_msg_ptr -> coap , tmp_coap_hdr_ptr );
748
758
}
749
759
}
750
- /* Remove message from Linked list */
751
- sn_coap_protocol_linked_list_send_msg_remove (handle , stored_msg_ptr -> send_msg_ptr -> dst_addr_ptr , temp_msg_id );
760
+
761
+ /* Free memory of stored message */
762
+ sn_coap_protocol_release_allocated_send_msg_mem (handle , stored_msg_ptr );
752
763
} else {
753
764
/* Send message */
754
765
stored_msg_ptr -> coap -> sn_coap_tx_callback (stored_msg_ptr -> send_msg_ptr -> packet_ptr ,
@@ -1801,7 +1812,6 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
1801
1812
1802
1813
stored_blockwise_msg_ptr -> coap_msg_ptr = src_coap_blockwise_ack_msg_ptr ;
1803
1814
stored_blockwise_msg_ptr -> coap = handle ;
1804
-
1805
1815
ns_list_add_to_end (& handle -> linked_list_blockwise_sent_msgs , stored_blockwise_msg_ptr );
1806
1816
1807
1817
/* * * Then release memory of CoAP Acknowledgement message * * */
@@ -1903,6 +1913,21 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
1903
1913
src_coap_blockwise_ack_msg_ptr -> payload_ptr = stored_blockwise_msg_temp_ptr -> coap_msg_ptr -> payload_ptr + (block_size * block_number );
1904
1914
}
1905
1915
1916
+ /* Update token to match one which is in GET request.
1917
+ * This is needed only in case of notification message.
1918
+ */
1919
+ if (src_coap_blockwise_ack_msg_ptr -> options_list_ptr &&
1920
+ src_coap_blockwise_ack_msg_ptr -> options_list_ptr -> observe != COAP_OBSERVE_NONE ) {
1921
+ if (received_coap_msg_ptr -> token_len && src_coap_blockwise_ack_msg_ptr -> token_ptr ) {
1922
+ handle -> sn_coap_protocol_free (src_coap_blockwise_ack_msg_ptr -> token_ptr );
1923
+ src_coap_blockwise_ack_msg_ptr -> token_ptr = handle -> sn_coap_protocol_malloc (received_coap_msg_ptr -> token_len );
1924
+ if (src_coap_blockwise_ack_msg_ptr -> token_ptr ) {
1925
+ memcpy (src_coap_blockwise_ack_msg_ptr -> token_ptr , received_coap_msg_ptr -> token_ptr , received_coap_msg_ptr -> token_len );
1926
+ src_coap_blockwise_ack_msg_ptr -> token_len = received_coap_msg_ptr -> token_len ;
1927
+ }
1928
+ }
1929
+ }
1930
+
1906
1931
/* Build and send block message */
1907
1932
dst_packed_data_needed_mem = sn_coap_builder_calc_needed_packet_data_size_2 (src_coap_blockwise_ack_msg_ptr , handle -> sn_coap_block_data_size );
1908
1933
0 commit comments