From: Gregory Lemercier Date: Tue, 2 May 2017 08:57:49 +0000 (+0200) Subject: examples/tls: fix certificates retrieval from SSS X-Git-Tag: 1.1_Public_Release~457^2~25 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e2a4862361a2f37d1b57710e0b537a79b354dbe7;p=rtos%2Ftinyara.git examples/tls: fix certificates retrieval from SSS This patch fixes the way the CA and device certificates are retrieved from the SSS. Before a common ASN1 tag value was searched with 'strstr', which was failing to properly split up the certificates. Instead we read the length value of the ASN1 sequence using the field following the ASN1 tag, which gives us the offset of the next certificate in the chain. Change-Id: I39c2cc40cd8be527a039c2922b21b97b9ea4a7f2 Signed-off-by: Gregory Lemercier Signed-off-by: EunBong Song --- diff --git a/apps/examples/tls_client/tls_client_main.c b/apps/examples/tls_client/tls_client_main.c index 8d6479b..cd27620 100644 --- a/apps/examples/tls_client/tls_client_main.c +++ b/apps/examples/tls_client/tls_client_main.c @@ -959,7 +959,6 @@ usage: #ifdef CONFIG_EXAMPLES_TLS_ARTIK_KEY unsigned int cert_buflen = SEE_MAX_BUF_SIZE; char *cert_buf = NULL; - const char cert_start[2] = { 0x30, 0x82 }; cert_buf = (char *)malloc(SEE_MAX_BUF_SIZE); @@ -974,22 +973,26 @@ usage: goto exit; } - char *cert_offset[3] = { NULL, NULL, NULL }; + char *cert_offset[3] = {NULL, NULL, NULL}; + int cert_length[3] = {0, 0, 0}; - cert_offset[0] = cert_buf + 4; - cert_offset[1] = strstr(cert_offset[0] + 4, cert_start); - cert_offset[2] = strstr(cert_offset[1] + 4, cert_start); + cert_offset[0] = cert_buf; + cert_length[0] = (cert_offset[0][2] << 8) + cert_offset[0][3] + 4; + cert_offset[1] = cert_offset[0] + cert_length[0]; + cert_length[1] = (cert_offset[1][2] << 8) + cert_offset[1][3] + 4; + cert_offset[2] = cert_offset[1] + cert_length[1]; + cert_length[2] = (cert_offset[2][2] << 8) + cert_offset[2][3] + 4; /* Parse CA Cert */ - if ((ret = mbedtls_x509_crt_parse_der(&cacert, (const unsigned char *)cert_offset[0], cert_offset[1] - cert_offset[0])) < 0) { - mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse -0x%x\n", -ret); + if ((ret = mbedtls_x509_crt_parse_der(&cacert, (const unsigned char *)cert_offset[0], cert_length[0])) < 0) { + mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse CA cert -0x%x\n", -ret); free(cert_buf); goto exit; } /* Parse Device Cert */ - if ((ret = mbedtls_x509_crt_parse_der(&clicert, (const unsigned char *)cert_offset[2], cert_buflen - (cert_offset[2] - cert_buf))) < 0) { - mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse -0x%x\n", -ret); + if ((ret = mbedtls_x509_crt_parse_der(&clicert, (const unsigned char *)cert_offset[2], cert_length[2])) < 0) { + mbedtls_printf(" failed\n ! mbedtls_x509_crt_parse Device cert -0x%x\n", -ret); free(cert_buf); goto exit; } diff --git a/apps/include/netutils/er-coap/LICENSE b/apps/include/netutils/er-coap/LICENSE deleted file mode 100644 index 0cf394b..0000000 --- a/apps/include/netutils/er-coap/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ diff --git a/apps/include/netutils/er-coap/er-coap-13.h b/apps/include/netutils/er-coap/er-coap-13.h deleted file mode 100644 index b3b8d1d..0000000 --- a/apps/include/netutils/er-coap/er-coap-13.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * An implementation of the Constrained Application Protocol (draft 12) - * \author - * Matthias Kovatsch - * \contributors - * David Navarro, Intel Corporation - Adapt to usage in liblwm2m - */ - -#ifndef COAP_13_H_ -#define COAP_13_H_ - -#include -#include /* for size_t */ - -/* - * The maximum buffer size that is provided for resource responses and must be respected due to the limited IP buffer. - * Larger data must be handled by the resource and will be sent chunk-wise through a TCP stream or CoAP blocks. - */ -#ifndef REST_MAX_CHUNK_SIZE -#define REST_MAX_CHUNK_SIZE 128 -#endif - -#define COAP_DEFAULT_MAX_AGE 60 -#define COAP_RESPONSE_TIMEOUT 2 -#define COAP_MAX_RETRANSMIT 4 - -#define COAP_TCP_SHIM_LEN 4 /* 32bit Length shim header for TCP */ -#define COAP_HEADER_LEN 4 /* | version:0x03 type:0x0C tkl:0xF0 | code | mid:0x00FF | mid:0xFF00 | */ -#define COAP_ETAG_LEN 8 /* The maximum number of bytes for the ETag */ -#define COAP_TOKEN_LEN 8 /* The maximum number of bytes for the Token */ -#define COAP_OPTIONS_MARKER_LEN 1 /* Length of marker (0xFF) between options and payload */ - -#define COAP_MAX_ACCEPT_NUM 2 /* The maximum number of accept preferences to parse/store */ - -#define COAP_MAX_OPTION_HEADER_LEN 5 - -#define COAP_HEADER_VERSION_MASK 0xC0 -#define COAP_HEADER_VERSION_POSITION 6 -#define COAP_HEADER_TYPE_MASK 0x30 -#define COAP_HEADER_TYPE_POSITION 4 -#define COAP_HEADER_TOKEN_LEN_MASK 0x0F -#define COAP_HEADER_TOKEN_LEN_POSITION 0 - -#define COAP_HEADER_OPTION_DELTA_MASK 0xF0 -#define COAP_HEADER_OPTION_SHORT_LENGTH_MASK 0x0F - -/* - * Conservative size limit, as not all options have to be set at the same time. - */ -#ifndef COAP_MAX_HEADER_SIZE -/* Hdr CoT Age Tag Obs Tok Blo strings */ -#define COAP_MAX_HEADER_SIZE (COAP_HEADER_LEN + 3 + 5 + 1 + COAP_ETAG_LEN + 3 + 1 + COAP_TOKEN_LEN + 4 + 30) /* 70 */ -#endif /* COAP_MAX_HEADER_SIZE */ - -#define COAP_MAX_PACKET_SIZE (COAP_MAX_HEADER_SIZE + REST_MAX_CHUNK_SIZE) -/* 0/14 48 for IPv6 (28 for IPv4) */ -#if COAP_MAX_PACKET_SIZE > (UIP_BUFSIZE - UIP_LLH_LEN - UIP_IPUDPH_LEN) -//#error "UIP_CONF_BUFFER_SIZE too small for REST_MAX_CHUNK_SIZE" -#endif - -/* Bitmap for set options */ -enum { OPTION_MAP_SIZE = sizeof(uint8_t) * 8 }; -#define SET_OPTION(packet, opt) ((packet)->options[opt / OPTION_MAP_SIZE] |= 1 << (opt % OPTION_MAP_SIZE)) -#define IS_OPTION(packet, opt) ((packet)->options[opt / OPTION_MAP_SIZE] & (1 << (opt % OPTION_MAP_SIZE))) - -#ifndef MIN -#define MIN(a, b) ((a) < (b)? (a) : (b)) -#endif /* MIN */ - -/* CoAP protocols */ -typedef enum { - COAP_UDP, - COAP_UDP_DTLS, - COAP_TCP, - COAP_TCP_TLS -} coap_protocol_t; - -/* CoAP message types */ -typedef enum { - COAP_TYPE_CON, /* confirmables */ - COAP_TYPE_NON, /* non-confirmables */ - COAP_TYPE_ACK, /* acknowledgements */ - COAP_TYPE_RST /* reset */ -} coap_message_type_t; - -/* CoAP request method codes */ -typedef enum { - COAP_GET = 1, - COAP_POST, - COAP_PUT, - COAP_DELETE -} coap_method_t; - -/* CoAP response codes */ -typedef enum { - NO_ERROR = 0, - - CREATED_2_01 = 65, /* CREATED */ - DELETED_2_02 = 66, /* DELETED */ - VALID_2_03 = 67, /* NOT_MODIFIED */ - CHANGED_2_04 = 68, /* CHANGED */ - CONTENT_2_05 = 69, /* OK */ - - BAD_REQUEST_4_00 = 128, /* BAD_REQUEST */ - UNAUTHORIZED_4_01 = 129, /* UNAUTHORIZED */ - BAD_OPTION_4_02 = 130, /* BAD_OPTION */ - FORBIDDEN_4_03 = 131, /* FORBIDDEN */ - NOT_FOUND_4_04 = 132, /* NOT_FOUND */ - METHOD_NOT_ALLOWED_4_05 = 133, /* METHOD_NOT_ALLOWED */ - NOT_ACCEPTABLE_4_06 = 134, /* NOT_ACCEPTABLE */ - PRECONDITION_FAILED_4_12 = 140, /* BAD_REQUEST */ - REQUEST_ENTITY_TOO_LARGE_4_13 = 141,/* REQUEST_ENTITY_TOO_LARGE */ - UNSUPPORTED_MEDIA_TYPE_4_15 = 143, /* UNSUPPORTED_MEDIA_TYPE */ - - INTERNAL_SERVER_ERROR_5_00 = 160, /* INTERNAL_SERVER_ERROR */ - NOT_IMPLEMENTED_5_01 = 161, /* NOT_IMPLEMENTED */ - BAD_GATEWAY_5_02 = 162, /* BAD_GATEWAY */ - SERVICE_UNAVAILABLE_5_03 = 163, /* SERVICE_UNAVAILABLE */ - GATEWAY_TIMEOUT_5_04 = 164, /* GATEWAY_TIMEOUT */ - PROXYING_NOT_SUPPORTED_5_05 = 165, /* PROXYING_NOT_SUPPORTED */ - - /* Erbium errors */ - MEMORY_ALLOCATION_ERROR = 192, - PACKET_SERIALIZATION_ERROR, - - /* Erbium hooks */ - MANUAL_RESPONSE -} coap_status_t; - -/* CoAP header options */ -typedef enum { - COAP_OPTION_IF_MATCH = 1, /* 0-8 B */ - COAP_OPTION_URI_HOST = 3, /* 1-255 B */ - COAP_OPTION_ETAG = 4, /* 1-8 B */ - COAP_OPTION_IF_NONE_MATCH = 5, /* 0 B */ - COAP_OPTION_OBSERVE = 6, /* 0-3 B */ - COAP_OPTION_URI_PORT = 7, /* 0-2 B */ - COAP_OPTION_LOCATION_PATH = 8, /* 0-255 B */ - COAP_OPTION_URI_PATH = 11, /* 0-255 B */ - COAP_OPTION_CONTENT_TYPE = 12, /* 0-2 B */ - COAP_OPTION_MAX_AGE = 14, /* 0-4 B */ - COAP_OPTION_URI_QUERY = 15, /* 0-270 B */ - COAP_OPTION_ACCEPT = 17, /* 0-2 B */ - COAP_OPTION_TOKEN = 19, /* 1-8 B */ - COAP_OPTION_LOCATION_QUERY = 20,/* 1-270 B */ - COAP_OPTION_BLOCK2 = 23, /* 1-3 B */ - COAP_OPTION_BLOCK1 = 27, /* 1-3 B */ - COAP_OPTION_SIZE = 28, /* 0-4 B */ - COAP_OPTION_PROXY_URI = 35, /* 1-270 B */ -} coap_option_t; - -/* CoAP Content-Types */ -typedef enum { - TEXT_PLAIN = 0, - TEXT_XML = 1, /* Indented types are not in the initial registry. */ - TEXT_CSV = 2, - TEXT_HTML = 3, - IMAGE_GIF = 21, - IMAGE_JPEG = 22, - IMAGE_PNG = 23, - IMAGE_TIFF = 24, - AUDIO_RAW = 25, - VIDEO_RAW = 26, - APPLICATION_LINK_FORMAT = 40, - APPLICATION_XML = 41, - APPLICATION_OCTET_STREAM = 42, - APPLICATION_RDF_XML = 43, - APPLICATION_SOAP_XML = 44, - APPLICATION_ATOM_XML = 45, - APPLICATION_XMPP_XML = 46, - APPLICATION_EXI = 47, - APPLICATION_FASTINFOSET = 48, - APPLICATION_SOAP_FASTINFOSET = 49, - APPLICATION_JSON = 50, - APPLICATION_X_OBIX_BINARY = 51 -} coap_content_type_t; - -typedef struct _multi_option_t { - struct _multi_option_t *next; - uint8_t is_static; - uint8_t len; - uint8_t *data; -} multi_option_t; - -/* Parsed message struct */ -typedef struct { - uint8_t *buffer; /* pointer to CoAP header / incoming packet buffer / memory to serialize packet */ - - uint8_t version; - coap_message_type_t type; - uint8_t code; - uint16_t mid; - - uint8_t options[COAP_OPTION_PROXY_URI / OPTION_MAP_SIZE + 1]; /* Bitmap to check if option is set */ - uint16_t options_len; - - coap_content_type_t content_type; /* Parse options once and store; allows setting options in random order */ - uint32_t max_age; - size_t proxy_uri_len; - const uint8_t *proxy_uri; - uint8_t etag_len; - uint8_t etag[COAP_ETAG_LEN]; - size_t uri_host_len; - const uint8_t *uri_host; - multi_option_t *location_path; - uint16_t uri_port; - size_t location_query_len; - uint8_t *location_query; - multi_option_t *uri_path; - uint32_t observe; - uint8_t token_len; - uint8_t token[COAP_TOKEN_LEN]; - uint8_t accept_num; - uint16_t accept[COAP_MAX_ACCEPT_NUM]; - uint8_t if_match_len; - uint8_t if_match[COAP_ETAG_LEN]; - uint32_t block2_num; - uint8_t block2_more; - uint16_t block2_size; - uint32_t block2_offset; - uint32_t block1_num; - uint8_t block1_more; - uint16_t block1_size; - uint32_t block1_offset; - uint32_t size; - multi_option_t *uri_query; - uint8_t if_none_match; - - uint16_t payload_len; - uint8_t *payload; - - coap_protocol_t protocol; - -} coap_packet_t; - -/* Option format serialization*/ -#define COAP_SERIALIZE_INT_OPTION(number, field, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - PRINTF(text" [%u]\n", coap_pkt->field); \ - option += coap_serialize_int_option(number, current_number, option, coap_pkt->field); \ - current_number = number; \ - } -#define COAP_SERIALIZE_BYTE_OPTION(number, field, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - PRINTF(text" %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n", coap_pkt->field##_len, \ - coap_pkt->field[0], \ - coap_pkt->field[1], \ - coap_pkt->field[2], \ - coap_pkt->field[3], \ - coap_pkt->field[4], \ - coap_pkt->field[5], \ - coap_pkt->field[6], \ - coap_pkt->field[7] \ - ); /*FIXME always prints 8 bytes */ \ - option += coap_serialize_array_option(number, current_number, option, coap_pkt->field, coap_pkt->field##_len, '\0'); \ - current_number = number; \ - } -#define COAP_SERIALIZE_STRING_OPTION(number, field, splitter, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - PRINTF(text" [%.*s]\n", coap_pkt->field##_len, coap_pkt->field); \ - option += coap_serialize_array_option(number, current_number, option, (uint8_t *)coap_pkt->field, coap_pkt->field##_len, splitter); \ - current_number = number; \ - } -#define COAP_SERIALIZE_MULTI_OPTION(number, field, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - PRINTF(text); \ - option += coap_serialize_multi_option(number, current_number, option, coap_pkt->field); \ - current_number = number; \ - } -#define COAP_SERIALIZE_ACCEPT_OPTION(number, field, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - int i; \ - for (i = 0; i < coap_pkt->field##_num; ++i) { \ - PRINTF(text" [%u]\n", coap_pkt->field[i]); \ - option += coap_serialize_int_option(number, current_number, option, coap_pkt->field[i]); \ - current_number = number; \ - } \ - } -#define COAP_SERIALIZE_BLOCK_OPTION(number, field, text) \ - if (IS_OPTION(coap_pkt, number)) { \ - PRINTF(text" [%lu%s (%u B/blk)]\n", coap_pkt->field##_num, coap_pkt->field##_more ? "+" : "", coap_pkt->field##_size); \ - uint32_t block = coap_pkt->field##_num << 4; \ - if (coap_pkt->field##_more) { \ - block |= 0x8; \ - } \ - block |= 0xF & coap_log_2(coap_pkt->field##_size/16); \ - PRINTF(text" encoded: 0x%lX\n", block); \ - option += coap_serialize_int_option(number, current_number, option, block); \ - current_number = number; \ - } - -/* To store error code and human-readable payload */ -extern const char *coap_error_message; - -uint16_t coap_get_mid(void); - -void coap_init_message(void *packet, coap_protocol_t protocol, coap_message_type_t type, uint8_t code, uint16_t mid); -size_t coap_serialize_get_size(void *packet); -size_t coap_serialize_message(void *packet, uint8_t *buffer); -coap_status_t coap_parse_message(void *request, coap_protocol_t protocol, uint8_t *data, uint16_t data_len); -void coap_free_header(void *packet); - -char *coap_get_multi_option_as_string(multi_option_t *option); -void coap_add_multi_option(multi_option_t **dst, uint8_t *option, size_t option_len, uint8_t is_static); -void free_multi_option(multi_option_t *dst); - -int coap_get_query_variable(void *packet, const char *name, const char **output); -int coap_get_post_variable(void *packet, const char *name, const char **output); - -/*-----------------------------------------------------------------------------------*/ - -int coap_set_status_code(void *packet, unsigned int code); - -unsigned int coap_get_header_content_type(void *packet); -int coap_set_header_content_type(void *packet, unsigned int content_type); - -int coap_get_header_accept(void *packet, const uint16_t **accept); -int coap_set_header_accept(void *packet, uint16_t accept); - -int coap_get_header_max_age(void *packet, uint32_t *age); -int coap_set_header_max_age(void *packet, uint32_t age); - -int coap_get_header_etag(void *packet, const uint8_t **etag); -int coap_set_header_etag(void *packet, const uint8_t *etag, size_t etag_len); - -int coap_get_header_if_match(void *packet, const uint8_t **etag); -int coap_set_header_if_match(void *packet, const uint8_t *etag, size_t etag_len); - -int coap_get_header_if_none_match(void *packet); -int coap_set_header_if_none_match(void *packet); - -int coap_get_header_token(void *packet, const uint8_t **token); -int coap_set_header_token(void *packet, const uint8_t *token, size_t token_len); - -int coap_get_header_proxy_uri(void *packet, const char **uri); /* In-place string might not be 0-terminated. */ -int coap_set_header_proxy_uri(void *packet, const char *uri); - -int coap_get_header_uri_host(void *packet, const char **host); /* In-place string might not be 0-terminated. */ -int coap_set_header_uri_host(void *packet, const char *host); - -int coap_get_header_uri_path(void *packet, const char **path); /* In-place string might not be 0-terminated. */ -int coap_set_header_uri_path(void *packet, const char *path); -int coap_set_header_uri_path_segment(void *packet, const char *path); - -int coap_get_header_uri_query(void *packet, const char **query); /* In-place string might not be 0-terminated. */ -int coap_set_header_uri_query(void *packet, const char *query); - -int coap_get_header_location_path(void *packet, const char **path); /* In-place string might not be 0-terminated. */ -int coap_set_header_location_path(void *packet, const char *path); /* Also splits optional query into Location-Query option. */ - -int coap_get_header_location_query(void *packet, const char **query); /* In-place string might not be 0-terminated. */ -int coap_set_header_location_query(void *packet, char *query); - -int coap_get_header_observe(void *packet, uint32_t *observe); -int coap_set_header_observe(void *packet, uint32_t observe); - -int coap_get_header_block2(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset); -int coap_set_header_block2(void *packet, uint32_t num, uint8_t more, uint16_t size); - -int coap_get_header_block1(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset); -int coap_set_header_block1(void *packet, uint32_t num, uint8_t more, uint16_t size); - -int coap_get_header_size(void *packet, uint32_t *size); -int coap_set_header_size(void *packet, uint32_t size); - -int coap_get_payload(void *packet, const uint8_t **payload); -int coap_set_payload(void *packet, const void *payload, size_t length); - -#endif /* COAP_13_H_ */ diff --git a/apps/include/netutils/er-coap/er-coap-conf.h b/apps/include/netutils/er-coap/er-coap-conf.h deleted file mode 100644 index 0e2509c..0000000 --- a/apps/include/netutils/er-coap/er-coap-conf.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Collection of default configuration values. - * \author - * Matthias Kovatsch - */ - -#ifndef ER_COAP_CONF_H_ -#define ER_COAP_CONF_H_ - -/* Features that can be disabled to achieve smaller memory footprint */ -#define COAP_LINK_FORMAT_FILTERING 0 -#define COAP_PROXY_OPTION_PROCESSING 0 - -/** - * @brief This definition describes listening port for the CoAP library - **/ -#ifdef CONFIG_NETUTILS_ERCOAP_SERVER_PORT -#define COAP_SERVER_PORT CONFIG_NETUTILS_ERCOAP_SERVER_PORT -#else -#define COAP_SERVER_PORT COAP_DEFAULT_PORT -#endif - -/* The number of concurrent messages that can be stored for retransmission in the transaction layer. */ -#ifndef COAP_MAX_OPEN_TRANSACTIONS -#define COAP_MAX_OPEN_TRANSACTIONS 4 -#endif /* COAP_MAX_OPEN_TRANSACTIONS */ - -/** - * @brief This definition describes maximum number of failed request attempts before action - */ -#ifdef CONFIG_NETUTILS_ERCOAP_MAX_ATTEMPTS -#define COAP_MAX_ATTEMPTS CONFIG_NETUTILS_ERCOAP_MAX_ATTEMPTS -#else -#define COAP_MAX_ATTEMPTS 4 -#endif /* CONFIG_NETUTILS_ERCOAP_MAX_ATTEMPTS */ - -/** - * @brief This definition describes that conservative size limit, as not all options have to be set at the same time. Check when Proxy-Uri option is used -*/ -#ifdef CONFIG_NETUILTS_ERCOAP_MAX_HEADER_SIZE -#define COAP_MAX_HEADER_SIZE CONFIG_NETUTIlS_ERCOAP_MAX_HEADER_SIZE -#else - /* Hdr CoF If-Match Obs Blo strings */ -#define COAP_MAX_HEADER_SIZE (4 + COAP_TOKEN_LEN + 3 + 1 + COAP_ETAG_LEN + 4 + 4 + 30) /* 65 */ -#endif /* CONFIG_NETUTILS_ERCOAP_MAX_HEADER_SIZE */ - -/* Number of observer slots (each takes abot xxx bytes) */ -#ifndef COAP_MAX_OBSERVERS -#define COAP_MAX_OBSERVERS COAP_MAX_OPEN_TRANSACTIONS - 1 -#endif /* COAP_MAX_OBSERVERS */ - -/* Interval in notifies in which NON notifies are changed to CON notifies to check client. */ -#define COAP_OBSERVE_REFRESH_INTERVAL 20 - -#endif /* ER_COAP_CONF_H_ */ diff --git a/apps/include/netutils/er-coap/er-coap-constants.h b/apps/include/netutils/er-coap/er-coap-constants.h deleted file mode 100644 index 46d0ebb..0000000 --- a/apps/include/netutils/er-coap/er-coap-constants.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Collection of constants specified in the CoAP standard. - * \author - * Matthias Kovatsch - */ - -#ifndef ER_COAP_CONSTANTS_H_ -#define ER_COAP_CONSTANTS_H_ - -#define COAP_DEFAULT_PORT 5683 - -#define COAP_DEFAULT_MAX_AGE 60 -#define COAP_RESPONSE_TIMEOUT 3 -#define COAP_RESPONSE_RANDOM_FACTOR 1.5 -#define COAP_MAX_RETRANSMIT 4 - -#define COAP_HEADER_LEN 4 /* | version:0x03 type:0x0C tkl:0xF0 | code | mid:0x00FF | mid:0xFF00 | */ -#define COAP_TOKEN_LEN 8 /* The maximum number of bytes for the Token */ -#define COAP_ETAG_LEN 8 /* The maximum number of bytes for the ETag */ - -#define COAP_HEADER_VERSION_MASK 0xC0 -#define COAP_HEADER_VERSION_POSITION 6 -#define COAP_HEADER_TYPE_MASK 0x30 -#define COAP_HEADER_TYPE_POSITION 4 -#define COAP_HEADER_TOKEN_LEN_MASK 0x0F -#define COAP_HEADER_TOKEN_LEN_POSITION 0 - -#define COAP_HEADER_OPTION_DELTA_MASK 0xF0 -#define COAP_HEADER_OPTION_SHORT_LENGTH_MASK 0x0F - -/* CoAP message types */ -typedef enum { - COAP_TYPE_CON, /* confirmables */ - COAP_TYPE_NON, /* non-confirmables */ - COAP_TYPE_ACK, /* acknowledgements */ - COAP_TYPE_RST /* reset */ -} coap_message_type_t; - -/* CoAP request method codes */ -typedef enum { - COAP_GET = 1, - COAP_POST, - COAP_PUT, - COAP_DELETE -} coap_method_t; - -/* CoAP response codes */ -typedef enum { - NO_ERROR = 0, - - CREATED_2_01 = 65, /* CREATED */ - DELETED_2_02 = 66, /* DELETED */ - VALID_2_03 = 67, /* NOT_MODIFIED */ - CHANGED_2_04 = 68, /* CHANGED */ - CONTENT_2_05 = 69, /* OK */ - CONTINUE_2_31 = 95, /* CONTINUE */ - - BAD_REQUEST_4_00 = 128, /* BAD_REQUEST */ - UNAUTHORIZED_4_01 = 129, /* UNAUTHORIZED */ - BAD_OPTION_4_02 = 130, /* BAD_OPTION */ - FORBIDDEN_4_03 = 131, /* FORBIDDEN */ - NOT_FOUND_4_04 = 132, /* NOT_FOUND */ - METHOD_NOT_ALLOWED_4_05 = 133, /* METHOD_NOT_ALLOWED */ - NOT_ACCEPTABLE_4_06 = 134, /* NOT_ACCEPTABLE */ - PRECONDITION_FAILED_4_12 = 140, /* BAD_REQUEST */ - REQUEST_ENTITY_TOO_LARGE_4_13 = 141,/* REQUEST_ENTITY_TOO_LARGE */ - UNSUPPORTED_MEDIA_TYPE_4_15 = 143, /* UNSUPPORTED_MEDIA_TYPE */ - - INTERNAL_SERVER_ERROR_5_00 = 160, /* INTERNAL_SERVER_ERROR */ - NOT_IMPLEMENTED_5_01 = 161, /* NOT_IMPLEMENTED */ - BAD_GATEWAY_5_02 = 162, /* BAD_GATEWAY */ - SERVICE_UNAVAILABLE_5_03 = 163, /* SERVICE_UNAVAILABLE */ - GATEWAY_TIMEOUT_5_04 = 164, /* GATEWAY_TIMEOUT */ - PROXYING_NOT_SUPPORTED_5_05 = 165, /* PROXYING_NOT_SUPPORTED */ - - /* Erbium errors */ - MEMORY_ALLOCATION_ERROR = 192, - PACKET_SERIALIZATION_ERROR, - - /* Erbium hooks */ - MANUAL_RESPONSE, - PING_RESPONSE -} coap_status_t; - -/* CoAP header option numbers */ -typedef enum { - COAP_OPTION_IF_MATCH = 1, /* 0-8 B */ - COAP_OPTION_URI_HOST = 3, /* 1-255 B */ - COAP_OPTION_ETAG = 4, /* 1-8 B */ - COAP_OPTION_IF_NONE_MATCH = 5, /* 0 B */ - COAP_OPTION_OBSERVE = 6, /* 0-3 B */ - COAP_OPTION_URI_PORT = 7, /* 0-2 B */ - COAP_OPTION_LOCATION_PATH = 8, /* 0-255 B */ - COAP_OPTION_URI_PATH = 11, /* 0-255 B */ - COAP_OPTION_CONTENT_FORMAT = 12,/* 0-2 B */ - COAP_OPTION_MAX_AGE = 14, /* 0-4 B */ - COAP_OPTION_URI_QUERY = 15, /* 0-255 B */ - COAP_OPTION_ACCEPT = 17, /* 0-2 B */ - COAP_OPTION_LOCATION_QUERY = 20,/* 0-255 B */ - COAP_OPTION_BLOCK2 = 23, /* 1-3 B */ - COAP_OPTION_BLOCK1 = 27, /* 1-3 B */ - COAP_OPTION_SIZE2 = 28, /* 0-4 B */ - COAP_OPTION_PROXY_URI = 35, /* 1-1034 B */ - COAP_OPTION_PROXY_SCHEME = 39, /* 1-255 B */ - COAP_OPTION_SIZE1 = 60, /* 0-4 B */ -} coap_option_t; - -/* CoAP Content-Formats */ -typedef enum { - TEXT_PLAIN = 0, - TEXT_XML = 1, - TEXT_CSV = 2, - TEXT_HTML = 3, - IMAGE_GIF = 21, - IMAGE_JPEG = 22, - IMAGE_PNG = 23, - IMAGE_TIFF = 24, - AUDIO_RAW = 25, - VIDEO_RAW = 26, - APPLICATION_LINK_FORMAT = 40, - APPLICATION_XML = 41, - APPLICATION_OCTET_STREAM = 42, - APPLICATION_RDF_XML = 43, - APPLICATION_SOAP_XML = 44, - APPLICATION_ATOM_XML = 45, - APPLICATION_XMPP_XML = 46, - APPLICATION_EXI = 47, - APPLICATION_FASTINFOSET = 48, - APPLICATION_SOAP_FASTINFOSET = 49, - APPLICATION_JSON = 50, - APPLICATION_X_OBIX_BINARY = 51 -} coap_content_format_t; - -#endif /* ER_COAP_CONSTANTS_H_ */ diff --git a/apps/netutils/er-coap/Kconfig b/apps/netutils/er-coap/Kconfig deleted file mode 100644 index 1a0180b..0000000 --- a/apps/netutils/er-coap/Kconfig +++ /dev/null @@ -1,34 +0,0 @@ -# -# For a description of the syntax of this configuration file, -# see kconfig-language at https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt -# - -config NETUTILS_ERCOAP - bool "CoAP Library (er-coap-13)" - default n - depends on NET_IPv4 - ---help--- - Enable support for er-coap library. - -if NETUTILS_ERCOAP -config NETUTILS_ERCOAP_MAX_ATTEMPTS - int "Maxmium number of failed request attempts" - default 4 - depends on EXPERIMENTAL - ---help--- - Maximum number of failed request attempts before action - -config NETUTILS_ERCOAP_MAX_HEADER_SIZE - int "CoAP maximum header size" - default 67 - ---help--- - Default value - = Hdr(4) + CoT(3) + Age(3) + Tag(1) + Etag(8) - + Obs(3) + Tok(1) + Token(8) + Blo(4) + Strings(30) - -config NETUTILS_ERCOAP_SERVER_PORT - int "CoAP server port" - default 5683 - ---help--- - Default port number used for server listening -endif diff --git a/apps/netutils/er-coap/LICENSE b/apps/netutils/er-coap/LICENSE deleted file mode 100644 index 0cf394b..0000000 --- a/apps/netutils/er-coap/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ diff --git a/apps/netutils/er-coap/Makefile b/apps/netutils/er-coap/Makefile deleted file mode 100644 index 3347d56..0000000 --- a/apps/netutils/er-coap/Makefile +++ /dev/null @@ -1,117 +0,0 @@ -########################################################################### -# -# Copyright 2016 Samsung Electronics All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -# either express or implied. See the License for the specific -# language governing permissions and limitations under the License. -# -########################################################################### -############################################################################ -# apps/netutils/er-coap/Makefile -# -# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# 3. Neither the name NuttX nor the names of its contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# -############################################################################ - --include $(TOPDIR)/.config --include $(TOPDIR)/Make.defs -include $(APPDIR)/Make.defs - -# DHCP Daemn Library - -ASRCS = -CSRCS = er-coap-13.c - -AOBJS = $(ASRCS:.S=$(OBJEXT)) -COBJS = $(CSRCS:.c=$(OBJEXT)) - -SRCS = $(ASRCS) $(CSRCS) -OBJS = $(AOBJS) $(COBJS) - -ifeq ($(CONFIG_WINDOWS_NATIVE),y) - BIN = ..\..\libapps$(LIBEXT) -else -ifeq ($(WINTOOL),y) - BIN = ..\\..\\libapps$(LIBEXT) -else - BIN = ../../libapps$(LIBEXT) -endif -endif - -ROOTDEPPATH = --dep-path . - -# Common build - -VPATH = - -all: .built -.PHONY: context depend clean distclean - -$(AOBJS): %$(OBJEXT): %.S - $(call ASSEMBLE, $<, $@) - -$(COBJS): %$(OBJEXT): %.c - $(call COMPILE, $<, $@) - -.built: $(OBJS) - $(call ARCHIVE, $(BIN), $(OBJS)) - $(Q) touch .built - -install: - -context: - -.depend: Makefile $(SRCS) - $(Q) $(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep - $(Q) touch $@ - -depend: .depend - -clean: - $(call DELFILE, .built) - $(call CLEAN) - -distclean: clean - $(call DELFILE, Make.dep) - $(call DELFILE, .depend) - --include Make.dep -.PHONY: preconfig -preconfig: diff --git a/apps/netutils/er-coap/er-coap-13.c b/apps/netutils/er-coap/er-coap-13.c deleted file mode 100644 index 010b989..0000000 --- a/apps/netutils/er-coap/er-coap-13.c +++ /dev/null @@ -1,1444 +0,0 @@ -/* - * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * An implementation of the Constrained Application Protocol (draft 12) - * \author - * Matthias Kovatsch - * \contributors - * David Navarro, Intel Corporation - Adapt to usage in liblwm2m - */ - -#include - -#include -#include - -#include - -#define DEBUG 0 -#if DEBUG -#include -#define PRINTF(...) printf(__VA_ARGS__) -#define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15]) -#define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]", (lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3], (lladdr)->addr[4], (lladdr)->addr[5]) -#else -#define PRINTF(...) -#define PRINT6ADDR(addr) -#define PRINTLLADDR(addr) -#endif - -/*-----------------------------------------------------------------------------------*/ -/*- Variables -----------------------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -static uint16_t current_mid = 0; - -coap_status_t coap_error_code = NO_ERROR; -const char *coap_error_message = ""; -/*-----------------------------------------------------------------------------------*/ -/*- LOCAL HELP FUNCTIONS ------------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -static -uint16_t coap_log_2(uint16_t value) -{ - uint16_t result = 0; - do { - value = value >> 1; - result++; - } while (value); - - return result ? result - 1 : result; -} - -/*-----------------------------------------------------------------------------------*/ -static uint32_t coap_parse_int_option(uint8_t *bytes, size_t length) -{ - uint32_t var = 0; - size_t i = 0; - while (i < length) { - var <<= 8; - var |= bytes[i++]; - } - return var; -} - -/*-----------------------------------------------------------------------------------*/ -static uint8_t coap_option_nibble(unsigned int value) -{ - if (value < 13) { - return value; - } else if (value <= 0xFF + 13) { - return 13; - } else { - return 14; - } -} - -/*-----------------------------------------------------------------------------------*/ -static size_t coap_set_option_header(unsigned int delta, size_t length, uint8_t *buffer) -{ - size_t written = 0; - - buffer[0] = coap_option_nibble(delta) << 4 | coap_option_nibble(length); - - /* avoids code duplication without function overhead */ - unsigned int *x = δ - do { - if (*x > 268) { - buffer[++written] = (*x - 269) >> 8; - buffer[++written] = (*x - 269); - } else if (*x > 12) { - buffer[++written] = (*x - 13); - } - } while (x != (unsigned int *)&length && (x = (unsigned int *)&length)); - - PRINTF("WRITTEN %u B opt header\n", written); - - return ++written; -} - -/*-----------------------------------------------------------------------------------*/ -static size_t coap_serialize_int_option(unsigned int number, unsigned int current_number, uint8_t *buffer, uint32_t value) -{ - size_t i = 0; - - if (0xFF000000 & value) { - ++i; - } - if (0xFFFF0000 & value) { - ++i; - } - if (0xFFFFFF00 & value) { - ++i; - } - if (0xFFFFFFFF & value) { - ++i; - } - - PRINTF("OPTION %u (delta %u, len %u)\n", number, number - current_number, i); - - i = coap_set_option_header(number - current_number, i, buffer); - - if (0xFF000000 & value) { - buffer[i++] = (uint8_t)(value >> 24); - } - if (0xFFFF0000 & value) { - buffer[i++] = (uint8_t)(value >> 16); - } - if (0xFFFFFF00 & value) { - buffer[i++] = (uint8_t)(value >> 8); - } - if (0xFFFFFFFF & value) { - buffer[i++] = (uint8_t)(value); - } - - return i; -} - -/*-----------------------------------------------------------------------------------*/ -static size_t coap_serialize_array_option(unsigned int number, unsigned int current_number, uint8_t *buffer, uint8_t *array, size_t length, char split_char) -{ - size_t i = 0; - - if (split_char != '\0') { - size_t j; - uint8_t *part_start = array; - uint8_t *part_end = NULL; - size_t temp_length; - - for (j = 0; j <= length; ++j) { - if (array[j] == split_char || j == length) { - part_end = array + j; - temp_length = part_end - part_start; - - i += coap_set_option_header(number - current_number, temp_length, &buffer[i]); - memcpy(&buffer[i], part_start, temp_length); - i += temp_length; - - PRINTF("OPTION type %u, delta %u, len %u, part [%.*s]\n", number, number - current_number, i, temp_length, part_start); - - ++j; /* skip the splitter */ - current_number = number; - part_start = array + j; - } - } /* for */ - } else { - i += coap_set_option_header(number - current_number, length, &buffer[i]); - memcpy(&buffer[i], array, length); - i += length; - - PRINTF("OPTION type %u, delta %u, len %u\n", number, number - current_number, length); - } - - return i; -} - -/*-----------------------------------------------------------------------------------*/ -static size_t coap_serialize_multi_option(unsigned int number, unsigned int current_number, uint8_t *buffer, multi_option_t *array) -{ - size_t i = 0; - multi_option_t *j; - - for (j = array; j != NULL; j = j->next) { - i += coap_set_option_header(number - current_number, j->len, &buffer[i]); - current_number = number; - memcpy(&buffer[i], j->data, j->len); - i += j->len; - } /* for */ - - return i; -} - -/*-----------------------------------------------------------------------------------*/ -static -void coap_merge_multi_option(uint8_t **dst, size_t *dst_len, uint8_t *option, size_t option_len, char separator) -{ - /* Merge multiple options. */ - if (*dst_len > 0) { - /* dst already contains an option: concatenate */ - (*dst)[*dst_len] = separator; - *dst_len += 1; - - /* memmove handles 2-byte option headers */ - memmove((*dst) + (*dst_len), option, option_len); - - *dst_len += option_len; - } else { - /* dst is empty: set to option */ - *dst = option; - *dst_len = option_len; - } -} - -void coap_add_multi_option(multi_option_t **dst, uint8_t *option, size_t option_len, uint8_t is_static) -{ - multi_option_t *opt = (multi_option_t *)malloc(sizeof(multi_option_t)); - - if (opt) { - opt->next = NULL; - opt->len = (uint8_t)option_len; - if (is_static) { - opt->data = option; - opt->is_static = 1; - } else { - opt->is_static = 0; - opt->data = (uint8_t *)malloc(option_len); - if (opt->data == NULL) { - free(opt); - return; - } - memcpy(opt->data, option, option_len); - } - - if (*dst) { - multi_option_t *i = *dst; - while (i->next) { - i = i->next; - } - i->next = opt; - } else { - *dst = opt; - } - } -} - -void free_multi_option(multi_option_t *dst) -{ - if (dst) { - multi_option_t *n = dst->next; - dst->next = NULL; - if (dst->is_static == 0) { - free(dst->data); - } - free(dst); - free_multi_option(n); - } -} - -char *coap_get_multi_option_as_string(multi_option_t *option) -{ - size_t len = 0; - multi_option_t *opt; - char *output; - - for (opt = option; opt != NULL; opt = opt->next) { - len += opt->len + 1; // for separator - } - - output = malloc(len + 1); // for String terminator - if (output != NULL) { - size_t i = 0; - - for (opt = option; opt != NULL; opt = opt->next) { - output[i] = '/'; - i += 1; - - memmove(output + i, opt->data, opt->len); - i += opt->len; - } - output[i] = 0; - } - - return output; -} - -/*-----------------------------------------------------------------------------------*/ -static -int coap_get_variable(const uint8_t *buffer, size_t length, const char *name, const char **output) -{ - const uint8_t *start = NULL; - const uint8_t *end = NULL; - const uint8_t *value_end = NULL; - size_t name_len = 0; - - /*initialize the output buffer first */ - *output = 0; - - name_len = strlen(name); - end = buffer + length; - - for (start = buffer; start + name_len < end; ++start) { - if ((start == buffer || start[-1] == '&') && start[name_len] == '=' && strncmp(name, (char *)start, name_len) == 0) { - - /* Point start to variable value */ - start += name_len + 1; - - /* Point end to the end of the value */ - value_end = (const uint8_t *)memchr(start, '&', end - start); - if (value_end == NULL) { - value_end = end; - } - - *output = (char *)start; - - return (value_end - start); - } - } - - return 0; -} - -/*-----------------------------------------------------------------------------------*/ -uint16_t coap_get_mid() -{ - return ++current_mid; -} - -/*-----------------------------------------------------------------------------------*/ -/*- MEASSAGE PROCESSING -------------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -void coap_init_message(void *packet, coap_protocol_t protocol, coap_message_type_t type, uint8_t code, uint16_t mid) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - /* Important thing */ - memset(coap_pkt, 0, sizeof(coap_packet_t)); - - coap_pkt->protocol = protocol; - coap_pkt->type = type; - coap_pkt->code = code; - coap_pkt->mid = mid; -} - -void coap_free_header(void *packet) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - free_multi_option(coap_pkt->uri_path); - free_multi_option(coap_pkt->uri_query); - free_multi_option(coap_pkt->location_path); - coap_pkt->uri_path = NULL; - coap_pkt->uri_query = NULL; - coap_pkt->location_path = NULL; -} - -/*-----------------------------------------------------------------------------------*/ -size_t coap_serialize_get_size(void *packet) -{ - if (packet == NULL) { - return 0; - } - - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - size_t length = 0; - - coap_pkt->options_len = 0; - if (IS_OPTION(coap_pkt, COAP_OPTION_IF_MATCH)) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->if_match_len; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_URI_HOST)) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->uri_host_len; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_ETAG)) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->etag_len; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_IF_NONE_MATCH)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_OBSERVE)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_URI_PORT)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH)) { - multi_option_t *optP; - - for (optP = coap_pkt->location_path; optP != NULL; optP = optP->next) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + optP->len; - } - } - if (IS_OPTION(coap_pkt, COAP_OPTION_URI_PATH)) { - multi_option_t *optP; - - for (optP = coap_pkt->uri_path; optP != NULL; optP = optP->next) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + optP->len; - } - } - if (IS_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_MAX_AGE)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY)) { - multi_option_t *optP; - - for (optP = coap_pkt->uri_query; optP != NULL; optP = optP->next) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + optP->len; - } - } - if (IS_OPTION(coap_pkt, COAP_OPTION_ACCEPT)) { - coap_pkt->options_len += coap_pkt->accept_num * COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY)) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->location_query_len; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_BLOCK2)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_BLOCK1)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_SIZE)) { - // can be stored in extended fields - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN; - } - if (IS_OPTION(coap_pkt, COAP_OPTION_PROXY_URI)) { - coap_pkt->options_len += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->proxy_uri_len; - } - - switch (coap_pkt->protocol) { - case COAP_TCP: - case COAP_TCP_TLS: { - int len = coap_pkt->options_len + coap_pkt->payload_len; - if (len < 13) { - length += 1; - } else if (len < ((1 << 8) + 13)) { - length += 2; - } else if (len < ((1 << 16) + 269)) { - length += 3; - } else { - length += 5; - } - - length += coap_pkt->token_len + coap_pkt->options_len; - if (coap_pkt->payload_len > 0) { - length += COAP_OPTIONS_MARKER_LEN + coap_pkt->payload_len; - } - } - break; - case COAP_UDP: - case COAP_UDP_DTLS: - length += COAP_HEADER_LEN + coap_pkt->token_len + coap_pkt->options_len; - if (coap_pkt->payload_len > 0) { - length += COAP_OPTIONS_MARKER_LEN + coap_pkt->payload_len; - } - break; - default: - break; - } - - return length; -} - -/*-----------------------------------------------------------------------------------*/ -size_t coap_serialize_message(void *packet, uint8_t *buffer) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - uint8_t *option; - uint8_t *options_buf; - unsigned int current_number = 0; - - /* Initialize */ - coap_pkt->buffer = buffer; - coap_pkt->version = 1; - - PRINTF("-Serializing MID %u to %p, ", coap_pkt->mid, coap_pkt->buffer); - - /* First serialize the options to get their exact size */ - current_number = 0; - options_buf = malloc(coap_pkt->options_len); - if (!options_buf) { - return 0; - } - option = options_buf; - - PRINTF("-Serializing options at %p-\n", option); - - /* The options must be serialized in the order of their number */ - COAP_SERIALIZE_BYTE_OPTION(COAP_OPTION_IF_MATCH, if_match, "If-Match") - COAP_SERIALIZE_STRING_OPTION(COAP_OPTION_URI_HOST, uri_host, '\0', "Uri-Host") - COAP_SERIALIZE_BYTE_OPTION(COAP_OPTION_ETAG, etag, "ETag") - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_IF_NONE_MATCH, content_type - coap_pkt->content_type, "If-None-Match") /* hack to get a zero field */ - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_OBSERVE, observe, "Observe") - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_URI_PORT, uri_port, "Uri-Port") - COAP_SERIALIZE_MULTI_OPTION(COAP_OPTION_LOCATION_PATH, location_path, "Location-Path") - COAP_SERIALIZE_MULTI_OPTION(COAP_OPTION_URI_PATH, uri_path, "Uri-Path") - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_CONTENT_TYPE, content_type, "Content-Format") - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_MAX_AGE, max_age, "Max-Age") - COAP_SERIALIZE_MULTI_OPTION(COAP_OPTION_URI_QUERY, uri_query, "Uri-Query") - COAP_SERIALIZE_ACCEPT_OPTION(COAP_OPTION_ACCEPT, accept, "Accept") - COAP_SERIALIZE_STRING_OPTION(COAP_OPTION_LOCATION_QUERY, location_query, '&', "Location-Query") - COAP_SERIALIZE_BLOCK_OPTION(COAP_OPTION_BLOCK2, block2, "Block2") - COAP_SERIALIZE_BLOCK_OPTION(COAP_OPTION_BLOCK1, block1, "Block1") - COAP_SERIALIZE_INT_OPTION(COAP_OPTION_SIZE, size, "Size") - COAP_SERIALIZE_STRING_OPTION(COAP_OPTION_PROXY_URI, proxy_uri, '\0', "Proxy-Uri") - - coap_pkt->options_len = option - options_buf; - - PRINTF("-Done serializing at %p----\n", option); - - switch (coap_pkt->protocol) { - case COAP_UDP: - case COAP_UDP_DTLS: - coap_pkt->buffer[0] = 0x00; - coap_pkt->buffer[0] |= COAP_HEADER_VERSION_MASK & (coap_pkt->version) << COAP_HEADER_VERSION_POSITION; - coap_pkt->buffer[0] |= COAP_HEADER_TYPE_MASK & (coap_pkt->type) << COAP_HEADER_TYPE_POSITION; - coap_pkt->buffer[0] |= COAP_HEADER_TOKEN_LEN_MASK & (coap_pkt->token_len) << COAP_HEADER_TOKEN_LEN_POSITION; - coap_pkt->buffer[1] = coap_pkt->code; - coap_pkt->buffer[2] = (uint8_t)((coap_pkt->mid) >> 8); - coap_pkt->buffer[3] = (uint8_t)(coap_pkt->mid); - option = coap_pkt->buffer + COAP_HEADER_LEN; - break; - - case COAP_TCP: - case COAP_TCP_TLS: { - uint32_t len = coap_pkt->options_len; - if (coap_pkt->payload_len > 0) { - len += COAP_OPTIONS_MARKER_LEN + coap_pkt->payload_len; - } - - PRINTF("Options+Payload (len %u)", len); - if (len < 13) { - coap_pkt->buffer[0] = (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->token_len); - coap_pkt->buffer[0] |= (len << 4); - coap_pkt->buffer[1] = coap_pkt->code; - option = coap_pkt->buffer + 2; - } else if (len < ((1 << 8) + 13)) { - coap_pkt->buffer[0] = (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->token_len); - coap_pkt->buffer[0] |= (13 << 4); - coap_pkt->buffer[1] = len - 13; - coap_pkt->buffer[2] = coap_pkt->code; - option = coap_pkt->buffer + 3; - } else if (len < ((1 << 16) + 269)) { - coap_pkt->buffer[0] = (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->token_len); - coap_pkt->buffer[0] |= (14 << 4); - coap_pkt->buffer[1] = ((len - 269) & 0xFF00) >> 8; - coap_pkt->buffer[2] = (len - 269) & 0x00FF; - coap_pkt->buffer[3] = coap_pkt->code; - option = coap_pkt->buffer + 4; - } else { - coap_pkt->buffer[0] = (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->token_len); - coap_pkt->buffer[0] |= (15 << 4); - coap_pkt->buffer[1] = ((len - 65805) & 0xFF000000) >> 24; - coap_pkt->buffer[2] = ((len - 65805) & 0x00FF0000) >> 16; - coap_pkt->buffer[3] = ((len - 65805) & 0x0000FF00) >> 8; - coap_pkt->buffer[4] = (len - 65805) & 0x00FF; - coap_pkt->buffer[5] = coap_pkt->code; - option = coap_pkt->buffer + 6; - } - } - break; - default: - break; - } - - /* set Token */ - PRINTF("Token (len %u)", coap_pkt->token_len); - - for (current_number = 0; current_number < coap_pkt->token_len; ++current_number) { - PRINTF(" %02X", coap_pkt->token[current_number]); - *option = coap_pkt->token[current_number]; - ++option; - } - PRINTF("-\n"); - - /* Copy options */ - memcpy(option, options_buf, coap_pkt->options_len); - option += coap_pkt->options_len; - free(options_buf); - - /* Free allocated header fields */ - coap_free_header(packet); - - /* Pack payload */ - /* Payload marker */ - if (coap_pkt->payload_len) { - *option = 0xFF; - ++option; - } - - memmove(option, coap_pkt->payload, coap_pkt->payload_len); - - PRINTF("-Done %u B (header len %u, payload len %u)-\n", coap_pkt->payload_len + option - buffer, option - buffer, coap_pkt->payload_len); - - PRINTF("Dump [0x%02X %02X %02X %02X %02X %02X %02X %02X]\n", coap_pkt->buffer[0], coap_pkt->buffer[1], coap_pkt->buffer[2], coap_pkt->buffer[3], coap_pkt->buffer[4], coap_pkt->buffer[5], coap_pkt->buffer[6], coap_pkt->buffer[7] - ); - - return (option - buffer) + coap_pkt->payload_len; /* packet length */ -} - -/*-----------------------------------------------------------------------------------*/ -coap_status_t coap_parse_message(void *packet, coap_protocol_t protocol, uint8_t *data, uint16_t data_len) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - uint8_t *current_option; - - current_option = NULL; - - /* Initialize packet */ - memset(coap_pkt, 0, sizeof(coap_packet_t)); - - coap_pkt->protocol = protocol; - - /* pointer to packet bytes */ - coap_pkt->buffer = data; - - /* parse header fields */ - switch (coap_pkt->protocol) { - case COAP_UDP: - case COAP_UDP_DTLS: - coap_pkt->version = (COAP_HEADER_VERSION_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_VERSION_POSITION; - coap_pkt->type = (COAP_HEADER_TYPE_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TYPE_POSITION; - coap_pkt->token_len = MIN(COAP_TOKEN_LEN, (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TOKEN_LEN_POSITION); - coap_pkt->code = coap_pkt->buffer[1]; - coap_pkt->mid = coap_pkt->buffer[2] << 8 | coap_pkt->buffer[3]; - current_option = data + COAP_HEADER_LEN; - break; - case COAP_TCP: - case COAP_TCP_TLS: - coap_pkt->token_len = coap_pkt->buffer[0] & COAP_HEADER_TOKEN_LEN_MASK; - int nibble = (coap_pkt->buffer[0] & 0xF0) >> 4; - if (nibble < 13) { - coap_pkt->code = coap_pkt->buffer[1]; - current_option = data + 2; - } else if (nibble == 13) { - coap_pkt->code = coap_pkt->buffer[2]; - current_option = data + 3; - } else if (nibble == 14) { - coap_pkt->code = coap_pkt->buffer[3]; - current_option = data + 4; - } else { - coap_pkt->code = coap_pkt->buffer[5]; - current_option = data + 6; - } - - /* Not passed in TCP, just set defaults */ - coap_pkt->version = 1; - coap_pkt->type = COAP_TYPE_CON; - coap_pkt->mid = 0; - break; - default: - break; - } - - if (coap_pkt->version != 1) { - coap_error_message = "CoAP version must be 1"; - return BAD_REQUEST_4_00; - } - - if (coap_pkt->token_len != 0) { - memcpy(coap_pkt->token, current_option, coap_pkt->token_len); - SET_OPTION(coap_pkt, COAP_OPTION_TOKEN); - - PRINTF("Token (len %u) [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n", coap_pkt->token_len, coap_pkt->token[0], coap_pkt->token[1], coap_pkt->token[2], coap_pkt->token[3], coap_pkt->token[4], coap_pkt->token[5], coap_pkt->token[6], coap_pkt->token[7] - ); /*FIXME always prints 8 bytes */ - } - - /* parse options */ - current_option += coap_pkt->token_len; - - unsigned int option_number = 0; - unsigned int option_delta = 0; - size_t option_length = 0; - - while (current_option < data + data_len) { - /* Payload marker 0xFF, currently only checking for 0xF* because rest is reserved */ - if ((current_option[0] & 0xF0) == 0xF0) { - coap_pkt->payload = ++current_option; - coap_pkt->payload_len = data_len - (coap_pkt->payload - data); - - break; - } - - option_delta = current_option[0] >> 4; - option_length = current_option[0] & 0x0F; - ++current_option; - - /* avoids code duplication without function overhead */ - unsigned int *x = &option_delta; - do { - if (*x == 13) { - *x += current_option[0]; - ++current_option; - } else if (*x == 14) { - *x += 255; - *x += current_option[0] << 8; - ++current_option; - *x += current_option[0]; - ++current_option; - } - } while (x != (unsigned int *)&option_length && (x = (unsigned int *)&option_length)); - - option_number += option_delta; - - PRINTF("OPTION %u (delta %u, len %u): ", option_number, option_delta, option_length); - - SET_OPTION(coap_pkt, option_number); - - switch (option_number) { - case COAP_OPTION_CONTENT_TYPE: - coap_pkt->content_type = coap_parse_int_option(current_option, option_length); - PRINTF("Content-Format [%u]\n", coap_pkt->content_type); - break; - case COAP_OPTION_MAX_AGE: - coap_pkt->max_age = coap_parse_int_option(current_option, option_length); - PRINTF("Max-Age [%lu]\n", coap_pkt->max_age); - break; - case COAP_OPTION_ETAG: - coap_pkt->etag_len = (uint8_t)(MIN(COAP_ETAG_LEN, option_length)); - memcpy(coap_pkt->etag, current_option, coap_pkt->etag_len); - PRINTF("ETag %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n", coap_pkt->etag_len, coap_pkt->etag[0], coap_pkt->etag[1], coap_pkt->etag[2], coap_pkt->etag[3], coap_pkt->etag[4], coap_pkt->etag[5], coap_pkt->etag[6], coap_pkt->etag[7] - ); /*FIXME always prints 8 bytes */ - break; - case COAP_OPTION_ACCEPT: - if (coap_pkt->accept_num < COAP_MAX_ACCEPT_NUM) { - coap_pkt->accept[coap_pkt->accept_num] = coap_parse_int_option(current_option, option_length); - coap_pkt->accept_num += 1; - PRINTF("Accept [%u]\n", coap_pkt->content_type); - } - break; - case COAP_OPTION_IF_MATCH: - /*FIXME support multiple ETags */ - coap_pkt->if_match_len = (uint8_t)(MIN(COAP_ETAG_LEN, option_length)); - memcpy(coap_pkt->if_match, current_option, coap_pkt->if_match_len); - PRINTF("If-Match %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n", coap_pkt->if_match_len, coap_pkt->if_match[0], coap_pkt->if_match[1], coap_pkt->if_match[2], coap_pkt->if_match[3], coap_pkt->if_match[4], coap_pkt->if_match[5], coap_pkt->if_match[6], coap_pkt->if_match[7] - ); /*FIXME always prints 8 bytes */ - break; - case COAP_OPTION_IF_NONE_MATCH: - coap_pkt->if_none_match = 1; - PRINTF("If-None-Match\n"); - break; - - case COAP_OPTION_URI_HOST: - coap_pkt->uri_host = current_option; - coap_pkt->uri_host_len = option_length; - PRINTF("Uri-Host [%.*s]\n", coap_pkt->uri_host_len, coap_pkt->uri_host); - break; - case COAP_OPTION_URI_PORT: - coap_pkt->uri_port = coap_parse_int_option(current_option, option_length); - PRINTF("Uri-Port [%u]\n", coap_pkt->uri_port); - break; - case COAP_OPTION_URI_PATH: - /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */ - // coap_merge_multi_option( (char **)&(coap_pkt->uri_path), &(coap_pkt->uri_path_len), current_option, option_length, 0); - coap_add_multi_option(&(coap_pkt->uri_path), current_option, option_length, 1); - PRINTF("Uri-Path [%.*s]\n", option_length, current_option); - break; - case COAP_OPTION_URI_QUERY: - /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */ - // coap_merge_multi_option( (char **)&(coap_pkt->uri_query), &(coap_pkt->uri_query_len), current_option, option_length, '&'); - coap_add_multi_option(&(coap_pkt->uri_query), current_option, option_length, 1); - PRINTF("Uri-Query [%.*s]\n", option_length, current_option); - break; - - case COAP_OPTION_LOCATION_PATH: - coap_add_multi_option(&(coap_pkt->location_path), current_option, option_length, 1); - break; - case COAP_OPTION_LOCATION_QUERY: - /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */ - coap_merge_multi_option(&(coap_pkt->location_query), &(coap_pkt->location_query_len), current_option, option_length, '&'); - PRINTF("Location-Query [%.*s]\n", option_length, current_option); - break; - - case COAP_OPTION_PROXY_URI: - /*FIXME check for own end-point */ - coap_pkt->proxy_uri = current_option; - coap_pkt->proxy_uri_len = option_length; - /*TODO length > 270 not implemented (actually not required) */ - PRINTF("Proxy-Uri NOT IMPLEMENTED [%.*s]\n", coap_pkt->proxy_uri_len, coap_pkt->proxy_uri); - coap_error_message = "This is a constrained server (Contiki)"; - return PROXYING_NOT_SUPPORTED_5_05; - break; - - case COAP_OPTION_OBSERVE: - coap_pkt->observe = coap_parse_int_option(current_option, option_length); - PRINTF("Observe [%lu]\n", coap_pkt->observe); - break; - case COAP_OPTION_BLOCK2: - coap_pkt->block2_num = coap_parse_int_option(current_option, option_length); - coap_pkt->block2_more = (coap_pkt->block2_num & 0x08) >> 3; - coap_pkt->block2_size = 16 << (coap_pkt->block2_num & 0x07); - coap_pkt->block2_offset = (coap_pkt->block2_num & ~0x0000000F) << (coap_pkt->block2_num & 0x07); - coap_pkt->block2_num >>= 4; - PRINTF("Block2 [%lu%s (%u B/blk)]\n", coap_pkt->block2_num, coap_pkt->block2_more ? "+" : "", coap_pkt->block2_size); - break; - case COAP_OPTION_BLOCK1: - coap_pkt->block1_num = coap_parse_int_option(current_option, option_length); - coap_pkt->block1_more = (coap_pkt->block1_num & 0x08) >> 3; - coap_pkt->block1_size = 16 << (coap_pkt->block1_num & 0x07); - coap_pkt->block1_offset = (coap_pkt->block1_num & ~0x0000000F) << (coap_pkt->block1_num & 0x07); - coap_pkt->block1_num >>= 4; - PRINTF("Block1 [%lu%s (%u B/blk)]\n", coap_pkt->block1_num, coap_pkt->block1_more ? "+" : "", coap_pkt->block1_size); - break; - case COAP_OPTION_SIZE: - coap_pkt->size = coap_parse_int_option(current_option, option_length); - PRINTF("Size [%lu]\n", coap_pkt->size); - break; - default: - PRINTF("unknown (%u)\n", option_number); - /* Check if critical (odd) */ - if (option_number & 1) { - coap_error_message = "Unsupported critical option"; - return BAD_OPTION_4_02; - } - } - - current_option += option_length; - } /* for */ - PRINTF("-Done parsing-------\n"); - - return NO_ERROR; -} - -/*-----------------------------------------------------------------------------------*/ -/*- REST FRAMEWORK FUNCTIONS --------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -int coap_get_query_variable(void *packet, const char *name, const char **output) -{ - /* - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY)) { - return coap_get_variable(coap_pkt->uri_query, coap_pkt->uri_query_len, name, output); - } - */ - return 0; -} - -int coap_get_post_variable(void *packet, const char *name, const char **output) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (coap_pkt->payload_len) { - return coap_get_variable(coap_pkt->payload, coap_pkt->payload_len, name, output); - } - return 0; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_set_status_code(void *packet, unsigned int code) -{ - if (code <= 0xFF) { - ((coap_packet_t *)packet)->code = (uint8_t)code; - return 1; - } else { - return 0; - } -} - -/*-----------------------------------------------------------------------------------*/ -/*- HEADER OPTION GETTERS AND SETTERS -----------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -unsigned int coap_get_header_content_type(void *packet) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE)) { - return -1; - } - - return coap_pkt->content_type; -} - -int coap_set_header_content_type(void *packet, unsigned int content_type) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->content_type = (coap_content_type_t)content_type; - SET_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_accept(void *packet, const uint16_t **accept) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_ACCEPT)) { - return 0; - } - - *accept = coap_pkt->accept; - return coap_pkt->accept_num; -} - -int coap_set_header_accept(void *packet, uint16_t accept) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (coap_pkt->accept_num < COAP_MAX_ACCEPT_NUM) { - coap_pkt->accept[coap_pkt->accept_num] = accept; - coap_pkt->accept_num += 1; - - SET_OPTION(coap_pkt, COAP_OPTION_ACCEPT); - } - return coap_pkt->accept_num; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_max_age(void *packet, uint32_t *age) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_MAX_AGE)) { - *age = COAP_DEFAULT_MAX_AGE; - } else { - *age = coap_pkt->max_age; - } - return 1; -} - -int coap_set_header_max_age(void *packet, uint32_t age) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->max_age = age; - SET_OPTION(coap_pkt, COAP_OPTION_MAX_AGE); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_etag(void *packet, const uint8_t **etag) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_ETAG)) { - return 0; - } - - *etag = coap_pkt->etag; - return coap_pkt->etag_len; -} - -int coap_set_header_etag(void *packet, const uint8_t *etag, size_t etag_len) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->etag_len = (uint8_t)(MIN(COAP_ETAG_LEN, etag_len)); - memcpy(coap_pkt->etag, etag, coap_pkt->etag_len); - - SET_OPTION(coap_pkt, COAP_OPTION_ETAG); - return coap_pkt->etag_len; -} - -/*-----------------------------------------------------------------------------------*/ -/*FIXME support multiple ETags */ -int coap_get_header_if_match(void *packet, const uint8_t **etag) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_IF_MATCH)) { - return 0; - } - - *etag = coap_pkt->if_match; - return coap_pkt->if_match_len; -} - -int coap_set_header_if_match(void *packet, const uint8_t *etag, size_t etag_len) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->if_match_len = (uint8_t)(MIN(COAP_ETAG_LEN, etag_len)); - memcpy(coap_pkt->if_match, etag, coap_pkt->if_match_len); - - SET_OPTION(coap_pkt, COAP_OPTION_IF_MATCH); - return coap_pkt->if_match_len; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_if_none_match(void *packet) -{ - return IS_OPTION((coap_packet_t *)packet, COAP_OPTION_IF_NONE_MATCH) ? 1 : 0; -} - -int coap_set_header_if_none_match(void *packet) -{ - SET_OPTION((coap_packet_t *)packet, COAP_OPTION_IF_NONE_MATCH); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_token(void *packet, const uint8_t **token) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_TOKEN)) { - return 0; - } - - *token = coap_pkt->token; - return coap_pkt->token_len; -} - -int coap_set_header_token(void *packet, const uint8_t *token, size_t token_len) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->token_len = (uint8_t)(MIN(COAP_TOKEN_LEN, token_len)); - memcpy(coap_pkt->token, token, coap_pkt->token_len); - - SET_OPTION(coap_pkt, COAP_OPTION_TOKEN); - return coap_pkt->token_len; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_proxy_uri(void *packet, const char **uri) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_PROXY_URI)) { - return 0; - } - - *uri = (const char *)coap_pkt->proxy_uri; - return coap_pkt->proxy_uri_len; -} - -int coap_set_header_proxy_uri(void *packet, const char *uri) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->proxy_uri = (const uint8_t *)uri; - coap_pkt->proxy_uri_len = strlen(uri); - - SET_OPTION(coap_pkt, COAP_OPTION_PROXY_URI); - return coap_pkt->proxy_uri_len; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_uri_host(void *packet, const char **host) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_HOST)) { - return 0; - } - - *host = (char *)coap_pkt->uri_host; - return coap_pkt->uri_host_len; -} - -int coap_set_header_uri_host(void *packet, const char *host) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->uri_host = (uint8_t *)host; - coap_pkt->uri_host_len = strlen(host); - - SET_OPTION(coap_pkt, COAP_OPTION_URI_HOST); - return coap_pkt->uri_host_len; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_uri_path(void *packet, const char **path) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_PATH)) { - return 0; - } - - *path = NULL; //coap_pkt->uri_path; - return 0; //coap_pkt->uri_path_len; -} - -int coap_set_header_uri_path(void *packet, const char *path) -{ - coap_packet_t *coap_pkt = (coap_packet_t *)packet; - int length = 0; - - free_multi_option(coap_pkt->uri_path); - coap_pkt->uri_path = NULL; - - if (path[0] == '/') { - ++path; - } - - do { - int i = 0; - - while (path[i] != 0 && path[i] != '/') { - i++; - } - coap_add_multi_option(&(coap_pkt->uri_path), (uint8_t *)path, i, 0); - - if (path[i] == '/') { - i++; - } - path += i; - length += i; - } while (path[0] != 0); - - SET_OPTION(coap_pkt, COAP_OPTION_URI_PATH); - return length; -} - -int coap_set_header_uri_path_segment(void *packet, const char *segment) -{ - coap_packet_t *coap_pkt = (coap_packet_t *)packet; - int length; - - if (segment == NULL || segment[0] == 0) { - coap_add_multi_option(&(coap_pkt->uri_path), NULL, 0, 1); - length = 0; - } else { - length = strlen(segment); - coap_add_multi_option(&(coap_pkt->uri_path), (uint8_t *)segment, length, 0); - } - - SET_OPTION(coap_pkt, COAP_OPTION_URI_PATH); - return length; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_uri_query(void *packet, const char **query) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY)) { - return 0; - } - - *query = NULL; //coap_pkt->uri_query; - return 0; //coap_pkt->uri_query_len; -} - -int coap_set_header_uri_query(void *packet, const char *query) -{ - int length = 0; - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - free_multi_option(coap_pkt->uri_query); - coap_pkt->uri_query = NULL; - - if (query[0] == '?') { - ++query; - } - - do { - int i = 0; - - while (query[i] != 0 && query[i] != '&') { - i++; - } - coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)query, i, 0); - - if (query[i] == '&') { - i++; - } - query += i; - length += i; - } while (query[0] != 0); - - SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY); - return length; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_location_path(void *packet, const char **path) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH)) { - return 0; - } - - *path = NULL; //coap_pkt->location_path; - return 0; //coap_pkt->location_path_len; -} - -int coap_set_header_location_path(void *packet, const char *path) -{ - coap_packet_t *coap_pkt = (coap_packet_t *)packet; - int length = 0; - - free_multi_option(coap_pkt->location_path); - coap_pkt->location_path = NULL; - - if (path[0] == '/') { - ++path; - } - - do { - int i = 0; - - while (path[i] != 0 && path[i] != '/') { - i++; - } - coap_add_multi_option(&(coap_pkt->location_path), (uint8_t *)path, i, 0); - - if (path[i] == '/') { - i++; - } - path += i; - length += i; - } while (path[0] != 0); - - SET_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH); - return length; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_location_query(void *packet, const char **query) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY)) { - return 0; - } - - *query = (const char *)coap_pkt->location_query; - return coap_pkt->location_query_len; -} - -int coap_set_header_location_query(void *packet, char *query) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - while (query[0] == '?') { - ++query; - } - - coap_pkt->location_query = (uint8_t *)query; - coap_pkt->location_query_len = strlen(query); - - SET_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY); - return coap_pkt->location_query_len; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_observe(void *packet, uint32_t *observe) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_OBSERVE)) { - return 0; - } - - *observe = coap_pkt->observe; - return 1; -} - -int coap_set_header_observe(void *packet, uint32_t observe) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->observe = 0x00FFFFFF & observe; - SET_OPTION(coap_pkt, COAP_OPTION_OBSERVE); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_block2(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_BLOCK2)) { - return 0; - } - - /* pointers may be NULL to get only specific block parameters */ - if (num != NULL) { - *num = coap_pkt->block2_num; - } - if (more != NULL) { - *more = coap_pkt->block2_more; - } - if (size != NULL) { - *size = coap_pkt->block2_size; - } - if (offset != NULL) { - *offset = coap_pkt->block2_offset; - } - - return 1; -} - -int coap_set_header_block2(void *packet, uint32_t num, uint8_t more, uint16_t size) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (size < 16) { - return 0; - } - if (size > 2048) { - return 0; - } - if (num > 0x0FFFFF) { - return 0; - } - - coap_pkt->block2_num = num; - coap_pkt->block2_more = more ? 1 : 0; - coap_pkt->block2_size = size; - - SET_OPTION(coap_pkt, COAP_OPTION_BLOCK2); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_block1(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_BLOCK1)) { - return 0; - } - - /* pointers may be NULL to get only specific block parameters */ - if (num != NULL) { - *num = coap_pkt->block1_num; - } - if (more != NULL) { - *more = coap_pkt->block1_more; - } - if (size != NULL) { - *size = coap_pkt->block1_size; - } - if (offset != NULL) { - *offset = coap_pkt->block1_offset; - } - - return 1; -} - -int coap_set_header_block1(void *packet, uint32_t num, uint8_t more, uint16_t size) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (size < 16) { - return 0; - } - if (size > 2048) { - return 0; - } - if (num > 0x0FFFFF) { - return 0; - } - - coap_pkt->block1_num = num; - coap_pkt->block1_more = more; - coap_pkt->block1_size = size; - - SET_OPTION(coap_pkt, COAP_OPTION_BLOCK1); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -int coap_get_header_size(void *packet, uint32_t *size) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (!IS_OPTION(coap_pkt, COAP_OPTION_SIZE)) { - return 0; - } - - *size = coap_pkt->size; - return 1; -} - -int coap_set_header_size(void *packet, uint32_t size) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->size = size; - SET_OPTION(coap_pkt, COAP_OPTION_SIZE); - return 1; -} - -/*-----------------------------------------------------------------------------------*/ -/*- PAYLOAD -------------------------------------------------------------------------*/ -/*-----------------------------------------------------------------------------------*/ -int coap_get_payload(void *packet, const uint8_t **payload) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - if (coap_pkt->payload) { - *payload = coap_pkt->payload; - return coap_pkt->payload_len; - } else { - *payload = NULL; - return 0; - } -} - -int coap_set_payload(void *packet, const void *payload, size_t length) -{ - coap_packet_t *const coap_pkt = (coap_packet_t *)packet; - - coap_pkt->payload = (uint8_t *)payload; - coap_pkt->payload_len = (uint16_t)(length); - - return coap_pkt->payload_len; -} - -/*-----------------------------------------------------------------------------------*/ diff --git a/build/configs/artik053/extra/defconfig b/build/configs/artik053/extra/defconfig index fbe02b4..cf886d4 100644 --- a/build/configs/artik053/extra/defconfig +++ b/build/configs/artik053/extra/defconfig @@ -1113,7 +1113,8 @@ CONFIG_NETUTILS_WIFI=y CONFIG_SLSI_WIFI_DEFAULT_WLAN_COUNTRY_CODE="00" CONFIG_SLSI_WIFI_DEFAULT_WLAN_TX_POWER=30 # CONFIG_SLSI_WIFI_FILESYSTEM_SUPPORT is not set -# CONFIG_NETUTILS_XMLRPC is not set +CONFIG_NETUTILS_MQTT=y +CONFIG_NETUTILS_MQTT_SECURITY=y # # Platform-specific Support