@@ -53,6 +53,8 @@ static coap_duplication_info_s *sn_coap_protocol_linked_list_duplication_info_se
5353static void sn_coap_protocol_linked_list_duplication_info_remove_old_ones (struct coap_s * handle );
5454static void sn_coap_protocol_duplication_info_free (struct coap_s * handle , coap_duplication_info_s * duplication_info_ptr );
5555static bool sn_coap_protocol_update_duplicate_package_data (const struct coap_s * handle , const sn_nsdl_addr_s * dst_addr_ptr , const sn_coap_hdr_s * coap_msg_ptr , const int16_t data_size , const uint8_t * dst_packet_data_ptr );
56+ static bool sn_coap_protocol_update_duplicate_package_data_all (const struct coap_s * handle , const sn_nsdl_addr_s * dst_addr_ptr , const sn_coap_hdr_s * coap_msg_ptr , const int16_t data_size , const uint8_t * dst_packet_data_ptr );
57+
5658#endif
5759
5860#if SN_COAP_BLOCKWISE_ENABLED || SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE /* If Message blockwising is not enabled, this part of code will not be compiled */
@@ -690,6 +692,8 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src
690692 tr_debug ("sn_coap_protocol_parse - send ack for duplicate message" );
691693 handle -> sn_coap_tx_callback (response -> packet_ptr ,
692694 response -> packet_len , response -> address , response -> param );
695+ } else {
696+ tr_error ("sn_coap_protocol_parse - response not yet build" );
693697 }
694698 }
695699
@@ -2235,6 +2239,20 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
22352239 }
22362240
22372241 sn_coap_builder_2 (dst_ack_packet_data_ptr , src_coap_blockwise_ack_msg_ptr , handle -> sn_coap_block_data_size );
2242+
2243+ #if SN_COAP_DUPLICATION_MAX_MSGS_COUNT
2244+ // copy coap data buffer to duplicate list for resending purposes
2245+ if (!sn_coap_protocol_update_duplicate_package_data_all (handle ,
2246+ src_addr_ptr ,
2247+ src_coap_blockwise_ack_msg_ptr ,
2248+ dst_packed_data_needed_mem ,
2249+ dst_ack_packet_data_ptr )) {
2250+ sn_coap_parser_release_allocated_coap_msg_mem (handle , src_coap_blockwise_ack_msg_ptr );
2251+ handle -> sn_coap_protocol_free (dst_ack_packet_data_ptr );
2252+ return NULL ;
2253+ }
2254+ #endif
2255+
22382256 handle -> sn_coap_tx_callback (dst_ack_packet_data_ptr , dst_packed_data_needed_mem , src_addr_ptr , param );
22392257
22402258 handle -> sn_coap_protocol_free (dst_ack_packet_data_ptr );
@@ -2434,27 +2452,38 @@ static sn_coap_hdr_s *sn_coap_protocol_copy_header(struct coap_s *handle, const
24342452
24352453#if SN_COAP_DUPLICATION_MAX_MSGS_COUNT
24362454static bool sn_coap_protocol_update_duplicate_package_data (const struct coap_s * handle ,
2437- const sn_nsdl_addr_s * dst_addr_ptr ,
2438- const sn_coap_hdr_s * coap_msg_ptr ,
2439- const int16_t data_size ,
2440- const uint8_t * dst_packet_data_ptr )
2455+ const sn_nsdl_addr_s * dst_addr_ptr ,
2456+ const sn_coap_hdr_s * coap_msg_ptr ,
2457+ const int16_t data_size ,
2458+ const uint8_t * dst_packet_data_ptr )
24412459{
24422460 if (coap_msg_ptr -> msg_type == COAP_MSG_TYPE_ACKNOWLEDGEMENT &&
24432461 handle -> sn_coap_duplication_buffer_size != 0 ) {
2444- coap_duplication_info_s * info = sn_coap_protocol_linked_list_duplication_info_search (handle ,
2445- dst_addr_ptr ,
2446- coap_msg_ptr -> msg_id );
2447-
2448- /* Update package data to duplication info struct if it's not there yet */
2449- if (info && info -> packet_ptr == NULL ) {
2450- info -> packet_ptr = handle -> sn_coap_protocol_malloc (data_size );
2451- if (info -> packet_ptr ) {
2452- memcpy (info -> packet_ptr , dst_packet_data_ptr , data_size );
2453- info -> packet_len = data_size ;
2454- } else {
2455- tr_error ("sn_coap_protocol_update_duplication_package_data - failed to allocate duplication info!" );
2456- return false;
2457- }
2462+ return sn_coap_protocol_update_duplicate_package_data_all (handle , dst_addr_ptr , coap_msg_ptr , data_size , dst_packet_data_ptr );
2463+ }
2464+ return true;
2465+ }
2466+
2467+ static bool sn_coap_protocol_update_duplicate_package_data_all (const struct coap_s * handle ,
2468+ const sn_nsdl_addr_s * dst_addr_ptr ,
2469+ const sn_coap_hdr_s * coap_msg_ptr ,
2470+ const int16_t data_size ,
2471+ const uint8_t * dst_packet_data_ptr )
2472+ {
2473+ coap_duplication_info_s * info = sn_coap_protocol_linked_list_duplication_info_search (handle ,
2474+ dst_addr_ptr ,
2475+ coap_msg_ptr -> msg_id );
2476+
2477+ /* Update package data to duplication info struct if it's not there yet */
2478+ if (info && info -> packet_ptr == NULL ) {
2479+ info -> packet_ptr = handle -> sn_coap_protocol_malloc (data_size );
2480+ if (info -> packet_ptr ) {
2481+ tr_debug ("sn_coap_protocol_update_duplication_package_data - added to duplicate list!" );
2482+ memcpy (info -> packet_ptr , dst_packet_data_ptr , data_size );
2483+ info -> packet_len = data_size ;
2484+ } else {
2485+ tr_error ("sn_coap_protocol_update_duplication_package_data - failed to allocate duplication info!" );
2486+ return false;
24582487 }
24592488 }
24602489 return true;
0 commit comments