Example

Dependencies:   FXAS21002 FXOS8700Q

Committer:
maygup01
Date:
Tue Nov 19 09:49:38 2019 +0000
Revision:
0:11cc2b7889af
Example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maygup01 0:11cc2b7889af 1 /*
maygup01 0:11cc2b7889af 2 * Copyright (c) 2011-2015 ARM Limited. All rights reserved.
maygup01 0:11cc2b7889af 3 * SPDX-License-Identifier: Apache-2.0
maygup01 0:11cc2b7889af 4 * Licensed under the Apache License, Version 2.0 (the License); you may
maygup01 0:11cc2b7889af 5 * not use this file except in compliance with the License.
maygup01 0:11cc2b7889af 6 * You may obtain a copy of the License at
maygup01 0:11cc2b7889af 7 *
maygup01 0:11cc2b7889af 8 * http://www.apache.org/licenses/LICENSE-2.0
maygup01 0:11cc2b7889af 9 *
maygup01 0:11cc2b7889af 10 * Unless required by applicable law or agreed to in writing, software
maygup01 0:11cc2b7889af 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
maygup01 0:11cc2b7889af 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
maygup01 0:11cc2b7889af 13 * See the License for the specific language governing permissions and
maygup01 0:11cc2b7889af 14 * limitations under the License.
maygup01 0:11cc2b7889af 15 */
maygup01 0:11cc2b7889af 16 /**
maygup01 0:11cc2b7889af 17 * \file sn_nsdl.c
maygup01 0:11cc2b7889af 18 *
maygup01 0:11cc2b7889af 19 * \brief Nano service device library
maygup01 0:11cc2b7889af 20 *
maygup01 0:11cc2b7889af 21 */
maygup01 0:11cc2b7889af 22
maygup01 0:11cc2b7889af 23 // Needed for PRIu64 on FreeRTOS
maygup01 0:11cc2b7889af 24 #include <stdio.h>
maygup01 0:11cc2b7889af 25 // Note: this macro is needed on armcc to get the the limit macros like UINT16_MAX
maygup01 0:11cc2b7889af 26 #ifndef __STDC_LIMIT_MACROS
maygup01 0:11cc2b7889af 27 #define __STDC_LIMIT_MACROS
maygup01 0:11cc2b7889af 28 #endif
maygup01 0:11cc2b7889af 29
maygup01 0:11cc2b7889af 30 // Note: this macro is needed on armcc to get the the PRI*32 macros
maygup01 0:11cc2b7889af 31 // from inttypes.h in a C++ code.
maygup01 0:11cc2b7889af 32 #ifndef __STDC_FORMAT_MACROS
maygup01 0:11cc2b7889af 33 #define __STDC_FORMAT_MACROS
maygup01 0:11cc2b7889af 34 #endif
maygup01 0:11cc2b7889af 35
maygup01 0:11cc2b7889af 36 #include <string.h>
maygup01 0:11cc2b7889af 37 #include <assert.h>
maygup01 0:11cc2b7889af 38
maygup01 0:11cc2b7889af 39 #include "ns_types.h"
maygup01 0:11cc2b7889af 40 #include "sn_nsdl.h"
maygup01 0:11cc2b7889af 41 #include "sn_coap_header.h"
maygup01 0:11cc2b7889af 42 #include "sn_coap_protocol.h"
maygup01 0:11cc2b7889af 43 #include "source/include/sn_coap_protocol_internal.h"
maygup01 0:11cc2b7889af 44 #include "sn_nsdl_lib.h"
maygup01 0:11cc2b7889af 45 #include "sn_grs.h"
maygup01 0:11cc2b7889af 46 #include "mbed-trace/mbed_trace.h"
maygup01 0:11cc2b7889af 47 #include "mbedtls/base64.h"
maygup01 0:11cc2b7889af 48 #include "common_functions.h"
maygup01 0:11cc2b7889af 49 #include "randLIB.h"
maygup01 0:11cc2b7889af 50
maygup01 0:11cc2b7889af 51 #include <stdlib.h>
maygup01 0:11cc2b7889af 52
maygup01 0:11cc2b7889af 53 /* Defines */
maygup01 0:11cc2b7889af 54 #define TRACE_GROUP "mClt"
maygup01 0:11cc2b7889af 55 #define RESOURCE_DIR_LEN 2
maygup01 0:11cc2b7889af 56 #define EP_NAME_PARAMETERS_LEN 3
maygup01 0:11cc2b7889af 57 #define ET_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 58 #define LT_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 59 #define DOMAIN_PARAMETER_LEN 2
maygup01 0:11cc2b7889af 60 #define RT_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 61 #define IF_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 62 #define NAME_PARAMETER_LEN 5
maygup01 0:11cc2b7889af 63 #define OBS_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 64 #define AOBS_PARAMETER_LEN 5
maygup01 0:11cc2b7889af 65 #define COAP_CON_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 66 #define BS_EP_PARAMETER_LEN 3
maygup01 0:11cc2b7889af 67 #define BS_QUEUE_MODE_PARAMETER_LEN 2
maygup01 0:11cc2b7889af 68 #define RESOURCE_VALUE_PARAMETER_LEN 2
maygup01 0:11cc2b7889af 69 #define FIRMWARE_DOWNLOAD_LEN 2
maygup01 0:11cc2b7889af 70 #define GENERIC_DOWNLOAD_LEN 8
maygup01 0:11cc2b7889af 71
maygup01 0:11cc2b7889af 72 #define SN_NSDL_EP_REGISTER_MESSAGE 1
maygup01 0:11cc2b7889af 73 #define SN_NSDL_EP_UPDATE_MESSAGE 2
maygup01 0:11cc2b7889af 74
maygup01 0:11cc2b7889af 75 #if defined MBED_CONF_MBED_CLIENT_COAP_DISABLE_OBS_FEATURE
maygup01 0:11cc2b7889af 76 #define COAP_DISABLE_OBS_FEATURE MBED_CONF_MBED_CLIENT_COAP_DISABLE_OBS_FEATURE
maygup01 0:11cc2b7889af 77 #endif
maygup01 0:11cc2b7889af 78
maygup01 0:11cc2b7889af 79 #if defined MBED_CONF_MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 80 #define MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE MBED_CONF_MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 81 #endif
maygup01 0:11cc2b7889af 82
maygup01 0:11cc2b7889af 83 /* Constants */
maygup01 0:11cc2b7889af 84 static uint8_t ep_name_parameter_string[] = {'e', 'p', '='}; /* Endpoint name. A unique name for the registering node in a domain. */
maygup01 0:11cc2b7889af 85 static uint8_t resource_path_ptr[] = {'r', 'd'}; /* For resource directory */
maygup01 0:11cc2b7889af 86 static uint8_t resource_type_parameter[] = {'r', 't', '='}; /* Resource type. Only once for registration */
maygup01 0:11cc2b7889af 87 #ifndef COAP_DISABLE_OBS_FEATURE
maygup01 0:11cc2b7889af 88 static uint8_t obs_parameter[] = {'o', 'b', 's'}; /* Observable */
maygup01 0:11cc2b7889af 89 static uint8_t aobs_parameter[] = {'a', 'o', 'b', 's', '='}; /* Auto observable */
maygup01 0:11cc2b7889af 90 #endif
maygup01 0:11cc2b7889af 91 static uint8_t if_description_parameter[] = {'i', 'f', '='}; /* Interface description. Only once */
maygup01 0:11cc2b7889af 92 static uint8_t ep_lifetime_parameter[] = {'l', 't', '='}; /* Lifetime. Number of seconds that this registration will be valid for. Must be updated within this time, or will be removed. */
maygup01 0:11cc2b7889af 93 static uint8_t ep_domain_parameter[] = {'d', '='}; /* Domain name. If this parameter is missing, a default domain is assumed. */
maygup01 0:11cc2b7889af 94 static uint8_t coap_con_type_parameter[] = {'c', 't', '='}; /* CoAP content type */
maygup01 0:11cc2b7889af 95 static uint8_t resource_value[] = {'v', '='}; /* Resource value */
maygup01 0:11cc2b7889af 96 #ifdef RESOURCE_ATTRIBUTES_LIST
maygup01 0:11cc2b7889af 97 static uint8_t name_parameter[] = {'n', 'a', 'm', 'e', '='};
maygup01 0:11cc2b7889af 98 #endif
maygup01 0:11cc2b7889af 99
maygup01 0:11cc2b7889af 100 static uint8_t firmware_download_uri[] = {'f', 'w'}; /* Path for firmware update. */
maygup01 0:11cc2b7889af 101 static uint8_t generic_download_uri[] = {'d', 'o', 'w', 'n', 'l', 'o', 'a', 'd'}; /* Path for generic download. */
maygup01 0:11cc2b7889af 102
maygup01 0:11cc2b7889af 103 /* * OMA BS parameters * */
maygup01 0:11cc2b7889af 104 static uint8_t bs_uri[] = {'b', 's'};
maygup01 0:11cc2b7889af 105 static uint8_t bs_ep_name[] = {'e', 'p', '='};
maygup01 0:11cc2b7889af 106 static uint8_t et_parameter[] = {'e', 't', '='}; /* Endpoint type */
maygup01 0:11cc2b7889af 107 static uint8_t bs_queue_mode[] = {'b', '='};
maygup01 0:11cc2b7889af 108
maygup01 0:11cc2b7889af 109 /* Function prototypes */
maygup01 0:11cc2b7889af 110 static int32_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr);
maygup01 0:11cc2b7889af 111 static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle);
maygup01 0:11cc2b7889af 112 int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration);
maygup01 0:11cc2b7889af 113 static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration, int8_t *error);
maygup01 0:11cc2b7889af 114 static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type, const char *uri_query);
maygup01 0:11cc2b7889af 115 static int8_t sn_nsdl_fill_uri_query_options(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *parameter_ptr, sn_coap_hdr_s *source_msg_ptr, uint8_t msg_type, const char *uri_query);
maygup01 0:11cc2b7889af 116 static int8_t sn_nsdl_local_rx_function(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr);
maygup01 0:11cc2b7889af 117 static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr);
maygup01 0:11cc2b7889af 118 static uint8_t sn_nsdl_itoa_len(uint32_t value);
maygup01 0:11cc2b7889af 119 static uint8_t *sn_nsdl_itoa(uint8_t *ptr, uint32_t value);
maygup01 0:11cc2b7889af 120 static int8_t set_endpoint_info(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *endpoint_info_ptr);
maygup01 0:11cc2b7889af 121 static bool validateParameters(sn_nsdl_ep_parameters_s *parameter_ptr);
maygup01 0:11cc2b7889af 122 static bool validate(uint8_t* ptr, uint32_t len, char illegalChar);
maygup01 0:11cc2b7889af 123 static bool sn_nsdl_check_uint_overflow(uint16_t resource_size, uint16_t param_a, uint16_t param_b);
maygup01 0:11cc2b7889af 124 static void remove_previous_block_data(struct nsdl_s *handle, sn_nsdl_addr_s *src_ptr, const uint32_t block_number);
maygup01 0:11cc2b7889af 125 static bool update_last_block_data(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, bool block1);
maygup01 0:11cc2b7889af 126 #if MBED_CONF_MBED_TRACE_ENABLE
maygup01 0:11cc2b7889af 127 static const char* sn_nsdl_coap_status_description(sn_coap_status_e status);
maygup01 0:11cc2b7889af 128 static const char* sn_nsdl_coap_message_code_desc(int msg_code);
maygup01 0:11cc2b7889af 129 static const char* sn_nsdl_coap_message_type_desc(int msg_type);
maygup01 0:11cc2b7889af 130 #endif
maygup01 0:11cc2b7889af 131
maygup01 0:11cc2b7889af 132 static void sn_nsdl_add_token(struct nsdl_s *handle, uint32_t *token, sn_coap_hdr_s *message_ptr);
maygup01 0:11cc2b7889af 133
maygup01 0:11cc2b7889af 134 int8_t sn_nsdl_destroy(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 135 {
maygup01 0:11cc2b7889af 136 if (handle == NULL) {
maygup01 0:11cc2b7889af 137 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 138 }
maygup01 0:11cc2b7889af 139
maygup01 0:11cc2b7889af 140 if (handle->ep_information_ptr) {
maygup01 0:11cc2b7889af 141 handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr);
maygup01 0:11cc2b7889af 142 handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr);
maygup01 0:11cc2b7889af 143 handle->sn_nsdl_free(handle->ep_information_ptr->location_ptr);
maygup01 0:11cc2b7889af 144 handle->sn_nsdl_free(handle->ep_information_ptr->type_ptr);
maygup01 0:11cc2b7889af 145 handle->sn_nsdl_free(handle->ep_information_ptr->lifetime_ptr);
maygup01 0:11cc2b7889af 146 handle->sn_nsdl_free(handle->ep_information_ptr);
maygup01 0:11cc2b7889af 147 }
maygup01 0:11cc2b7889af 148
maygup01 0:11cc2b7889af 149 if (handle->server_address.addr_ptr) {
maygup01 0:11cc2b7889af 150 handle->sn_nsdl_free(handle->server_address.addr_ptr);
maygup01 0:11cc2b7889af 151 handle->server_address.addr_ptr = NULL;
maygup01 0:11cc2b7889af 152 handle->server_address.type = SN_NSDL_ADDRESS_TYPE_NONE;
maygup01 0:11cc2b7889af 153 }
maygup01 0:11cc2b7889af 154
maygup01 0:11cc2b7889af 155 /* Destroy also libCoap and grs part of libNsdl */
maygup01 0:11cc2b7889af 156 sn_coap_protocol_destroy(handle->grs->coap);
maygup01 0:11cc2b7889af 157 sn_grs_destroy(handle->grs);
maygup01 0:11cc2b7889af 158 handle->sn_nsdl_free(handle);
maygup01 0:11cc2b7889af 159
maygup01 0:11cc2b7889af 160 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 161 }
maygup01 0:11cc2b7889af 162
maygup01 0:11cc2b7889af 163 struct nsdl_s *sn_nsdl_init(uint8_t (*sn_nsdl_tx_cb)(struct nsdl_s *, sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *),
maygup01 0:11cc2b7889af 164 uint8_t (*sn_nsdl_rx_cb)(struct nsdl_s *, sn_coap_hdr_s *, sn_nsdl_addr_s *),
maygup01 0:11cc2b7889af 165 void *(*sn_nsdl_alloc)(uint16_t), void (*sn_nsdl_free)(void *),
maygup01 0:11cc2b7889af 166 uint8_t (*sn_nsdl_auto_obs_token_cb)(struct nsdl_s *, const char *, uint8_t *))
maygup01 0:11cc2b7889af 167 {
maygup01 0:11cc2b7889af 168 /* Check pointers and define function pointers */
maygup01 0:11cc2b7889af 169 if (!sn_nsdl_alloc || !sn_nsdl_free || !sn_nsdl_tx_cb || !sn_nsdl_rx_cb) {
maygup01 0:11cc2b7889af 170 return NULL;
maygup01 0:11cc2b7889af 171 }
maygup01 0:11cc2b7889af 172
maygup01 0:11cc2b7889af 173 struct nsdl_s *handle = NULL;
maygup01 0:11cc2b7889af 174
maygup01 0:11cc2b7889af 175 handle = sn_nsdl_alloc(sizeof(struct nsdl_s));
maygup01 0:11cc2b7889af 176
maygup01 0:11cc2b7889af 177 if (handle == NULL) {
maygup01 0:11cc2b7889af 178 return NULL;
maygup01 0:11cc2b7889af 179 }
maygup01 0:11cc2b7889af 180
maygup01 0:11cc2b7889af 181 memset(handle, 0, sizeof(struct nsdl_s));
maygup01 0:11cc2b7889af 182
maygup01 0:11cc2b7889af 183 /* Define function pointers */
maygup01 0:11cc2b7889af 184 handle->sn_nsdl_alloc = sn_nsdl_alloc;
maygup01 0:11cc2b7889af 185 handle->sn_nsdl_free = sn_nsdl_free;
maygup01 0:11cc2b7889af 186
maygup01 0:11cc2b7889af 187 handle->sn_nsdl_tx_callback = sn_nsdl_tx_cb;
maygup01 0:11cc2b7889af 188 handle->sn_nsdl_rx_callback = sn_nsdl_rx_cb;
maygup01 0:11cc2b7889af 189 handle->sn_nsdl_auto_obs_token_callback = sn_nsdl_auto_obs_token_cb;
maygup01 0:11cc2b7889af 190
maygup01 0:11cc2b7889af 191 /* Initialize ep parameters struct */
maygup01 0:11cc2b7889af 192 if (!handle->ep_information_ptr) {
maygup01 0:11cc2b7889af 193 handle->ep_information_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s));
maygup01 0:11cc2b7889af 194 if (!handle->ep_information_ptr) {
maygup01 0:11cc2b7889af 195 sn_nsdl_free(handle);
maygup01 0:11cc2b7889af 196 return NULL;
maygup01 0:11cc2b7889af 197 }
maygup01 0:11cc2b7889af 198 memset(handle->ep_information_ptr, 0, sizeof(sn_nsdl_ep_parameters_s));
maygup01 0:11cc2b7889af 199 }
maygup01 0:11cc2b7889af 200
maygup01 0:11cc2b7889af 201 handle->grs = sn_grs_init(sn_nsdl_tx_cb, &sn_nsdl_local_rx_function, sn_nsdl_alloc, sn_nsdl_free);
maygup01 0:11cc2b7889af 202
maygup01 0:11cc2b7889af 203 /* Initialize GRS */
maygup01 0:11cc2b7889af 204 if (handle->grs == NULL) {
maygup01 0:11cc2b7889af 205 handle->sn_nsdl_free(handle->ep_information_ptr);
maygup01 0:11cc2b7889af 206 handle->ep_information_ptr = 0;
maygup01 0:11cc2b7889af 207 sn_nsdl_free(handle);
maygup01 0:11cc2b7889af 208 return NULL;
maygup01 0:11cc2b7889af 209 }
maygup01 0:11cc2b7889af 210
maygup01 0:11cc2b7889af 211 sn_nsdl_resolve_nsp_address(handle);
maygup01 0:11cc2b7889af 212
maygup01 0:11cc2b7889af 213 handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED;
maygup01 0:11cc2b7889af 214 handle->context = NULL;
maygup01 0:11cc2b7889af 215
maygup01 0:11cc2b7889af 216 randLIB_get_n_bytes_random(&handle->token_seed, sizeof(handle->token_seed));
maygup01 0:11cc2b7889af 217 if (handle->token_seed == 0) {
maygup01 0:11cc2b7889af 218 handle->token_seed++;
maygup01 0:11cc2b7889af 219 }
maygup01 0:11cc2b7889af 220 return handle;
maygup01 0:11cc2b7889af 221 }
maygup01 0:11cc2b7889af 222
maygup01 0:11cc2b7889af 223 uint16_t sn_nsdl_register_endpoint(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 224 sn_nsdl_ep_parameters_s *endpoint_info_ptr,
maygup01 0:11cc2b7889af 225 const char *uri_query_parameters)
maygup01 0:11cc2b7889af 226 {
maygup01 0:11cc2b7889af 227 /* Local variables */
maygup01 0:11cc2b7889af 228 sn_coap_hdr_s *register_message_ptr;
maygup01 0:11cc2b7889af 229 uint16_t message_id = 0;
maygup01 0:11cc2b7889af 230
maygup01 0:11cc2b7889af 231 if (endpoint_info_ptr == NULL || handle == NULL) {
maygup01 0:11cc2b7889af 232 return 0;
maygup01 0:11cc2b7889af 233 }
maygup01 0:11cc2b7889af 234
maygup01 0:11cc2b7889af 235 // Clear any leftovers from previous registration or bootstrap
maygup01 0:11cc2b7889af 236 sn_nsdl_clear_coap_sent_blockwise_messages(handle);
maygup01 0:11cc2b7889af 237 sn_nsdl_clear_coap_received_blockwise_messages(handle);
maygup01 0:11cc2b7889af 238 sn_nsdl_clear_coap_resending_queue(handle);
maygup01 0:11cc2b7889af 239
maygup01 0:11cc2b7889af 240 /*** Build endpoint register message ***/
maygup01 0:11cc2b7889af 241
maygup01 0:11cc2b7889af 242 handle->is_bs_server = false;
maygup01 0:11cc2b7889af 243
maygup01 0:11cc2b7889af 244 /* Allocate memory for header struct */
maygup01 0:11cc2b7889af 245 register_message_ptr = sn_coap_parser_alloc_message(handle->grs->coap);
maygup01 0:11cc2b7889af 246 if (register_message_ptr == NULL) {
maygup01 0:11cc2b7889af 247 return 0;
maygup01 0:11cc2b7889af 248 }
maygup01 0:11cc2b7889af 249
maygup01 0:11cc2b7889af 250 /* Fill message fields -> confirmable post to specified NSP path */
maygup01 0:11cc2b7889af 251 register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 252 register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST;
maygup01 0:11cc2b7889af 253
maygup01 0:11cc2b7889af 254 /* Allocate memory for the extended options list */
maygup01 0:11cc2b7889af 255 if (sn_coap_parser_alloc_options(handle->grs->coap, register_message_ptr) == NULL) {
maygup01 0:11cc2b7889af 256 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 257 register_message_ptr = 0;
maygup01 0:11cc2b7889af 258 return 0;
maygup01 0:11cc2b7889af 259 }
maygup01 0:11cc2b7889af 260
maygup01 0:11cc2b7889af 261 register_message_ptr->uri_path_len = sizeof(resource_path_ptr);
maygup01 0:11cc2b7889af 262 register_message_ptr->uri_path_ptr = resource_path_ptr;
maygup01 0:11cc2b7889af 263
maygup01 0:11cc2b7889af 264 /* Fill Uri-query options */
maygup01 0:11cc2b7889af 265 if( SN_NSDL_FAILURE == sn_nsdl_fill_uri_query_options(handle, endpoint_info_ptr,
maygup01 0:11cc2b7889af 266 register_message_ptr, SN_NSDL_EP_REGISTER_MESSAGE,
maygup01 0:11cc2b7889af 267 uri_query_parameters) ){
maygup01 0:11cc2b7889af 268 register_message_ptr->uri_path_ptr = NULL;
maygup01 0:11cc2b7889af 269 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 270 return 0;
maygup01 0:11cc2b7889af 271 }
maygup01 0:11cc2b7889af 272
maygup01 0:11cc2b7889af 273 if (endpoint_info_ptr->ds_register_mode == REGISTER_WITH_RESOURCES) {
maygup01 0:11cc2b7889af 274 /* Built body for message */
maygup01 0:11cc2b7889af 275 if (sn_nsdl_build_registration_body(handle, register_message_ptr, 0) == SN_NSDL_FAILURE) {
maygup01 0:11cc2b7889af 276 register_message_ptr->uri_path_ptr = NULL;
maygup01 0:11cc2b7889af 277 register_message_ptr->options_list_ptr->uri_host_ptr = NULL;
maygup01 0:11cc2b7889af 278 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 279 return 0;
maygup01 0:11cc2b7889af 280 }
maygup01 0:11cc2b7889af 281 }
maygup01 0:11cc2b7889af 282 tr_info("REGISTER MESSAGE %.*s", register_message_ptr->payload_len, register_message_ptr->payload_ptr);
maygup01 0:11cc2b7889af 283
maygup01 0:11cc2b7889af 284 /* Clean (possible) existing and save new endpoint info to handle */
maygup01 0:11cc2b7889af 285 if (set_endpoint_info(handle, endpoint_info_ptr) == -1) {
maygup01 0:11cc2b7889af 286
maygup01 0:11cc2b7889af 287 handle->sn_nsdl_free(register_message_ptr->payload_ptr);
maygup01 0:11cc2b7889af 288 register_message_ptr->payload_ptr = NULL;
maygup01 0:11cc2b7889af 289
maygup01 0:11cc2b7889af 290 register_message_ptr->uri_path_ptr = NULL;
maygup01 0:11cc2b7889af 291 register_message_ptr->options_list_ptr->uri_host_ptr = NULL;
maygup01 0:11cc2b7889af 292
maygup01 0:11cc2b7889af 293 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 294
maygup01 0:11cc2b7889af 295 return 0;
maygup01 0:11cc2b7889af 296 }
maygup01 0:11cc2b7889af 297
maygup01 0:11cc2b7889af 298 sn_nsdl_add_token(handle, &handle->register_token, register_message_ptr);
maygup01 0:11cc2b7889af 299
maygup01 0:11cc2b7889af 300 /* Build and send coap message to NSP */
maygup01 0:11cc2b7889af 301 message_id = sn_nsdl_internal_coap_send(handle, register_message_ptr, &handle->server_address);
maygup01 0:11cc2b7889af 302
maygup01 0:11cc2b7889af 303 handle->sn_nsdl_free(register_message_ptr->payload_ptr);
maygup01 0:11cc2b7889af 304 register_message_ptr->payload_ptr = NULL;
maygup01 0:11cc2b7889af 305
maygup01 0:11cc2b7889af 306 register_message_ptr->uri_path_ptr = NULL;
maygup01 0:11cc2b7889af 307 register_message_ptr->options_list_ptr->uri_host_ptr = NULL;
maygup01 0:11cc2b7889af 308
maygup01 0:11cc2b7889af 309 register_message_ptr->token_ptr = NULL;
maygup01 0:11cc2b7889af 310 register_message_ptr->token_len = 0;
maygup01 0:11cc2b7889af 311
maygup01 0:11cc2b7889af 312 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 313
maygup01 0:11cc2b7889af 314 return message_id;
maygup01 0:11cc2b7889af 315 }
maygup01 0:11cc2b7889af 316
maygup01 0:11cc2b7889af 317 int32_t sn_nsdl_unregister_endpoint(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 318 {
maygup01 0:11cc2b7889af 319 /* Local variables */
maygup01 0:11cc2b7889af 320 sn_coap_hdr_s *unregister_message_ptr;
maygup01 0:11cc2b7889af 321 uint8_t *temp_ptr = 0;
maygup01 0:11cc2b7889af 322 int32_t message_id = 0;
maygup01 0:11cc2b7889af 323
maygup01 0:11cc2b7889af 324 /* Check parameters */
maygup01 0:11cc2b7889af 325 if (handle == NULL) {
maygup01 0:11cc2b7889af 326 return 0;
maygup01 0:11cc2b7889af 327 }
maygup01 0:11cc2b7889af 328
maygup01 0:11cc2b7889af 329 /* Check that EP have been registered */
maygup01 0:11cc2b7889af 330 if (sn_nsdl_is_ep_registered(handle)) {
maygup01 0:11cc2b7889af 331
maygup01 0:11cc2b7889af 332 /* Memory allocation for unregister message */
maygup01 0:11cc2b7889af 333 unregister_message_ptr = sn_coap_parser_alloc_message(handle->grs->coap);
maygup01 0:11cc2b7889af 334 if (!unregister_message_ptr) {
maygup01 0:11cc2b7889af 335 return 0;
maygup01 0:11cc2b7889af 336 }
maygup01 0:11cc2b7889af 337
maygup01 0:11cc2b7889af 338 /* Fill unregister message */
maygup01 0:11cc2b7889af 339 unregister_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 340 unregister_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_DELETE;
maygup01 0:11cc2b7889af 341
maygup01 0:11cc2b7889af 342 if(handle->ep_information_ptr->location_ptr) {
maygup01 0:11cc2b7889af 343 unregister_message_ptr->uri_path_len = handle->ep_information_ptr->location_len;
maygup01 0:11cc2b7889af 344 unregister_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(unregister_message_ptr->uri_path_len);
maygup01 0:11cc2b7889af 345 if (!unregister_message_ptr->uri_path_ptr) {
maygup01 0:11cc2b7889af 346 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr);
maygup01 0:11cc2b7889af 347 return 0;
maygup01 0:11cc2b7889af 348 }
maygup01 0:11cc2b7889af 349
maygup01 0:11cc2b7889af 350 temp_ptr = unregister_message_ptr->uri_path_ptr;
maygup01 0:11cc2b7889af 351
maygup01 0:11cc2b7889af 352 memcpy(temp_ptr , handle->ep_information_ptr->location_ptr, handle->ep_information_ptr->location_len);
maygup01 0:11cc2b7889af 353 } else {
maygup01 0:11cc2b7889af 354 unregister_message_ptr->uri_path_len = (RESOURCE_DIR_LEN + 1 + handle->ep_information_ptr->domain_name_len + 1 + handle->ep_information_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 355 unregister_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(unregister_message_ptr->uri_path_len);
maygup01 0:11cc2b7889af 356 if (!unregister_message_ptr->uri_path_ptr) {
maygup01 0:11cc2b7889af 357 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr);
maygup01 0:11cc2b7889af 358 return 0;
maygup01 0:11cc2b7889af 359 }
maygup01 0:11cc2b7889af 360
maygup01 0:11cc2b7889af 361 temp_ptr = unregister_message_ptr->uri_path_ptr;
maygup01 0:11cc2b7889af 362
maygup01 0:11cc2b7889af 363 memcpy(temp_ptr, resource_path_ptr, RESOURCE_DIR_LEN);
maygup01 0:11cc2b7889af 364 temp_ptr += RESOURCE_DIR_LEN;
maygup01 0:11cc2b7889af 365
maygup01 0:11cc2b7889af 366 *temp_ptr++ = '/';
maygup01 0:11cc2b7889af 367
maygup01 0:11cc2b7889af 368 memcpy(temp_ptr , handle->ep_information_ptr->domain_name_ptr, handle->ep_information_ptr->domain_name_len);
maygup01 0:11cc2b7889af 369 temp_ptr += handle->ep_information_ptr->domain_name_len;
maygup01 0:11cc2b7889af 370
maygup01 0:11cc2b7889af 371 *temp_ptr++ = '/';
maygup01 0:11cc2b7889af 372
maygup01 0:11cc2b7889af 373 memcpy(temp_ptr , handle->ep_information_ptr->endpoint_name_ptr, handle->ep_information_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 374 }
maygup01 0:11cc2b7889af 375
maygup01 0:11cc2b7889af 376 sn_nsdl_add_token(handle, &handle->unregister_token, unregister_message_ptr);
maygup01 0:11cc2b7889af 377
maygup01 0:11cc2b7889af 378 /* Send message */
maygup01 0:11cc2b7889af 379 message_id = sn_nsdl_internal_coap_send(handle, unregister_message_ptr, &handle->server_address);
maygup01 0:11cc2b7889af 380
maygup01 0:11cc2b7889af 381 unregister_message_ptr->token_ptr = NULL;
maygup01 0:11cc2b7889af 382 unregister_message_ptr->token_len = 0;
maygup01 0:11cc2b7889af 383
maygup01 0:11cc2b7889af 384 /* Free memory */
maygup01 0:11cc2b7889af 385 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr);
maygup01 0:11cc2b7889af 386
maygup01 0:11cc2b7889af 387 }
maygup01 0:11cc2b7889af 388
maygup01 0:11cc2b7889af 389 return message_id;
maygup01 0:11cc2b7889af 390 }
maygup01 0:11cc2b7889af 391
maygup01 0:11cc2b7889af 392 int32_t sn_nsdl_update_registration(struct nsdl_s *handle, uint8_t *lt_ptr, uint8_t lt_len)
maygup01 0:11cc2b7889af 393 {
maygup01 0:11cc2b7889af 394 /* Local variables */
maygup01 0:11cc2b7889af 395 sn_coap_hdr_s *register_message_ptr;
maygup01 0:11cc2b7889af 396 uint8_t *temp_ptr;
maygup01 0:11cc2b7889af 397 sn_nsdl_ep_parameters_s temp_parameters;
maygup01 0:11cc2b7889af 398 int32_t message_id = 0;
maygup01 0:11cc2b7889af 399
maygup01 0:11cc2b7889af 400 /* Check parameters */
maygup01 0:11cc2b7889af 401 if (handle == NULL) {
maygup01 0:11cc2b7889af 402 return -1;
maygup01 0:11cc2b7889af 403 }
maygup01 0:11cc2b7889af 404
maygup01 0:11cc2b7889af 405 if (!sn_nsdl_is_ep_registered(handle)){
maygup01 0:11cc2b7889af 406 return -1;
maygup01 0:11cc2b7889af 407 }
maygup01 0:11cc2b7889af 408
maygup01 0:11cc2b7889af 409 memset(&temp_parameters, 0, sizeof(sn_nsdl_ep_parameters_s));
maygup01 0:11cc2b7889af 410
maygup01 0:11cc2b7889af 411 temp_parameters.lifetime_len = lt_len;
maygup01 0:11cc2b7889af 412 temp_parameters.lifetime_ptr = lt_ptr;
maygup01 0:11cc2b7889af 413
maygup01 0:11cc2b7889af 414 if (handle->ep_information_ptr) {
maygup01 0:11cc2b7889af 415 temp_parameters.type_len = handle->ep_information_ptr->type_len;
maygup01 0:11cc2b7889af 416 temp_parameters.type_ptr = handle->ep_information_ptr->type_ptr;
maygup01 0:11cc2b7889af 417 }
maygup01 0:11cc2b7889af 418
maygup01 0:11cc2b7889af 419 /*** Build endpoint register update message ***/
maygup01 0:11cc2b7889af 420
maygup01 0:11cc2b7889af 421 /* Allocate memory for header struct */
maygup01 0:11cc2b7889af 422 register_message_ptr = sn_coap_parser_alloc_message(handle->grs->coap);
maygup01 0:11cc2b7889af 423 if (register_message_ptr == NULL) {
maygup01 0:11cc2b7889af 424 return -2;
maygup01 0:11cc2b7889af 425 }
maygup01 0:11cc2b7889af 426
maygup01 0:11cc2b7889af 427 /* Fill message fields -> confirmable post to specified NSP path */
maygup01 0:11cc2b7889af 428 register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 429 register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST;
maygup01 0:11cc2b7889af 430
maygup01 0:11cc2b7889af 431 if(handle->ep_information_ptr->location_ptr) {
maygup01 0:11cc2b7889af 432 register_message_ptr->uri_path_len = handle->ep_information_ptr->location_len; /* = Only location set by Device Server*/
maygup01 0:11cc2b7889af 433
maygup01 0:11cc2b7889af 434 register_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(register_message_ptr->uri_path_len);
maygup01 0:11cc2b7889af 435 if (!register_message_ptr->uri_path_ptr) {
maygup01 0:11cc2b7889af 436 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 437 return -2;
maygup01 0:11cc2b7889af 438 }
maygup01 0:11cc2b7889af 439
maygup01 0:11cc2b7889af 440 temp_ptr = register_message_ptr->uri_path_ptr;
maygup01 0:11cc2b7889af 441
maygup01 0:11cc2b7889af 442 /* location */
maygup01 0:11cc2b7889af 443 memcpy(temp_ptr, handle->ep_information_ptr->location_ptr, handle->ep_information_ptr->location_len);
maygup01 0:11cc2b7889af 444 } else {
maygup01 0:11cc2b7889af 445 register_message_ptr->uri_path_len = sizeof(resource_path_ptr) + handle->ep_information_ptr->domain_name_len + handle->ep_information_ptr->endpoint_name_len + 2; /* = rd/domain/endpoint */
maygup01 0:11cc2b7889af 446
maygup01 0:11cc2b7889af 447 register_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(register_message_ptr->uri_path_len);
maygup01 0:11cc2b7889af 448 if (!register_message_ptr->uri_path_ptr) {
maygup01 0:11cc2b7889af 449 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 450 return -2;
maygup01 0:11cc2b7889af 451 }
maygup01 0:11cc2b7889af 452
maygup01 0:11cc2b7889af 453 temp_ptr = register_message_ptr->uri_path_ptr;
maygup01 0:11cc2b7889af 454
maygup01 0:11cc2b7889af 455 /* rd/ */
maygup01 0:11cc2b7889af 456 memcpy(temp_ptr, resource_path_ptr, sizeof(resource_path_ptr));
maygup01 0:11cc2b7889af 457 temp_ptr += sizeof(resource_path_ptr);
maygup01 0:11cc2b7889af 458 *temp_ptr++ = '/';
maygup01 0:11cc2b7889af 459
maygup01 0:11cc2b7889af 460 /* rd/DOMAIN/ */
maygup01 0:11cc2b7889af 461 memcpy(temp_ptr, handle->ep_information_ptr->domain_name_ptr, handle->ep_information_ptr->domain_name_len);
maygup01 0:11cc2b7889af 462 temp_ptr += handle->ep_information_ptr->domain_name_len;
maygup01 0:11cc2b7889af 463 *temp_ptr++ = '/';
maygup01 0:11cc2b7889af 464
maygup01 0:11cc2b7889af 465 /* rd/domain/ENDPOINT */
maygup01 0:11cc2b7889af 466 memcpy(temp_ptr, handle->ep_information_ptr->endpoint_name_ptr, handle->ep_information_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 467 }
maygup01 0:11cc2b7889af 468
maygup01 0:11cc2b7889af 469 /* Allocate memory for the extended options list */
maygup01 0:11cc2b7889af 470 if (sn_coap_parser_alloc_options(handle->grs->coap, register_message_ptr) == NULL) {
maygup01 0:11cc2b7889af 471 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 472 return -2;
maygup01 0:11cc2b7889af 473 }
maygup01 0:11cc2b7889af 474
maygup01 0:11cc2b7889af 475 /* Fill Uri-query options */
maygup01 0:11cc2b7889af 476 sn_nsdl_fill_uri_query_options(handle, &temp_parameters, register_message_ptr, SN_NSDL_EP_UPDATE_MESSAGE, NULL);
maygup01 0:11cc2b7889af 477
maygup01 0:11cc2b7889af 478 /* Build payload */
maygup01 0:11cc2b7889af 479 if (handle->ep_information_ptr->ds_register_mode == REGISTER_WITH_RESOURCES) {
maygup01 0:11cc2b7889af 480 if (sn_nsdl_build_registration_body(handle, register_message_ptr, 1) == SN_NSDL_FAILURE) {
maygup01 0:11cc2b7889af 481 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 482 return -2;
maygup01 0:11cc2b7889af 483 }
maygup01 0:11cc2b7889af 484 }
maygup01 0:11cc2b7889af 485
maygup01 0:11cc2b7889af 486 // Remove previous update reg message from the queue if exists
maygup01 0:11cc2b7889af 487
maygup01 0:11cc2b7889af 488 sn_nsdl_remove_msg_from_retransmission(handle,
maygup01 0:11cc2b7889af 489 (uint8_t*)&handle->update_register_token,
maygup01 0:11cc2b7889af 490 sizeof(handle->update_register_token));
maygup01 0:11cc2b7889af 491
maygup01 0:11cc2b7889af 492 sn_nsdl_add_token(handle, &handle->update_register_token, register_message_ptr);
maygup01 0:11cc2b7889af 493
maygup01 0:11cc2b7889af 494 /* Build and send coap message to NSP */
maygup01 0:11cc2b7889af 495 message_id = sn_nsdl_internal_coap_send(handle, register_message_ptr, &handle->server_address);
maygup01 0:11cc2b7889af 496
maygup01 0:11cc2b7889af 497 register_message_ptr->token_ptr = NULL;
maygup01 0:11cc2b7889af 498 register_message_ptr->token_len = 0;
maygup01 0:11cc2b7889af 499
maygup01 0:11cc2b7889af 500 handle->sn_nsdl_free(register_message_ptr->payload_ptr);
maygup01 0:11cc2b7889af 501
maygup01 0:11cc2b7889af 502 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr);
maygup01 0:11cc2b7889af 503
maygup01 0:11cc2b7889af 504 if (message_id == 0) {
maygup01 0:11cc2b7889af 505 // Failure when sending
maygup01 0:11cc2b7889af 506 return -2;
maygup01 0:11cc2b7889af 507 }
maygup01 0:11cc2b7889af 508
maygup01 0:11cc2b7889af 509 return message_id;
maygup01 0:11cc2b7889af 510 }
maygup01 0:11cc2b7889af 511
maygup01 0:11cc2b7889af 512 int8_t sn_nsdl_set_endpoint_location(struct nsdl_s *handle, uint8_t *location_ptr, uint8_t location_len)
maygup01 0:11cc2b7889af 513 {
maygup01 0:11cc2b7889af 514 if(!handle || !location_ptr || (location_len == 0)) {
maygup01 0:11cc2b7889af 515 return -1;
maygup01 0:11cc2b7889af 516 }
maygup01 0:11cc2b7889af 517
maygup01 0:11cc2b7889af 518 handle->sn_nsdl_free(handle->ep_information_ptr->location_ptr);
maygup01 0:11cc2b7889af 519 handle->ep_information_ptr->location_ptr = handle->sn_nsdl_alloc(location_len);
maygup01 0:11cc2b7889af 520 memcpy(handle->ep_information_ptr->location_ptr, location_ptr, location_len);
maygup01 0:11cc2b7889af 521 handle->ep_information_ptr->location_len = location_len;
maygup01 0:11cc2b7889af 522
maygup01 0:11cc2b7889af 523 return 0;
maygup01 0:11cc2b7889af 524 }
maygup01 0:11cc2b7889af 525
maygup01 0:11cc2b7889af 526 void sn_nsdl_nsp_lost(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 527 {
maygup01 0:11cc2b7889af 528 /* Check parameters */
maygup01 0:11cc2b7889af 529 if (handle == NULL) {
maygup01 0:11cc2b7889af 530 return;
maygup01 0:11cc2b7889af 531 }
maygup01 0:11cc2b7889af 532
maygup01 0:11cc2b7889af 533 handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED;
maygup01 0:11cc2b7889af 534 }
maygup01 0:11cc2b7889af 535
maygup01 0:11cc2b7889af 536 int8_t sn_nsdl_is_ep_registered(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 537 {
maygup01 0:11cc2b7889af 538 /* Check parameters */
maygup01 0:11cc2b7889af 539 if (handle == NULL) {
maygup01 0:11cc2b7889af 540 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 541 }
maygup01 0:11cc2b7889af 542
maygup01 0:11cc2b7889af 543 return handle->sn_nsdl_endpoint_registered;
maygup01 0:11cc2b7889af 544 }
maygup01 0:11cc2b7889af 545
maygup01 0:11cc2b7889af 546 int32_t sn_nsdl_send_observation_notification(struct nsdl_s *handle, uint8_t *token_ptr, uint8_t token_len,
maygup01 0:11cc2b7889af 547 uint8_t *payload_ptr, uint16_t payload_len, sn_coap_observe_e observe, sn_coap_msg_type_e message_type,
maygup01 0:11cc2b7889af 548 sn_coap_content_format_e content_format,
maygup01 0:11cc2b7889af 549 const int32_t message_id)
maygup01 0:11cc2b7889af 550 {
maygup01 0:11cc2b7889af 551 sn_coap_hdr_s *notification_message_ptr;
maygup01 0:11cc2b7889af 552 int32_t return_msg_id = 0;
maygup01 0:11cc2b7889af 553
maygup01 0:11cc2b7889af 554 /* Check parameters */
maygup01 0:11cc2b7889af 555 if (handle == NULL || handle->grs == NULL || token_len == 0) {
maygup01 0:11cc2b7889af 556 return 0;
maygup01 0:11cc2b7889af 557 }
maygup01 0:11cc2b7889af 558
maygup01 0:11cc2b7889af 559 /* Allocate and initialize memory for header struct */
maygup01 0:11cc2b7889af 560 notification_message_ptr = sn_coap_parser_alloc_message(handle->grs->coap);
maygup01 0:11cc2b7889af 561 if (notification_message_ptr == NULL) {
maygup01 0:11cc2b7889af 562 return 0;
maygup01 0:11cc2b7889af 563 }
maygup01 0:11cc2b7889af 564
maygup01 0:11cc2b7889af 565 if (sn_coap_parser_alloc_options(handle->grs->coap, notification_message_ptr) == NULL) {
maygup01 0:11cc2b7889af 566 handle->sn_nsdl_free(notification_message_ptr);
maygup01 0:11cc2b7889af 567 return 0;
maygup01 0:11cc2b7889af 568 }
maygup01 0:11cc2b7889af 569
maygup01 0:11cc2b7889af 570 /* Fill header */
maygup01 0:11cc2b7889af 571 notification_message_ptr->msg_type = message_type;
maygup01 0:11cc2b7889af 572 notification_message_ptr->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
maygup01 0:11cc2b7889af 573
maygup01 0:11cc2b7889af 574 /* Fill token */
maygup01 0:11cc2b7889af 575 notification_message_ptr->token_len = token_len;
maygup01 0:11cc2b7889af 576 notification_message_ptr->token_ptr = token_ptr;
maygup01 0:11cc2b7889af 577
maygup01 0:11cc2b7889af 578 /* Fill payload */
maygup01 0:11cc2b7889af 579 notification_message_ptr->payload_len = payload_len;
maygup01 0:11cc2b7889af 580 notification_message_ptr->payload_ptr = payload_ptr;
maygup01 0:11cc2b7889af 581
maygup01 0:11cc2b7889af 582 /* Fill observe */
maygup01 0:11cc2b7889af 583 notification_message_ptr->options_list_ptr->observe = observe;
maygup01 0:11cc2b7889af 584
maygup01 0:11cc2b7889af 585 /* Fill content format */
maygup01 0:11cc2b7889af 586 notification_message_ptr->content_format = content_format;
maygup01 0:11cc2b7889af 587
maygup01 0:11cc2b7889af 588 if (message_id != -1) {
maygup01 0:11cc2b7889af 589 notification_message_ptr->msg_id = message_id;
maygup01 0:11cc2b7889af 590 }
maygup01 0:11cc2b7889af 591
maygup01 0:11cc2b7889af 592 /* Send message */
maygup01 0:11cc2b7889af 593 return_msg_id = sn_nsdl_send_coap_message(handle, &handle->server_address, notification_message_ptr);
maygup01 0:11cc2b7889af 594 if (return_msg_id >= SN_NSDL_SUCCESS) {
maygup01 0:11cc2b7889af 595 return_msg_id = notification_message_ptr->msg_id;
maygup01 0:11cc2b7889af 596 }
maygup01 0:11cc2b7889af 597
maygup01 0:11cc2b7889af 598 /* Free memory */
maygup01 0:11cc2b7889af 599 notification_message_ptr->payload_ptr = NULL;
maygup01 0:11cc2b7889af 600 notification_message_ptr->token_ptr = NULL;
maygup01 0:11cc2b7889af 601
maygup01 0:11cc2b7889af 602 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, notification_message_ptr);
maygup01 0:11cc2b7889af 603
maygup01 0:11cc2b7889af 604 return return_msg_id;
maygup01 0:11cc2b7889af 605 }
maygup01 0:11cc2b7889af 606
maygup01 0:11cc2b7889af 607 /* * * * * * * * * * */
maygup01 0:11cc2b7889af 608 /* ~ OMA functions ~ */
maygup01 0:11cc2b7889af 609 /* * * * * * * * * * */
maygup01 0:11cc2b7889af 610
maygup01 0:11cc2b7889af 611 uint16_t sn_nsdl_oma_bootstrap(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 612 sn_nsdl_addr_s *bootstrap_address_ptr,
maygup01 0:11cc2b7889af 613 sn_nsdl_ep_parameters_s *endpoint_info_ptr,
maygup01 0:11cc2b7889af 614 const char *uri_query_parameters)
maygup01 0:11cc2b7889af 615 {
maygup01 0:11cc2b7889af 616 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 617 /* Local variables */
maygup01 0:11cc2b7889af 618 sn_coap_hdr_s bootstrap_coap_header;
maygup01 0:11cc2b7889af 619 uint8_t *uri_query_tmp_ptr;
maygup01 0:11cc2b7889af 620 uint16_t message_id = 0;
maygup01 0:11cc2b7889af 621
maygup01 0:11cc2b7889af 622 /* Check parameters */
maygup01 0:11cc2b7889af 623 if (!bootstrap_address_ptr || !endpoint_info_ptr || !handle) {
maygup01 0:11cc2b7889af 624 return 0;
maygup01 0:11cc2b7889af 625 }
maygup01 0:11cc2b7889af 626
maygup01 0:11cc2b7889af 627 if (set_NSP_address(handle,
maygup01 0:11cc2b7889af 628 bootstrap_address_ptr->addr_ptr,
maygup01 0:11cc2b7889af 629 bootstrap_address_ptr->addr_len,
maygup01 0:11cc2b7889af 630 bootstrap_address_ptr->port,
maygup01 0:11cc2b7889af 631 bootstrap_address_ptr->type) == SN_NSDL_FAILURE) {
maygup01 0:11cc2b7889af 632 return 0;
maygup01 0:11cc2b7889af 633 }
maygup01 0:11cc2b7889af 634
maygup01 0:11cc2b7889af 635 handle->is_bs_server = true;
maygup01 0:11cc2b7889af 636
maygup01 0:11cc2b7889af 637 /* XXX FIX -- Init CoAP header struct */
maygup01 0:11cc2b7889af 638 sn_coap_parser_init_message(&bootstrap_coap_header);
maygup01 0:11cc2b7889af 639
maygup01 0:11cc2b7889af 640 if (!sn_coap_parser_alloc_options(handle->grs->coap, &bootstrap_coap_header)) {
maygup01 0:11cc2b7889af 641 return 0;
maygup01 0:11cc2b7889af 642 }
maygup01 0:11cc2b7889af 643
maygup01 0:11cc2b7889af 644 /* Build bootstrap start message */
maygup01 0:11cc2b7889af 645 bootstrap_coap_header.msg_code = COAP_MSG_CODE_REQUEST_POST;
maygup01 0:11cc2b7889af 646 bootstrap_coap_header.msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 647
maygup01 0:11cc2b7889af 648 bootstrap_coap_header.uri_path_ptr = bs_uri;
maygup01 0:11cc2b7889af 649 bootstrap_coap_header.uri_path_len = sizeof(bs_uri);
maygup01 0:11cc2b7889af 650
maygup01 0:11cc2b7889af 651 size_t query_len = endpoint_info_ptr->endpoint_name_len + BS_EP_PARAMETER_LEN;
maygup01 0:11cc2b7889af 652 size_t optional_params_len = 0;
maygup01 0:11cc2b7889af 653 if (uri_query_parameters) {
maygup01 0:11cc2b7889af 654 optional_params_len = strlen(uri_query_parameters);
maygup01 0:11cc2b7889af 655 }
maygup01 0:11cc2b7889af 656
maygup01 0:11cc2b7889af 657 query_len += optional_params_len;
maygup01 0:11cc2b7889af 658
maygup01 0:11cc2b7889af 659 if (query_len > MAX_URI_QUERY_LEN) {
maygup01 0:11cc2b7889af 660 handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr);
maygup01 0:11cc2b7889af 661 tr_error("sn_nsdl_oma_bootstrap - max param length reached (%lu)", (unsigned long)query_len);
maygup01 0:11cc2b7889af 662 return 0;
maygup01 0:11cc2b7889af 663 }
maygup01 0:11cc2b7889af 664
maygup01 0:11cc2b7889af 665 uri_query_tmp_ptr = handle->sn_nsdl_alloc(query_len);
maygup01 0:11cc2b7889af 666 if (!uri_query_tmp_ptr) {
maygup01 0:11cc2b7889af 667 handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr);
maygup01 0:11cc2b7889af 668 return 0;
maygup01 0:11cc2b7889af 669 }
maygup01 0:11cc2b7889af 670
maygup01 0:11cc2b7889af 671 memcpy(uri_query_tmp_ptr, bs_ep_name, BS_EP_PARAMETER_LEN);
maygup01 0:11cc2b7889af 672 memcpy((uri_query_tmp_ptr + BS_EP_PARAMETER_LEN),
maygup01 0:11cc2b7889af 673 endpoint_info_ptr->endpoint_name_ptr,
maygup01 0:11cc2b7889af 674 endpoint_info_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 675
maygup01 0:11cc2b7889af 676 if (optional_params_len > 0) {
maygup01 0:11cc2b7889af 677 memcpy(uri_query_tmp_ptr + endpoint_info_ptr->endpoint_name_len + BS_EP_PARAMETER_LEN,
maygup01 0:11cc2b7889af 678 uri_query_parameters,
maygup01 0:11cc2b7889af 679 optional_params_len);
maygup01 0:11cc2b7889af 680 }
maygup01 0:11cc2b7889af 681
maygup01 0:11cc2b7889af 682 bootstrap_coap_header.options_list_ptr->uri_query_len = query_len;
maygup01 0:11cc2b7889af 683 bootstrap_coap_header.options_list_ptr->uri_query_ptr = uri_query_tmp_ptr;
maygup01 0:11cc2b7889af 684
maygup01 0:11cc2b7889af 685 /* Save bootstrap server address */
maygup01 0:11cc2b7889af 686 sn_nsdl_add_token(handle, &handle->bootstrap_token, &bootstrap_coap_header);
maygup01 0:11cc2b7889af 687
maygup01 0:11cc2b7889af 688 /* Send message */
maygup01 0:11cc2b7889af 689 message_id = sn_nsdl_internal_coap_send(handle, &bootstrap_coap_header, bootstrap_address_ptr);
maygup01 0:11cc2b7889af 690
maygup01 0:11cc2b7889af 691 /* Free allocated memory */
maygup01 0:11cc2b7889af 692 handle->sn_nsdl_free(uri_query_tmp_ptr);
maygup01 0:11cc2b7889af 693 handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr);
maygup01 0:11cc2b7889af 694
maygup01 0:11cc2b7889af 695 return message_id;
maygup01 0:11cc2b7889af 696 #else
maygup01 0:11cc2b7889af 697 return 0;
maygup01 0:11cc2b7889af 698 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 699
maygup01 0:11cc2b7889af 700 }
maygup01 0:11cc2b7889af 701
maygup01 0:11cc2b7889af 702 char *sn_nsdl_get_version(void)
maygup01 0:11cc2b7889af 703 {
maygup01 0:11cc2b7889af 704 #if defined(YOTTA_MBED_CLIENT_C_VERSION_STRING)
maygup01 0:11cc2b7889af 705 return YOTTA_MBED_CLIENT_C_VERSION_STRING;
maygup01 0:11cc2b7889af 706 #elif defined(VERSION)
maygup01 0:11cc2b7889af 707 return VERSION;
maygup01 0:11cc2b7889af 708 #else
maygup01 0:11cc2b7889af 709 return "0.0.0";
maygup01 0:11cc2b7889af 710 #endif
maygup01 0:11cc2b7889af 711 }
maygup01 0:11cc2b7889af 712
maygup01 0:11cc2b7889af 713 int8_t sn_nsdl_process_coap(struct nsdl_s *handle, uint8_t *packet_ptr, uint16_t packet_len, sn_nsdl_addr_s *src_ptr)
maygup01 0:11cc2b7889af 714 {
maygup01 0:11cc2b7889af 715 sn_coap_hdr_s *coap_packet_ptr = NULL;
maygup01 0:11cc2b7889af 716 sn_coap_hdr_s *coap_response_ptr = NULL;
maygup01 0:11cc2b7889af 717 sn_nsdl_dynamic_resource_parameters_s *resource = NULL;
maygup01 0:11cc2b7889af 718 /* Check parameters */
maygup01 0:11cc2b7889af 719 if (handle == NULL) {
maygup01 0:11cc2b7889af 720 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 721 }
maygup01 0:11cc2b7889af 722
maygup01 0:11cc2b7889af 723 /* Parse CoAP packet */
maygup01 0:11cc2b7889af 724 coap_packet_ptr = sn_coap_protocol_parse(handle->grs->coap, src_ptr, packet_len, packet_ptr, (void *)handle);
maygup01 0:11cc2b7889af 725
maygup01 0:11cc2b7889af 726 /* Check if parsing was successfull */
maygup01 0:11cc2b7889af 727 if (coap_packet_ptr == (sn_coap_hdr_s *)NULL) {
maygup01 0:11cc2b7889af 728 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 729 }
maygup01 0:11cc2b7889af 730 sn_nsdl_print_coap_data(coap_packet_ptr, false);
maygup01 0:11cc2b7889af 731
maygup01 0:11cc2b7889af 732 #if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE
maygup01 0:11cc2b7889af 733 // Pass block to application if external_memory_block is set
maygup01 0:11cc2b7889af 734 if((coap_packet_ptr->options_list_ptr &&
maygup01 0:11cc2b7889af 735 coap_packet_ptr->options_list_ptr->block1 != -1) &&
maygup01 0:11cc2b7889af 736 (coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING ||
maygup01 0:11cc2b7889af 737 coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED)) {
maygup01 0:11cc2b7889af 738 // Block 1 handling
maygup01 0:11cc2b7889af 739 /* Get resource */
maygup01 0:11cc2b7889af 740 char* path = handle->sn_nsdl_alloc(coap_packet_ptr->uri_path_len + 1);
maygup01 0:11cc2b7889af 741 if (!path) {
maygup01 0:11cc2b7889af 742 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 743 }
maygup01 0:11cc2b7889af 744
maygup01 0:11cc2b7889af 745 memcpy(path,
maygup01 0:11cc2b7889af 746 coap_packet_ptr->uri_path_ptr,
maygup01 0:11cc2b7889af 747 coap_packet_ptr->uri_path_len);
maygup01 0:11cc2b7889af 748 path[coap_packet_ptr->uri_path_len] = '\0';
maygup01 0:11cc2b7889af 749
maygup01 0:11cc2b7889af 750
maygup01 0:11cc2b7889af 751 resource = sn_nsdl_get_resource(handle, path);
maygup01 0:11cc2b7889af 752 handle->sn_nsdl_free(path);
maygup01 0:11cc2b7889af 753
maygup01 0:11cc2b7889af 754 if (coap_packet_ptr->options_list_ptr) {
maygup01 0:11cc2b7889af 755 if(resource &&
maygup01 0:11cc2b7889af 756 resource->static_resource_parameters->external_memory_block &&
maygup01 0:11cc2b7889af 757 coap_packet_ptr->options_list_ptr->block1) {
maygup01 0:11cc2b7889af 758
maygup01 0:11cc2b7889af 759 uint32_t block_number = coap_packet_ptr->options_list_ptr->block1 >> 4;
maygup01 0:11cc2b7889af 760 if (block_number) {
maygup01 0:11cc2b7889af 761 remove_previous_block_data(handle, src_ptr, block_number);
maygup01 0:11cc2b7889af 762 }
maygup01 0:11cc2b7889af 763
maygup01 0:11cc2b7889af 764 // Whole message received --> pass only the last block data to application
maygup01 0:11cc2b7889af 765 if (coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED) {
maygup01 0:11cc2b7889af 766 // Get the block size
maygup01 0:11cc2b7889af 767 uint8_t temp = (coap_packet_ptr->options_list_ptr->block1 & 0x07);
maygup01 0:11cc2b7889af 768 uint16_t block_size = 1u << (temp + 4);
maygup01 0:11cc2b7889af 769
maygup01 0:11cc2b7889af 770 uint32_t new_payload_len = coap_packet_ptr->payload_len - block_size;
maygup01 0:11cc2b7889af 771 uint8_t *temp_ptr = handle->grs->coap->sn_coap_protocol_malloc(new_payload_len);
maygup01 0:11cc2b7889af 772 if (temp_ptr) {
maygup01 0:11cc2b7889af 773 // Skip the second last block data since it's still stored in mbed-coap list!
maygup01 0:11cc2b7889af 774 memcpy(temp_ptr, coap_packet_ptr->payload_ptr + block_size, new_payload_len);
maygup01 0:11cc2b7889af 775 handle->grs->coap->sn_coap_protocol_free(coap_packet_ptr->payload_ptr);
maygup01 0:11cc2b7889af 776 coap_packet_ptr->payload_ptr = NULL;
maygup01 0:11cc2b7889af 777
maygup01 0:11cc2b7889af 778 coap_packet_ptr->payload_ptr = handle->grs->coap->sn_coap_protocol_malloc(new_payload_len);
maygup01 0:11cc2b7889af 779 if (coap_packet_ptr->payload_ptr) {
maygup01 0:11cc2b7889af 780 memcpy(coap_packet_ptr->payload_ptr, temp_ptr, new_payload_len);
maygup01 0:11cc2b7889af 781 coap_packet_ptr->payload_len = new_payload_len;
maygup01 0:11cc2b7889af 782 }
maygup01 0:11cc2b7889af 783
maygup01 0:11cc2b7889af 784 handle->grs->coap->sn_coap_protocol_free(temp_ptr);
maygup01 0:11cc2b7889af 785 }
maygup01 0:11cc2b7889af 786 }
maygup01 0:11cc2b7889af 787 } else {
maygup01 0:11cc2b7889af 788 resource = NULL;
maygup01 0:11cc2b7889af 789 }
maygup01 0:11cc2b7889af 790 } else {
maygup01 0:11cc2b7889af 791 resource = NULL;
maygup01 0:11cc2b7889af 792 }
maygup01 0:11cc2b7889af 793 }
maygup01 0:11cc2b7889af 794 #endif
maygup01 0:11cc2b7889af 795
maygup01 0:11cc2b7889af 796 // Handling of GET responses
maygup01 0:11cc2b7889af 797 if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_CONTENT) {
maygup01 0:11cc2b7889af 798 bool data_updated = false;
maygup01 0:11cc2b7889af 799 if (coap_packet_ptr->options_list_ptr && coap_packet_ptr->options_list_ptr->block2 != -1) {
maygup01 0:11cc2b7889af 800 uint32_t block_number = coap_packet_ptr->options_list_ptr->block2 >> 4;
maygup01 0:11cc2b7889af 801 if (block_number) {
maygup01 0:11cc2b7889af 802 remove_previous_block_data(handle, src_ptr, block_number);
maygup01 0:11cc2b7889af 803 }
maygup01 0:11cc2b7889af 804
maygup01 0:11cc2b7889af 805 // Modify payload to have only last received block data
maygup01 0:11cc2b7889af 806 data_updated = update_last_block_data(handle, coap_packet_ptr, false);
maygup01 0:11cc2b7889af 807 }
maygup01 0:11cc2b7889af 808
maygup01 0:11cc2b7889af 809 handle->sn_nsdl_rx_callback(handle, coap_packet_ptr, src_ptr);
maygup01 0:11cc2b7889af 810 if (data_updated) {
maygup01 0:11cc2b7889af 811 handle->grs->coap->sn_coap_protocol_free(coap_packet_ptr->payload_ptr);
maygup01 0:11cc2b7889af 812 }
maygup01 0:11cc2b7889af 813
maygup01 0:11cc2b7889af 814 #if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE
maygup01 0:11cc2b7889af 815 // Remove sent blockwise message(GET request) from the linked list.
maygup01 0:11cc2b7889af 816 sn_coap_protocol_remove_sent_blockwise_message(handle->grs->coap, coap_packet_ptr->msg_id);
maygup01 0:11cc2b7889af 817 #endif
maygup01 0:11cc2b7889af 818
maygup01 0:11cc2b7889af 819 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 820 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 821 }
maygup01 0:11cc2b7889af 822
maygup01 0:11cc2b7889af 823 /* Check, if coap itself sends response, or block receiving is ongoing... */
maygup01 0:11cc2b7889af 824 if (coap_packet_ptr->coap_status != COAP_STATUS_OK &&
maygup01 0:11cc2b7889af 825 coap_packet_ptr->coap_status != COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED &&
maygup01 0:11cc2b7889af 826 coap_packet_ptr &&
maygup01 0:11cc2b7889af 827 !resource) {
maygup01 0:11cc2b7889af 828 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 829 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 830 }
maygup01 0:11cc2b7889af 831
maygup01 0:11cc2b7889af 832 /* If proxy options added, return not supported */
maygup01 0:11cc2b7889af 833 if (coap_packet_ptr->options_list_ptr) {
maygup01 0:11cc2b7889af 834 if (coap_packet_ptr->options_list_ptr->proxy_uri_len) {
maygup01 0:11cc2b7889af 835 coap_response_ptr = sn_coap_build_response(handle->grs->coap, coap_packet_ptr, COAP_MSG_CODE_RESPONSE_PROXYING_NOT_SUPPORTED);
maygup01 0:11cc2b7889af 836 if (coap_response_ptr) {
maygup01 0:11cc2b7889af 837 sn_nsdl_send_coap_message(handle, src_ptr, coap_response_ptr);
maygup01 0:11cc2b7889af 838 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_response_ptr);
maygup01 0:11cc2b7889af 839 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 840 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 841 } else {
maygup01 0:11cc2b7889af 842 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 843 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 844 }
maygup01 0:11cc2b7889af 845 }
maygup01 0:11cc2b7889af 846 }
maygup01 0:11cc2b7889af 847
maygup01 0:11cc2b7889af 848 /* * * * * * * * * * * * * * * * * * * * * * * * * * */
maygup01 0:11cc2b7889af 849 /* If message is response message, call RX callback */
maygup01 0:11cc2b7889af 850 /* * * * * * * * * * * * * * * * * * * * * * * * * * */
maygup01 0:11cc2b7889af 851
maygup01 0:11cc2b7889af 852 if (((coap_packet_ptr->msg_code > COAP_MSG_CODE_REQUEST_DELETE) ||
maygup01 0:11cc2b7889af 853 (coap_packet_ptr->msg_type >= COAP_MSG_TYPE_ACKNOWLEDGEMENT))) {
maygup01 0:11cc2b7889af 854 int8_t retval = sn_nsdl_local_rx_function(handle, coap_packet_ptr, src_ptr);
maygup01 0:11cc2b7889af 855 if (coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED &&
maygup01 0:11cc2b7889af 856 coap_packet_ptr->payload_ptr) {
maygup01 0:11cc2b7889af 857 handle->sn_nsdl_free(coap_packet_ptr->payload_ptr);
maygup01 0:11cc2b7889af 858 coap_packet_ptr->payload_ptr = 0;
maygup01 0:11cc2b7889af 859 }
maygup01 0:11cc2b7889af 860 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 861 return retval;
maygup01 0:11cc2b7889af 862 }
maygup01 0:11cc2b7889af 863 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 864 /* * If OMA bootstrap message... * */
maygup01 0:11cc2b7889af 865 bool bootstrap_msg = handle->is_bs_server;
maygup01 0:11cc2b7889af 866
maygup01 0:11cc2b7889af 867 // Pass bootstrap data to application
maygup01 0:11cc2b7889af 868 if (bootstrap_msg) {
maygup01 0:11cc2b7889af 869 // If retval is 2 skip the freeing, it will be done in MBED_CLIENT_NSDLINTERFACE_BS_PUT_EVENT event
maygup01 0:11cc2b7889af 870 if (handle->sn_nsdl_rx_callback(handle, coap_packet_ptr,src_ptr) != 2) {
maygup01 0:11cc2b7889af 871 if (coap_packet_ptr &&
maygup01 0:11cc2b7889af 872 coap_packet_ptr->options_list_ptr &&
maygup01 0:11cc2b7889af 873 coap_packet_ptr->coap_status != COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED &&
maygup01 0:11cc2b7889af 874 coap_packet_ptr->options_list_ptr->block1 != -1) {
maygup01 0:11cc2b7889af 875 handle->sn_nsdl_free(coap_packet_ptr->payload_ptr);
maygup01 0:11cc2b7889af 876 coap_packet_ptr->payload_ptr = NULL;
maygup01 0:11cc2b7889af 877 }
maygup01 0:11cc2b7889af 878 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr);
maygup01 0:11cc2b7889af 879 }
maygup01 0:11cc2b7889af 880
maygup01 0:11cc2b7889af 881 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 882 }
maygup01 0:11cc2b7889af 883 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
maygup01 0:11cc2b7889af 884
maygup01 0:11cc2b7889af 885 /* * * * * * * * * * * * * * * */
maygup01 0:11cc2b7889af 886 /* Other messages are for GRS */
maygup01 0:11cc2b7889af 887 /* * * * * * * * * * * * * * * */
maygup01 0:11cc2b7889af 888 return sn_grs_process_coap(handle, coap_packet_ptr, src_ptr);
maygup01 0:11cc2b7889af 889 }
maygup01 0:11cc2b7889af 890
maygup01 0:11cc2b7889af 891 int8_t sn_nsdl_exec(struct nsdl_s *handle, uint32_t time)
maygup01 0:11cc2b7889af 892 {
maygup01 0:11cc2b7889af 893 if(!handle || !handle->grs){
maygup01 0:11cc2b7889af 894 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 895 }
maygup01 0:11cc2b7889af 896 /* Call CoAP execution function */
maygup01 0:11cc2b7889af 897 return sn_coap_protocol_exec(handle->grs->coap, time);
maygup01 0:11cc2b7889af 898 }
maygup01 0:11cc2b7889af 899
maygup01 0:11cc2b7889af 900 sn_nsdl_dynamic_resource_parameters_s *sn_nsdl_get_resource(struct nsdl_s *handle, const char *path_ptr)
maygup01 0:11cc2b7889af 901 {
maygup01 0:11cc2b7889af 902 /* Check parameters */
maygup01 0:11cc2b7889af 903 if (handle == NULL) {
maygup01 0:11cc2b7889af 904 return NULL;
maygup01 0:11cc2b7889af 905 }
maygup01 0:11cc2b7889af 906
maygup01 0:11cc2b7889af 907 return sn_grs_search_resource(handle->grs, path_ptr, SN_GRS_SEARCH_METHOD);
maygup01 0:11cc2b7889af 908 }
maygup01 0:11cc2b7889af 909
maygup01 0:11cc2b7889af 910
maygup01 0:11cc2b7889af 911 /**
maygup01 0:11cc2b7889af 912 * \fn static int32_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr)
maygup01 0:11cc2b7889af 913 *
maygup01 0:11cc2b7889af 914 *
maygup01 0:11cc2b7889af 915 * \brief To send NSDL messages. Stores message id?s and message description to catch response from NSP server
maygup01 0:11cc2b7889af 916 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 917 * \param *coap_header_ptr Pointer to the CoAP message header to be sent
maygup01 0:11cc2b7889af 918 * \param *dst_addr_ptr Pointer to the address structure that contains destination address information
maygup01 0:11cc2b7889af 919 * \param message_description Message description to be stored to list for waiting response
maygup01 0:11cc2b7889af 920 *
maygup01 0:11cc2b7889af 921 * \return message id, <=0 if failed
maygup01 0:11cc2b7889af 922 */
maygup01 0:11cc2b7889af 923 static int32_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr)
maygup01 0:11cc2b7889af 924 {
maygup01 0:11cc2b7889af 925
maygup01 0:11cc2b7889af 926 tr_debug("sn_nsdl_internal_coap_send");
maygup01 0:11cc2b7889af 927 uint8_t *coap_message_ptr = NULL;
maygup01 0:11cc2b7889af 928 int32_t coap_message_len = 0;
maygup01 0:11cc2b7889af 929
maygup01 0:11cc2b7889af 930 #if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE /* If Message blockwising is not used at all, this part of code will not be compiled */
maygup01 0:11cc2b7889af 931 int8_t ret_val = prepare_blockwise_message(handle->grs->coap, coap_header_ptr);
maygup01 0:11cc2b7889af 932 if( 0 != ret_val ) {
maygup01 0:11cc2b7889af 933 return 0;
maygup01 0:11cc2b7889af 934 }
maygup01 0:11cc2b7889af 935 #endif
maygup01 0:11cc2b7889af 936
maygup01 0:11cc2b7889af 937 coap_message_len = sn_coap_builder_calc_needed_packet_data_size_2(coap_header_ptr, handle->grs->coap->sn_coap_block_data_size);
maygup01 0:11cc2b7889af 938 tr_debug("sn_nsdl_internal_coap_send - msg len after calc: %" PRId32 "", coap_message_len);
maygup01 0:11cc2b7889af 939 if (coap_message_len == 0) {
maygup01 0:11cc2b7889af 940 return 0;
maygup01 0:11cc2b7889af 941 }
maygup01 0:11cc2b7889af 942
maygup01 0:11cc2b7889af 943 coap_message_ptr = handle->sn_nsdl_alloc(coap_message_len);
maygup01 0:11cc2b7889af 944 if (!coap_message_ptr) {
maygup01 0:11cc2b7889af 945 return 0;
maygup01 0:11cc2b7889af 946 }
maygup01 0:11cc2b7889af 947
maygup01 0:11cc2b7889af 948 /* Build message */
maygup01 0:11cc2b7889af 949 int16_t ret = sn_coap_protocol_build(handle->grs->coap, dst_addr_ptr, coap_message_ptr, coap_header_ptr, (void *)handle);
maygup01 0:11cc2b7889af 950 if (ret < 0) {
maygup01 0:11cc2b7889af 951 handle->sn_nsdl_free(coap_message_ptr);
maygup01 0:11cc2b7889af 952 return ret;
maygup01 0:11cc2b7889af 953 }
maygup01 0:11cc2b7889af 954
maygup01 0:11cc2b7889af 955 handle->sn_nsdl_tx_callback(handle, SN_NSDL_PROTOCOL_COAP, coap_message_ptr, coap_message_len, dst_addr_ptr);
maygup01 0:11cc2b7889af 956 handle->sn_nsdl_free(coap_message_ptr);
maygup01 0:11cc2b7889af 957
maygup01 0:11cc2b7889af 958 return coap_header_ptr->msg_id;
maygup01 0:11cc2b7889af 959 }
maygup01 0:11cc2b7889af 960
maygup01 0:11cc2b7889af 961 /**
maygup01 0:11cc2b7889af 962 * \fn static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 963 *
maygup01 0:11cc2b7889af 964 * \brief Resolves NSP server address.
maygup01 0:11cc2b7889af 965 *
maygup01 0:11cc2b7889af 966 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 967 * \note Application must set NSP address with set_nsp_address
maygup01 0:11cc2b7889af 968 */
maygup01 0:11cc2b7889af 969 static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 970 {
maygup01 0:11cc2b7889af 971 memset(&handle->server_address, 0, sizeof(sn_nsdl_addr_s));
maygup01 0:11cc2b7889af 972 handle->server_address.type = SN_NSDL_ADDRESS_TYPE_NONE;
maygup01 0:11cc2b7889af 973 }
maygup01 0:11cc2b7889af 974
maygup01 0:11cc2b7889af 975 #ifdef RESOURCE_ATTRIBUTES_LIST
maygup01 0:11cc2b7889af 976 static char *sn_nsdl_build_resource_attribute_str(char *dst, const sn_nsdl_attribute_item_s *attribute, const char *name, const size_t name_len)
maygup01 0:11cc2b7889af 977 {
maygup01 0:11cc2b7889af 978 if (attribute != NULL && name != NULL && name_len > 0 && attribute->value) {
maygup01 0:11cc2b7889af 979 size_t attribute_len = strlen(attribute->value);
maygup01 0:11cc2b7889af 980 *dst++ = ';';
maygup01 0:11cc2b7889af 981 memcpy(dst, name, name_len);
maygup01 0:11cc2b7889af 982 dst += name_len;
maygup01 0:11cc2b7889af 983 *dst++ = '"';
maygup01 0:11cc2b7889af 984 memcpy(dst,
maygup01 0:11cc2b7889af 985 attribute->value,
maygup01 0:11cc2b7889af 986 attribute_len);
maygup01 0:11cc2b7889af 987 dst += attribute_len;
maygup01 0:11cc2b7889af 988 *dst++ = '"';
maygup01 0:11cc2b7889af 989 }
maygup01 0:11cc2b7889af 990 return dst;
maygup01 0:11cc2b7889af 991 }
maygup01 0:11cc2b7889af 992 #endif
maygup01 0:11cc2b7889af 993
maygup01 0:11cc2b7889af 994 /**
maygup01 0:11cc2b7889af 995 * \fn int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration)
maygup01 0:11cc2b7889af 996 *
maygup01 0:11cc2b7889af 997 * \brief To build GRS resources to registration message payload
maygup01 0:11cc2b7889af 998 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 999 * \param *message_ptr Pointer to CoAP message header
maygup01 0:11cc2b7889af 1000 *
maygup01 0:11cc2b7889af 1001 * \return SN_NSDL_SUCCESS = 0, Failed = -1
maygup01 0:11cc2b7889af 1002 */
maygup01 0:11cc2b7889af 1003 int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration)
maygup01 0:11cc2b7889af 1004 {
maygup01 0:11cc2b7889af 1005 tr_debug("sn_nsdl_build_registration_body");
maygup01 0:11cc2b7889af 1006 /* Local variables */
maygup01 0:11cc2b7889af 1007 uint8_t *temp_ptr;
maygup01 0:11cc2b7889af 1008 sn_nsdl_dynamic_resource_parameters_s *resource_temp_ptr;
maygup01 0:11cc2b7889af 1009
maygup01 0:11cc2b7889af 1010 /* Calculate needed memory and allocate */
maygup01 0:11cc2b7889af 1011 int8_t error = 0;
maygup01 0:11cc2b7889af 1012 uint16_t msg_len = sn_nsdl_calculate_registration_body_size(handle, updating_registeration, &error);
maygup01 0:11cc2b7889af 1013 if (SN_NSDL_FAILURE == error) {
maygup01 0:11cc2b7889af 1014 return error;
maygup01 0:11cc2b7889af 1015 }
maygup01 0:11cc2b7889af 1016
maygup01 0:11cc2b7889af 1017 if (!msg_len) {
maygup01 0:11cc2b7889af 1018 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1019 } else {
maygup01 0:11cc2b7889af 1020 message_ptr->payload_len = msg_len;
maygup01 0:11cc2b7889af 1021 }
maygup01 0:11cc2b7889af 1022 tr_debug("sn_nsdl_build_registration_body - body size: [%d]", message_ptr->payload_len);
maygup01 0:11cc2b7889af 1023 message_ptr->payload_ptr = handle->sn_nsdl_alloc(message_ptr->payload_len);
maygup01 0:11cc2b7889af 1024 if (!message_ptr->payload_ptr) {
maygup01 0:11cc2b7889af 1025 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1026 }
maygup01 0:11cc2b7889af 1027
maygup01 0:11cc2b7889af 1028 /* Build message */
maygup01 0:11cc2b7889af 1029 temp_ptr = message_ptr->payload_ptr;
maygup01 0:11cc2b7889af 1030
maygup01 0:11cc2b7889af 1031 resource_temp_ptr = sn_grs_get_first_resource(handle->grs);
maygup01 0:11cc2b7889af 1032
maygup01 0:11cc2b7889af 1033 /* Loop trough all resources */
maygup01 0:11cc2b7889af 1034 while (resource_temp_ptr) {
maygup01 0:11cc2b7889af 1035 /* if resource needs to be registered */
maygup01 0:11cc2b7889af 1036 if (resource_temp_ptr->publish_uri) {
maygup01 0:11cc2b7889af 1037 if (!resource_temp_ptr->always_publish && updating_registeration && resource_temp_ptr->registered == SN_NDSL_RESOURCE_REGISTERED) {
maygup01 0:11cc2b7889af 1038 resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr);
maygup01 0:11cc2b7889af 1039 continue;
maygup01 0:11cc2b7889af 1040 } else if (resource_temp_ptr->registered != SN_NDSL_RESOURCE_DELETE) {
maygup01 0:11cc2b7889af 1041 resource_temp_ptr->registered = SN_NDSL_RESOURCE_REGISTERED;
maygup01 0:11cc2b7889af 1042 }
maygup01 0:11cc2b7889af 1043
maygup01 0:11cc2b7889af 1044 /* If not first resource, add '.' to separator */
maygup01 0:11cc2b7889af 1045 if (temp_ptr != message_ptr->payload_ptr) {
maygup01 0:11cc2b7889af 1046 *temp_ptr++ = ',';
maygup01 0:11cc2b7889af 1047 }
maygup01 0:11cc2b7889af 1048
maygup01 0:11cc2b7889af 1049 *temp_ptr++ = '<';
maygup01 0:11cc2b7889af 1050 *temp_ptr++ = '/';
maygup01 0:11cc2b7889af 1051 size_t path_len = 0;
maygup01 0:11cc2b7889af 1052 if (resource_temp_ptr->static_resource_parameters->path) {
maygup01 0:11cc2b7889af 1053 path_len = strlen(resource_temp_ptr->static_resource_parameters->path);
maygup01 0:11cc2b7889af 1054 }
maygup01 0:11cc2b7889af 1055 memcpy(temp_ptr,
maygup01 0:11cc2b7889af 1056 resource_temp_ptr->static_resource_parameters->path,
maygup01 0:11cc2b7889af 1057 path_len);
maygup01 0:11cc2b7889af 1058 temp_ptr += path_len;
maygup01 0:11cc2b7889af 1059 *temp_ptr++ = '>';
maygup01 0:11cc2b7889af 1060
maygup01 0:11cc2b7889af 1061 /* Resource attributes */
maygup01 0:11cc2b7889af 1062 if (resource_temp_ptr->registered == SN_NDSL_RESOURCE_DELETE) {
maygup01 0:11cc2b7889af 1063 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1064 *temp_ptr++ = 'd';
maygup01 0:11cc2b7889af 1065 }
maygup01 0:11cc2b7889af 1066 #ifndef RESOURCE_ATTRIBUTES_LIST
maygup01 0:11cc2b7889af 1067 #ifndef DISABLE_RESOURCE_TYPE
maygup01 0:11cc2b7889af 1068 size_t resource_type_len = 0;
maygup01 0:11cc2b7889af 1069 if (resource_temp_ptr->static_resource_parameters->resource_type_ptr) {
maygup01 0:11cc2b7889af 1070 resource_type_len = strlen(resource_temp_ptr->static_resource_parameters->resource_type_ptr);
maygup01 0:11cc2b7889af 1071 }
maygup01 0:11cc2b7889af 1072 if (resource_type_len) {
maygup01 0:11cc2b7889af 1073 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1074 memcpy(temp_ptr, resource_type_parameter, RT_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1075 temp_ptr += RT_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1076 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1077 memcpy(temp_ptr,
maygup01 0:11cc2b7889af 1078 resource_temp_ptr->static_resource_parameters->resource_type_ptr,
maygup01 0:11cc2b7889af 1079 resource_type_len);
maygup01 0:11cc2b7889af 1080 temp_ptr += resource_type_len;
maygup01 0:11cc2b7889af 1081 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1082 }
maygup01 0:11cc2b7889af 1083 #endif
maygup01 0:11cc2b7889af 1084 #ifndef DISABLE_INTERFACE_DESCRIPTION
maygup01 0:11cc2b7889af 1085 size_t interface_description_len = 0;
maygup01 0:11cc2b7889af 1086 if (resource_temp_ptr->static_resource_parameters->interface_description_ptr) {
maygup01 0:11cc2b7889af 1087 interface_description_len = strlen(resource_temp_ptr->static_resource_parameters->interface_description_ptr);
maygup01 0:11cc2b7889af 1088 }
maygup01 0:11cc2b7889af 1089
maygup01 0:11cc2b7889af 1090 if (interface_description_len) {
maygup01 0:11cc2b7889af 1091 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1092 memcpy(temp_ptr, if_description_parameter, IF_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1093 temp_ptr += IF_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1094 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1095 memcpy(temp_ptr,
maygup01 0:11cc2b7889af 1096 resource_temp_ptr->static_resource_parameters->interface_description_ptr,
maygup01 0:11cc2b7889af 1097 interface_description_len);
maygup01 0:11cc2b7889af 1098 temp_ptr += interface_description_len;
maygup01 0:11cc2b7889af 1099 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1100 }
maygup01 0:11cc2b7889af 1101 #endif
maygup01 0:11cc2b7889af 1102 #else
maygup01 0:11cc2b7889af 1103 size_t attribute_len = 0;
maygup01 0:11cc2b7889af 1104 if (resource_temp_ptr->static_resource_parameters->attributes_ptr) {
maygup01 0:11cc2b7889af 1105 sn_nsdl_attribute_item_s *attribute = resource_temp_ptr->static_resource_parameters->attributes_ptr;
maygup01 0:11cc2b7889af 1106 while (attribute->attribute_name != ATTR_END) {
maygup01 0:11cc2b7889af 1107 switch (attribute->attribute_name) {
maygup01 0:11cc2b7889af 1108 case ATTR_RESOURCE_TYPE:
maygup01 0:11cc2b7889af 1109 temp_ptr = sn_nsdl_build_resource_attribute_str(temp_ptr, attribute, resource_type_parameter, RT_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1110 break;
maygup01 0:11cc2b7889af 1111 case ATTR_INTERFACE_DESCRIPTION:
maygup01 0:11cc2b7889af 1112 temp_ptr = sn_nsdl_build_resource_attribute_str(temp_ptr, attribute, if_description_parameter, IF_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1113 break;
maygup01 0:11cc2b7889af 1114 case ATTR_ENDPOINT_NAME:
maygup01 0:11cc2b7889af 1115 temp_ptr = sn_nsdl_build_resource_attribute_str(temp_ptr, attribute, name_parameter, NAME_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1116 break;
maygup01 0:11cc2b7889af 1117 default:
maygup01 0:11cc2b7889af 1118 break;
maygup01 0:11cc2b7889af 1119 }
maygup01 0:11cc2b7889af 1120 attribute++;
maygup01 0:11cc2b7889af 1121 }
maygup01 0:11cc2b7889af 1122 }
maygup01 0:11cc2b7889af 1123 #endif
maygup01 0:11cc2b7889af 1124 if (resource_temp_ptr->coap_content_type != 0) {
maygup01 0:11cc2b7889af 1125 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1126 memcpy(temp_ptr, coap_con_type_parameter, COAP_CON_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1127 temp_ptr += COAP_CON_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1128 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1129 temp_ptr = sn_nsdl_itoa(temp_ptr,
maygup01 0:11cc2b7889af 1130 resource_temp_ptr->coap_content_type);
maygup01 0:11cc2b7889af 1131 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1132 }
maygup01 0:11cc2b7889af 1133
maygup01 0:11cc2b7889af 1134 /* ;v */
maygup01 0:11cc2b7889af 1135 if ((resource_temp_ptr->publish_value > 0) && resource_temp_ptr->resource) {
maygup01 0:11cc2b7889af 1136 // If the resource is Opaque then do Base64 encoding of data
maygup01 0:11cc2b7889af 1137 if (resource_temp_ptr->publish_value == 2) {
maygup01 0:11cc2b7889af 1138 size_t dst_size = (((resource_temp_ptr->resource_len + 2) / 3) << 2) + 1;
maygup01 0:11cc2b7889af 1139 unsigned char *dst = (unsigned char*)handle->sn_nsdl_alloc(dst_size);
maygup01 0:11cc2b7889af 1140 size_t olen = 0;
maygup01 0:11cc2b7889af 1141 if (dst) {
maygup01 0:11cc2b7889af 1142 if (mbedtls_base64_encode(dst, dst_size, &olen,
maygup01 0:11cc2b7889af 1143 resource_temp_ptr->resource, resource_temp_ptr->resource_len) == 0) {
maygup01 0:11cc2b7889af 1144 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1145 memcpy(temp_ptr, resource_value, RESOURCE_VALUE_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1146 temp_ptr += RESOURCE_VALUE_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1147 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1148 memcpy(temp_ptr, dst, olen);
maygup01 0:11cc2b7889af 1149 temp_ptr += olen;
maygup01 0:11cc2b7889af 1150 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1151
maygup01 0:11cc2b7889af 1152 }
maygup01 0:11cc2b7889af 1153 handle->sn_nsdl_free(dst);
maygup01 0:11cc2b7889af 1154 }
maygup01 0:11cc2b7889af 1155
maygup01 0:11cc2b7889af 1156 } else { // For resources which does not require Base64 encoding of data
maygup01 0:11cc2b7889af 1157 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1158 memcpy(temp_ptr, resource_value, RESOURCE_VALUE_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1159 temp_ptr += RESOURCE_VALUE_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1160 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1161 memcpy(temp_ptr, resource_temp_ptr->resource, resource_temp_ptr->resource_len);
maygup01 0:11cc2b7889af 1162 temp_ptr += resource_temp_ptr->resource_len;
maygup01 0:11cc2b7889af 1163 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1164 }
maygup01 0:11cc2b7889af 1165 }
maygup01 0:11cc2b7889af 1166
maygup01 0:11cc2b7889af 1167 /* ;aobs / ;obs */
maygup01 0:11cc2b7889af 1168 // This needs to be re-visited and may be need an API for maganging obs value for different server implementation
maygup01 0:11cc2b7889af 1169 #ifndef COAP_DISABLE_OBS_FEATURE
maygup01 0:11cc2b7889af 1170 if (resource_temp_ptr->auto_observable) {
maygup01 0:11cc2b7889af 1171 uint8_t token[MAX_TOKEN_SIZE] = {0};
maygup01 0:11cc2b7889af 1172 uint8_t len = handle->sn_nsdl_auto_obs_token_callback(handle,
maygup01 0:11cc2b7889af 1173 resource_temp_ptr->static_resource_parameters->path,
maygup01 0:11cc2b7889af 1174 (uint8_t*)token);
maygup01 0:11cc2b7889af 1175 if (len > 0) {
maygup01 0:11cc2b7889af 1176 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1177 memcpy(temp_ptr, aobs_parameter, AOBS_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1178 temp_ptr += AOBS_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1179 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1180 uint16_t temp = common_read_16_bit((uint8_t*)token);
maygup01 0:11cc2b7889af 1181 temp_ptr = sn_nsdl_itoa(temp_ptr, temp);
maygup01 0:11cc2b7889af 1182 *temp_ptr++ = '"';
maygup01 0:11cc2b7889af 1183 }
maygup01 0:11cc2b7889af 1184 }
maygup01 0:11cc2b7889af 1185 else if (resource_temp_ptr->observable) {
maygup01 0:11cc2b7889af 1186 *temp_ptr++ = ';';
maygup01 0:11cc2b7889af 1187 memcpy(temp_ptr, obs_parameter, OBS_PARAMETER_LEN);
maygup01 0:11cc2b7889af 1188 temp_ptr += OBS_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1189 }
maygup01 0:11cc2b7889af 1190 #endif
maygup01 0:11cc2b7889af 1191 }
maygup01 0:11cc2b7889af 1192 resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr);
maygup01 0:11cc2b7889af 1193
maygup01 0:11cc2b7889af 1194 }
maygup01 0:11cc2b7889af 1195 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1196 }
maygup01 0:11cc2b7889af 1197
maygup01 0:11cc2b7889af 1198 /**
maygup01 0:11cc2b7889af 1199 * \fn static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration, int8_t *error)
maygup01 0:11cc2b7889af 1200 *
maygup01 0:11cc2b7889af 1201 *
maygup01 0:11cc2b7889af 1202 * \brief Calculates registration message payload size
maygup01 0:11cc2b7889af 1203 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 1204 * \param *updating_registeration Pointer to list of GRS resources
maygup01 0:11cc2b7889af 1205 * \param *error Error code, SN_NSDL_SUCCESS or SN_NSDL_FAILURE
maygup01 0:11cc2b7889af 1206 *
maygup01 0:11cc2b7889af 1207 * \return Needed payload size
maygup01 0:11cc2b7889af 1208 */
maygup01 0:11cc2b7889af 1209 static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration, int8_t *error)
maygup01 0:11cc2b7889af 1210 {
maygup01 0:11cc2b7889af 1211 tr_debug("sn_nsdl_calculate_registration_body_size");
maygup01 0:11cc2b7889af 1212 /* Local variables */
maygup01 0:11cc2b7889af 1213 uint16_t return_value = 0;
maygup01 0:11cc2b7889af 1214 *error = SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1215 const sn_nsdl_dynamic_resource_parameters_s *resource_temp_ptr;
maygup01 0:11cc2b7889af 1216
maygup01 0:11cc2b7889af 1217 /* check pointer */
maygup01 0:11cc2b7889af 1218 resource_temp_ptr = sn_grs_get_first_resource(handle->grs);
maygup01 0:11cc2b7889af 1219
maygup01 0:11cc2b7889af 1220 while (resource_temp_ptr) {
maygup01 0:11cc2b7889af 1221 if (resource_temp_ptr->publish_uri) {
maygup01 0:11cc2b7889af 1222 if (!resource_temp_ptr->always_publish && updating_registeration && resource_temp_ptr->registered == SN_NDSL_RESOURCE_REGISTERED) {
maygup01 0:11cc2b7889af 1223 resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr);
maygup01 0:11cc2b7889af 1224 continue;
maygup01 0:11cc2b7889af 1225 }
maygup01 0:11cc2b7889af 1226 /* If not first resource, then '.' will be added */
maygup01 0:11cc2b7889af 1227 if (return_value) {
maygup01 0:11cc2b7889af 1228 if (sn_nsdl_check_uint_overflow(return_value, 1, 0)) {
maygup01 0:11cc2b7889af 1229 return_value++;
maygup01 0:11cc2b7889af 1230 } else {
maygup01 0:11cc2b7889af 1231 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1232 break;
maygup01 0:11cc2b7889af 1233 }
maygup01 0:11cc2b7889af 1234 }
maygup01 0:11cc2b7889af 1235
maygup01 0:11cc2b7889af 1236 /* Count length for the resource path </path> */
maygup01 0:11cc2b7889af 1237 size_t path_len = 0;
maygup01 0:11cc2b7889af 1238 if (resource_temp_ptr->static_resource_parameters->path) {
maygup01 0:11cc2b7889af 1239 path_len = strlen(resource_temp_ptr->static_resource_parameters->path);
maygup01 0:11cc2b7889af 1240 }
maygup01 0:11cc2b7889af 1241
maygup01 0:11cc2b7889af 1242 if (sn_nsdl_check_uint_overflow(return_value, 3, path_len)) {
maygup01 0:11cc2b7889af 1243 return_value += (3 + path_len);
maygup01 0:11cc2b7889af 1244 } else {
maygup01 0:11cc2b7889af 1245 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1246 break;
maygup01 0:11cc2b7889af 1247 }
maygup01 0:11cc2b7889af 1248
maygup01 0:11cc2b7889af 1249 /* Count lengths of the attributes */
maygup01 0:11cc2b7889af 1250 if (resource_temp_ptr->registered == SN_NDSL_RESOURCE_DELETE) {
maygup01 0:11cc2b7889af 1251 return_value += 2;
maygup01 0:11cc2b7889af 1252 }
maygup01 0:11cc2b7889af 1253 #ifndef RESOURCE_ATTRIBUTES_LIST
maygup01 0:11cc2b7889af 1254 #ifndef DISABLE_RESOURCE_TYPE
maygup01 0:11cc2b7889af 1255 /* Resource type parameter */
maygup01 0:11cc2b7889af 1256 size_t resource_type_len = 0;
maygup01 0:11cc2b7889af 1257 if (resource_temp_ptr->static_resource_parameters->resource_type_ptr) {
maygup01 0:11cc2b7889af 1258 resource_type_len = strlen(resource_temp_ptr->static_resource_parameters->resource_type_ptr);
maygup01 0:11cc2b7889af 1259 }
maygup01 0:11cc2b7889af 1260
maygup01 0:11cc2b7889af 1261 if (resource_type_len) {
maygup01 0:11cc2b7889af 1262 /* ;rt="restype" */
maygup01 0:11cc2b7889af 1263 if (sn_nsdl_check_uint_overflow(return_value,
maygup01 0:11cc2b7889af 1264 6,
maygup01 0:11cc2b7889af 1265 resource_type_len)) {
maygup01 0:11cc2b7889af 1266 return_value += (6 + resource_type_len);
maygup01 0:11cc2b7889af 1267 } else {
maygup01 0:11cc2b7889af 1268 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1269 break;
maygup01 0:11cc2b7889af 1270 }
maygup01 0:11cc2b7889af 1271 }
maygup01 0:11cc2b7889af 1272 #endif
maygup01 0:11cc2b7889af 1273
maygup01 0:11cc2b7889af 1274 #ifndef DISABLE_INTERFACE_DESCRIPTION
maygup01 0:11cc2b7889af 1275 /* Interface description parameter */
maygup01 0:11cc2b7889af 1276 size_t interface_description_len = 0;
maygup01 0:11cc2b7889af 1277 if (resource_temp_ptr->static_resource_parameters->interface_description_ptr) {
maygup01 0:11cc2b7889af 1278 interface_description_len = strlen(resource_temp_ptr->static_resource_parameters->interface_description_ptr);
maygup01 0:11cc2b7889af 1279 }
maygup01 0:11cc2b7889af 1280 if (interface_description_len) {
maygup01 0:11cc2b7889af 1281 /* ;if="iftype" */
maygup01 0:11cc2b7889af 1282 if (sn_nsdl_check_uint_overflow(return_value,
maygup01 0:11cc2b7889af 1283 6,
maygup01 0:11cc2b7889af 1284 interface_description_len)) {
maygup01 0:11cc2b7889af 1285 return_value += (6 + interface_description_len);
maygup01 0:11cc2b7889af 1286 } else {
maygup01 0:11cc2b7889af 1287 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1288 break;
maygup01 0:11cc2b7889af 1289 }
maygup01 0:11cc2b7889af 1290 }
maygup01 0:11cc2b7889af 1291 #endif
maygup01 0:11cc2b7889af 1292 #else
maygup01 0:11cc2b7889af 1293 /* All attributes */
maygup01 0:11cc2b7889af 1294 if (resource_temp_ptr->static_resource_parameters->attributes_ptr) {
maygup01 0:11cc2b7889af 1295 size_t attribute_len = 0;
maygup01 0:11cc2b7889af 1296 size_t attribute_desc_len = 0;
maygup01 0:11cc2b7889af 1297 uint8_t success = 1;
maygup01 0:11cc2b7889af 1298 sn_nsdl_attribute_item_s *item = resource_temp_ptr->static_resource_parameters->attributes_ptr;
maygup01 0:11cc2b7889af 1299 while (item->attribute_name != ATTR_END) {
maygup01 0:11cc2b7889af 1300 switch(item->attribute_name) {
maygup01 0:11cc2b7889af 1301 case ATTR_RESOURCE_TYPE:
maygup01 0:11cc2b7889af 1302 /* ;rt="restype" */
maygup01 0:11cc2b7889af 1303 attribute_desc_len = 6;
maygup01 0:11cc2b7889af 1304 attribute_len = strlen(item->value);
maygup01 0:11cc2b7889af 1305 break;
maygup01 0:11cc2b7889af 1306 case ATTR_INTERFACE_DESCRIPTION:
maygup01 0:11cc2b7889af 1307 /* ;if="iftype" */
maygup01 0:11cc2b7889af 1308 attribute_desc_len = 6;
maygup01 0:11cc2b7889af 1309 attribute_len = strlen(item->value);
maygup01 0:11cc2b7889af 1310 break;
maygup01 0:11cc2b7889af 1311 case ATTR_ENDPOINT_NAME:
maygup01 0:11cc2b7889af 1312 /* ;name="name" */
maygup01 0:11cc2b7889af 1313 attribute_desc_len = 8;
maygup01 0:11cc2b7889af 1314 attribute_len = strlen(item->value);
maygup01 0:11cc2b7889af 1315 break;
maygup01 0:11cc2b7889af 1316 default:
maygup01 0:11cc2b7889af 1317 break;
maygup01 0:11cc2b7889af 1318 }
maygup01 0:11cc2b7889af 1319 if (sn_nsdl_check_uint_overflow(return_value,
maygup01 0:11cc2b7889af 1320 attribute_desc_len,
maygup01 0:11cc2b7889af 1321 attribute_len)) {
maygup01 0:11cc2b7889af 1322 return_value += (attribute_desc_len + attribute_len);
maygup01 0:11cc2b7889af 1323 } else {
maygup01 0:11cc2b7889af 1324 success = 0;
maygup01 0:11cc2b7889af 1325 break;
maygup01 0:11cc2b7889af 1326 }
maygup01 0:11cc2b7889af 1327 item++;
maygup01 0:11cc2b7889af 1328 }
maygup01 0:11cc2b7889af 1329 if (!success) {
maygup01 0:11cc2b7889af 1330 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1331 break;
maygup01 0:11cc2b7889af 1332 }
maygup01 0:11cc2b7889af 1333 }
maygup01 0:11cc2b7889af 1334 #endif
maygup01 0:11cc2b7889af 1335 if (resource_temp_ptr->coap_content_type != 0) {
maygup01 0:11cc2b7889af 1336 /* ;if="content" */
maygup01 0:11cc2b7889af 1337 uint8_t len = sn_nsdl_itoa_len(resource_temp_ptr->coap_content_type);
maygup01 0:11cc2b7889af 1338 if (sn_nsdl_check_uint_overflow(return_value, 6, len)) {
maygup01 0:11cc2b7889af 1339 return_value += (6 + len);
maygup01 0:11cc2b7889af 1340 } else {
maygup01 0:11cc2b7889af 1341 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1342 break;
maygup01 0:11cc2b7889af 1343 }
maygup01 0:11cc2b7889af 1344 }
maygup01 0:11cc2b7889af 1345
maygup01 0:11cc2b7889af 1346 if ((resource_temp_ptr->publish_value > 0) && resource_temp_ptr->resource) {
maygup01 0:11cc2b7889af 1347 /* ;v="" */
maygup01 0:11cc2b7889af 1348 uint16_t len = resource_temp_ptr->resource_len;
maygup01 0:11cc2b7889af 1349 if (resource_temp_ptr->publish_value == 2) {
maygup01 0:11cc2b7889af 1350 len = (((resource_temp_ptr->resource_len + 2) / 3) << 2);
maygup01 0:11cc2b7889af 1351 }
maygup01 0:11cc2b7889af 1352 if (sn_nsdl_check_uint_overflow(return_value, 5, len)) {
maygup01 0:11cc2b7889af 1353 return_value += 5 + len;
maygup01 0:11cc2b7889af 1354 } else {
maygup01 0:11cc2b7889af 1355 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1356 break;
maygup01 0:11cc2b7889af 1357 }
maygup01 0:11cc2b7889af 1358 /* ;v="" */
maygup01 0:11cc2b7889af 1359 }
maygup01 0:11cc2b7889af 1360
maygup01 0:11cc2b7889af 1361 #ifndef COAP_DISABLE_OBS_FEATURE
maygup01 0:11cc2b7889af 1362 // Auto obs will take higher priority
maygup01 0:11cc2b7889af 1363 // This needs to be re-visited and may be need an API for maganging obs value for different server implementation
maygup01 0:11cc2b7889af 1364 if (resource_temp_ptr->auto_observable) {
maygup01 0:11cc2b7889af 1365 /* ;aobs="" */
maygup01 0:11cc2b7889af 1366 uint8_t token[MAX_TOKEN_SIZE] = {0};
maygup01 0:11cc2b7889af 1367 uint8_t len = handle->sn_nsdl_auto_obs_token_callback(handle,
maygup01 0:11cc2b7889af 1368 resource_temp_ptr->static_resource_parameters->path,
maygup01 0:11cc2b7889af 1369 (uint8_t*)token);
maygup01 0:11cc2b7889af 1370
maygup01 0:11cc2b7889af 1371 if (len > 0) {
maygup01 0:11cc2b7889af 1372 uint16_t temp = common_read_16_bit((uint8_t*)token);
maygup01 0:11cc2b7889af 1373 uint8_t token_len = sn_nsdl_itoa_len(temp);
maygup01 0:11cc2b7889af 1374 if (sn_nsdl_check_uint_overflow(return_value, 8, token_len)) {
maygup01 0:11cc2b7889af 1375 return_value += (8 + token_len);
maygup01 0:11cc2b7889af 1376 } else {
maygup01 0:11cc2b7889af 1377 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1378 break;
maygup01 0:11cc2b7889af 1379 }
maygup01 0:11cc2b7889af 1380 } else {
maygup01 0:11cc2b7889af 1381 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1382 break;
maygup01 0:11cc2b7889af 1383 }
maygup01 0:11cc2b7889af 1384 }
maygup01 0:11cc2b7889af 1385 else if (resource_temp_ptr->observable) {
maygup01 0:11cc2b7889af 1386 if (sn_nsdl_check_uint_overflow(return_value, 4, 0)) {
maygup01 0:11cc2b7889af 1387 return_value += 4;
maygup01 0:11cc2b7889af 1388 } else {
maygup01 0:11cc2b7889af 1389 *error = SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1390 break;
maygup01 0:11cc2b7889af 1391 }
maygup01 0:11cc2b7889af 1392 }
maygup01 0:11cc2b7889af 1393 #endif
maygup01 0:11cc2b7889af 1394 }
maygup01 0:11cc2b7889af 1395 resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr);
maygup01 0:11cc2b7889af 1396 }
maygup01 0:11cc2b7889af 1397 return return_value;
maygup01 0:11cc2b7889af 1398 }
maygup01 0:11cc2b7889af 1399
maygup01 0:11cc2b7889af 1400 /**
maygup01 0:11cc2b7889af 1401 * \fn static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type)
maygup01 0:11cc2b7889af 1402 *
maygup01 0:11cc2b7889af 1403 *
maygup01 0:11cc2b7889af 1404 * \brief Calculates needed uri query option length
maygup01 0:11cc2b7889af 1405 *
maygup01 0:11cc2b7889af 1406 * \param *endpoint_info_ptr Pointer to endpoint info structure
maygup01 0:11cc2b7889af 1407 * \param msg_type Message type
maygup01 0:11cc2b7889af 1408 *
maygup01 0:11cc2b7889af 1409 * \return number of parameters in uri query
maygup01 0:11cc2b7889af 1410 */
maygup01 0:11cc2b7889af 1411 static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr,
maygup01 0:11cc2b7889af 1412 uint8_t msg_type,
maygup01 0:11cc2b7889af 1413 const char *uri_query)
maygup01 0:11cc2b7889af 1414 {
maygup01 0:11cc2b7889af 1415 uint16_t return_value = 0;
maygup01 0:11cc2b7889af 1416 uint8_t number_of_parameters = 0;
maygup01 0:11cc2b7889af 1417
maygup01 0:11cc2b7889af 1418
maygup01 0:11cc2b7889af 1419 if ((endpoint_info_ptr->endpoint_name_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && endpoint_info_ptr->endpoint_name_ptr != 0) {
maygup01 0:11cc2b7889af 1420 return_value += endpoint_info_ptr->endpoint_name_len;
maygup01 0:11cc2b7889af 1421 return_value += EP_NAME_PARAMETERS_LEN; //ep=
maygup01 0:11cc2b7889af 1422 number_of_parameters++;
maygup01 0:11cc2b7889af 1423 }
maygup01 0:11cc2b7889af 1424
maygup01 0:11cc2b7889af 1425 if ((endpoint_info_ptr->type_len != 0) &&
maygup01 0:11cc2b7889af 1426 (msg_type == SN_NSDL_EP_REGISTER_MESSAGE || msg_type == SN_NSDL_EP_UPDATE_MESSAGE) &&
maygup01 0:11cc2b7889af 1427 (endpoint_info_ptr->type_ptr != 0)) {
maygup01 0:11cc2b7889af 1428 return_value += endpoint_info_ptr->type_len;
maygup01 0:11cc2b7889af 1429 return_value += ET_PARAMETER_LEN; //et=
maygup01 0:11cc2b7889af 1430 number_of_parameters++;
maygup01 0:11cc2b7889af 1431 }
maygup01 0:11cc2b7889af 1432
maygup01 0:11cc2b7889af 1433 if ((endpoint_info_ptr->lifetime_len != 0) && (endpoint_info_ptr->lifetime_ptr != 0)) {
maygup01 0:11cc2b7889af 1434 return_value += endpoint_info_ptr->lifetime_len;
maygup01 0:11cc2b7889af 1435 return_value += LT_PARAMETER_LEN; //lt=
maygup01 0:11cc2b7889af 1436 number_of_parameters++;
maygup01 0:11cc2b7889af 1437 }
maygup01 0:11cc2b7889af 1438
maygup01 0:11cc2b7889af 1439 if ((endpoint_info_ptr->domain_name_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && (endpoint_info_ptr->domain_name_ptr != 0)) {
maygup01 0:11cc2b7889af 1440 return_value += endpoint_info_ptr->domain_name_len;
maygup01 0:11cc2b7889af 1441 return_value += DOMAIN_PARAMETER_LEN; //d=
maygup01 0:11cc2b7889af 1442 number_of_parameters++;
maygup01 0:11cc2b7889af 1443 }
maygup01 0:11cc2b7889af 1444
maygup01 0:11cc2b7889af 1445 if (((endpoint_info_ptr->binding_and_mode & 0x04) || (endpoint_info_ptr->binding_and_mode & 0x01)) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) {
maygup01 0:11cc2b7889af 1446 return_value += BS_QUEUE_MODE_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1447
maygup01 0:11cc2b7889af 1448 if (endpoint_info_ptr->binding_and_mode & 0x01) {
maygup01 0:11cc2b7889af 1449 return_value++;
maygup01 0:11cc2b7889af 1450 }
maygup01 0:11cc2b7889af 1451 if (endpoint_info_ptr->binding_and_mode & 0x04) {
maygup01 0:11cc2b7889af 1452 return_value++;
maygup01 0:11cc2b7889af 1453 }
maygup01 0:11cc2b7889af 1454 if ((endpoint_info_ptr->binding_and_mode & 0x02) && ((endpoint_info_ptr->binding_and_mode & 0x04) || (endpoint_info_ptr->binding_and_mode & 0x01))) {
maygup01 0:11cc2b7889af 1455 return_value++;
maygup01 0:11cc2b7889af 1456 }
maygup01 0:11cc2b7889af 1457
maygup01 0:11cc2b7889af 1458 number_of_parameters++;
maygup01 0:11cc2b7889af 1459 }
maygup01 0:11cc2b7889af 1460
maygup01 0:11cc2b7889af 1461 if (number_of_parameters != 0) {
maygup01 0:11cc2b7889af 1462 return_value += (number_of_parameters - 1);
maygup01 0:11cc2b7889af 1463 }
maygup01 0:11cc2b7889af 1464
maygup01 0:11cc2b7889af 1465 if (uri_query) {
maygup01 0:11cc2b7889af 1466 return_value += strlen(uri_query);
maygup01 0:11cc2b7889af 1467 }
maygup01 0:11cc2b7889af 1468
maygup01 0:11cc2b7889af 1469 if (return_value > MAX_URI_QUERY_LEN) {
maygup01 0:11cc2b7889af 1470 tr_error("sn_nsdl_calculate_uri_query_option_len - max param length reached (%d)", return_value);
maygup01 0:11cc2b7889af 1471 return_value = 0;
maygup01 0:11cc2b7889af 1472 }
maygup01 0:11cc2b7889af 1473
maygup01 0:11cc2b7889af 1474 return return_value;
maygup01 0:11cc2b7889af 1475 }
maygup01 0:11cc2b7889af 1476
maygup01 0:11cc2b7889af 1477 /**
maygup01 0:11cc2b7889af 1478 * \fn static int8_t sn_nsdl_fill_uri_query_options(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *parameter_ptr, sn_coap_hdr_s *source_msg_ptr, uint8_t msg_type)
maygup01 0:11cc2b7889af 1479 *
maygup01 0:11cc2b7889af 1480 *
maygup01 0:11cc2b7889af 1481 * \brief Fills uri-query options to message header struct
maygup01 0:11cc2b7889af 1482 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 1483 * \param *parameter_ptr Pointer to endpoint parameters struct
maygup01 0:11cc2b7889af 1484 * \param *source_msg_ptr Pointer to CoAP header struct
maygup01 0:11cc2b7889af 1485 * \param msg_type Message type
maygup01 0:11cc2b7889af 1486 *
maygup01 0:11cc2b7889af 1487 * \return SN_NSDL_SUCCESS = 0, Failed = -1
maygup01 0:11cc2b7889af 1488 */
maygup01 0:11cc2b7889af 1489 static int8_t sn_nsdl_fill_uri_query_options(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 1490 sn_nsdl_ep_parameters_s *parameter_ptr,
maygup01 0:11cc2b7889af 1491 sn_coap_hdr_s *source_msg_ptr,
maygup01 0:11cc2b7889af 1492 uint8_t msg_type,
maygup01 0:11cc2b7889af 1493 const char *uri_query)
maygup01 0:11cc2b7889af 1494 {
maygup01 0:11cc2b7889af 1495 uint8_t *temp_ptr = NULL;
maygup01 0:11cc2b7889af 1496 if( !validateParameters(parameter_ptr) ){
maygup01 0:11cc2b7889af 1497 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1498 }
maygup01 0:11cc2b7889af 1499
maygup01 0:11cc2b7889af 1500 size_t query_len = sn_nsdl_calculate_uri_query_option_len(parameter_ptr, msg_type, uri_query);
maygup01 0:11cc2b7889af 1501 if (query_len == 0) {
maygup01 0:11cc2b7889af 1502 return 0;
maygup01 0:11cc2b7889af 1503 }
maygup01 0:11cc2b7889af 1504
maygup01 0:11cc2b7889af 1505 source_msg_ptr->options_list_ptr->uri_query_len = query_len;
maygup01 0:11cc2b7889af 1506 source_msg_ptr->options_list_ptr->uri_query_ptr = handle->sn_nsdl_alloc(query_len);
maygup01 0:11cc2b7889af 1507
maygup01 0:11cc2b7889af 1508 if (source_msg_ptr->options_list_ptr->uri_query_ptr == NULL) {
maygup01 0:11cc2b7889af 1509 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1510 }
maygup01 0:11cc2b7889af 1511 memset(source_msg_ptr->options_list_ptr->uri_query_ptr, 0, source_msg_ptr->options_list_ptr->uri_query_len);
maygup01 0:11cc2b7889af 1512
maygup01 0:11cc2b7889af 1513 temp_ptr = source_msg_ptr->options_list_ptr->uri_query_ptr;
maygup01 0:11cc2b7889af 1514
maygup01 0:11cc2b7889af 1515 /******************************************************/
maygup01 0:11cc2b7889af 1516 /* If endpoint name is configured, fill needed fields */
maygup01 0:11cc2b7889af 1517 /******************************************************/
maygup01 0:11cc2b7889af 1518
maygup01 0:11cc2b7889af 1519 if ((parameter_ptr->endpoint_name_len != 0) &&
maygup01 0:11cc2b7889af 1520 (parameter_ptr->endpoint_name_ptr != 0) &&
maygup01 0:11cc2b7889af 1521 (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) {
maygup01 0:11cc2b7889af 1522 /* fill endpoint name, first ?ep=, then endpoint name */
maygup01 0:11cc2b7889af 1523 memcpy(temp_ptr, ep_name_parameter_string, sizeof(ep_name_parameter_string));
maygup01 0:11cc2b7889af 1524 temp_ptr += EP_NAME_PARAMETERS_LEN;
maygup01 0:11cc2b7889af 1525 memcpy(temp_ptr, parameter_ptr->endpoint_name_ptr, parameter_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 1526 temp_ptr += parameter_ptr->endpoint_name_len;
maygup01 0:11cc2b7889af 1527 }
maygup01 0:11cc2b7889af 1528
maygup01 0:11cc2b7889af 1529 /******************************************************/
maygup01 0:11cc2b7889af 1530 /* If endpoint type is configured, fill needed fields */
maygup01 0:11cc2b7889af 1531 /******************************************************/
maygup01 0:11cc2b7889af 1532
maygup01 0:11cc2b7889af 1533 if ((parameter_ptr->type_len != 0) &&
maygup01 0:11cc2b7889af 1534 (parameter_ptr->type_ptr != 0) &&
maygup01 0:11cc2b7889af 1535 (msg_type == SN_NSDL_EP_REGISTER_MESSAGE || msg_type == SN_NSDL_EP_UPDATE_MESSAGE)) {
maygup01 0:11cc2b7889af 1536 if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) {
maygup01 0:11cc2b7889af 1537 *temp_ptr++ = '&';
maygup01 0:11cc2b7889af 1538 }
maygup01 0:11cc2b7889af 1539
maygup01 0:11cc2b7889af 1540 memcpy(temp_ptr, et_parameter, sizeof(et_parameter));
maygup01 0:11cc2b7889af 1541 temp_ptr += ET_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1542 memcpy(temp_ptr, parameter_ptr->type_ptr, parameter_ptr->type_len);
maygup01 0:11cc2b7889af 1543 temp_ptr += parameter_ptr->type_len;
maygup01 0:11cc2b7889af 1544 }
maygup01 0:11cc2b7889af 1545
maygup01 0:11cc2b7889af 1546
maygup01 0:11cc2b7889af 1547 /******************************************************/
maygup01 0:11cc2b7889af 1548 /* If lifetime is configured, fill needed fields */
maygup01 0:11cc2b7889af 1549 /******************************************************/
maygup01 0:11cc2b7889af 1550
maygup01 0:11cc2b7889af 1551 if ((parameter_ptr->lifetime_len != 0) && (parameter_ptr->lifetime_ptr != 0)) {
maygup01 0:11cc2b7889af 1552 if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) {
maygup01 0:11cc2b7889af 1553 *temp_ptr++ = '&';
maygup01 0:11cc2b7889af 1554 }
maygup01 0:11cc2b7889af 1555
maygup01 0:11cc2b7889af 1556 memcpy(temp_ptr, ep_lifetime_parameter, sizeof(ep_lifetime_parameter));
maygup01 0:11cc2b7889af 1557 temp_ptr += LT_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1558 memcpy(temp_ptr, parameter_ptr->lifetime_ptr, parameter_ptr->lifetime_len);
maygup01 0:11cc2b7889af 1559 temp_ptr += parameter_ptr->lifetime_len;
maygup01 0:11cc2b7889af 1560 }
maygup01 0:11cc2b7889af 1561
maygup01 0:11cc2b7889af 1562 /******************************************************/
maygup01 0:11cc2b7889af 1563 /* If domain is configured, fill needed fields */
maygup01 0:11cc2b7889af 1564 /******************************************************/
maygup01 0:11cc2b7889af 1565
maygup01 0:11cc2b7889af 1566 if ((parameter_ptr->domain_name_len != 0) &&
maygup01 0:11cc2b7889af 1567 (parameter_ptr->domain_name_ptr != 0) &&
maygup01 0:11cc2b7889af 1568 (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) {
maygup01 0:11cc2b7889af 1569 if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) {
maygup01 0:11cc2b7889af 1570 *temp_ptr++ = '&';
maygup01 0:11cc2b7889af 1571 }
maygup01 0:11cc2b7889af 1572
maygup01 0:11cc2b7889af 1573 memcpy(temp_ptr, ep_domain_parameter, sizeof(ep_domain_parameter));
maygup01 0:11cc2b7889af 1574 temp_ptr += DOMAIN_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1575 memcpy(temp_ptr, parameter_ptr->domain_name_ptr, parameter_ptr->domain_name_len);
maygup01 0:11cc2b7889af 1576 temp_ptr += parameter_ptr->domain_name_len;
maygup01 0:11cc2b7889af 1577 }
maygup01 0:11cc2b7889af 1578
maygup01 0:11cc2b7889af 1579 /******************************************************/
maygup01 0:11cc2b7889af 1580 /* If queue-mode is configured, fill needed fields */
maygup01 0:11cc2b7889af 1581 /******************************************************/
maygup01 0:11cc2b7889af 1582
maygup01 0:11cc2b7889af 1583 if (((parameter_ptr->binding_and_mode & 0x01) ||
maygup01 0:11cc2b7889af 1584 (parameter_ptr->binding_and_mode & 0x04)) &&
maygup01 0:11cc2b7889af 1585 (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) {
maygup01 0:11cc2b7889af 1586 if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) {
maygup01 0:11cc2b7889af 1587 *temp_ptr++ = '&';
maygup01 0:11cc2b7889af 1588 }
maygup01 0:11cc2b7889af 1589
maygup01 0:11cc2b7889af 1590 memcpy(temp_ptr, bs_queue_mode, sizeof(bs_queue_mode));
maygup01 0:11cc2b7889af 1591 temp_ptr += BS_QUEUE_MODE_PARAMETER_LEN;
maygup01 0:11cc2b7889af 1592
maygup01 0:11cc2b7889af 1593 if (parameter_ptr->binding_and_mode & 0x01) {
maygup01 0:11cc2b7889af 1594 *temp_ptr++ = 'U';
maygup01 0:11cc2b7889af 1595 if (parameter_ptr->binding_and_mode & 0x02) {
maygup01 0:11cc2b7889af 1596 *temp_ptr++ = 'Q';
maygup01 0:11cc2b7889af 1597 }
maygup01 0:11cc2b7889af 1598 }
maygup01 0:11cc2b7889af 1599
maygup01 0:11cc2b7889af 1600 if (parameter_ptr->binding_and_mode & 0x04) {
maygup01 0:11cc2b7889af 1601 *temp_ptr++ = 'S';
maygup01 0:11cc2b7889af 1602 if ((parameter_ptr->binding_and_mode & 0x02) && !(parameter_ptr->binding_and_mode & 0x01)) {
maygup01 0:11cc2b7889af 1603 *temp_ptr++ = 'Q';
maygup01 0:11cc2b7889af 1604 }
maygup01 0:11cc2b7889af 1605 }
maygup01 0:11cc2b7889af 1606 }
maygup01 0:11cc2b7889af 1607
maygup01 0:11cc2b7889af 1608 if (uri_query) {
maygup01 0:11cc2b7889af 1609 memcpy(temp_ptr, uri_query, strlen(uri_query));
maygup01 0:11cc2b7889af 1610 }
maygup01 0:11cc2b7889af 1611
maygup01 0:11cc2b7889af 1612 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1613 }
maygup01 0:11cc2b7889af 1614
maygup01 0:11cc2b7889af 1615 static bool validateParameters(sn_nsdl_ep_parameters_s *parameter_ptr)
maygup01 0:11cc2b7889af 1616 {
maygup01 0:11cc2b7889af 1617 if( !validate( parameter_ptr->domain_name_ptr, parameter_ptr->domain_name_len, '&' ) ){
maygup01 0:11cc2b7889af 1618 return false;
maygup01 0:11cc2b7889af 1619 }
maygup01 0:11cc2b7889af 1620
maygup01 0:11cc2b7889af 1621 if( !validate( parameter_ptr->endpoint_name_ptr, parameter_ptr->endpoint_name_len, '&' ) ){
maygup01 0:11cc2b7889af 1622 return false;
maygup01 0:11cc2b7889af 1623 }
maygup01 0:11cc2b7889af 1624
maygup01 0:11cc2b7889af 1625 if( !validate( parameter_ptr->lifetime_ptr, parameter_ptr->lifetime_len, '&' ) ){
maygup01 0:11cc2b7889af 1626 return false;
maygup01 0:11cc2b7889af 1627 }
maygup01 0:11cc2b7889af 1628
maygup01 0:11cc2b7889af 1629 if( !validate( parameter_ptr->type_ptr, parameter_ptr->type_len, '&' ) ){
maygup01 0:11cc2b7889af 1630 return false;
maygup01 0:11cc2b7889af 1631 }
maygup01 0:11cc2b7889af 1632 return true;
maygup01 0:11cc2b7889af 1633 }
maygup01 0:11cc2b7889af 1634
maygup01 0:11cc2b7889af 1635 static bool validate(uint8_t* ptr, uint32_t len, char illegalChar)
maygup01 0:11cc2b7889af 1636 {
maygup01 0:11cc2b7889af 1637 if( ptr ){
maygup01 0:11cc2b7889af 1638 for( uint32_t i=0; i < len; i++ ){
maygup01 0:11cc2b7889af 1639 if( ptr[i] == illegalChar ){
maygup01 0:11cc2b7889af 1640 return false;
maygup01 0:11cc2b7889af 1641 }
maygup01 0:11cc2b7889af 1642 }
maygup01 0:11cc2b7889af 1643 }
maygup01 0:11cc2b7889af 1644 return true;
maygup01 0:11cc2b7889af 1645 }
maygup01 0:11cc2b7889af 1646
maygup01 0:11cc2b7889af 1647 /**
maygup01 0:11cc2b7889af 1648 * \fn static int8_t sn_nsdl_local_rx_function(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
maygup01 0:11cc2b7889af 1649 *
maygup01 0:11cc2b7889af 1650 * \brief If received message is reply for the message that NSDL has been sent, it is processed here. Else, packet will be sent to application.
maygup01 0:11cc2b7889af 1651 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 1652 * \param *coap_packet_ptr Pointer to received CoAP packet
maygup01 0:11cc2b7889af 1653 * \param *address_ptr Pointer to source address struct
maygup01 0:11cc2b7889af 1654 *
maygup01 0:11cc2b7889af 1655 * \return SN_NSDL_SUCCESS = 0, Failed = -1
maygup01 0:11cc2b7889af 1656 */
maygup01 0:11cc2b7889af 1657 static int8_t sn_nsdl_local_rx_function(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
maygup01 0:11cc2b7889af 1658 {
maygup01 0:11cc2b7889af 1659 if ((coap_packet_ptr == 0) || (address_ptr == 0)) {
maygup01 0:11cc2b7889af 1660 return -1;
maygup01 0:11cc2b7889af 1661 }
maygup01 0:11cc2b7889af 1662
maygup01 0:11cc2b7889af 1663 bool is_reg_msg = false;
maygup01 0:11cc2b7889af 1664 bool is_update_reg_msg = false;
maygup01 0:11cc2b7889af 1665 bool is_unreg_msg = false;
maygup01 0:11cc2b7889af 1666 bool is_bs_msg = false;
maygup01 0:11cc2b7889af 1667
maygup01 0:11cc2b7889af 1668 if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_CREATED &&
maygup01 0:11cc2b7889af 1669 coap_packet_ptr->token_len == sizeof(handle->register_token) &&
maygup01 0:11cc2b7889af 1670 memcmp(coap_packet_ptr->token_ptr, &handle->register_token, coap_packet_ptr->token_len) == 0) {
maygup01 0:11cc2b7889af 1671 handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_IS_REGISTERED;
maygup01 0:11cc2b7889af 1672 sn_grs_mark_resources_as_registered(handle);
maygup01 0:11cc2b7889af 1673 is_reg_msg = true;
maygup01 0:11cc2b7889af 1674 if (sn_nsdl_resolve_ep_information(handle, coap_packet_ptr) != SN_NSDL_SUCCESS) {
maygup01 0:11cc2b7889af 1675 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1676 }
maygup01 0:11cc2b7889af 1677 }
maygup01 0:11cc2b7889af 1678
maygup01 0:11cc2b7889af 1679 else if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_CHANGED &&
maygup01 0:11cc2b7889af 1680 coap_packet_ptr->token_len == sizeof(handle->update_register_token) &&
maygup01 0:11cc2b7889af 1681 memcmp(coap_packet_ptr->token_ptr,
maygup01 0:11cc2b7889af 1682 &handle->update_register_token,
maygup01 0:11cc2b7889af 1683 coap_packet_ptr->token_len) == 0) {
maygup01 0:11cc2b7889af 1684 is_update_reg_msg = true;
maygup01 0:11cc2b7889af 1685 }
maygup01 0:11cc2b7889af 1686
maygup01 0:11cc2b7889af 1687 else if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_DELETED &&
maygup01 0:11cc2b7889af 1688 coap_packet_ptr->token_len == sizeof(handle->unregister_token) &&
maygup01 0:11cc2b7889af 1689 memcmp(coap_packet_ptr->token_ptr, &handle->unregister_token, coap_packet_ptr->token_len) == 0) {
maygup01 0:11cc2b7889af 1690 is_unreg_msg = true;
maygup01 0:11cc2b7889af 1691 handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr);
maygup01 0:11cc2b7889af 1692 handle->ep_information_ptr->endpoint_name_ptr = 0;
maygup01 0:11cc2b7889af 1693 handle->ep_information_ptr->endpoint_name_len = 0;
maygup01 0:11cc2b7889af 1694
maygup01 0:11cc2b7889af 1695 handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr);
maygup01 0:11cc2b7889af 1696 handle->ep_information_ptr->domain_name_ptr = 0;
maygup01 0:11cc2b7889af 1697 handle->ep_information_ptr->domain_name_len = 0;
maygup01 0:11cc2b7889af 1698 }
maygup01 0:11cc2b7889af 1699 else if (coap_packet_ptr->token_len == sizeof(handle->bootstrap_token) &&
maygup01 0:11cc2b7889af 1700 memcmp(coap_packet_ptr->token_ptr, &handle->bootstrap_token, coap_packet_ptr->token_len) == 0) {
maygup01 0:11cc2b7889af 1701 is_bs_msg = true;
maygup01 0:11cc2b7889af 1702 }
maygup01 0:11cc2b7889af 1703
maygup01 0:11cc2b7889af 1704 /* Store the current message token so that we can identify if same operation was initiated from callback */
maygup01 0:11cc2b7889af 1705 uint32_t temp_token = 0;
maygup01 0:11cc2b7889af 1706 if (is_reg_msg) {
maygup01 0:11cc2b7889af 1707 temp_token = handle->register_token;
maygup01 0:11cc2b7889af 1708 }
maygup01 0:11cc2b7889af 1709 else if (is_unreg_msg) {
maygup01 0:11cc2b7889af 1710 temp_token = handle->unregister_token;
maygup01 0:11cc2b7889af 1711 }
maygup01 0:11cc2b7889af 1712 else if (is_update_reg_msg) {
maygup01 0:11cc2b7889af 1713 temp_token = handle->update_register_token;
maygup01 0:11cc2b7889af 1714 }
maygup01 0:11cc2b7889af 1715 else if (is_bs_msg) {
maygup01 0:11cc2b7889af 1716 temp_token = handle->bootstrap_token;
maygup01 0:11cc2b7889af 1717 }
maygup01 0:11cc2b7889af 1718
maygup01 0:11cc2b7889af 1719 /* No messages to wait for, or message was not response to our request */
maygup01 0:11cc2b7889af 1720 int ret = handle->sn_nsdl_rx_callback(handle, coap_packet_ptr, address_ptr);
maygup01 0:11cc2b7889af 1721
maygup01 0:11cc2b7889af 1722 /* If callback initiated same operation then token is updated in handle and temp_token won't match.
maygup01 0:11cc2b7889af 1723 This means we don't clear the handle token here because we will wait for response to new request. */
maygup01 0:11cc2b7889af 1724 if (is_reg_msg && temp_token == handle->register_token) {
maygup01 0:11cc2b7889af 1725 handle->register_token = 0;
maygup01 0:11cc2b7889af 1726 }
maygup01 0:11cc2b7889af 1727 else if (is_unreg_msg && temp_token == handle->unregister_token) {
maygup01 0:11cc2b7889af 1728 handle->unregister_token = 0;
maygup01 0:11cc2b7889af 1729 }
maygup01 0:11cc2b7889af 1730 else if (is_update_reg_msg && temp_token == handle->update_register_token) {
maygup01 0:11cc2b7889af 1731 handle->update_register_token = 0;
maygup01 0:11cc2b7889af 1732 }
maygup01 0:11cc2b7889af 1733 else if (is_bs_msg && temp_token == handle->bootstrap_token) {
maygup01 0:11cc2b7889af 1734 handle->bootstrap_token = 0;
maygup01 0:11cc2b7889af 1735 }
maygup01 0:11cc2b7889af 1736 return ret;
maygup01 0:11cc2b7889af 1737 }
maygup01 0:11cc2b7889af 1738
maygup01 0:11cc2b7889af 1739 /**
maygup01 0:11cc2b7889af 1740 * \fn static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr)
maygup01 0:11cc2b7889af 1741 *
maygup01 0:11cc2b7889af 1742 *
maygup01 0:11cc2b7889af 1743 * \brief Resolves endpoint information from received CoAP message
maygup01 0:11cc2b7889af 1744 * \param *handle Pointer to nsdl-library handle
maygup01 0:11cc2b7889af 1745 * \param *coap_packet_ptr Pointer to received CoAP message
maygup01 0:11cc2b7889af 1746 *
maygup01 0:11cc2b7889af 1747 * \return SN_NSDL_SUCCESS = 0, Failed = -1
maygup01 0:11cc2b7889af 1748 */
maygup01 0:11cc2b7889af 1749 static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr)
maygup01 0:11cc2b7889af 1750 {
maygup01 0:11cc2b7889af 1751 uint8_t *temp_ptr;
maygup01 0:11cc2b7889af 1752 uint8_t parameter_count = 0;
maygup01 0:11cc2b7889af 1753 uint16_t parameter_len = 0;
maygup01 0:11cc2b7889af 1754
maygup01 0:11cc2b7889af 1755 if (!coap_packet_ptr || !coap_packet_ptr->options_list_ptr ||
maygup01 0:11cc2b7889af 1756 !coap_packet_ptr->options_list_ptr->location_path_ptr) {
maygup01 0:11cc2b7889af 1757 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1758 }
maygup01 0:11cc2b7889af 1759
maygup01 0:11cc2b7889af 1760 temp_ptr = coap_packet_ptr->options_list_ptr->location_path_ptr;
maygup01 0:11cc2b7889af 1761
maygup01 0:11cc2b7889af 1762 while (temp_ptr <= (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len)) {
maygup01 0:11cc2b7889af 1763
maygup01 0:11cc2b7889af 1764 if ((temp_ptr == (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len)) || (*temp_ptr == '/')) {
maygup01 0:11cc2b7889af 1765
maygup01 0:11cc2b7889af 1766 parameter_count++;
maygup01 0:11cc2b7889af 1767 if (parameter_count == 2) {
maygup01 0:11cc2b7889af 1768 if (!handle->ep_information_ptr->domain_name_ptr) {
maygup01 0:11cc2b7889af 1769 handle->ep_information_ptr->domain_name_len = parameter_len - 1;
maygup01 0:11cc2b7889af 1770 handle->ep_information_ptr->domain_name_ptr = handle->sn_nsdl_alloc(handle->ep_information_ptr->domain_name_len);
maygup01 0:11cc2b7889af 1771 if (!handle->ep_information_ptr->domain_name_ptr) {
maygup01 0:11cc2b7889af 1772 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1773 }
maygup01 0:11cc2b7889af 1774 memcpy(handle->ep_information_ptr->domain_name_ptr, temp_ptr - handle->ep_information_ptr->domain_name_len, handle->ep_information_ptr->domain_name_len);
maygup01 0:11cc2b7889af 1775 }
maygup01 0:11cc2b7889af 1776
maygup01 0:11cc2b7889af 1777 }
maygup01 0:11cc2b7889af 1778 if (parameter_count == 3) {
maygup01 0:11cc2b7889af 1779 if (!handle->ep_information_ptr->endpoint_name_ptr) {
maygup01 0:11cc2b7889af 1780 handle->ep_information_ptr->endpoint_name_len = parameter_len - 1;
maygup01 0:11cc2b7889af 1781 handle->ep_information_ptr->endpoint_name_ptr = handle->sn_nsdl_alloc(handle->ep_information_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 1782 if (!handle->ep_information_ptr->endpoint_name_ptr) {
maygup01 0:11cc2b7889af 1783 if (handle->ep_information_ptr->domain_name_ptr) {
maygup01 0:11cc2b7889af 1784 handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr);
maygup01 0:11cc2b7889af 1785 handle->ep_information_ptr->domain_name_ptr = NULL;
maygup01 0:11cc2b7889af 1786 handle->ep_information_ptr->domain_name_len = 0;
maygup01 0:11cc2b7889af 1787 }
maygup01 0:11cc2b7889af 1788
maygup01 0:11cc2b7889af 1789 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1790
maygup01 0:11cc2b7889af 1791 }
maygup01 0:11cc2b7889af 1792 memcpy(handle->ep_information_ptr->endpoint_name_ptr, temp_ptr - handle->ep_information_ptr->endpoint_name_len, handle->ep_information_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 1793 }
maygup01 0:11cc2b7889af 1794 }
maygup01 0:11cc2b7889af 1795 parameter_len = 0;
maygup01 0:11cc2b7889af 1796 }
maygup01 0:11cc2b7889af 1797 parameter_len++;
maygup01 0:11cc2b7889af 1798 temp_ptr++;
maygup01 0:11cc2b7889af 1799 }
maygup01 0:11cc2b7889af 1800
maygup01 0:11cc2b7889af 1801
maygup01 0:11cc2b7889af 1802 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1803 }
maygup01 0:11cc2b7889af 1804
maygup01 0:11cc2b7889af 1805 extern int8_t set_NSP_address(struct nsdl_s *handle, uint8_t *NSP_address, uint8_t address_length, uint16_t port, sn_nsdl_addr_type_e address_type)
maygup01 0:11cc2b7889af 1806 {
maygup01 0:11cc2b7889af 1807 /* Check parameters and source pointers */
maygup01 0:11cc2b7889af 1808 if (!handle || !NSP_address) {
maygup01 0:11cc2b7889af 1809 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1810 }
maygup01 0:11cc2b7889af 1811
maygup01 0:11cc2b7889af 1812 handle->server_address.type = address_type;
maygup01 0:11cc2b7889af 1813
maygup01 0:11cc2b7889af 1814 handle->sn_nsdl_free(handle->server_address.addr_ptr);
maygup01 0:11cc2b7889af 1815
maygup01 0:11cc2b7889af 1816 handle->server_address.addr_len = address_length;
maygup01 0:11cc2b7889af 1817
maygup01 0:11cc2b7889af 1818 handle->server_address.addr_ptr = handle->sn_nsdl_alloc(handle->server_address.addr_len);
maygup01 0:11cc2b7889af 1819 if (!handle->server_address.addr_ptr) {
maygup01 0:11cc2b7889af 1820 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1821 }
maygup01 0:11cc2b7889af 1822
maygup01 0:11cc2b7889af 1823 memcpy(handle->server_address.addr_ptr, NSP_address, handle->server_address.addr_len);
maygup01 0:11cc2b7889af 1824 handle->server_address.port = port;
maygup01 0:11cc2b7889af 1825
maygup01 0:11cc2b7889af 1826 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1827 }
maygup01 0:11cc2b7889af 1828
maygup01 0:11cc2b7889af 1829
maygup01 0:11cc2b7889af 1830 static uint8_t sn_nsdl_itoa_len(uint32_t value)
maygup01 0:11cc2b7889af 1831 {
maygup01 0:11cc2b7889af 1832 uint8_t i = 0;
maygup01 0:11cc2b7889af 1833
maygup01 0:11cc2b7889af 1834 do {
maygup01 0:11cc2b7889af 1835 i++;
maygup01 0:11cc2b7889af 1836 } while ((value /= 10) > 0);
maygup01 0:11cc2b7889af 1837
maygup01 0:11cc2b7889af 1838 return i;
maygup01 0:11cc2b7889af 1839 }
maygup01 0:11cc2b7889af 1840
maygup01 0:11cc2b7889af 1841 static uint8_t *sn_nsdl_itoa(uint8_t *ptr, uint32_t value)
maygup01 0:11cc2b7889af 1842 {
maygup01 0:11cc2b7889af 1843
maygup01 0:11cc2b7889af 1844 uint8_t start = 0;
maygup01 0:11cc2b7889af 1845 uint8_t end = 0;
maygup01 0:11cc2b7889af 1846 uint8_t i;
maygup01 0:11cc2b7889af 1847
maygup01 0:11cc2b7889af 1848 i = 0;
maygup01 0:11cc2b7889af 1849
maygup01 0:11cc2b7889af 1850 /* ITOA */
maygup01 0:11cc2b7889af 1851 do {
maygup01 0:11cc2b7889af 1852 ptr[i++] = (value % 10) + '0';
maygup01 0:11cc2b7889af 1853 } while ((value /= 10) > 0);
maygup01 0:11cc2b7889af 1854
maygup01 0:11cc2b7889af 1855 end = i - 1;
maygup01 0:11cc2b7889af 1856
maygup01 0:11cc2b7889af 1857 /* reverse (part of ITOA) */
maygup01 0:11cc2b7889af 1858 while (start < end) {
maygup01 0:11cc2b7889af 1859 uint8_t chr;
maygup01 0:11cc2b7889af 1860
maygup01 0:11cc2b7889af 1861 chr = ptr[start];
maygup01 0:11cc2b7889af 1862 ptr[start] = ptr[end];
maygup01 0:11cc2b7889af 1863 ptr[end] = chr;
maygup01 0:11cc2b7889af 1864
maygup01 0:11cc2b7889af 1865 start++;
maygup01 0:11cc2b7889af 1866 end--;
maygup01 0:11cc2b7889af 1867
maygup01 0:11cc2b7889af 1868 }
maygup01 0:11cc2b7889af 1869 return (ptr + i);
maygup01 0:11cc2b7889af 1870 }
maygup01 0:11cc2b7889af 1871
maygup01 0:11cc2b7889af 1872 static int8_t set_endpoint_info(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *endpoint_info_ptr)
maygup01 0:11cc2b7889af 1873 {
maygup01 0:11cc2b7889af 1874 handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr);
maygup01 0:11cc2b7889af 1875 handle->ep_information_ptr->domain_name_ptr = 0;
maygup01 0:11cc2b7889af 1876 handle->ep_information_ptr->domain_name_len = 0;
maygup01 0:11cc2b7889af 1877
maygup01 0:11cc2b7889af 1878 handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr);
maygup01 0:11cc2b7889af 1879 handle->ep_information_ptr->endpoint_name_ptr = 0;
maygup01 0:11cc2b7889af 1880 handle->ep_information_ptr->endpoint_name_len = 0;
maygup01 0:11cc2b7889af 1881
maygup01 0:11cc2b7889af 1882 handle->sn_nsdl_free(handle->ep_information_ptr->type_ptr);
maygup01 0:11cc2b7889af 1883 handle->ep_information_ptr->type_ptr = 0;
maygup01 0:11cc2b7889af 1884 handle->ep_information_ptr->type_len = 0;
maygup01 0:11cc2b7889af 1885
maygup01 0:11cc2b7889af 1886 if (endpoint_info_ptr->domain_name_ptr && endpoint_info_ptr->domain_name_len) {
maygup01 0:11cc2b7889af 1887 handle->ep_information_ptr->domain_name_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->domain_name_len);
maygup01 0:11cc2b7889af 1888
maygup01 0:11cc2b7889af 1889 if (!handle->ep_information_ptr->domain_name_ptr) {
maygup01 0:11cc2b7889af 1890 return -1;
maygup01 0:11cc2b7889af 1891 }
maygup01 0:11cc2b7889af 1892
maygup01 0:11cc2b7889af 1893 memcpy(handle->ep_information_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_len);
maygup01 0:11cc2b7889af 1894 handle->ep_information_ptr->domain_name_len = endpoint_info_ptr->domain_name_len;
maygup01 0:11cc2b7889af 1895 }
maygup01 0:11cc2b7889af 1896
maygup01 0:11cc2b7889af 1897 if (endpoint_info_ptr->endpoint_name_ptr && endpoint_info_ptr->endpoint_name_len) {
maygup01 0:11cc2b7889af 1898 handle->ep_information_ptr->endpoint_name_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 1899
maygup01 0:11cc2b7889af 1900 if (!handle->ep_information_ptr->endpoint_name_ptr) {
maygup01 0:11cc2b7889af 1901 handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr);
maygup01 0:11cc2b7889af 1902 handle->ep_information_ptr->domain_name_ptr = 0;
maygup01 0:11cc2b7889af 1903 handle->ep_information_ptr->domain_name_len = 0;
maygup01 0:11cc2b7889af 1904 return -1;
maygup01 0:11cc2b7889af 1905 }
maygup01 0:11cc2b7889af 1906
maygup01 0:11cc2b7889af 1907 memcpy(handle->ep_information_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_len);
maygup01 0:11cc2b7889af 1908 handle->ep_information_ptr->endpoint_name_len = endpoint_info_ptr->endpoint_name_len;
maygup01 0:11cc2b7889af 1909 }
maygup01 0:11cc2b7889af 1910
maygup01 0:11cc2b7889af 1911 if (endpoint_info_ptr->type_ptr && endpoint_info_ptr->type_len) {
maygup01 0:11cc2b7889af 1912 handle->ep_information_ptr->type_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->type_len);
maygup01 0:11cc2b7889af 1913 if (handle->ep_information_ptr->type_ptr) {
maygup01 0:11cc2b7889af 1914 memcpy(handle->ep_information_ptr->type_ptr, endpoint_info_ptr->type_ptr, endpoint_info_ptr->type_len);
maygup01 0:11cc2b7889af 1915 handle->ep_information_ptr->type_len = endpoint_info_ptr->type_len;
maygup01 0:11cc2b7889af 1916 }
maygup01 0:11cc2b7889af 1917 }
maygup01 0:11cc2b7889af 1918
maygup01 0:11cc2b7889af 1919 handle->ep_information_ptr->binding_and_mode = endpoint_info_ptr->binding_and_mode;
maygup01 0:11cc2b7889af 1920 handle->ep_information_ptr->ds_register_mode = endpoint_info_ptr->ds_register_mode;
maygup01 0:11cc2b7889af 1921
maygup01 0:11cc2b7889af 1922 return 0;
maygup01 0:11cc2b7889af 1923 }
maygup01 0:11cc2b7889af 1924
maygup01 0:11cc2b7889af 1925 extern int8_t sn_nsdl_send_coap_message(struct nsdl_s *handle, sn_nsdl_addr_s *address_ptr, sn_coap_hdr_s *coap_hdr_ptr)
maygup01 0:11cc2b7889af 1926 {
maygup01 0:11cc2b7889af 1927 /* Check parameters */
maygup01 0:11cc2b7889af 1928 if (handle == NULL) {
maygup01 0:11cc2b7889af 1929 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1930 }
maygup01 0:11cc2b7889af 1931
maygup01 0:11cc2b7889af 1932 int8_t ret = sn_grs_send_coap_message(handle, address_ptr, coap_hdr_ptr);
maygup01 0:11cc2b7889af 1933
maygup01 0:11cc2b7889af 1934 return ret;
maygup01 0:11cc2b7889af 1935 }
maygup01 0:11cc2b7889af 1936
maygup01 0:11cc2b7889af 1937 extern int8_t sn_nsdl_handle_block2_response_internally(struct nsdl_s *handle, uint8_t build_response)
maygup01 0:11cc2b7889af 1938 {
maygup01 0:11cc2b7889af 1939 /* Check parameters */
maygup01 0:11cc2b7889af 1940 if (handle == NULL) {
maygup01 0:11cc2b7889af 1941 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1942 }
maygup01 0:11cc2b7889af 1943
maygup01 0:11cc2b7889af 1944 return sn_coap_protocol_handle_block2_response_internally(handle->grs->coap, build_response);
maygup01 0:11cc2b7889af 1945 }
maygup01 0:11cc2b7889af 1946
maygup01 0:11cc2b7889af 1947 extern int8_t sn_nsdl_clear_coap_sent_blockwise_messages(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 1948 {
maygup01 0:11cc2b7889af 1949 /* Check parameters */
maygup01 0:11cc2b7889af 1950 if (handle == NULL) {
maygup01 0:11cc2b7889af 1951 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1952 }
maygup01 0:11cc2b7889af 1953
maygup01 0:11cc2b7889af 1954 // Enable function once new CoAP API is released to mbed-os
maygup01 0:11cc2b7889af 1955 sn_coap_protocol_clear_sent_blockwise_messages(handle->grs->coap);
maygup01 0:11cc2b7889af 1956
maygup01 0:11cc2b7889af 1957 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1958 }
maygup01 0:11cc2b7889af 1959
maygup01 0:11cc2b7889af 1960 extern int8_t sn_nsdl_clear_coap_received_blockwise_messages(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 1961 {
maygup01 0:11cc2b7889af 1962 /* Check parameters */
maygup01 0:11cc2b7889af 1963 if (handle == NULL) {
maygup01 0:11cc2b7889af 1964 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 1965 }
maygup01 0:11cc2b7889af 1966
maygup01 0:11cc2b7889af 1967 // Enable function once new CoAP API is released to mbed-os
maygup01 0:11cc2b7889af 1968 // sn_coap_protocol_clear_received_blockwise_messages(handle->grs->coap);
maygup01 0:11cc2b7889af 1969
maygup01 0:11cc2b7889af 1970 /* Loop all stored Blockwise messages in Linked list */
maygup01 0:11cc2b7889af 1971 ns_list_foreach_safe(coap_blockwise_payload_s, removed_payload_ptr, &handle->grs->coap->linked_list_blockwise_received_payloads) {
maygup01 0:11cc2b7889af 1972 ns_list_remove(&handle->grs->coap->linked_list_blockwise_received_payloads, removed_payload_ptr);
maygup01 0:11cc2b7889af 1973 /* Free memory of stored payload */
maygup01 0:11cc2b7889af 1974 handle->grs->coap->sn_coap_protocol_free(removed_payload_ptr->addr_ptr);
maygup01 0:11cc2b7889af 1975 handle->grs->coap->sn_coap_protocol_free(removed_payload_ptr->payload_ptr);
maygup01 0:11cc2b7889af 1976 handle->grs->coap->sn_coap_protocol_free(removed_payload_ptr->token_ptr);
maygup01 0:11cc2b7889af 1977 handle->grs->coap->sn_coap_protocol_free(removed_payload_ptr);
maygup01 0:11cc2b7889af 1978 }
maygup01 0:11cc2b7889af 1979
maygup01 0:11cc2b7889af 1980 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 1981 }
maygup01 0:11cc2b7889af 1982
maygup01 0:11cc2b7889af 1983 extern int32_t sn_nsdl_send_request(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 1984 const sn_coap_msg_code_e msg_code,
maygup01 0:11cc2b7889af 1985 const char *uri_path,
maygup01 0:11cc2b7889af 1986 const uint32_t token,
maygup01 0:11cc2b7889af 1987 const size_t offset,
maygup01 0:11cc2b7889af 1988 const uint16_t payload_len,
maygup01 0:11cc2b7889af 1989 uint8_t* payload_ptr,
maygup01 0:11cc2b7889af 1990 DownloadType type)
maygup01 0:11cc2b7889af 1991 {
maygup01 0:11cc2b7889af 1992 sn_coap_hdr_s req_message;
maygup01 0:11cc2b7889af 1993 int32_t message_id;
maygup01 0:11cc2b7889af 1994
maygup01 0:11cc2b7889af 1995 if (handle == NULL || uri_path == NULL) {
maygup01 0:11cc2b7889af 1996 return 0;
maygup01 0:11cc2b7889af 1997 }
maygup01 0:11cc2b7889af 1998
maygup01 0:11cc2b7889af 1999 memset(&req_message, 0, sizeof(sn_coap_hdr_s));
maygup01 0:11cc2b7889af 2000
maygup01 0:11cc2b7889af 2001 // Fill message fields
maygup01 0:11cc2b7889af 2002 req_message.msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 2003 req_message.msg_code = msg_code;
maygup01 0:11cc2b7889af 2004
maygup01 0:11cc2b7889af 2005 // In GET we use hardcoded uri path('fw' or 'download') since the actual binary path will be part of
maygup01 0:11cc2b7889af 2006 // proxy uri option
maygup01 0:11cc2b7889af 2007 if (req_message.msg_code == COAP_MSG_CODE_REQUEST_GET) {
maygup01 0:11cc2b7889af 2008 if (type == FIRMWARE_DOWNLOAD) {
maygup01 0:11cc2b7889af 2009 req_message.uri_path_len = FIRMWARE_DOWNLOAD_LEN;
maygup01 0:11cc2b7889af 2010 req_message.uri_path_ptr = firmware_download_uri;
maygup01 0:11cc2b7889af 2011 } else {
maygup01 0:11cc2b7889af 2012 req_message.uri_path_len = GENERIC_DOWNLOAD_LEN;
maygup01 0:11cc2b7889af 2013 req_message.uri_path_ptr = generic_download_uri;
maygup01 0:11cc2b7889af 2014 }
maygup01 0:11cc2b7889af 2015 } else {
maygup01 0:11cc2b7889af 2016 req_message.uri_path_len = (uint16_t)strlen(uri_path);
maygup01 0:11cc2b7889af 2017 req_message.uri_path_ptr = (uint8_t*)uri_path;
maygup01 0:11cc2b7889af 2018 }
maygup01 0:11cc2b7889af 2019 req_message.token_ptr = (uint8_t*)&token;
maygup01 0:11cc2b7889af 2020 req_message.token_len = sizeof(token);
maygup01 0:11cc2b7889af 2021 if (msg_code == COAP_MSG_CODE_REQUEST_POST || msg_code == COAP_MSG_CODE_REQUEST_PUT) {
maygup01 0:11cc2b7889af 2022 // Use payload only if POST or PUT request
maygup01 0:11cc2b7889af 2023 req_message.payload_ptr = payload_ptr;
maygup01 0:11cc2b7889af 2024 req_message.payload_len = payload_len;
maygup01 0:11cc2b7889af 2025 }
maygup01 0:11cc2b7889af 2026
maygup01 0:11cc2b7889af 2027 if (sn_coap_parser_alloc_options(handle->grs->coap, &req_message) == NULL) {
maygup01 0:11cc2b7889af 2028 handle->grs->coap->sn_coap_protocol_free(req_message.options_list_ptr);
maygup01 0:11cc2b7889af 2029 return 0;
maygup01 0:11cc2b7889af 2030 }
maygup01 0:11cc2b7889af 2031
maygup01 0:11cc2b7889af 2032 if (msg_code == COAP_MSG_CODE_REQUEST_GET) {
maygup01 0:11cc2b7889af 2033 req_message.options_list_ptr->proxy_uri_len = (uint16_t)strlen(uri_path);
maygup01 0:11cc2b7889af 2034 req_message.options_list_ptr->proxy_uri_ptr = (uint8_t*)uri_path;
maygup01 0:11cc2b7889af 2035 }
maygup01 0:11cc2b7889af 2036
maygup01 0:11cc2b7889af 2037 // Skip block options if feature is not enabled
maygup01 0:11cc2b7889af 2038 #if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE
maygup01 0:11cc2b7889af 2039 // Add block number
maygup01 0:11cc2b7889af 2040 req_message.options_list_ptr->block2 = 0;
maygup01 0:11cc2b7889af 2041 if (offset > 0) {
maygup01 0:11cc2b7889af 2042 req_message.options_list_ptr->block2 = ((offset / handle->grs->coap->sn_coap_block_data_size) << 4);
maygup01 0:11cc2b7889af 2043 }
maygup01 0:11cc2b7889af 2044 // Add block size
maygup01 0:11cc2b7889af 2045 req_message.options_list_ptr->block2 |= sn_coap_convert_block_size(handle->grs->coap->sn_coap_block_data_size);
maygup01 0:11cc2b7889af 2046 #else
maygup01 0:11cc2b7889af 2047 (void)offset;
maygup01 0:11cc2b7889af 2048 #endif
maygup01 0:11cc2b7889af 2049
maygup01 0:11cc2b7889af 2050 // Build and send coap message
maygup01 0:11cc2b7889af 2051 message_id = sn_nsdl_internal_coap_send(handle, &req_message, &handle->server_address);
maygup01 0:11cc2b7889af 2052 handle->grs->coap->sn_coap_protocol_free(req_message.options_list_ptr);
maygup01 0:11cc2b7889af 2053
maygup01 0:11cc2b7889af 2054 return message_id;
maygup01 0:11cc2b7889af 2055 }
maygup01 0:11cc2b7889af 2056
maygup01 0:11cc2b7889af 2057 extern int8_t sn_nsdl_put_resource(struct nsdl_s *handle, sn_nsdl_dynamic_resource_parameters_s *res)
maygup01 0:11cc2b7889af 2058 {
maygup01 0:11cc2b7889af 2059 if (!handle) {
maygup01 0:11cc2b7889af 2060 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2061 }
maygup01 0:11cc2b7889af 2062
maygup01 0:11cc2b7889af 2063 return sn_grs_put_resource(handle->grs, res);
maygup01 0:11cc2b7889af 2064 }
maygup01 0:11cc2b7889af 2065
maygup01 0:11cc2b7889af 2066 extern int8_t sn_nsdl_pop_resource(struct nsdl_s *handle, sn_nsdl_dynamic_resource_parameters_s *res)
maygup01 0:11cc2b7889af 2067 {
maygup01 0:11cc2b7889af 2068 if (!handle) {
maygup01 0:11cc2b7889af 2069 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2070 }
maygup01 0:11cc2b7889af 2071
maygup01 0:11cc2b7889af 2072 return sn_grs_pop_resource(handle->grs, res);
maygup01 0:11cc2b7889af 2073 }
maygup01 0:11cc2b7889af 2074
maygup01 0:11cc2b7889af 2075 extern int8_t sn_nsdl_delete_resource(struct nsdl_s *handle, const char *path)
maygup01 0:11cc2b7889af 2076 {
maygup01 0:11cc2b7889af 2077 /* Check parameters */
maygup01 0:11cc2b7889af 2078 if (handle == NULL) {
maygup01 0:11cc2b7889af 2079 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2080 }
maygup01 0:11cc2b7889af 2081
maygup01 0:11cc2b7889af 2082 return sn_grs_delete_resource(handle->grs, path);
maygup01 0:11cc2b7889af 2083 }
maygup01 0:11cc2b7889af 2084 extern const sn_nsdl_dynamic_resource_parameters_s *sn_nsdl_get_first_resource(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 2085 {
maygup01 0:11cc2b7889af 2086 /* Check parameters */
maygup01 0:11cc2b7889af 2087 if (handle == NULL) {
maygup01 0:11cc2b7889af 2088 return NULL;
maygup01 0:11cc2b7889af 2089 }
maygup01 0:11cc2b7889af 2090
maygup01 0:11cc2b7889af 2091 return sn_grs_get_first_resource(handle->grs);
maygup01 0:11cc2b7889af 2092 }
maygup01 0:11cc2b7889af 2093 extern const sn_nsdl_dynamic_resource_parameters_s *sn_nsdl_get_next_resource(struct nsdl_s *handle, const sn_nsdl_dynamic_resource_parameters_s *resource)
maygup01 0:11cc2b7889af 2094 {
maygup01 0:11cc2b7889af 2095 /* Check parameters */
maygup01 0:11cc2b7889af 2096 if (handle == NULL) {
maygup01 0:11cc2b7889af 2097 return NULL;
maygup01 0:11cc2b7889af 2098 }
maygup01 0:11cc2b7889af 2099
maygup01 0:11cc2b7889af 2100 return sn_grs_get_next_resource(handle->grs, resource);
maygup01 0:11cc2b7889af 2101 }
maygup01 0:11cc2b7889af 2102
maygup01 0:11cc2b7889af 2103 extern sn_coap_hdr_s *sn_nsdl_build_response(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, uint8_t msg_code)
maygup01 0:11cc2b7889af 2104 {
maygup01 0:11cc2b7889af 2105 if (handle == NULL) {
maygup01 0:11cc2b7889af 2106 return NULL;
maygup01 0:11cc2b7889af 2107 }
maygup01 0:11cc2b7889af 2108
maygup01 0:11cc2b7889af 2109 return sn_coap_build_response(handle->grs->coap, coap_packet_ptr, msg_code);
maygup01 0:11cc2b7889af 2110 }
maygup01 0:11cc2b7889af 2111
maygup01 0:11cc2b7889af 2112 extern sn_coap_options_list_s *sn_nsdl_alloc_options_list(struct nsdl_s *handle, sn_coap_hdr_s *coap_msg_ptr)
maygup01 0:11cc2b7889af 2113 {
maygup01 0:11cc2b7889af 2114 if (handle == NULL || coap_msg_ptr == NULL) {
maygup01 0:11cc2b7889af 2115 return NULL;
maygup01 0:11cc2b7889af 2116 }
maygup01 0:11cc2b7889af 2117 return sn_coap_parser_alloc_options(handle->grs->coap, coap_msg_ptr);
maygup01 0:11cc2b7889af 2118 }
maygup01 0:11cc2b7889af 2119
maygup01 0:11cc2b7889af 2120 extern void sn_nsdl_release_allocated_coap_msg_mem(struct nsdl_s *handle, sn_coap_hdr_s *freed_coap_msg_ptr)
maygup01 0:11cc2b7889af 2121 {
maygup01 0:11cc2b7889af 2122 if (handle == NULL) {
maygup01 0:11cc2b7889af 2123 return;
maygup01 0:11cc2b7889af 2124 }
maygup01 0:11cc2b7889af 2125
maygup01 0:11cc2b7889af 2126 sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, freed_coap_msg_ptr);
maygup01 0:11cc2b7889af 2127 }
maygup01 0:11cc2b7889af 2128
maygup01 0:11cc2b7889af 2129 extern int8_t sn_nsdl_set_retransmission_parameters(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 2130 uint8_t resending_count, uint8_t resending_interval)
maygup01 0:11cc2b7889af 2131 {
maygup01 0:11cc2b7889af 2132 if (handle == NULL) {
maygup01 0:11cc2b7889af 2133 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2134 }
maygup01 0:11cc2b7889af 2135 return sn_coap_protocol_set_retransmission_parameters(handle->grs->coap,
maygup01 0:11cc2b7889af 2136 resending_count,resending_interval);
maygup01 0:11cc2b7889af 2137 }
maygup01 0:11cc2b7889af 2138
maygup01 0:11cc2b7889af 2139 extern int8_t sn_nsdl_set_retransmission_buffer(struct nsdl_s *handle,
maygup01 0:11cc2b7889af 2140 uint8_t buffer_size_messages, uint16_t buffer_size_bytes)
maygup01 0:11cc2b7889af 2141 {
maygup01 0:11cc2b7889af 2142 if (handle == NULL) {
maygup01 0:11cc2b7889af 2143 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2144 }
maygup01 0:11cc2b7889af 2145 return sn_coap_protocol_set_retransmission_buffer(handle->grs->coap,
maygup01 0:11cc2b7889af 2146 buffer_size_messages, buffer_size_bytes);
maygup01 0:11cc2b7889af 2147 }
maygup01 0:11cc2b7889af 2148
maygup01 0:11cc2b7889af 2149 extern int8_t sn_nsdl_set_block_size(struct nsdl_s *handle, uint16_t block_size)
maygup01 0:11cc2b7889af 2150 {
maygup01 0:11cc2b7889af 2151 if (handle == NULL) {
maygup01 0:11cc2b7889af 2152 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2153 }
maygup01 0:11cc2b7889af 2154 return sn_coap_protocol_set_block_size(handle->grs->coap, block_size);
maygup01 0:11cc2b7889af 2155 }
maygup01 0:11cc2b7889af 2156
maygup01 0:11cc2b7889af 2157 extern int8_t sn_nsdl_set_duplicate_buffer_size(struct nsdl_s *handle, uint8_t message_count)
maygup01 0:11cc2b7889af 2158 {
maygup01 0:11cc2b7889af 2159 if (handle == NULL) {
maygup01 0:11cc2b7889af 2160 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2161 }
maygup01 0:11cc2b7889af 2162 return sn_coap_protocol_set_duplicate_buffer_size(handle->grs->coap, message_count);
maygup01 0:11cc2b7889af 2163 }
maygup01 0:11cc2b7889af 2164
maygup01 0:11cc2b7889af 2165 bool sn_nsdl_check_uint_overflow(uint16_t resource_size, uint16_t param_a, uint16_t param_b)
maygup01 0:11cc2b7889af 2166 {
maygup01 0:11cc2b7889af 2167 uint16_t first_check = param_a + param_b;
maygup01 0:11cc2b7889af 2168 if (first_check < param_b) {
maygup01 0:11cc2b7889af 2169 return false;
maygup01 0:11cc2b7889af 2170 } else {
maygup01 0:11cc2b7889af 2171 uint16_t total = resource_size + first_check;
maygup01 0:11cc2b7889af 2172 if (total < first_check) {
maygup01 0:11cc2b7889af 2173 return false;
maygup01 0:11cc2b7889af 2174 } else {
maygup01 0:11cc2b7889af 2175 return true;
maygup01 0:11cc2b7889af 2176 }
maygup01 0:11cc2b7889af 2177 }
maygup01 0:11cc2b7889af 2178 }
maygup01 0:11cc2b7889af 2179
maygup01 0:11cc2b7889af 2180 extern int8_t sn_nsdl_set_context(struct nsdl_s * const handle, void * const context)
maygup01 0:11cc2b7889af 2181 {
maygup01 0:11cc2b7889af 2182 if (handle == NULL) {
maygup01 0:11cc2b7889af 2183 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2184 }
maygup01 0:11cc2b7889af 2185 handle->context = context;
maygup01 0:11cc2b7889af 2186 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 2187 }
maygup01 0:11cc2b7889af 2188
maygup01 0:11cc2b7889af 2189 extern void *sn_nsdl_get_context(const struct nsdl_s * const handle)
maygup01 0:11cc2b7889af 2190 {
maygup01 0:11cc2b7889af 2191 if (handle == NULL) {
maygup01 0:11cc2b7889af 2192 return NULL;
maygup01 0:11cc2b7889af 2193 }
maygup01 0:11cc2b7889af 2194 return handle->context;
maygup01 0:11cc2b7889af 2195 }
maygup01 0:11cc2b7889af 2196
maygup01 0:11cc2b7889af 2197
maygup01 0:11cc2b7889af 2198 int8_t sn_nsdl_clear_coap_resending_queue(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 2199 {
maygup01 0:11cc2b7889af 2200 if (handle == NULL || handle->grs == NULL) {
maygup01 0:11cc2b7889af 2201 tr_err("sn_nsdl_clear_coap_resending_queue failed.");
maygup01 0:11cc2b7889af 2202 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2203 }
maygup01 0:11cc2b7889af 2204 sn_coap_protocol_clear_retransmission_buffer(handle->grs->coap);
maygup01 0:11cc2b7889af 2205 return SN_NSDL_SUCCESS;
maygup01 0:11cc2b7889af 2206 }
maygup01 0:11cc2b7889af 2207
maygup01 0:11cc2b7889af 2208 int8_t sn_nsdl_remove_msg_from_retransmission(struct nsdl_s *handle, uint8_t *token, uint8_t token_len)
maygup01 0:11cc2b7889af 2209 {
maygup01 0:11cc2b7889af 2210 if (handle == NULL || handle->grs == NULL || handle->grs->coap == NULL || token == NULL || token_len == 0) {
maygup01 0:11cc2b7889af 2211 tr_err("sn_nsdl_remove_msg_from_retransmission failed.");
maygup01 0:11cc2b7889af 2212 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2213 }
maygup01 0:11cc2b7889af 2214
maygup01 0:11cc2b7889af 2215 #if ENABLE_RESENDINGS
maygup01 0:11cc2b7889af 2216 // Workaround until new "sn_coap_protocol_delete_retransmission_by_token" API is released
maygup01 0:11cc2b7889af 2217 // return sn_coap_protocol_delete_retransmission_by_token(handle->grs->coap, token, token_len);
maygup01 0:11cc2b7889af 2218 ns_list_foreach(coap_send_msg_s, stored_msg, &handle->grs->coap->linked_list_resent_msgs) {
maygup01 0:11cc2b7889af 2219 uint8_t stored_token_len = (stored_msg->send_msg_ptr->packet_ptr[0] & 0x0F);
maygup01 0:11cc2b7889af 2220 if (stored_token_len == token_len) {
maygup01 0:11cc2b7889af 2221 uint8_t stored_token[8];
maygup01 0:11cc2b7889af 2222 memcpy(stored_token, &stored_msg->send_msg_ptr->packet_ptr[4], stored_token_len);
maygup01 0:11cc2b7889af 2223 if (memcmp(stored_token, token, stored_token_len) == 0) {
maygup01 0:11cc2b7889af 2224 uint16_t temp_msg_id = (stored_msg->send_msg_ptr->packet_ptr[2] << 8);
maygup01 0:11cc2b7889af 2225 temp_msg_id += (uint16_t)stored_msg->send_msg_ptr->packet_ptr[3];
maygup01 0:11cc2b7889af 2226 tr_debug("sn_nsdl_remove_msg_from_retransmission - removed msg_id: %d", temp_msg_id);
maygup01 0:11cc2b7889af 2227 ns_list_remove(&handle->grs->coap->linked_list_resent_msgs, stored_msg);
maygup01 0:11cc2b7889af 2228 --handle->grs->coap->count_resent_msgs;
maygup01 0:11cc2b7889af 2229
maygup01 0:11cc2b7889af 2230 handle->grs->coap->sn_coap_protocol_free(stored_msg->send_msg_ptr);
maygup01 0:11cc2b7889af 2231 handle->grs->coap->sn_coap_protocol_free(stored_msg);
maygup01 0:11cc2b7889af 2232
maygup01 0:11cc2b7889af 2233 return 0;
maygup01 0:11cc2b7889af 2234 }
maygup01 0:11cc2b7889af 2235 }
maygup01 0:11cc2b7889af 2236 }
maygup01 0:11cc2b7889af 2237 #endif
maygup01 0:11cc2b7889af 2238
maygup01 0:11cc2b7889af 2239 return SN_NSDL_FAILURE;
maygup01 0:11cc2b7889af 2240 }
maygup01 0:11cc2b7889af 2241
maygup01 0:11cc2b7889af 2242 #ifdef RESOURCE_ATTRIBUTES_LIST
maygup01 0:11cc2b7889af 2243 static void sn_nsdl_free_attribute_value(sn_nsdl_attribute_item_s *attribute)
maygup01 0:11cc2b7889af 2244 {
maygup01 0:11cc2b7889af 2245 switch (attribute->attribute_name) {
maygup01 0:11cc2b7889af 2246 case ATTR_RESOURCE_TYPE:
maygup01 0:11cc2b7889af 2247 case ATTR_INTERFACE_DESCRIPTION:
maygup01 0:11cc2b7889af 2248 case ATTR_ENDPOINT_NAME:
maygup01 0:11cc2b7889af 2249 free(attribute->value);
maygup01 0:11cc2b7889af 2250 attribute->value = NULL;
maygup01 0:11cc2b7889af 2251 break;
maygup01 0:11cc2b7889af 2252 case ATTR_NOP:
maygup01 0:11cc2b7889af 2253 case ATTR_END:
maygup01 0:11cc2b7889af 2254 default:
maygup01 0:11cc2b7889af 2255 break;
maygup01 0:11cc2b7889af 2256 }
maygup01 0:11cc2b7889af 2257 }
maygup01 0:11cc2b7889af 2258
maygup01 0:11cc2b7889af 2259 void sn_nsdl_free_resource_attributes_list(sn_nsdl_static_resource_parameters_s *params)
maygup01 0:11cc2b7889af 2260 {
maygup01 0:11cc2b7889af 2261 if (params == NULL || params->free_on_delete == false) {
maygup01 0:11cc2b7889af 2262 return;
maygup01 0:11cc2b7889af 2263 }
maygup01 0:11cc2b7889af 2264 sn_nsdl_attribute_item_s *item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2265 if (item) {
maygup01 0:11cc2b7889af 2266 while (item->attribute_name != ATTR_END) {
maygup01 0:11cc2b7889af 2267 sn_nsdl_free_attribute_value(item);
maygup01 0:11cc2b7889af 2268 item++;
maygup01 0:11cc2b7889af 2269 }
maygup01 0:11cc2b7889af 2270 free(params->attributes_ptr);
maygup01 0:11cc2b7889af 2271 params->attributes_ptr = NULL;
maygup01 0:11cc2b7889af 2272 }
maygup01 0:11cc2b7889af 2273 }
maygup01 0:11cc2b7889af 2274
maygup01 0:11cc2b7889af 2275 bool sn_nsdl_set_resource_attribute(sn_nsdl_static_resource_parameters_s *params, const sn_nsdl_attribute_item_s *attribute)
maygup01 0:11cc2b7889af 2276 {
maygup01 0:11cc2b7889af 2277 if (params == NULL || params->free_on_delete == false) {
maygup01 0:11cc2b7889af 2278 return false;
maygup01 0:11cc2b7889af 2279 }
maygup01 0:11cc2b7889af 2280 unsigned int item_count = 0;
maygup01 0:11cc2b7889af 2281 sn_nsdl_attribute_item_s *item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2282 // Count the number of attributes for reallocation, update in place though
maygup01 0:11cc2b7889af 2283 // if the attribute already existed
maygup01 0:11cc2b7889af 2284 while (item != NULL) {
maygup01 0:11cc2b7889af 2285 item_count++;
maygup01 0:11cc2b7889af 2286 if (item->attribute_name == ATTR_END) {
maygup01 0:11cc2b7889af 2287 break;
maygup01 0:11cc2b7889af 2288 }
maygup01 0:11cc2b7889af 2289 // Check if attribute already exists or if there is NOP we can overwrite
maygup01 0:11cc2b7889af 2290 if (item->attribute_name == attribute->attribute_name || item->attribute_name == ATTR_NOP) {
maygup01 0:11cc2b7889af 2291 // Found attribute or NOP, overwrite it
maygup01 0:11cc2b7889af 2292 sn_nsdl_free_attribute_value(item);
maygup01 0:11cc2b7889af 2293 item->attribute_name = attribute->attribute_name;
maygup01 0:11cc2b7889af 2294 item->value = attribute->value;
maygup01 0:11cc2b7889af 2295 return true;
maygup01 0:11cc2b7889af 2296 }
maygup01 0:11cc2b7889af 2297 item++;
maygup01 0:11cc2b7889af 2298 }
maygup01 0:11cc2b7889af 2299 // Attribute did not yet exist (ptr was null or ATTR_END was first one)
maygup01 0:11cc2b7889af 2300 if (item_count > 0) {
maygup01 0:11cc2b7889af 2301 // List already had some attributes, so reallocate
maygup01 0:11cc2b7889af 2302 size_t new_size = (item_count + 1) * sizeof(sn_nsdl_attribute_item_s);
maygup01 0:11cc2b7889af 2303 item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2304 params->attributes_ptr = realloc(item, new_size);
maygup01 0:11cc2b7889af 2305 if (params->attributes_ptr == NULL) {
maygup01 0:11cc2b7889af 2306 // realloc failed, put back original pointer and return false
maygup01 0:11cc2b7889af 2307 params->attributes_ptr = item;
maygup01 0:11cc2b7889af 2308 return false;
maygup01 0:11cc2b7889af 2309 }
maygup01 0:11cc2b7889af 2310 // And move item ptr to ATTR_END to update that and last attribute
maygup01 0:11cc2b7889af 2311 item = &(params->attributes_ptr[item_count - 1]);
maygup01 0:11cc2b7889af 2312 }
maygup01 0:11cc2b7889af 2313 else {
maygup01 0:11cc2b7889af 2314 // No attributes, so allocate first time (1 struct for attribute and 1 struct for ATTR_END)
maygup01 0:11cc2b7889af 2315 params->attributes_ptr = (char*)malloc(2 * sizeof(sn_nsdl_attribute_item_s));
maygup01 0:11cc2b7889af 2316 if (params->attributes_ptr == NULL) {
maygup01 0:11cc2b7889af 2317 return false;
maygup01 0:11cc2b7889af 2318 }
maygup01 0:11cc2b7889af 2319 item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2320 }
maygup01 0:11cc2b7889af 2321 item->attribute_name = attribute->attribute_name;
maygup01 0:11cc2b7889af 2322 item->value = attribute->value;
maygup01 0:11cc2b7889af 2323 item++;
maygup01 0:11cc2b7889af 2324 item->attribute_name = ATTR_END;
maygup01 0:11cc2b7889af 2325 item->value = NULL;
maygup01 0:11cc2b7889af 2326 return true;
maygup01 0:11cc2b7889af 2327 }
maygup01 0:11cc2b7889af 2328
maygup01 0:11cc2b7889af 2329 const char *sn_nsdl_get_resource_attribute(const sn_nsdl_static_resource_parameters_s *params, sn_nsdl_resource_attribute_t attribute_name)
maygup01 0:11cc2b7889af 2330 {
maygup01 0:11cc2b7889af 2331 char *value = NULL;
maygup01 0:11cc2b7889af 2332 if (params != NULL) {
maygup01 0:11cc2b7889af 2333 sn_nsdl_attribute_item_s *item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2334 while (item != NULL && item->attribute_name != ATTR_END) {
maygup01 0:11cc2b7889af 2335 if (item->attribute_name == attribute_name) {
maygup01 0:11cc2b7889af 2336 value = item->value;
maygup01 0:11cc2b7889af 2337 break;
maygup01 0:11cc2b7889af 2338 }
maygup01 0:11cc2b7889af 2339 item++;
maygup01 0:11cc2b7889af 2340 }
maygup01 0:11cc2b7889af 2341 }
maygup01 0:11cc2b7889af 2342 return value;
maygup01 0:11cc2b7889af 2343 }
maygup01 0:11cc2b7889af 2344
maygup01 0:11cc2b7889af 2345 bool sn_nsdl_remove_resource_attribute(sn_nsdl_static_resource_parameters_s *params, sn_nsdl_resource_attribute_t attribute_name)
maygup01 0:11cc2b7889af 2346 {
maygup01 0:11cc2b7889af 2347 if (params == NULL || params->free_on_delete == false) {
maygup01 0:11cc2b7889af 2348 return false;
maygup01 0:11cc2b7889af 2349 }
maygup01 0:11cc2b7889af 2350
maygup01 0:11cc2b7889af 2351 bool found = false;
maygup01 0:11cc2b7889af 2352 sn_nsdl_attribute_item_s *item = params->attributes_ptr;
maygup01 0:11cc2b7889af 2353 while (item != NULL) {
maygup01 0:11cc2b7889af 2354 if (item->attribute_name == ATTR_END) {
maygup01 0:11cc2b7889af 2355 break;
maygup01 0:11cc2b7889af 2356 }
maygup01 0:11cc2b7889af 2357 // Remove if attribute name matches
maygup01 0:11cc2b7889af 2358 if (item->attribute_name == attribute_name) {
maygup01 0:11cc2b7889af 2359 // Currently only pointer values, need to free and set as NOP
maygup01 0:11cc2b7889af 2360 sn_nsdl_free_attribute_value(item);
maygup01 0:11cc2b7889af 2361 item->attribute_name = ATTR_NOP;
maygup01 0:11cc2b7889af 2362 found = true;
maygup01 0:11cc2b7889af 2363 break;
maygup01 0:11cc2b7889af 2364 }
maygup01 0:11cc2b7889af 2365 item++;
maygup01 0:11cc2b7889af 2366 }
maygup01 0:11cc2b7889af 2367
maygup01 0:11cc2b7889af 2368 return found;
maygup01 0:11cc2b7889af 2369
maygup01 0:11cc2b7889af 2370 }
maygup01 0:11cc2b7889af 2371
maygup01 0:11cc2b7889af 2372 #endif
maygup01 0:11cc2b7889af 2373
maygup01 0:11cc2b7889af 2374
maygup01 0:11cc2b7889af 2375 void sn_nsdl_print_coap_data(sn_coap_hdr_s *coap_header_ptr, bool outgoing)
maygup01 0:11cc2b7889af 2376 {
maygup01 0:11cc2b7889af 2377 #if MBED_CONF_MBED_TRACE_ENABLE
maygup01 0:11cc2b7889af 2378 if (!coap_header_ptr) {
maygup01 0:11cc2b7889af 2379 return;
maygup01 0:11cc2b7889af 2380 }
maygup01 0:11cc2b7889af 2381
maygup01 0:11cc2b7889af 2382 if (outgoing) {
maygup01 0:11cc2b7889af 2383 tr_info("======== Outgoing CoAP package ========");
maygup01 0:11cc2b7889af 2384 } else {
maygup01 0:11cc2b7889af 2385 tr_info("======== Incoming CoAP package ========");
maygup01 0:11cc2b7889af 2386 }
maygup01 0:11cc2b7889af 2387
maygup01 0:11cc2b7889af 2388 if (coap_header_ptr->uri_path_len > 0 && coap_header_ptr->uri_path_ptr) {
maygup01 0:11cc2b7889af 2389 tr_info("Uri-Path:\t\t%.*s", coap_header_ptr->uri_path_len, coap_header_ptr->uri_path_ptr);
maygup01 0:11cc2b7889af 2390 }
maygup01 0:11cc2b7889af 2391 tr_info("Status:\t\t%s", sn_nsdl_coap_status_description(coap_header_ptr->coap_status));
maygup01 0:11cc2b7889af 2392 tr_info("Code:\t\t%s", sn_nsdl_coap_message_code_desc(coap_header_ptr->msg_code));
maygup01 0:11cc2b7889af 2393 tr_info("Type:\t\t%s", sn_nsdl_coap_message_type_desc(coap_header_ptr->msg_type));
maygup01 0:11cc2b7889af 2394 tr_info("Id:\t\t%d", coap_header_ptr->msg_id);
maygup01 0:11cc2b7889af 2395 if (coap_header_ptr->token_ptr && coap_header_ptr->token_len > 0) {
maygup01 0:11cc2b7889af 2396 tr_info("Token:\t\t%s", tr_array(coap_header_ptr->token_ptr, coap_header_ptr->token_len));
maygup01 0:11cc2b7889af 2397 }
maygup01 0:11cc2b7889af 2398 if (coap_header_ptr->content_format != -1) {
maygup01 0:11cc2b7889af 2399 tr_info("Content-type:\t%d", coap_header_ptr->content_format);
maygup01 0:11cc2b7889af 2400 }
maygup01 0:11cc2b7889af 2401 tr_info("Payload len:\t%d", coap_header_ptr->payload_len);
maygup01 0:11cc2b7889af 2402 #ifdef MBED_CLIENT_PRINT_COAP_PAYLOAD
maygup01 0:11cc2b7889af 2403 if (coap_header_ptr->payload_ptr && coap_header_ptr->payload_len > 0) {
maygup01 0:11cc2b7889af 2404 int i = 0;
maygup01 0:11cc2b7889af 2405 int row_len = 40;
maygup01 0:11cc2b7889af 2406 int max_length = 2048;
maygup01 0:11cc2b7889af 2407 while (i < coap_header_ptr->payload_len && i < max_length) {
maygup01 0:11cc2b7889af 2408 if (i + row_len > coap_header_ptr->payload_len) {
maygup01 0:11cc2b7889af 2409 row_len = coap_header_ptr->payload_len - i;
maygup01 0:11cc2b7889af 2410 }
maygup01 0:11cc2b7889af 2411 tr_info("Payload:\t\t%s", tr_array( coap_header_ptr->payload_ptr + i, row_len));
maygup01 0:11cc2b7889af 2412 i += row_len;
maygup01 0:11cc2b7889af 2413 }
maygup01 0:11cc2b7889af 2414 if (i >= max_length)
maygup01 0:11cc2b7889af 2415 tr_info("Payload:\t\t.....");
maygup01 0:11cc2b7889af 2416 }
maygup01 0:11cc2b7889af 2417 #endif
maygup01 0:11cc2b7889af 2418
maygup01 0:11cc2b7889af 2419 if (coap_header_ptr->options_list_ptr) {
maygup01 0:11cc2b7889af 2420 if (coap_header_ptr->options_list_ptr->etag_ptr && coap_header_ptr->options_list_ptr->etag_len > 0) {
maygup01 0:11cc2b7889af 2421 tr_info("E-tag:\t%s", tr_array(coap_header_ptr->options_list_ptr->etag_ptr, coap_header_ptr->options_list_ptr->etag_len));
maygup01 0:11cc2b7889af 2422 }
maygup01 0:11cc2b7889af 2423 if (coap_header_ptr->options_list_ptr->proxy_uri_ptr && coap_header_ptr->options_list_ptr->proxy_uri_len > 0) {
maygup01 0:11cc2b7889af 2424 tr_info("Proxy uri:\t%.*s", coap_header_ptr->options_list_ptr->proxy_uri_len, coap_header_ptr->options_list_ptr->proxy_uri_ptr);
maygup01 0:11cc2b7889af 2425 }
maygup01 0:11cc2b7889af 2426
maygup01 0:11cc2b7889af 2427 if (coap_header_ptr->options_list_ptr->uri_host_ptr && coap_header_ptr->options_list_ptr->uri_host_len > 0) {
maygup01 0:11cc2b7889af 2428 tr_info("Uri host:\t%.*s", coap_header_ptr->options_list_ptr->uri_host_len, coap_header_ptr->options_list_ptr->uri_host_ptr);
maygup01 0:11cc2b7889af 2429 }
maygup01 0:11cc2b7889af 2430
maygup01 0:11cc2b7889af 2431 if (coap_header_ptr->options_list_ptr->location_path_ptr && coap_header_ptr->options_list_ptr->location_path_len > 0) {
maygup01 0:11cc2b7889af 2432 tr_info("Location path:\t%.*s", coap_header_ptr->options_list_ptr->location_path_len, coap_header_ptr->options_list_ptr->location_path_ptr);
maygup01 0:11cc2b7889af 2433 }
maygup01 0:11cc2b7889af 2434
maygup01 0:11cc2b7889af 2435 if (coap_header_ptr->options_list_ptr->location_query_ptr && coap_header_ptr->options_list_ptr->location_query_len > 0) {
maygup01 0:11cc2b7889af 2436 tr_info("Location query:\t%.*s", coap_header_ptr->options_list_ptr->location_query_len, coap_header_ptr->options_list_ptr->location_query_ptr);
maygup01 0:11cc2b7889af 2437 }
maygup01 0:11cc2b7889af 2438
maygup01 0:11cc2b7889af 2439 if (coap_header_ptr->options_list_ptr->uri_query_ptr && coap_header_ptr->options_list_ptr->uri_query_len > 0) {
maygup01 0:11cc2b7889af 2440 tr_info("Uri query:\t%.*s", coap_header_ptr->options_list_ptr->uri_query_len, coap_header_ptr->options_list_ptr->uri_query_ptr);
maygup01 0:11cc2b7889af 2441 }
maygup01 0:11cc2b7889af 2442
maygup01 0:11cc2b7889af 2443 tr_info("Max-age:\t\t%" PRIu32"", coap_header_ptr->options_list_ptr->max_age);
maygup01 0:11cc2b7889af 2444 if (coap_header_ptr->options_list_ptr->use_size1) {
maygup01 0:11cc2b7889af 2445 tr_info("Size 1:\t\t%" PRIu32"", coap_header_ptr->options_list_ptr->size1);
maygup01 0:11cc2b7889af 2446 }
maygup01 0:11cc2b7889af 2447 if (coap_header_ptr->options_list_ptr->use_size2) {
maygup01 0:11cc2b7889af 2448 tr_info("Size 2:\t\t%" PRIu32"", coap_header_ptr->options_list_ptr->size2);
maygup01 0:11cc2b7889af 2449 }
maygup01 0:11cc2b7889af 2450 if (coap_header_ptr->options_list_ptr->accept != -1) {
maygup01 0:11cc2b7889af 2451 tr_info("Accept:\t\t%d", coap_header_ptr->options_list_ptr->accept);
maygup01 0:11cc2b7889af 2452 }
maygup01 0:11cc2b7889af 2453 if (coap_header_ptr->options_list_ptr->uri_port != -1) {
maygup01 0:11cc2b7889af 2454 tr_info("Uri port:\t%" PRId32"", coap_header_ptr->options_list_ptr->uri_port);
maygup01 0:11cc2b7889af 2455 }
maygup01 0:11cc2b7889af 2456 if (coap_header_ptr->options_list_ptr->observe != -1) {
maygup01 0:11cc2b7889af 2457 tr_info("Observe:\t\t%" PRId32"", coap_header_ptr->options_list_ptr->observe);
maygup01 0:11cc2b7889af 2458 }
maygup01 0:11cc2b7889af 2459 if (coap_header_ptr->options_list_ptr->block1 != -1) {
maygup01 0:11cc2b7889af 2460 tr_info("Block1 number:\t%" PRId32"", coap_header_ptr->options_list_ptr->block1 >> 4);
maygup01 0:11cc2b7889af 2461 uint8_t temp = (coap_header_ptr->options_list_ptr->block1 & 0x07);
maygup01 0:11cc2b7889af 2462 uint16_t block_size = 1u << (temp + 4);
maygup01 0:11cc2b7889af 2463 tr_info("Block1 size:\t%d", block_size);
maygup01 0:11cc2b7889af 2464 tr_info("Block1 more:\t%d", (coap_header_ptr->options_list_ptr->block1) & 0x08 ? true : false);
maygup01 0:11cc2b7889af 2465 }
maygup01 0:11cc2b7889af 2466 if (coap_header_ptr->options_list_ptr->block2 != -1) {
maygup01 0:11cc2b7889af 2467 tr_info("Block2 number:\t%" PRId32"", coap_header_ptr->options_list_ptr->block2 >> 4);
maygup01 0:11cc2b7889af 2468 uint8_t temp = (coap_header_ptr->options_list_ptr->block2 & 0x07);
maygup01 0:11cc2b7889af 2469 uint16_t block_size = 1u << (temp + 4);
maygup01 0:11cc2b7889af 2470 tr_info("Block2 size:\t%d", block_size);
maygup01 0:11cc2b7889af 2471 tr_info("Block2 more:\t%d", (coap_header_ptr->options_list_ptr->block2) & 0x08 ? true : false);
maygup01 0:11cc2b7889af 2472 }
maygup01 0:11cc2b7889af 2473 }
maygup01 0:11cc2b7889af 2474 tr_info("======== End of CoAP package ========");
maygup01 0:11cc2b7889af 2475 #else
maygup01 0:11cc2b7889af 2476 (void) coap_header_ptr;
maygup01 0:11cc2b7889af 2477 (void) outgoing;
maygup01 0:11cc2b7889af 2478 #endif
maygup01 0:11cc2b7889af 2479 }
maygup01 0:11cc2b7889af 2480
maygup01 0:11cc2b7889af 2481 #if MBED_CONF_MBED_TRACE_ENABLE
maygup01 0:11cc2b7889af 2482 const char *sn_nsdl_coap_status_description(sn_coap_status_e status)
maygup01 0:11cc2b7889af 2483 {
maygup01 0:11cc2b7889af 2484 switch(status) {
maygup01 0:11cc2b7889af 2485 case COAP_STATUS_OK:
maygup01 0:11cc2b7889af 2486 return "COAP_STATUS_OK";
maygup01 0:11cc2b7889af 2487 case COAP_STATUS_PARSER_ERROR_IN_HEADER:
maygup01 0:11cc2b7889af 2488 return "COAP_STATUS_PARSER_ERROR_IN_HEADER";
maygup01 0:11cc2b7889af 2489 case COAP_STATUS_PARSER_DUPLICATED_MSG:
maygup01 0:11cc2b7889af 2490 return "COAP_STATUS_PARSER_DUPLICATED_MSG";
maygup01 0:11cc2b7889af 2491 case COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING:
maygup01 0:11cc2b7889af 2492 return "COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVING";
maygup01 0:11cc2b7889af 2493 case COAP_STATUS_PARSER_BLOCKWISE_ACK:
maygup01 0:11cc2b7889af 2494 return "COAP_STATUS_PARSER_BLOCKWISE_ACK";
maygup01 0:11cc2b7889af 2495 case COAP_STATUS_PARSER_BLOCKWISE_MSG_REJECTED:
maygup01 0:11cc2b7889af 2496 return "COAP_STATUS_PARSER_BLOCKWISE_MSG_REJECTED";
maygup01 0:11cc2b7889af 2497 case COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED:
maygup01 0:11cc2b7889af 2498 return "COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED";
maygup01 0:11cc2b7889af 2499 case COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED:
maygup01 0:11cc2b7889af 2500 return "COAP_STATUS_BUILDER_MESSAGE_SENDING_FAILED";
maygup01 0:11cc2b7889af 2501 default:
maygup01 0:11cc2b7889af 2502 return "";
maygup01 0:11cc2b7889af 2503 }
maygup01 0:11cc2b7889af 2504 }
maygup01 0:11cc2b7889af 2505
maygup01 0:11cc2b7889af 2506 const char *sn_nsdl_coap_message_code_desc(int msg_code)
maygup01 0:11cc2b7889af 2507 {
maygup01 0:11cc2b7889af 2508 switch(msg_code) {
maygup01 0:11cc2b7889af 2509 case COAP_MSG_CODE_EMPTY:
maygup01 0:11cc2b7889af 2510 return "COAP_MSG_CODE_EMPTY";
maygup01 0:11cc2b7889af 2511 case COAP_MSG_CODE_REQUEST_GET:
maygup01 0:11cc2b7889af 2512 return "COAP_MSG_CODE_REQUEST_GET";
maygup01 0:11cc2b7889af 2513 case COAP_MSG_CODE_REQUEST_POST:
maygup01 0:11cc2b7889af 2514 return "COAP_MSG_CODE_REQUEST_POST";
maygup01 0:11cc2b7889af 2515 case COAP_MSG_CODE_REQUEST_PUT:
maygup01 0:11cc2b7889af 2516 return "COAP_MSG_CODE_REQUEST_PUT";
maygup01 0:11cc2b7889af 2517 case COAP_MSG_CODE_REQUEST_DELETE:
maygup01 0:11cc2b7889af 2518 return "COAP_MSG_CODE_REQUEST_DELETE";
maygup01 0:11cc2b7889af 2519 case COAP_MSG_CODE_RESPONSE_CREATED:
maygup01 0:11cc2b7889af 2520 return "COAP_MSG_CODE_RESPONSE_CREATED";
maygup01 0:11cc2b7889af 2521 case COAP_MSG_CODE_RESPONSE_DELETED:
maygup01 0:11cc2b7889af 2522 return "COAP_MSG_CODE_RESPONSE_DELETED";
maygup01 0:11cc2b7889af 2523 case COAP_MSG_CODE_RESPONSE_VALID:
maygup01 0:11cc2b7889af 2524 return "COAP_MSG_CODE_RESPONSE_VALID";
maygup01 0:11cc2b7889af 2525 case COAP_MSG_CODE_RESPONSE_CHANGED:
maygup01 0:11cc2b7889af 2526 return "COAP_MSG_CODE_RESPONSE_CHANGED";
maygup01 0:11cc2b7889af 2527 case COAP_MSG_CODE_RESPONSE_CONTENT:
maygup01 0:11cc2b7889af 2528 return "COAP_MSG_CODE_RESPONSE_CONTENT";
maygup01 0:11cc2b7889af 2529 case COAP_MSG_CODE_RESPONSE_CONTINUE:
maygup01 0:11cc2b7889af 2530 return "COAP_MSG_CODE_RESPONSE_CONTINUE";
maygup01 0:11cc2b7889af 2531 case COAP_MSG_CODE_RESPONSE_BAD_REQUEST:
maygup01 0:11cc2b7889af 2532 return "COAP_MSG_CODE_RESPONSE_BAD_REQUEST";
maygup01 0:11cc2b7889af 2533 case COAP_MSG_CODE_RESPONSE_UNAUTHORIZED:
maygup01 0:11cc2b7889af 2534 return "COAP_MSG_CODE_RESPONSE_UNAUTHORIZED";
maygup01 0:11cc2b7889af 2535 case COAP_MSG_CODE_RESPONSE_BAD_OPTION:
maygup01 0:11cc2b7889af 2536 return "COAP_MSG_CODE_RESPONSE_BAD_OPTION";
maygup01 0:11cc2b7889af 2537 case COAP_MSG_CODE_RESPONSE_FORBIDDEN:
maygup01 0:11cc2b7889af 2538 return "COAP_MSG_CODE_RESPONSE_FORBIDDEN";
maygup01 0:11cc2b7889af 2539 case COAP_MSG_CODE_RESPONSE_NOT_FOUND:
maygup01 0:11cc2b7889af 2540 return "COAP_MSG_CODE_RESPONSE_NOT_FOUND";
maygup01 0:11cc2b7889af 2541 case COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED:
maygup01 0:11cc2b7889af 2542 return "COAP_MSG_CODE_RESPONSE_METHOD_NOT_ALLOWED";
maygup01 0:11cc2b7889af 2543 case COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE:
maygup01 0:11cc2b7889af 2544 return "COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE";
maygup01 0:11cc2b7889af 2545 case COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_INCOMPLETE:
maygup01 0:11cc2b7889af 2546 return "COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_INCOMPLETE";
maygup01 0:11cc2b7889af 2547 case COAP_MSG_CODE_RESPONSE_PRECONDITION_FAILED:
maygup01 0:11cc2b7889af 2548 return "COAP_MSG_CODE_RESPONSE_PRECONDITION_FAILED";
maygup01 0:11cc2b7889af 2549 case COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE:
maygup01 0:11cc2b7889af 2550 return "COAP_MSG_CODE_RESPONSE_REQUEST_ENTITY_TOO_LARGE";
maygup01 0:11cc2b7889af 2551 case COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT:
maygup01 0:11cc2b7889af 2552 return "COAP_MSG_CODE_RESPONSE_UNSUPPORTED_CONTENT_FORMAT";
maygup01 0:11cc2b7889af 2553 case COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR:
maygup01 0:11cc2b7889af 2554 return "COAP_MSG_CODE_RESPONSE_INTERNAL_SERVER_ERROR";
maygup01 0:11cc2b7889af 2555 case COAP_MSG_CODE_RESPONSE_NOT_IMPLEMENTED:
maygup01 0:11cc2b7889af 2556 return "COAP_MSG_CODE_RESPONSE_NOT_IMPLEMENTED";
maygup01 0:11cc2b7889af 2557 case COAP_MSG_CODE_RESPONSE_BAD_GATEWAY:
maygup01 0:11cc2b7889af 2558 return "COAP_MSG_CODE_RESPONSE_BAD_GATEWAY";
maygup01 0:11cc2b7889af 2559 case COAP_MSG_CODE_RESPONSE_SERVICE_UNAVAILABLE:
maygup01 0:11cc2b7889af 2560 return "COAP_MSG_CODE_RESPONSE_SERVICE_UNAVAILABLE";
maygup01 0:11cc2b7889af 2561 case COAP_MSG_CODE_RESPONSE_GATEWAY_TIMEOUT:
maygup01 0:11cc2b7889af 2562 return "COAP_MSG_CODE_RESPONSE_GATEWAY_TIMEOUT";
maygup01 0:11cc2b7889af 2563 case COAP_MSG_CODE_RESPONSE_PROXYING_NOT_SUPPORTED:
maygup01 0:11cc2b7889af 2564 return "COAP_MSG_CODE_RESPONSE_PROXYING_NOT_SUPPORTED";
maygup01 0:11cc2b7889af 2565 default:
maygup01 0:11cc2b7889af 2566 return "";
maygup01 0:11cc2b7889af 2567 }
maygup01 0:11cc2b7889af 2568 }
maygup01 0:11cc2b7889af 2569
maygup01 0:11cc2b7889af 2570 const char *sn_nsdl_coap_message_type_desc(int msg_type)
maygup01 0:11cc2b7889af 2571 {
maygup01 0:11cc2b7889af 2572 switch(msg_type) {
maygup01 0:11cc2b7889af 2573 case COAP_MSG_TYPE_CONFIRMABLE:
maygup01 0:11cc2b7889af 2574 return "COAP_MSG_TYPE_CONFIRMABLE";
maygup01 0:11cc2b7889af 2575 case COAP_MSG_TYPE_NON_CONFIRMABLE:
maygup01 0:11cc2b7889af 2576 return "COAP_MSG_TYPE_NON_CONFIRMABLE";
maygup01 0:11cc2b7889af 2577 case COAP_MSG_TYPE_ACKNOWLEDGEMENT:
maygup01 0:11cc2b7889af 2578 return "COAP_MSG_TYPE_ACKNOWLEDGEMENT";
maygup01 0:11cc2b7889af 2579 case COAP_MSG_TYPE_RESET:
maygup01 0:11cc2b7889af 2580 return "COAP_MSG_TYPE_RESET";
maygup01 0:11cc2b7889af 2581 default:
maygup01 0:11cc2b7889af 2582 return "";
maygup01 0:11cc2b7889af 2583 }
maygup01 0:11cc2b7889af 2584 }
maygup01 0:11cc2b7889af 2585 #endif
maygup01 0:11cc2b7889af 2586
maygup01 0:11cc2b7889af 2587 void remove_previous_block_data(struct nsdl_s *handle, sn_nsdl_addr_s *src_ptr, const uint32_t block_number)
maygup01 0:11cc2b7889af 2588 {
maygup01 0:11cc2b7889af 2589 #if SN_COAP_MAX_BLOCKWISE_PAYLOAD_SIZE
maygup01 0:11cc2b7889af 2590 ns_list_foreach(coap_blockwise_payload_s, stored_payload_info_ptr, &handle->grs->coap->linked_list_blockwise_received_payloads) {
maygup01 0:11cc2b7889af 2591 uint32_t stored_number = stored_payload_info_ptr->block_number;
maygup01 0:11cc2b7889af 2592 // Remove the previous block data
maygup01 0:11cc2b7889af 2593 if (block_number - 1 == stored_number) {
maygup01 0:11cc2b7889af 2594 sn_coap_protocol_block_remove(handle->grs->coap,
maygup01 0:11cc2b7889af 2595 src_ptr,
maygup01 0:11cc2b7889af 2596 stored_payload_info_ptr->payload_len,
maygup01 0:11cc2b7889af 2597 stored_payload_info_ptr->payload_ptr);
maygup01 0:11cc2b7889af 2598 break;
maygup01 0:11cc2b7889af 2599 }
maygup01 0:11cc2b7889af 2600 }
maygup01 0:11cc2b7889af 2601 #endif
maygup01 0:11cc2b7889af 2602 }
maygup01 0:11cc2b7889af 2603
maygup01 0:11cc2b7889af 2604 bool update_last_block_data(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, bool block1)
maygup01 0:11cc2b7889af 2605 {
maygup01 0:11cc2b7889af 2606 bool data_updated = false;
maygup01 0:11cc2b7889af 2607 // Whole message received --> pass only the last block data to application
maygup01 0:11cc2b7889af 2608 if (coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED) {
maygup01 0:11cc2b7889af 2609 // Get the block size
maygup01 0:11cc2b7889af 2610 uint8_t temp = 0;
maygup01 0:11cc2b7889af 2611 if (block1) {
maygup01 0:11cc2b7889af 2612 temp = (coap_packet_ptr->options_list_ptr->block1 & 0x07);
maygup01 0:11cc2b7889af 2613 } else {
maygup01 0:11cc2b7889af 2614 temp = (coap_packet_ptr->options_list_ptr->block2 & 0x07);
maygup01 0:11cc2b7889af 2615 }
maygup01 0:11cc2b7889af 2616 uint16_t block_size = 1u << (temp + 4);
maygup01 0:11cc2b7889af 2617
maygup01 0:11cc2b7889af 2618 uint32_t new_payload_len = coap_packet_ptr->payload_len - block_size;
maygup01 0:11cc2b7889af 2619 uint8_t *temp_ptr = handle->grs->coap->sn_coap_protocol_malloc(new_payload_len);
maygup01 0:11cc2b7889af 2620 if (temp_ptr) {
maygup01 0:11cc2b7889af 2621 // Skip the second last block data since it's still stored in mbed-coap list!
maygup01 0:11cc2b7889af 2622 memcpy(temp_ptr, coap_packet_ptr->payload_ptr + block_size, new_payload_len);
maygup01 0:11cc2b7889af 2623 handle->grs->coap->sn_coap_protocol_free(coap_packet_ptr->payload_ptr);
maygup01 0:11cc2b7889af 2624 coap_packet_ptr->payload_ptr = temp_ptr;
maygup01 0:11cc2b7889af 2625 coap_packet_ptr->payload_len = new_payload_len;
maygup01 0:11cc2b7889af 2626 data_updated = true;
maygup01 0:11cc2b7889af 2627 }
maygup01 0:11cc2b7889af 2628 }
maygup01 0:11cc2b7889af 2629
maygup01 0:11cc2b7889af 2630 return data_updated;
maygup01 0:11cc2b7889af 2631 }
maygup01 0:11cc2b7889af 2632
maygup01 0:11cc2b7889af 2633 static void sn_nsdl_add_token(struct nsdl_s *handle, uint32_t *token, sn_coap_hdr_s *message_ptr)
maygup01 0:11cc2b7889af 2634 {
maygup01 0:11cc2b7889af 2635 handle->token_seed++;
maygup01 0:11cc2b7889af 2636 if (handle->token_seed == 0) {
maygup01 0:11cc2b7889af 2637 handle->token_seed++;
maygup01 0:11cc2b7889af 2638 }
maygup01 0:11cc2b7889af 2639
maygup01 0:11cc2b7889af 2640 *token = handle->token_seed;
maygup01 0:11cc2b7889af 2641
maygup01 0:11cc2b7889af 2642 message_ptr->token_ptr = (uint8_t*)token;
maygup01 0:11cc2b7889af 2643 message_ptr->token_len = sizeof(*token);
maygup01 0:11cc2b7889af 2644 }
maygup01 0:11cc2b7889af 2645
maygup01 0:11cc2b7889af 2646 uint16_t sn_nsdl_get_block_size(const struct nsdl_s *handle)
maygup01 0:11cc2b7889af 2647 {
maygup01 0:11cc2b7889af 2648 if (handle == NULL) {
maygup01 0:11cc2b7889af 2649 return 0;
maygup01 0:11cc2b7889af 2650 }
maygup01 0:11cc2b7889af 2651
maygup01 0:11cc2b7889af 2652 return handle->grs->coap->sn_coap_block_data_size;
maygup01 0:11cc2b7889af 2653 }
maygup01 0:11cc2b7889af 2654
maygup01 0:11cc2b7889af 2655 extern uint8_t sn_nsdl_get_retransmission_count(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 2656 {
maygup01 0:11cc2b7889af 2657 #if ENABLE_RESENDINGS
maygup01 0:11cc2b7889af 2658 if (handle == NULL) {
maygup01 0:11cc2b7889af 2659 return 0;
maygup01 0:11cc2b7889af 2660 }
maygup01 0:11cc2b7889af 2661
maygup01 0:11cc2b7889af 2662 return handle->grs->coap->sn_coap_resending_count;
maygup01 0:11cc2b7889af 2663 #else
maygup01 0:11cc2b7889af 2664 (void) handle;
maygup01 0:11cc2b7889af 2665 return 0;
maygup01 0:11cc2b7889af 2666 #endif
maygup01 0:11cc2b7889af 2667 }
maygup01 0:11cc2b7889af 2668
maygup01 0:11cc2b7889af 2669 int32_t sn_nsdl_send_coap_ping(struct nsdl_s *handle)
maygup01 0:11cc2b7889af 2670 {
maygup01 0:11cc2b7889af 2671 assert(handle);
maygup01 0:11cc2b7889af 2672 assert(handle->grs);
maygup01 0:11cc2b7889af 2673
maygup01 0:11cc2b7889af 2674 sn_coap_hdr_s coap_ping = {0};
maygup01 0:11cc2b7889af 2675 int32_t return_msg_id = 0;
maygup01 0:11cc2b7889af 2676
maygup01 0:11cc2b7889af 2677 /* Fill header */
maygup01 0:11cc2b7889af 2678 coap_ping.msg_type = COAP_MSG_TYPE_CONFIRMABLE;
maygup01 0:11cc2b7889af 2679 coap_ping.msg_code = COAP_MSG_CODE_EMPTY;
maygup01 0:11cc2b7889af 2680 coap_ping.content_format = COAP_CT_NONE;
maygup01 0:11cc2b7889af 2681
maygup01 0:11cc2b7889af 2682 /* Send message */
maygup01 0:11cc2b7889af 2683 return_msg_id = sn_nsdl_send_coap_message(handle, &handle->server_address, &coap_ping);
maygup01 0:11cc2b7889af 2684 if (return_msg_id >= SN_NSDL_SUCCESS) {
maygup01 0:11cc2b7889af 2685 return_msg_id = coap_ping.msg_id;
maygup01 0:11cc2b7889af 2686 }
maygup01 0:11cc2b7889af 2687
maygup01 0:11cc2b7889af 2688 return return_msg_id;
maygup01 0:11cc2b7889af 2689 }