Skip to content

Commit 02ec653

Browse files
author
Yogesh Pande
committed
Updating mbed-coap to version 4.0.8
Fixes errors reported in Github - #4798 - Fixed Lwm2m blockwise data transfer (using Block1 option) with Leshan - ARMmbed/mbed-client#512 - Fixed an ongoing blocktransfer (Block 1 option) interruption by out of order Block to return error 4.08 Request Entity Incomplete as specified in the coap specification. - ARMmbed/mbed-client#511 - Fixed detected duplicate message duplications will not stop mbed-client
1 parent c8657d0 commit 02ec653

File tree

4 files changed

+76
-12
lines changed

4 files changed

+76
-12
lines changed

features/FEATURE_COMMON_PAL/mbed-coap/CHANGELOG.md

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

3+
## [v4.0.8](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.0.8)
4+
5+
-[Full Changelog](https://github.com/ARMmbed/mbed-coap/compare/v4.0.4...v4.0.8)
6+
7+
**Closed issues:**
8+
- IOTCLT-1880 Lwm2m blockwise data transfer (using Block1 option) with Leshan not working
9+
- IOTCLT-1885 Return 4.08 Request Entity Incomplete on Block transfer errors
10+
- IOTCLT-1883 Detected message duplications stop mbed-client
11+
312
## [v4.0.4](https://github.com/ARMmbed/mbed-coap/releases/tag/v4.0.4)
413

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

features/FEATURE_COMMON_PAL/mbed-coap/module.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mbed-coap",
3-
"version": "4.0.6",
3+
"version": "4.0.8",
44
"description": "COAP library",
55
"keywords": [
66
"coap",

features/FEATURE_COMMON_PAL/mbed-coap/source/include/sn_coap_protocol_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ typedef struct coap_blockwise_payload_ {
189189
uint8_t addr_len;
190190
uint8_t *addr_ptr;
191191
uint16_t port;
192+
uint32_t block_number;
192193

193194
uint16_t payload_len;
194195
uint8_t *payload_ptr;

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

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ static void sn_coap_protocol_linked_list_duplication_info_remov
5656
#endif
5757
#if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE /* If Message blockwising is not used at all, this part of code will not be compiled */
5858
static void sn_coap_protocol_linked_list_blockwise_msg_remove(struct coap_s *handle, coap_blockwise_msg_s *removed_msg_ptr);
59-
static void sn_coap_protocol_linked_list_blockwise_payload_store(struct coap_s *handle, sn_nsdl_addr_s *addr_ptr, uint16_t stored_payload_len, uint8_t *stored_payload_ptr);
59+
static void sn_coap_protocol_linked_list_blockwise_payload_store(struct coap_s *handle, sn_nsdl_addr_s *addr_ptr, uint16_t stored_payload_len, uint8_t *stored_payload_ptr, uint32_t block_number);
6060
static uint8_t *sn_coap_protocol_linked_list_blockwise_payload_search(struct coap_s *handle, sn_nsdl_addr_s *src_addr_ptr, uint16_t *payload_length);
61+
static bool sn_coap_protocol_linked_list_blockwise_payload_compare_block_number(struct coap_s *handle, sn_nsdl_addr_s *src_addr_ptr, uint32_t block_number);
6162
static void sn_coap_protocol_linked_list_blockwise_payload_remove(struct coap_s *handle, coap_blockwise_payload_s *removed_payload_ptr);
6263
static void sn_coap_protocol_linked_list_blockwise_payload_remove_oldest(struct coap_s *handle);
6364
static uint32_t sn_coap_protocol_linked_list_blockwise_payloads_get_len(struct coap_s *handle, sn_nsdl_addr_s *src_addr_ptr);
@@ -653,9 +654,11 @@ sn_coap_hdr_s *sn_coap_protocol_parse(struct coap_s *handle, sn_nsdl_addr_s *src
653654
returned_dst_coap_msg_ptr->msg_id);
654655
/* Send ACK response */
655656
if (response) {
656-
response->coap->sn_coap_tx_callback(response->packet_ptr,
657-
response->packet_len, response->address, response->param);
658-
657+
/* Check that response has been created */
658+
if (response->packet_ptr) {
659+
response->coap->sn_coap_tx_callback(response->packet_ptr,
660+
response->packet_len, response->address, response->param);
661+
}
659662
}
660663

661664
return returned_dst_coap_msg_ptr;
@@ -795,7 +798,6 @@ int8_t sn_coap_protocol_exec(struct coap_s *handle, uint32_t current_time)
795798

796799
if (tmp_coap_hdr_ptr != 0) {
797800
tmp_coap_hdr_ptr->coap_status = COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED;
798-
799801
stored_msg_ptr->coap->sn_coap_rx_callback(tmp_coap_hdr_ptr, stored_msg_ptr->send_msg_ptr->dst_addr_ptr, stored_msg_ptr->param);
800802

801803
sn_coap_parser_release_allocated_coap_msg_mem(stored_msg_ptr->coap, tmp_coap_hdr_ptr);
@@ -1210,7 +1212,8 @@ static void sn_coap_protocol_linked_list_blockwise_msg_remove(struct coap_s *han
12101212

12111213
static void sn_coap_protocol_linked_list_blockwise_payload_store(struct coap_s *handle, sn_nsdl_addr_s *addr_ptr,
12121214
uint16_t stored_payload_len,
1213-
uint8_t *stored_payload_ptr)
1215+
uint8_t *stored_payload_ptr,
1216+
uint32_t block_number)
12141217
{
12151218
if (!addr_ptr || !stored_payload_len || !stored_payload_ptr) {
12161219
return;
@@ -1227,6 +1230,7 @@ static void sn_coap_protocol_linked_list_blockwise_payload_store(struct coap_s *
12271230
return;
12281231
}
12291232

1233+
12301234
/* Allocate memory for stored Payload's data */
12311235
stored_blockwise_payload_ptr->payload_ptr = handle->sn_coap_protocol_malloc(stored_payload_len);
12321236

@@ -1259,6 +1263,8 @@ static void sn_coap_protocol_linked_list_blockwise_payload_store(struct coap_s *
12591263

12601264
stored_blockwise_payload_ptr->coap = handle;
12611265

1266+
stored_blockwise_payload_ptr->block_number = block_number;
1267+
12621268
/* * * * Storing Payload to Linked list * * * */
12631269

12641270
ns_list_add_to_end(&handle->linked_list_blockwise_received_payloads, stored_blockwise_payload_ptr);
@@ -1295,6 +1301,27 @@ static uint8_t *sn_coap_protocol_linked_list_blockwise_payload_search(struct coa
12951301
return NULL;
12961302
}
12971303

1304+
static bool sn_coap_protocol_linked_list_blockwise_payload_compare_block_number(struct coap_s *handle,
1305+
sn_nsdl_addr_s *src_addr_ptr,
1306+
uint32_t block_number)
1307+
{
1308+
/* Loop all stored blockwise payloads in Linked list */
1309+
ns_list_foreach(coap_blockwise_payload_s, stored_payload_info_ptr, &handle->linked_list_blockwise_received_payloads) {
1310+
/* If payload's Source address is same than is searched */
1311+
if (0 == memcmp(src_addr_ptr->addr_ptr, stored_payload_info_ptr->addr_ptr, src_addr_ptr->addr_len)) {
1312+
/* If payload's Source address port is same than is searched */
1313+
if (stored_payload_info_ptr->port == src_addr_ptr->port) {
1314+
// Check that incoming block number matches to last received one
1315+
if (block_number - 1 == stored_payload_info_ptr->block_number) {
1316+
tr_debug("sn_coap_protocol_linked_list_blockwise_payload_search_block_number - found %d", stored_payload_info_ptr->block_number);
1317+
return true;
1318+
}
1319+
}
1320+
}
1321+
}
1322+
return false;
1323+
}
1324+
12981325
/**************************************************************************//**
12991326
* \fn static void sn_coap_protocol_linked_list_blockwise_payload_remove_oldest(struct coap_s *handle)
13001327
*
@@ -1326,7 +1353,6 @@ static void sn_coap_protocol_linked_list_blockwise_payload_remove(struct coap_s
13261353
coap_blockwise_payload_s *removed_payload_ptr)
13271354
{
13281355
ns_list_remove(&handle->linked_list_blockwise_received_payloads, removed_payload_ptr);
1329-
13301356
/* Free memory of stored payload */
13311357
if (removed_payload_ptr->addr_ptr != NULL) {
13321358
handle->sn_coap_protocol_free(removed_payload_ptr->addr_ptr);
@@ -1658,7 +1684,22 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
16581684
received_coap_msg_ptr->payload_len = handle->sn_coap_block_data_size;
16591685
}
16601686

1661-
sn_coap_protocol_linked_list_blockwise_payload_store(handle, src_addr_ptr, received_coap_msg_ptr->payload_len, received_coap_msg_ptr->payload_ptr);
1687+
// Check that incoming block number is in order.
1688+
uint32_t block_number = received_coap_msg_ptr->options_list_ptr->block1 >> 4;
1689+
bool blocks_in_order = true;
1690+
if (block_number > 0 &&
1691+
!sn_coap_protocol_linked_list_blockwise_payload_compare_block_number(handle,
1692+
src_addr_ptr,
1693+
block_number)) {
1694+
blocks_in_order = false;
1695+
}
1696+
1697+
sn_coap_protocol_linked_list_blockwise_payload_store(handle,
1698+
src_addr_ptr,
1699+
received_coap_msg_ptr->payload_len,
1700+
received_coap_msg_ptr->payload_ptr,
1701+
block_number);
1702+
16621703
/* If not last block (more value is set) */
16631704
/* Block option length can be 1-3 bytes. First 4-20 bits are for block number. Last 4 bits are ALWAYS more bit + block size. */
16641705
if (received_coap_msg_ptr->options_list_ptr->block1 & 0x08) {
@@ -1678,12 +1719,14 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
16781719

16791720
// Response with COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE if the payload size is more than we can handle
16801721
tr_debug("sn_coap_handle_blockwise_message - block1 received - incoming size: [%d]", received_coap_msg_ptr->options_list_ptr->size1);
1722+
16811723
uint32_t max_size = SN_COAP_MAX_INCOMING_BLOCK_MESSAGE_SIZE;
1682-
if (received_coap_msg_ptr->options_list_ptr->size1 > max_size) {
1724+
if (!blocks_in_order) {
1725+
src_coap_blockwise_ack_msg_ptr->msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_INCOMPLETE;
1726+
} else if (received_coap_msg_ptr->options_list_ptr->size1 > max_size) {
16831727
// Include maximum size that stack can handle into response
16841728
src_coap_blockwise_ack_msg_ptr->msg_code = COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE;
16851729
src_coap_blockwise_ack_msg_ptr->options_list_ptr->size1 = max_size;
1686-
16871730
} else if (received_coap_msg_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET) {
16881731
src_coap_blockwise_ack_msg_ptr->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
16891732
} else if (received_coap_msg_ptr->msg_code == COAP_MSG_CODE_REQUEST_POST) {
@@ -1706,6 +1749,13 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
17061749

17071750
src_coap_blockwise_ack_msg_ptr->msg_id = received_coap_msg_ptr->msg_id;
17081751

1752+
// Copy token to response
1753+
src_coap_blockwise_ack_msg_ptr->token_ptr = handle->sn_coap_protocol_malloc(received_coap_msg_ptr->token_len);
1754+
if (src_coap_blockwise_ack_msg_ptr->token_ptr) {
1755+
memcpy(src_coap_blockwise_ack_msg_ptr->token_ptr, received_coap_msg_ptr->token_ptr, received_coap_msg_ptr->token_len);
1756+
src_coap_blockwise_ack_msg_ptr->token_len = received_coap_msg_ptr->token_len;
1757+
}
1758+
17091759
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);
17101760

17111761
dst_ack_packet_data_ptr = handle->sn_coap_protocol_malloc(dst_packed_data_needed_mem);
@@ -1776,7 +1826,11 @@ static sn_coap_hdr_s *sn_coap_handle_blockwise_message(struct coap_s *handle, sn
17761826

17771827
/* Store blockwise payload to Linked list */
17781828
//todo: add block number to stored values - just to make sure all packets are in order
1779-
sn_coap_protocol_linked_list_blockwise_payload_store(handle, src_addr_ptr, received_coap_msg_ptr->payload_len, received_coap_msg_ptr->payload_ptr);
1829+
sn_coap_protocol_linked_list_blockwise_payload_store(handle,
1830+
src_addr_ptr,
1831+
received_coap_msg_ptr->payload_len,
1832+
received_coap_msg_ptr->payload_ptr,
1833+
received_coap_msg_ptr->options_list_ptr->block1 >> 4);
17801834

17811835
/* If not last block (more value is set) */
17821836
if (received_coap_msg_ptr->options_list_ptr->block2 & 0x08) {

0 commit comments

Comments
 (0)