@@ -53,6 +53,8 @@ static coap_duplication_info_s *sn_coap_protocol_linked_list_duplication_info_se
53
53
static void sn_coap_protocol_linked_list_duplication_info_remove_old_ones (struct coap_s * handle );
54
54
static void sn_coap_protocol_duplication_info_free (struct coap_s * handle , coap_duplication_info_s * duplication_info_ptr );
55
55
static 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
+
56
58
#endif
57
59
58
60
#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
690
692
tr_debug ("sn_coap_protocol_parse - send ack for duplicate message" );
691
693
handle -> sn_coap_tx_callback (response -> packet_ptr ,
692
694
response -> packet_len , response -> address , response -> param );
695
+ } else {
696
+ tr_error ("sn_coap_protocol_parse - response not yet build" );
693
697
}
694
698
}
695
699
@@ -2235,6 +2239,20 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
2235
2239
}
2236
2240
2237
2241
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
+
2238
2256
handle -> sn_coap_tx_callback (dst_ack_packet_data_ptr , dst_packed_data_needed_mem , src_addr_ptr , param );
2239
2257
2240
2258
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
2434
2452
2435
2453
#if SN_COAP_DUPLICATION_MAX_MSGS_COUNT
2436
2454
static 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 )
2441
2459
{
2442
2460
if (coap_msg_ptr -> msg_type == COAP_MSG_TYPE_ACKNOWLEDGEMENT &&
2443
2461
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;
2458
2487
}
2459
2488
}
2460
2489
return true;
0 commit comments