Skip to content

Commit ede7762

Browse files
authored
Merge pull request #4332 from yogpan01/master
Fix for blockwise observation failure
2 parents ef7ab92 + 8062837 commit ede7762

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

features/FEATURE_COMMON_PAL/mbed-coap/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Change Log
22

3+
## [v4.0.4](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.0.4)
4+
5+
-[Full Changelog](https://github.com/ARMmbed/mbed-coap/compare/v4.0.3...v4.0.4)
6+
7+
**Closed issues:**
8+
- https://github.com/ARMmbed/mbed-client/issues/481 - Obs Con blockwise fails to transmit 2nd block
9+
310
## [v4.0.3](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.0.3)
411

512
-[Full Changelog](https://github.com/ARMmbed/mbed-coap/compare/v4.0.2...v4.0.3)

features/FEATURE_COMMON_PAL/mbed-coap/source/sn_coap_protocol.c

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,6 @@ int16_t sn_coap_protocol_build(struct coap_s *handle, sn_nsdl_addr_s *dst_addr_p
474474
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);
475475

476476
stored_blockwise_msg_ptr->coap = handle;
477-
478477
ns_list_add_to_end(&handle->linked_list_blockwise_sent_msgs, stored_blockwise_msg_ptr);
479478
}
480479

@@ -499,7 +498,6 @@ int16_t sn_coap_protocol_build(struct coap_s *handle, sn_nsdl_addr_s *dst_addr_p
499498
}
500499

501500
stored_blockwise_msg_ptr->coap = handle;
502-
503501
ns_list_add_to_end(&handle->linked_list_blockwise_sent_msgs, stored_blockwise_msg_ptr);
504502
}
505503

@@ -641,11 +639,19 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src
641639
break;
642640
}
643641
}
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;
645646
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) {
647654
ns_list_remove(&handle->linked_list_blockwise_sent_msgs, stored_blockwise_msg_temp_ptr);
648-
649655
if (stored_blockwise_msg_temp_ptr->coap_msg_ptr) {
650656
if(stored_blockwise_msg_temp_ptr->coap_msg_ptr->payload_ptr){
651657
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)
733739
uint16_t temp_msg_id = (stored_msg_ptr->send_msg_ptr->packet_ptr[2] << 8);
734740
temp_msg_id += (uint16_t)stored_msg_ptr->send_msg_ptr->packet_ptr[3];
735741

742+
/* Remove message from Linked list */
743+
ns_list_remove(&handle->linked_list_resent_msgs, stored_msg_ptr);
744+
--handle->count_resent_msgs;
745+
736746
/* If RX callback have been defined.. */
737747
if (stored_msg_ptr->coap->sn_coap_rx_callback != 0) {
738748
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)
747757
sn_coap_parser_release_allocated_coap_msg_mem(stored_msg_ptr->coap, tmp_coap_hdr_ptr);
748758
}
749759
}
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);
752763
} else {
753764
/* Send message */
754765
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
18011812

18021813
stored_blockwise_msg_ptr->coap_msg_ptr = src_coap_blockwise_ack_msg_ptr;
18031814
stored_blockwise_msg_ptr->coap = handle;
1804-
18051815
ns_list_add_to_end(&handle->linked_list_blockwise_sent_msgs, stored_blockwise_msg_ptr);
18061816

18071817
/* * * 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
19031913
src_coap_blockwise_ack_msg_ptr->payload_ptr = stored_blockwise_msg_temp_ptr->coap_msg_ptr->payload_ptr + (block_size * block_number);
19041914
}
19051915

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+
19061931
/* Build and send block message */
19071932
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);
19081933

0 commit comments

Comments
 (0)