@@ -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
@@ -759,6 +763,14 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src
759
763
goto cleanup ;
760
764
}
761
765
766
+ #if SN_COAP_DUPLICATION_MAX_MSGS_COUNT
767
+ // copy data buffer to duplicate list for resending purposes
768
+ if (!sn_coap_protocol_update_duplicate_package_data (handle , src_addr_ptr , resp , packet_data_size , packet_data_ptr )) {
769
+ tr_error ("sn_coap_protocol_parse - failed to update duplicate info!" );
770
+ goto cleanup ;
771
+ }
772
+ #endif
773
+
762
774
sn_coap_parser_release_allocated_coap_msg_mem (handle , resp );
763
775
764
776
handle -> sn_coap_tx_callback (packet_data_ptr , packet_data_size , src_addr_ptr , param );
@@ -2227,6 +2239,20 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
2227
2239
}
2228
2240
2229
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
+
2230
2256
handle -> sn_coap_tx_callback (dst_ack_packet_data_ptr , dst_packed_data_needed_mem , src_addr_ptr , param );
2231
2257
2232
2258
handle -> sn_coap_protocol_free (dst_ack_packet_data_ptr );
@@ -2426,27 +2452,38 @@ static sn_coap_hdr_s *sn_coap_protocol_copy_header(struct coap_s *handle, const
2426
2452
2427
2453
#if SN_COAP_DUPLICATION_MAX_MSGS_COUNT
2428
2454
static bool sn_coap_protocol_update_duplicate_package_data (const struct coap_s * handle ,
2429
- const sn_nsdl_addr_s * dst_addr_ptr ,
2430
- const sn_coap_hdr_s * coap_msg_ptr ,
2431
- const int16_t data_size ,
2432
- 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 )
2433
2459
{
2434
2460
if (coap_msg_ptr -> msg_type == COAP_MSG_TYPE_ACKNOWLEDGEMENT &&
2435
2461
handle -> sn_coap_duplication_buffer_size != 0 ) {
2436
- coap_duplication_info_s * info = sn_coap_protocol_linked_list_duplication_info_search (handle ,
2437
- dst_addr_ptr ,
2438
- coap_msg_ptr -> msg_id );
2439
-
2440
- /* Update package data to duplication info struct if it's not there yet */
2441
- if (info && info -> packet_ptr == NULL ) {
2442
- info -> packet_ptr = handle -> sn_coap_protocol_malloc (data_size );
2443
- if (info -> packet_ptr ) {
2444
- memcpy (info -> packet_ptr , dst_packet_data_ptr , data_size );
2445
- info -> packet_len = data_size ;
2446
- } else {
2447
- tr_error ("sn_coap_protocol_update_duplication_package_data - failed to allocate duplication info!" );
2448
- return false;
2449
- }
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;
2450
2487
}
2451
2488
}
2452
2489
return true;
0 commit comments