Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-client-c by
source/libNsdl/src/sn_nsdl.c@4:5d91b0f5038c, 2016-04-02 (annotated)
- Committer:
- Yogesh Pande
- Date:
- Sat Apr 02 00:39:03 2016 +0300
- Revision:
- 4:5d91b0f5038c
- Parent:
- 1:43f5c94c6771
Latest mbed-client-c sources from Github.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yogesh Pande |
4:5d91b0f5038c | 1 | /* |
Yogesh Pande |
4:5d91b0f5038c | 2 | * Copyright (c) 2011-2015 ARM Limited. All rights reserved. |
Yogesh Pande |
4:5d91b0f5038c | 3 | * SPDX-License-Identifier: Apache-2.0 |
Yogesh Pande |
4:5d91b0f5038c | 4 | * Licensed under the Apache License, Version 2.0 (the License); you may |
Yogesh Pande |
4:5d91b0f5038c | 5 | * not use this file except in compliance with the License. |
Yogesh Pande |
4:5d91b0f5038c | 6 | * You may obtain a copy of the License at |
Yogesh Pande |
4:5d91b0f5038c | 7 | * |
Yogesh Pande |
4:5d91b0f5038c | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Yogesh Pande |
4:5d91b0f5038c | 9 | * |
Yogesh Pande |
4:5d91b0f5038c | 10 | * Unless required by applicable law or agreed to in writing, software |
Yogesh Pande |
4:5d91b0f5038c | 11 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
Yogesh Pande |
4:5d91b0f5038c | 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Yogesh Pande |
4:5d91b0f5038c | 13 | * See the License for the specific language governing permissions and |
Yogesh Pande |
4:5d91b0f5038c | 14 | * limitations under the License. |
Yogesh Pande |
4:5d91b0f5038c | 15 | */ |
Yogesh Pande |
4:5d91b0f5038c | 16 | /** |
Yogesh Pande |
4:5d91b0f5038c | 17 | * \file sn_nsdl.c |
Yogesh Pande |
4:5d91b0f5038c | 18 | * |
Yogesh Pande |
4:5d91b0f5038c | 19 | * \brief Nano service device library |
Yogesh Pande |
4:5d91b0f5038c | 20 | * |
Yogesh Pande |
4:5d91b0f5038c | 21 | */ |
Yogesh Pande |
4:5d91b0f5038c | 22 | |
Yogesh Pande |
4:5d91b0f5038c | 23 | #include <string.h> |
Yogesh Pande |
4:5d91b0f5038c | 24 | |
Yogesh Pande |
4:5d91b0f5038c | 25 | #include "ns_types.h" |
Yogesh Pande |
4:5d91b0f5038c | 26 | #include "sn_nsdl.h" |
Yogesh Pande |
4:5d91b0f5038c | 27 | #include "sn_coap_header.h" |
Yogesh Pande |
4:5d91b0f5038c | 28 | #include "sn_coap_protocol.h" |
Yogesh Pande |
4:5d91b0f5038c | 29 | #include "sn_coap_protocol_internal.h" |
Yogesh Pande |
4:5d91b0f5038c | 30 | #include "sn_nsdl_lib.h" |
Yogesh Pande |
4:5d91b0f5038c | 31 | #include "sn_grs.h" |
Yogesh Pande |
4:5d91b0f5038c | 32 | |
Yogesh Pande |
4:5d91b0f5038c | 33 | /* Defines */ |
Yogesh Pande |
4:5d91b0f5038c | 34 | #define RESOURCE_DIR_LEN 2 |
Yogesh Pande |
4:5d91b0f5038c | 35 | #define EP_NAME_PARAMETERS_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 36 | #define ET_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 37 | #define LT_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 38 | #define DOMAIN_PARAMETER_LEN 2 |
Yogesh Pande |
4:5d91b0f5038c | 39 | #define RT_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 40 | #define IF_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 41 | #define OBS_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 42 | #define AOBS_PARAMETER_LEN 8 |
Yogesh Pande |
4:5d91b0f5038c | 43 | #define COAP_CON_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 44 | #define BS_EP_PARAMETER_LEN 3 |
Yogesh Pande |
4:5d91b0f5038c | 45 | #define BS_QUEUE_MODE_PARAMATER_LEN 2 |
Yogesh Pande |
4:5d91b0f5038c | 46 | |
Yogesh Pande |
4:5d91b0f5038c | 47 | #define SN_NSDL_EP_REGISTER_MESSAGE 1 |
Yogesh Pande |
4:5d91b0f5038c | 48 | #define SN_NSDL_EP_UPDATE_MESSAGE 2 |
Yogesh Pande |
4:5d91b0f5038c | 49 | |
Yogesh Pande |
4:5d91b0f5038c | 50 | #define SN_NSDL_MSG_UNDEFINED 0 |
Yogesh Pande |
4:5d91b0f5038c | 51 | #define SN_NSDL_MSG_REGISTER 1 |
Yogesh Pande |
4:5d91b0f5038c | 52 | #define SN_NSDL_MSG_UNREGISTER 2 |
Yogesh Pande |
4:5d91b0f5038c | 53 | #define SN_NSDL_MSG_UPDATE 3 |
Yogesh Pande |
4:5d91b0f5038c | 54 | |
Yogesh Pande |
4:5d91b0f5038c | 55 | /* Constants */ |
Yogesh Pande |
4:5d91b0f5038c | 56 | static uint8_t ep_name_parameter_string[] = {'e', 'p', '='}; /* Endpoint name. A unique name for the registering node in a domain. */ |
Yogesh Pande |
4:5d91b0f5038c | 57 | static uint8_t resource_path_ptr[] = {'r', 'd'}; /* For resource directory */ |
Yogesh Pande |
4:5d91b0f5038c | 58 | static uint8_t resource_type_parameter[] = {'r', 't', '='}; /* Resource type. Only once for registration */ |
Yogesh Pande |
4:5d91b0f5038c | 59 | #ifndef YOTTA_CFG_DISABLE_OBS_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 60 | static uint8_t obs_parameter[] = {'o', 'b', 's'}; /* Observable */ |
Yogesh Pande |
4:5d91b0f5038c | 61 | #endif |
Yogesh Pande |
4:5d91b0f5038c | 62 | //static uint8_t aobs_parameter[] = {'a','o','b','s',';','i','d','='}; /* Auto-observable - TBD */ |
Yogesh Pande |
4:5d91b0f5038c | 63 | static uint8_t if_description_parameter[] = {'i', 'f', '='}; /* Interface description. Only once */ |
Yogesh Pande |
4:5d91b0f5038c | 64 | 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. */ |
Yogesh Pande |
4:5d91b0f5038c | 65 | static uint8_t ep_domain_parameter[] = {'d', '='}; /* Domain name. If this parameter is missing, a default domain is assumed. */ |
Yogesh Pande |
4:5d91b0f5038c | 66 | static uint8_t coap_con_type_parameter[] = {'c', 't', '='}; /* CoAP content type */ |
Yogesh Pande |
4:5d91b0f5038c | 67 | /* * OMA BS parameters * */ |
Yogesh Pande |
4:5d91b0f5038c | 68 | static uint8_t bs_uri[] = {'b', 's'}; |
Yogesh Pande |
4:5d91b0f5038c | 69 | static uint8_t bs_ep_name[] = {'e', 'p', '='}; |
Yogesh Pande |
4:5d91b0f5038c | 70 | static uint8_t et_parameter[] = {'e', 't', '='}; /* Endpoint type */ |
Yogesh Pande |
4:5d91b0f5038c | 71 | static uint8_t bs_queue_mode[] = {'b', '='}; |
Yogesh Pande |
4:5d91b0f5038c | 72 | |
Yogesh Pande |
4:5d91b0f5038c | 73 | /* Function prototypes */ |
Yogesh Pande |
4:5d91b0f5038c | 74 | static uint16_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description); |
Yogesh Pande |
4:5d91b0f5038c | 75 | static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle); |
Yogesh Pande |
4:5d91b0f5038c | 76 | int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration); |
Yogesh Pande |
4:5d91b0f5038c | 77 | static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration); |
Yogesh Pande |
4:5d91b0f5038c | 78 | static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type); |
Yogesh Pande |
4:5d91b0f5038c | 79 | 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); |
Yogesh Pande |
4:5d91b0f5038c | 80 | 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); |
Yogesh Pande |
4:5d91b0f5038c | 81 | static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 82 | static uint8_t sn_nsdl_itoa_len(uint8_t value); |
Yogesh Pande |
4:5d91b0f5038c | 83 | static uint8_t *sn_nsdl_itoa(uint8_t *ptr, uint8_t value); |
Yogesh Pande |
4:5d91b0f5038c | 84 | static int32_t sn_nsdl_atoi(uint8_t *ptr, uint8_t len); |
Yogesh Pande |
4:5d91b0f5038c | 85 | static uint32_t sn_nsdl_ahextoi(uint8_t *ptr, uint8_t len); |
Yogesh Pande |
4:5d91b0f5038c | 86 | static int8_t sn_nsdl_resolve_lwm2m_address(struct nsdl_s *handle, uint8_t *uri, uint16_t uri_len); |
Yogesh Pande |
4:5d91b0f5038c | 87 | static int8_t sn_nsdl_process_oma_tlv(struct nsdl_s *handle, uint8_t *data_ptr, uint16_t data_len); |
Yogesh Pande |
4:5d91b0f5038c | 88 | static void sn_nsdl_check_oma_bs_status(struct nsdl_s *handle); |
Yogesh Pande |
4:5d91b0f5038c | 89 | static int8_t sn_nsdl_create_oma_device_object_base(struct nsdl_s *handle, sn_nsdl_oma_device_t *oma_device_setup_ptr, sn_nsdl_oma_binding_and_mode_t binding_and_mode); |
Yogesh Pande |
4:5d91b0f5038c | 90 | static int8_t set_endpoint_info(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *endpoint_info_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 91 | static bool validateParameters(sn_nsdl_ep_parameters_s *parameter_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 92 | static bool validate(uint8_t* ptr, uint32_t len, char illegalChar); |
Yogesh Pande |
4:5d91b0f5038c | 93 | |
Yogesh Pande |
4:5d91b0f5038c | 94 | int8_t sn_nsdl_destroy(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 95 | { |
Yogesh Pande |
4:5d91b0f5038c | 96 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 97 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 98 | } |
Yogesh Pande |
4:5d91b0f5038c | 99 | |
Yogesh Pande |
4:5d91b0f5038c | 100 | if (handle->ep_information_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 101 | if (handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 102 | handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 103 | handle->ep_information_ptr->endpoint_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 104 | } |
Yogesh Pande |
4:5d91b0f5038c | 105 | if (handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 106 | handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 107 | handle->ep_information_ptr->domain_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 108 | handle->ep_information_ptr->domain_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 109 | } |
Yogesh Pande |
4:5d91b0f5038c | 110 | if (handle->ep_information_ptr->location_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 111 | handle->sn_nsdl_free(handle->ep_information_ptr->location_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 112 | handle->ep_information_ptr->location_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 113 | handle->ep_information_ptr->location_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 114 | } |
Yogesh Pande |
4:5d91b0f5038c | 115 | if (handle->ep_information_ptr->type_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 116 | handle->sn_nsdl_free(handle->ep_information_ptr->type_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 117 | handle->ep_information_ptr->type_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 118 | } |
Yogesh Pande |
4:5d91b0f5038c | 119 | |
Yogesh Pande |
4:5d91b0f5038c | 120 | if (handle->ep_information_ptr->lifetime_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 121 | |
Yogesh Pande |
4:5d91b0f5038c | 122 | { |
Yogesh Pande |
4:5d91b0f5038c | 123 | handle->sn_nsdl_free(handle->ep_information_ptr->lifetime_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 124 | handle->ep_information_ptr->lifetime_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 125 | } |
Yogesh Pande |
4:5d91b0f5038c | 126 | |
Yogesh Pande |
4:5d91b0f5038c | 127 | handle->sn_nsdl_free(handle->ep_information_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 128 | handle->ep_information_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 129 | } |
Yogesh Pande |
4:5d91b0f5038c | 130 | |
Yogesh Pande |
4:5d91b0f5038c | 131 | if (handle->nsp_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 132 | if (handle->nsp_address_ptr->omalw_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 133 | if (handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 134 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 135 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 136 | } |
Yogesh Pande |
4:5d91b0f5038c | 137 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 138 | } |
Yogesh Pande |
4:5d91b0f5038c | 139 | |
Yogesh Pande |
4:5d91b0f5038c | 140 | handle->sn_nsdl_free(handle->nsp_address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 141 | handle->nsp_address_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 142 | } |
Yogesh Pande |
4:5d91b0f5038c | 143 | |
Yogesh Pande |
4:5d91b0f5038c | 144 | if (handle->oma_bs_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 145 | handle->sn_nsdl_free(handle->oma_bs_address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 146 | } |
Yogesh Pande |
4:5d91b0f5038c | 147 | |
Yogesh Pande |
4:5d91b0f5038c | 148 | /* Destroy also libCoap and grs part of libNsdl */ |
Yogesh Pande |
4:5d91b0f5038c | 149 | sn_coap_protocol_destroy(handle->grs->coap); |
Yogesh Pande |
4:5d91b0f5038c | 150 | sn_grs_destroy(handle->grs); |
Yogesh Pande |
4:5d91b0f5038c | 151 | handle->sn_nsdl_free(handle); |
Yogesh Pande |
4:5d91b0f5038c | 152 | |
Yogesh Pande |
4:5d91b0f5038c | 153 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 154 | } |
Yogesh Pande |
4:5d91b0f5038c | 155 | |
Yogesh Pande |
4:5d91b0f5038c | 156 | 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 *), |
Yogesh Pande |
4:5d91b0f5038c | 157 | uint8_t (*sn_nsdl_rx_cb)(struct nsdl_s *, sn_coap_hdr_s *, sn_nsdl_addr_s *), |
Yogesh Pande |
4:5d91b0f5038c | 158 | void *(*sn_nsdl_alloc)(uint16_t), void (*sn_nsdl_free)(void *)) |
Yogesh Pande |
4:5d91b0f5038c | 159 | { |
Yogesh Pande |
4:5d91b0f5038c | 160 | /* Check pointers and define function pointers */ |
Yogesh Pande |
4:5d91b0f5038c | 161 | if (!sn_nsdl_alloc || !sn_nsdl_free || !sn_nsdl_tx_cb || !sn_nsdl_rx_cb) { |
Yogesh Pande |
4:5d91b0f5038c | 162 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 163 | } |
Yogesh Pande |
4:5d91b0f5038c | 164 | |
Yogesh Pande |
4:5d91b0f5038c | 165 | struct nsdl_s *handle = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 166 | |
Yogesh Pande |
4:5d91b0f5038c | 167 | handle = sn_nsdl_alloc(sizeof(struct nsdl_s)); |
Yogesh Pande |
4:5d91b0f5038c | 168 | |
Yogesh Pande |
4:5d91b0f5038c | 169 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 170 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 171 | } |
Yogesh Pande |
4:5d91b0f5038c | 172 | |
Yogesh Pande |
4:5d91b0f5038c | 173 | memset(handle, 0, sizeof(struct nsdl_s)); |
Yogesh Pande |
4:5d91b0f5038c | 174 | |
Yogesh Pande |
4:5d91b0f5038c | 175 | /* Define function pointers */ |
Yogesh Pande |
4:5d91b0f5038c | 176 | handle->sn_nsdl_alloc = sn_nsdl_alloc; |
Yogesh Pande |
4:5d91b0f5038c | 177 | handle->sn_nsdl_free = sn_nsdl_free; |
Yogesh Pande |
4:5d91b0f5038c | 178 | |
Yogesh Pande |
4:5d91b0f5038c | 179 | handle->sn_nsdl_tx_callback = sn_nsdl_tx_cb; |
Yogesh Pande |
4:5d91b0f5038c | 180 | handle->sn_nsdl_rx_callback = sn_nsdl_rx_cb; |
Yogesh Pande |
4:5d91b0f5038c | 181 | |
Yogesh Pande |
4:5d91b0f5038c | 182 | /* Initialize ep parameters struct */ |
Yogesh Pande |
4:5d91b0f5038c | 183 | if (!handle->ep_information_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 184 | handle->ep_information_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 185 | if (!handle->ep_information_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 186 | sn_nsdl_free(handle); |
Yogesh Pande |
4:5d91b0f5038c | 187 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 188 | } |
Yogesh Pande |
4:5d91b0f5038c | 189 | memset(handle->ep_information_ptr, 0, sizeof(sn_nsdl_ep_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 190 | } |
Yogesh Pande |
4:5d91b0f5038c | 191 | |
Yogesh Pande |
4:5d91b0f5038c | 192 | handle->grs = sn_grs_init(sn_nsdl_tx_cb, &sn_nsdl_local_rx_function, sn_nsdl_alloc, sn_nsdl_free); |
Yogesh Pande |
4:5d91b0f5038c | 193 | |
Yogesh Pande |
4:5d91b0f5038c | 194 | /* Initialize GRS */ |
Yogesh Pande |
4:5d91b0f5038c | 195 | if (handle->grs == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 196 | handle->sn_nsdl_free(handle->ep_information_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 197 | handle->ep_information_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 198 | sn_nsdl_free(handle); |
Yogesh Pande |
4:5d91b0f5038c | 199 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 200 | } |
Yogesh Pande |
4:5d91b0f5038c | 201 | |
Yogesh Pande |
4:5d91b0f5038c | 202 | sn_nsdl_resolve_nsp_address(handle); |
Yogesh Pande |
4:5d91b0f5038c | 203 | |
Yogesh Pande |
4:5d91b0f5038c | 204 | handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED; |
Yogesh Pande |
4:5d91b0f5038c | 205 | |
Yogesh Pande |
4:5d91b0f5038c | 206 | return handle; |
Yogesh Pande |
4:5d91b0f5038c | 207 | } |
Yogesh Pande |
4:5d91b0f5038c | 208 | |
Yogesh Pande |
4:5d91b0f5038c | 209 | uint16_t sn_nsdl_register_endpoint(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *endpoint_info_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 210 | { |
Yogesh Pande |
4:5d91b0f5038c | 211 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 212 | sn_coap_hdr_s *register_message_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 213 | uint16_t message_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 214 | |
Yogesh Pande |
4:5d91b0f5038c | 215 | if (endpoint_info_ptr == NULL || handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 216 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 217 | } |
Yogesh Pande |
4:5d91b0f5038c | 218 | |
Yogesh Pande |
4:5d91b0f5038c | 219 | /*** Build endpoint register message ***/ |
Yogesh Pande |
4:5d91b0f5038c | 220 | |
Yogesh Pande |
4:5d91b0f5038c | 221 | /* Allocate memory for header struct */ |
Yogesh Pande |
4:5d91b0f5038c | 222 | register_message_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 223 | if (register_message_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 224 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 225 | } |
Yogesh Pande |
4:5d91b0f5038c | 226 | |
Yogesh Pande |
4:5d91b0f5038c | 227 | memset(register_message_ptr, 0, sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 228 | |
Yogesh Pande |
4:5d91b0f5038c | 229 | /* Fill message fields -> confirmable post to specified NSP path */ |
Yogesh Pande |
4:5d91b0f5038c | 230 | register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE; |
Yogesh Pande |
4:5d91b0f5038c | 231 | register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST; |
Yogesh Pande |
4:5d91b0f5038c | 232 | |
Yogesh Pande |
4:5d91b0f5038c | 233 | /* Allocate memory for the extended options list */ |
Yogesh Pande |
4:5d91b0f5038c | 234 | register_message_ptr->options_list_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 235 | if (register_message_ptr->options_list_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 236 | handle->sn_nsdl_free(register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 237 | register_message_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 238 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 239 | } |
Yogesh Pande |
4:5d91b0f5038c | 240 | |
Yogesh Pande |
4:5d91b0f5038c | 241 | memset(register_message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 242 | |
Yogesh Pande |
4:5d91b0f5038c | 243 | register_message_ptr->uri_path_len = sizeof(resource_path_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 244 | register_message_ptr->uri_path_ptr = resource_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 245 | |
Yogesh Pande |
4:5d91b0f5038c | 246 | /* Fill Uri-query options */ |
Yogesh Pande |
4:5d91b0f5038c | 247 | if( SN_NSDL_FAILURE == sn_nsdl_fill_uri_query_options(handle, endpoint_info_ptr, |
Yogesh Pande |
4:5d91b0f5038c | 248 | register_message_ptr, SN_NSDL_EP_REGISTER_MESSAGE) ){ |
Yogesh Pande |
4:5d91b0f5038c | 249 | register_message_ptr->uri_path_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 250 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 251 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 252 | } |
Yogesh Pande |
4:5d91b0f5038c | 253 | |
Yogesh Pande |
4:5d91b0f5038c | 254 | if (endpoint_info_ptr->ds_register_mode == REGISTER_WITH_RESOURCES) { |
Yogesh Pande |
4:5d91b0f5038c | 255 | /* Built body for message */ |
Yogesh Pande |
4:5d91b0f5038c | 256 | if (sn_nsdl_build_registration_body(handle, register_message_ptr, 0) == SN_NSDL_FAILURE) { |
Yogesh Pande |
4:5d91b0f5038c | 257 | register_message_ptr->uri_path_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 258 | register_message_ptr->options_list_ptr->uri_host_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 259 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 260 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 261 | } |
Yogesh Pande |
4:5d91b0f5038c | 262 | } |
Yogesh Pande |
4:5d91b0f5038c | 263 | |
Yogesh Pande |
4:5d91b0f5038c | 264 | /* Clean (possible) existing and save new endpoint info to handle */ |
Yogesh Pande |
4:5d91b0f5038c | 265 | if (set_endpoint_info(handle, endpoint_info_ptr) == -1) { |
Yogesh Pande |
4:5d91b0f5038c | 266 | if (register_message_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 267 | handle->sn_nsdl_free(register_message_ptr->payload_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 268 | register_message_ptr->payload_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 269 | } |
Yogesh Pande |
4:5d91b0f5038c | 270 | |
Yogesh Pande |
4:5d91b0f5038c | 271 | register_message_ptr->uri_path_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 272 | register_message_ptr->options_list_ptr->uri_host_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 273 | |
Yogesh Pande |
4:5d91b0f5038c | 274 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 275 | |
Yogesh Pande |
4:5d91b0f5038c | 276 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 277 | } |
Yogesh Pande |
4:5d91b0f5038c | 278 | |
Yogesh Pande |
4:5d91b0f5038c | 279 | /* Build and send coap message to NSP */ |
Yogesh Pande |
4:5d91b0f5038c | 280 | message_id = sn_nsdl_internal_coap_send(handle, register_message_ptr, handle->nsp_address_ptr->omalw_address_ptr, SN_NSDL_MSG_REGISTER); |
Yogesh Pande |
4:5d91b0f5038c | 281 | |
Yogesh Pande |
4:5d91b0f5038c | 282 | if (register_message_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 283 | handle->sn_nsdl_free(register_message_ptr->payload_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 284 | register_message_ptr->payload_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 285 | } |
Yogesh Pande |
4:5d91b0f5038c | 286 | |
Yogesh Pande |
4:5d91b0f5038c | 287 | register_message_ptr->uri_path_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 288 | register_message_ptr->options_list_ptr->uri_host_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 289 | |
Yogesh Pande |
4:5d91b0f5038c | 290 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 291 | |
Yogesh Pande |
4:5d91b0f5038c | 292 | return message_id; |
Yogesh Pande |
4:5d91b0f5038c | 293 | } |
Yogesh Pande |
4:5d91b0f5038c | 294 | |
Yogesh Pande |
4:5d91b0f5038c | 295 | uint16_t sn_nsdl_unregister_endpoint(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 296 | { |
Yogesh Pande |
4:5d91b0f5038c | 297 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 298 | sn_coap_hdr_s *unregister_message_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 299 | uint8_t *temp_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 300 | uint16_t message_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 301 | |
Yogesh Pande |
4:5d91b0f5038c | 302 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 303 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 304 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 305 | } |
Yogesh Pande |
4:5d91b0f5038c | 306 | |
Yogesh Pande |
4:5d91b0f5038c | 307 | /* Check that EP have been registered */ |
Yogesh Pande |
4:5d91b0f5038c | 308 | if (sn_nsdl_is_ep_registered(handle)) { |
Yogesh Pande |
4:5d91b0f5038c | 309 | |
Yogesh Pande |
4:5d91b0f5038c | 310 | /* Memory allocation for unregister message */ |
Yogesh Pande |
4:5d91b0f5038c | 311 | unregister_message_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 312 | if (!unregister_message_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 313 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 314 | } |
Yogesh Pande |
4:5d91b0f5038c | 315 | |
Yogesh Pande |
4:5d91b0f5038c | 316 | memset(unregister_message_ptr, 0, sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 317 | |
Yogesh Pande |
4:5d91b0f5038c | 318 | /* Fill unregister message */ |
Yogesh Pande |
4:5d91b0f5038c | 319 | unregister_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE; |
Yogesh Pande |
4:5d91b0f5038c | 320 | unregister_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_DELETE; |
Yogesh Pande |
4:5d91b0f5038c | 321 | |
Yogesh Pande |
4:5d91b0f5038c | 322 | if(handle->ep_information_ptr->location_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 323 | unregister_message_ptr->uri_path_len = handle->ep_information_ptr->location_len; |
Yogesh Pande |
4:5d91b0f5038c | 324 | unregister_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(unregister_message_ptr->uri_path_len); |
Yogesh Pande |
4:5d91b0f5038c | 325 | if (!unregister_message_ptr->uri_path_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 326 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 327 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 328 | } |
Yogesh Pande |
4:5d91b0f5038c | 329 | |
Yogesh Pande |
4:5d91b0f5038c | 330 | temp_ptr = unregister_message_ptr->uri_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 331 | |
Yogesh Pande |
4:5d91b0f5038c | 332 | memcpy(temp_ptr , handle->ep_information_ptr->location_ptr, handle->ep_information_ptr->location_len); |
Yogesh Pande |
4:5d91b0f5038c | 333 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 334 | 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); |
Yogesh Pande |
4:5d91b0f5038c | 335 | unregister_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(unregister_message_ptr->uri_path_len); |
Yogesh Pande |
4:5d91b0f5038c | 336 | if (!unregister_message_ptr->uri_path_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 337 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 338 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 339 | } |
Yogesh Pande |
4:5d91b0f5038c | 340 | |
Yogesh Pande |
4:5d91b0f5038c | 341 | temp_ptr = unregister_message_ptr->uri_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 342 | |
Yogesh Pande |
4:5d91b0f5038c | 343 | memcpy(temp_ptr, resource_path_ptr, RESOURCE_DIR_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 344 | temp_ptr += RESOURCE_DIR_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 345 | |
Yogesh Pande |
4:5d91b0f5038c | 346 | *temp_ptr++ = '/'; |
Yogesh Pande |
4:5d91b0f5038c | 347 | |
Yogesh Pande |
4:5d91b0f5038c | 348 | memcpy(temp_ptr , handle->ep_information_ptr->domain_name_ptr, handle->ep_information_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 349 | temp_ptr += handle->ep_information_ptr->domain_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 350 | |
Yogesh Pande |
4:5d91b0f5038c | 351 | *temp_ptr++ = '/'; |
Yogesh Pande |
4:5d91b0f5038c | 352 | |
Yogesh Pande |
4:5d91b0f5038c | 353 | memcpy(temp_ptr , handle->ep_information_ptr->endpoint_name_ptr, handle->ep_information_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 354 | } |
Yogesh Pande |
4:5d91b0f5038c | 355 | |
Yogesh Pande |
4:5d91b0f5038c | 356 | /* Send message */ |
Yogesh Pande |
4:5d91b0f5038c | 357 | message_id = sn_nsdl_internal_coap_send(handle, unregister_message_ptr, handle->nsp_address_ptr->omalw_address_ptr, SN_NSDL_MSG_UNREGISTER); |
Yogesh Pande |
4:5d91b0f5038c | 358 | |
Yogesh Pande |
4:5d91b0f5038c | 359 | /* Free memory */ |
Yogesh Pande |
4:5d91b0f5038c | 360 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, unregister_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 361 | |
Yogesh Pande |
4:5d91b0f5038c | 362 | } |
Yogesh Pande |
4:5d91b0f5038c | 363 | |
Yogesh Pande |
4:5d91b0f5038c | 364 | return message_id; |
Yogesh Pande |
4:5d91b0f5038c | 365 | } |
Yogesh Pande |
4:5d91b0f5038c | 366 | |
Yogesh Pande |
4:5d91b0f5038c | 367 | uint16_t sn_nsdl_update_registration(struct nsdl_s *handle, uint8_t *lt_ptr, uint8_t lt_len) |
Yogesh Pande |
4:5d91b0f5038c | 368 | { |
Yogesh Pande |
4:5d91b0f5038c | 369 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 370 | sn_coap_hdr_s *register_message_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 371 | uint8_t *temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 372 | sn_nsdl_ep_parameters_s temp_parameters; |
Yogesh Pande |
4:5d91b0f5038c | 373 | uint16_t message_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 374 | |
Yogesh Pande |
4:5d91b0f5038c | 375 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 376 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 377 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 378 | } |
Yogesh Pande |
4:5d91b0f5038c | 379 | |
Yogesh Pande |
4:5d91b0f5038c | 380 | if (!sn_nsdl_is_ep_registered(handle)){ |
Yogesh Pande |
4:5d91b0f5038c | 381 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 382 | } |
Yogesh Pande |
4:5d91b0f5038c | 383 | |
Yogesh Pande |
4:5d91b0f5038c | 384 | memset(&temp_parameters, 0, sizeof(sn_nsdl_ep_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 385 | |
Yogesh Pande |
4:5d91b0f5038c | 386 | temp_parameters.lifetime_len = lt_len; |
Yogesh Pande |
4:5d91b0f5038c | 387 | temp_parameters.lifetime_ptr = lt_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 388 | |
Yogesh Pande |
4:5d91b0f5038c | 389 | /*** Build endpoint register update message ***/ |
Yogesh Pande |
4:5d91b0f5038c | 390 | |
Yogesh Pande |
4:5d91b0f5038c | 391 | /* Allocate memory for header struct */ |
Yogesh Pande |
4:5d91b0f5038c | 392 | register_message_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 393 | if (register_message_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 394 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 395 | } |
Yogesh Pande |
4:5d91b0f5038c | 396 | |
Yogesh Pande |
4:5d91b0f5038c | 397 | memset(register_message_ptr, 0, sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 398 | |
Yogesh Pande |
4:5d91b0f5038c | 399 | /* Fill message fields -> confirmable post to specified NSP path */ |
Yogesh Pande |
4:5d91b0f5038c | 400 | register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE; |
Yogesh Pande |
4:5d91b0f5038c | 401 | register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST; |
Yogesh Pande |
4:5d91b0f5038c | 402 | |
Yogesh Pande |
4:5d91b0f5038c | 403 | if(handle->ep_information_ptr->location_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 404 | register_message_ptr->uri_path_len = handle->ep_information_ptr->location_len; /* = Only location set by Device Server*/ |
Yogesh Pande |
4:5d91b0f5038c | 405 | |
Yogesh Pande |
4:5d91b0f5038c | 406 | register_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(register_message_ptr->uri_path_len); |
Yogesh Pande |
4:5d91b0f5038c | 407 | if (!register_message_ptr->uri_path_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 408 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 409 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 410 | } |
Yogesh Pande |
4:5d91b0f5038c | 411 | |
Yogesh Pande |
4:5d91b0f5038c | 412 | temp_ptr = register_message_ptr->uri_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 413 | |
Yogesh Pande |
4:5d91b0f5038c | 414 | /* location */ |
Yogesh Pande |
4:5d91b0f5038c | 415 | memcpy(temp_ptr, handle->ep_information_ptr->location_ptr, handle->ep_information_ptr->location_len); |
Yogesh Pande |
4:5d91b0f5038c | 416 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 417 | 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 */ |
Yogesh Pande |
4:5d91b0f5038c | 418 | |
Yogesh Pande |
4:5d91b0f5038c | 419 | register_message_ptr->uri_path_ptr = handle->sn_nsdl_alloc(register_message_ptr->uri_path_len); |
Yogesh Pande |
4:5d91b0f5038c | 420 | if (!register_message_ptr->uri_path_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 421 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 422 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 423 | } |
Yogesh Pande |
4:5d91b0f5038c | 424 | |
Yogesh Pande |
4:5d91b0f5038c | 425 | temp_ptr = register_message_ptr->uri_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 426 | |
Yogesh Pande |
4:5d91b0f5038c | 427 | /* rd/ */ |
Yogesh Pande |
4:5d91b0f5038c | 428 | memcpy(temp_ptr, resource_path_ptr, sizeof(resource_path_ptr)); |
Yogesh Pande |
4:5d91b0f5038c | 429 | temp_ptr += sizeof(resource_path_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 430 | *temp_ptr++ = '/'; |
Yogesh Pande |
4:5d91b0f5038c | 431 | |
Yogesh Pande |
4:5d91b0f5038c | 432 | /* rd/DOMAIN/ */ |
Yogesh Pande |
4:5d91b0f5038c | 433 | memcpy(temp_ptr, handle->ep_information_ptr->domain_name_ptr, handle->ep_information_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 434 | temp_ptr += handle->ep_information_ptr->domain_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 435 | *temp_ptr++ = '/'; |
Yogesh Pande |
4:5d91b0f5038c | 436 | |
Yogesh Pande |
4:5d91b0f5038c | 437 | /* rd/domain/ENDPOINT */ |
Yogesh Pande |
4:5d91b0f5038c | 438 | memcpy(temp_ptr, handle->ep_information_ptr->endpoint_name_ptr, handle->ep_information_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 439 | } |
Yogesh Pande |
4:5d91b0f5038c | 440 | |
Yogesh Pande |
4:5d91b0f5038c | 441 | /* Allocate memory for the extended options list */ |
Yogesh Pande |
4:5d91b0f5038c | 442 | register_message_ptr->options_list_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 443 | if (register_message_ptr->options_list_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 444 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 445 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 446 | } |
Yogesh Pande |
4:5d91b0f5038c | 447 | |
Yogesh Pande |
4:5d91b0f5038c | 448 | memset(register_message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 449 | |
Yogesh Pande |
4:5d91b0f5038c | 450 | /* Fill Uri-query options */ |
Yogesh Pande |
4:5d91b0f5038c | 451 | sn_nsdl_fill_uri_query_options(handle, &temp_parameters, register_message_ptr, SN_NSDL_EP_UPDATE_MESSAGE); |
Yogesh Pande |
4:5d91b0f5038c | 452 | |
Yogesh Pande |
4:5d91b0f5038c | 453 | /* Build payload */ |
Yogesh Pande |
4:5d91b0f5038c | 454 | if (handle->ep_information_ptr->ds_register_mode == REGISTER_WITH_RESOURCES) { |
Yogesh Pande |
4:5d91b0f5038c | 455 | |
Yogesh Pande |
4:5d91b0f5038c | 456 | if (sn_nsdl_build_registration_body(handle, register_message_ptr, 1) == SN_NSDL_FAILURE) { |
Yogesh Pande |
4:5d91b0f5038c | 457 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 458 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 459 | } |
Yogesh Pande |
4:5d91b0f5038c | 460 | } |
Yogesh Pande |
4:5d91b0f5038c | 461 | |
Yogesh Pande |
4:5d91b0f5038c | 462 | /* Build and send coap message to NSP */ |
Yogesh Pande |
4:5d91b0f5038c | 463 | message_id = sn_nsdl_internal_coap_send(handle, register_message_ptr, handle->nsp_address_ptr->omalw_address_ptr, SN_NSDL_MSG_UPDATE); |
Yogesh Pande |
4:5d91b0f5038c | 464 | |
Yogesh Pande |
4:5d91b0f5038c | 465 | if (register_message_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 466 | handle->sn_nsdl_free(register_message_ptr->payload_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 467 | } |
Yogesh Pande |
4:5d91b0f5038c | 468 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, register_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 469 | |
Yogesh Pande |
4:5d91b0f5038c | 470 | return message_id; |
Yogesh Pande |
4:5d91b0f5038c | 471 | } |
Yogesh Pande |
4:5d91b0f5038c | 472 | |
Yogesh Pande |
4:5d91b0f5038c | 473 | int8_t sn_nsdl_set_endpoint_location(struct nsdl_s *handle, uint8_t *location_ptr, uint8_t location_len) |
Yogesh Pande |
4:5d91b0f5038c | 474 | { |
Yogesh Pande |
4:5d91b0f5038c | 475 | if(!handle || !location_ptr || (location_len == 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 476 | return -1; |
Yogesh Pande |
4:5d91b0f5038c | 477 | } |
Yogesh Pande |
4:5d91b0f5038c | 478 | handle->ep_information_ptr->location_ptr = handle->sn_nsdl_alloc(location_len); |
Yogesh Pande |
4:5d91b0f5038c | 479 | memcpy(handle->ep_information_ptr->location_ptr, location_ptr, location_len); |
Yogesh Pande |
4:5d91b0f5038c | 480 | handle->ep_information_ptr->location_len = location_len; |
Yogesh Pande |
4:5d91b0f5038c | 481 | |
Yogesh Pande |
4:5d91b0f5038c | 482 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 483 | } |
Yogesh Pande |
4:5d91b0f5038c | 484 | |
Yogesh Pande |
4:5d91b0f5038c | 485 | void sn_nsdl_nsp_lost(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 486 | { |
Yogesh Pande |
4:5d91b0f5038c | 487 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 488 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 489 | return; |
Yogesh Pande |
4:5d91b0f5038c | 490 | } |
Yogesh Pande |
4:5d91b0f5038c | 491 | |
Yogesh Pande |
4:5d91b0f5038c | 492 | handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED; |
Yogesh Pande |
4:5d91b0f5038c | 493 | } |
Yogesh Pande |
4:5d91b0f5038c | 494 | |
Yogesh Pande |
4:5d91b0f5038c | 495 | int8_t sn_nsdl_is_ep_registered(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 496 | { |
Yogesh Pande |
4:5d91b0f5038c | 497 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 498 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 499 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 500 | } |
Yogesh Pande |
4:5d91b0f5038c | 501 | |
Yogesh Pande |
4:5d91b0f5038c | 502 | return handle->sn_nsdl_endpoint_registered; |
Yogesh Pande |
4:5d91b0f5038c | 503 | } |
Yogesh Pande |
4:5d91b0f5038c | 504 | |
Yogesh Pande |
4:5d91b0f5038c | 505 | uint16_t sn_nsdl_send_observation_notification(struct nsdl_s *handle, uint8_t *token_ptr, uint8_t token_len, |
Yogesh Pande |
4:5d91b0f5038c | 506 | uint8_t *payload_ptr, uint16_t payload_len, |
Yogesh Pande |
4:5d91b0f5038c | 507 | uint8_t *observe_ptr, uint8_t observe_len, |
Yogesh Pande |
4:5d91b0f5038c | 508 | sn_coap_msg_type_e message_type, uint8_t content_type) |
Yogesh Pande |
4:5d91b0f5038c | 509 | { |
Yogesh Pande |
4:5d91b0f5038c | 510 | return sn_nsdl_send_observation_notification_with_uri_path(handle, |
Yogesh Pande |
4:5d91b0f5038c | 511 | token_ptr, |
Yogesh Pande |
4:5d91b0f5038c | 512 | token_len, |
Yogesh Pande |
4:5d91b0f5038c | 513 | payload_ptr, |
Yogesh Pande |
4:5d91b0f5038c | 514 | payload_len, |
Yogesh Pande |
4:5d91b0f5038c | 515 | observe_ptr, |
Yogesh Pande |
4:5d91b0f5038c | 516 | observe_len, |
Yogesh Pande |
4:5d91b0f5038c | 517 | message_type, |
Yogesh Pande |
4:5d91b0f5038c | 518 | content_type, |
Yogesh Pande |
4:5d91b0f5038c | 519 | NULL, |
Yogesh Pande |
4:5d91b0f5038c | 520 | 0); |
Yogesh Pande |
4:5d91b0f5038c | 521 | } |
Yogesh Pande |
4:5d91b0f5038c | 522 | |
Yogesh Pande |
4:5d91b0f5038c | 523 | uint16_t sn_nsdl_send_observation_notification_with_uri_path(struct nsdl_s *handle, uint8_t *token_ptr, uint8_t token_len, |
Yogesh Pande |
4:5d91b0f5038c | 524 | uint8_t *payload_ptr, uint16_t payload_len, |
Yogesh Pande |
4:5d91b0f5038c | 525 | uint8_t *observe_ptr, uint8_t observe_len, |
Yogesh Pande |
4:5d91b0f5038c | 526 | sn_coap_msg_type_e message_type, uint8_t content_type, |
Yogesh Pande |
4:5d91b0f5038c | 527 | uint8_t *uri_path_ptr, uint16_t uri_path_len) |
Yogesh Pande |
4:5d91b0f5038c | 528 | { |
Yogesh Pande |
4:5d91b0f5038c | 529 | sn_coap_hdr_s *notification_message_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 530 | uint16_t return_msg_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 531 | |
Yogesh Pande |
4:5d91b0f5038c | 532 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 533 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 534 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 535 | } |
Yogesh Pande |
4:5d91b0f5038c | 536 | |
Yogesh Pande |
4:5d91b0f5038c | 537 | /* Allocate and initialize memory for header struct */ |
Yogesh Pande |
4:5d91b0f5038c | 538 | notification_message_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 539 | if (notification_message_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 540 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 541 | } |
Yogesh Pande |
4:5d91b0f5038c | 542 | |
Yogesh Pande |
4:5d91b0f5038c | 543 | memset(notification_message_ptr, 0, sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 544 | |
Yogesh Pande |
4:5d91b0f5038c | 545 | notification_message_ptr->options_list_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 546 | if (notification_message_ptr->options_list_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 547 | handle->sn_nsdl_free(notification_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 548 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 549 | } |
Yogesh Pande |
4:5d91b0f5038c | 550 | |
Yogesh Pande |
4:5d91b0f5038c | 551 | memset(notification_message_ptr->options_list_ptr , 0, sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 552 | |
Yogesh Pande |
4:5d91b0f5038c | 553 | /* Fill header */ |
Yogesh Pande |
4:5d91b0f5038c | 554 | notification_message_ptr->msg_type = message_type; |
Yogesh Pande |
4:5d91b0f5038c | 555 | notification_message_ptr->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT; |
Yogesh Pande |
4:5d91b0f5038c | 556 | |
Yogesh Pande |
4:5d91b0f5038c | 557 | /* Fill token */ |
Yogesh Pande |
4:5d91b0f5038c | 558 | notification_message_ptr->token_len = token_len; |
Yogesh Pande |
4:5d91b0f5038c | 559 | notification_message_ptr->token_ptr = token_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 560 | |
Yogesh Pande |
4:5d91b0f5038c | 561 | /* Fill payload */ |
Yogesh Pande |
4:5d91b0f5038c | 562 | notification_message_ptr->payload_len = payload_len; |
Yogesh Pande |
4:5d91b0f5038c | 563 | notification_message_ptr->payload_ptr = payload_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 564 | |
Yogesh Pande |
4:5d91b0f5038c | 565 | /* Fill uri path */ |
Yogesh Pande |
4:5d91b0f5038c | 566 | notification_message_ptr->uri_path_len = uri_path_len; |
Yogesh Pande |
4:5d91b0f5038c | 567 | notification_message_ptr->uri_path_ptr = uri_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 568 | |
Yogesh Pande |
4:5d91b0f5038c | 569 | /* Fill observe */ |
Yogesh Pande |
4:5d91b0f5038c | 570 | notification_message_ptr->options_list_ptr->observe_len = observe_len; |
Yogesh Pande |
4:5d91b0f5038c | 571 | notification_message_ptr->options_list_ptr->observe_ptr = observe_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 572 | |
Yogesh Pande |
4:5d91b0f5038c | 573 | /* Fill content type */ |
Yogesh Pande |
4:5d91b0f5038c | 574 | if (content_type) { |
Yogesh Pande |
4:5d91b0f5038c | 575 | notification_message_ptr->content_type_len = 1; |
Yogesh Pande |
4:5d91b0f5038c | 576 | notification_message_ptr->content_type_ptr = &content_type; |
Yogesh Pande |
4:5d91b0f5038c | 577 | } |
Yogesh Pande |
4:5d91b0f5038c | 578 | |
Yogesh Pande |
4:5d91b0f5038c | 579 | /* Send message */ |
Yogesh Pande |
4:5d91b0f5038c | 580 | if (sn_nsdl_send_coap_message(handle, handle->nsp_address_ptr->omalw_address_ptr, notification_message_ptr) == SN_NSDL_FAILURE) { |
Yogesh Pande |
4:5d91b0f5038c | 581 | return_msg_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 582 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 583 | return_msg_id = notification_message_ptr->msg_id; |
Yogesh Pande |
4:5d91b0f5038c | 584 | } |
Yogesh Pande |
4:5d91b0f5038c | 585 | |
Yogesh Pande |
4:5d91b0f5038c | 586 | /* Free memory */ |
Yogesh Pande |
4:5d91b0f5038c | 587 | notification_message_ptr->uri_path_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 588 | notification_message_ptr->payload_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 589 | notification_message_ptr->options_list_ptr->observe_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 590 | notification_message_ptr->token_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 591 | notification_message_ptr->content_type_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 592 | |
Yogesh Pande |
4:5d91b0f5038c | 593 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, notification_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 594 | |
Yogesh Pande |
4:5d91b0f5038c | 595 | return return_msg_id; |
Yogesh Pande |
4:5d91b0f5038c | 596 | } |
Yogesh Pande |
4:5d91b0f5038c | 597 | |
Yogesh Pande |
4:5d91b0f5038c | 598 | |
Yogesh Pande |
4:5d91b0f5038c | 599 | /* * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 600 | /* ~ OMA functions ~ */ |
Yogesh Pande |
4:5d91b0f5038c | 601 | /* * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 602 | |
Yogesh Pande |
4:5d91b0f5038c | 603 | uint16_t sn_nsdl_oma_bootstrap(struct nsdl_s *handle, sn_nsdl_addr_s *bootstrap_address_ptr, sn_nsdl_ep_parameters_s *endpoint_info_ptr, sn_nsdl_bs_ep_info_t *bootstrap_endpoint_info_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 604 | { |
Yogesh Pande |
4:5d91b0f5038c | 605 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 606 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 607 | sn_coap_hdr_s bootstrap_coap_header; |
Yogesh Pande |
4:5d91b0f5038c | 608 | uint8_t *uri_query_tmp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 609 | uint16_t message_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 610 | |
Yogesh Pande |
4:5d91b0f5038c | 611 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 612 | if (!bootstrap_address_ptr || !bootstrap_endpoint_info_ptr || !endpoint_info_ptr || !handle) { |
Yogesh Pande |
4:5d91b0f5038c | 613 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 614 | } |
Yogesh Pande |
4:5d91b0f5038c | 615 | |
Yogesh Pande |
4:5d91b0f5038c | 616 | /* Create device object */ |
Yogesh Pande |
4:5d91b0f5038c | 617 | if (sn_nsdl_create_oma_device_object_base(handle, bootstrap_endpoint_info_ptr->device_object, endpoint_info_ptr->binding_and_mode) < 0) { |
Yogesh Pande |
4:5d91b0f5038c | 618 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 619 | } |
Yogesh Pande |
4:5d91b0f5038c | 620 | |
Yogesh Pande |
4:5d91b0f5038c | 621 | handle->sn_nsdl_oma_bs_done_cb = bootstrap_endpoint_info_ptr->oma_bs_status_cb; |
Yogesh Pande |
4:5d91b0f5038c | 622 | |
Yogesh Pande |
4:5d91b0f5038c | 623 | /* Init CoAP header struct */ |
Yogesh Pande |
4:5d91b0f5038c | 624 | memset(&bootstrap_coap_header, 0, sizeof(sn_coap_hdr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 625 | |
Yogesh Pande |
4:5d91b0f5038c | 626 | bootstrap_coap_header.options_list_ptr = handle->sn_nsdl_alloc(sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 627 | if (!bootstrap_coap_header.options_list_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 628 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 629 | } |
Yogesh Pande |
4:5d91b0f5038c | 630 | |
Yogesh Pande |
4:5d91b0f5038c | 631 | memset(bootstrap_coap_header.options_list_ptr, 0, sizeof(sn_coap_options_list_s)); |
Yogesh Pande |
4:5d91b0f5038c | 632 | |
Yogesh Pande |
4:5d91b0f5038c | 633 | /* Build bootstrap start message */ |
Yogesh Pande |
4:5d91b0f5038c | 634 | bootstrap_coap_header.msg_code = COAP_MSG_CODE_REQUEST_POST; |
Yogesh Pande |
4:5d91b0f5038c | 635 | bootstrap_coap_header.msg_type = COAP_MSG_TYPE_CONFIRMABLE; |
Yogesh Pande |
4:5d91b0f5038c | 636 | |
Yogesh Pande |
4:5d91b0f5038c | 637 | bootstrap_coap_header.uri_path_ptr = bs_uri; |
Yogesh Pande |
4:5d91b0f5038c | 638 | bootstrap_coap_header.uri_path_len = sizeof(bs_uri); |
Yogesh Pande |
4:5d91b0f5038c | 639 | |
Yogesh Pande |
4:5d91b0f5038c | 640 | uri_query_tmp_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->endpoint_name_len + BS_EP_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 641 | if (!uri_query_tmp_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 642 | handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 643 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 644 | } |
Yogesh Pande |
4:5d91b0f5038c | 645 | |
Yogesh Pande |
4:5d91b0f5038c | 646 | memcpy(uri_query_tmp_ptr, bs_ep_name, BS_EP_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 647 | memcpy((uri_query_tmp_ptr + BS_EP_PARAMETER_LEN), endpoint_info_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 648 | |
Yogesh Pande |
4:5d91b0f5038c | 649 | bootstrap_coap_header.options_list_ptr->uri_query_len = endpoint_info_ptr->endpoint_name_len + BS_EP_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 650 | bootstrap_coap_header.options_list_ptr->uri_query_ptr = uri_query_tmp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 651 | |
Yogesh Pande |
4:5d91b0f5038c | 652 | /* Save bootstrap server address */ |
Yogesh Pande |
4:5d91b0f5038c | 653 | handle->oma_bs_address_len = bootstrap_address_ptr->addr_len; /* Length.. */ |
Yogesh Pande |
4:5d91b0f5038c | 654 | handle->oma_bs_address_ptr = handle->sn_nsdl_alloc(handle->oma_bs_address_len); /* Address.. */ |
Yogesh Pande |
4:5d91b0f5038c | 655 | if (!handle->oma_bs_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 656 | handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 657 | handle->sn_nsdl_free(uri_query_tmp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 658 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 659 | } |
Yogesh Pande |
4:5d91b0f5038c | 660 | memcpy(handle->oma_bs_address_ptr, bootstrap_address_ptr->addr_ptr, handle->oma_bs_address_len); |
Yogesh Pande |
4:5d91b0f5038c | 661 | handle->oma_bs_port = bootstrap_address_ptr->port; /* And port */ |
Yogesh Pande |
4:5d91b0f5038c | 662 | |
Yogesh Pande |
4:5d91b0f5038c | 663 | /* Send message */ |
Yogesh Pande |
4:5d91b0f5038c | 664 | message_id = sn_nsdl_internal_coap_send(handle, &bootstrap_coap_header, bootstrap_address_ptr, SN_NSDL_MSG_UNDEFINED); |
Yogesh Pande |
4:5d91b0f5038c | 665 | |
Yogesh Pande |
4:5d91b0f5038c | 666 | /* Free allocated memory */ |
Yogesh Pande |
4:5d91b0f5038c | 667 | handle->sn_nsdl_free(uri_query_tmp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 668 | handle->sn_nsdl_free(bootstrap_coap_header.options_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 669 | |
Yogesh Pande |
4:5d91b0f5038c | 670 | return message_id; |
Yogesh Pande |
4:5d91b0f5038c | 671 | #else |
Yogesh Pande |
4:5d91b0f5038c | 672 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 673 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 674 | |
Yogesh Pande |
4:5d91b0f5038c | 675 | } |
Yogesh Pande |
4:5d91b0f5038c | 676 | |
Yogesh Pande |
4:5d91b0f5038c | 677 | omalw_certificate_list_t *sn_nsdl_get_certificates(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 678 | { |
Yogesh Pande |
4:5d91b0f5038c | 679 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 680 | sn_nsdl_resource_info_s *resource_ptr = 0;; |
Yogesh Pande |
4:5d91b0f5038c | 681 | omalw_certificate_list_t *certi_list_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 682 | |
Yogesh Pande |
4:5d91b0f5038c | 683 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 684 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 685 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 686 | } |
Yogesh Pande |
4:5d91b0f5038c | 687 | |
Yogesh Pande |
4:5d91b0f5038c | 688 | certi_list_ptr = handle->sn_nsdl_alloc(sizeof(omalw_certificate_list_t)); |
Yogesh Pande |
4:5d91b0f5038c | 689 | |
Yogesh Pande |
4:5d91b0f5038c | 690 | if (!certi_list_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 691 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 692 | } |
Yogesh Pande |
4:5d91b0f5038c | 693 | |
Yogesh Pande |
4:5d91b0f5038c | 694 | /* Get private key resource */ |
Yogesh Pande |
4:5d91b0f5038c | 695 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/5"); |
Yogesh Pande |
4:5d91b0f5038c | 696 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 697 | handle->sn_nsdl_free(certi_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 698 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 699 | } |
Yogesh Pande |
4:5d91b0f5038c | 700 | certi_list_ptr->own_private_key_ptr = resource_ptr->resource; |
Yogesh Pande |
4:5d91b0f5038c | 701 | certi_list_ptr->own_private_key_len = resource_ptr->resourcelen; |
Yogesh Pande |
4:5d91b0f5038c | 702 | |
Yogesh Pande |
4:5d91b0f5038c | 703 | /* Get client certificate resource */ |
Yogesh Pande |
4:5d91b0f5038c | 704 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/4"); |
Yogesh Pande |
4:5d91b0f5038c | 705 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 706 | handle->sn_nsdl_free(certi_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 707 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 708 | } |
Yogesh Pande |
4:5d91b0f5038c | 709 | certi_list_ptr->certificate_ptr[0] = resource_ptr->resource; |
Yogesh Pande |
4:5d91b0f5038c | 710 | certi_list_ptr->certificate_len[0] = resource_ptr->resourcelen; |
Yogesh Pande |
4:5d91b0f5038c | 711 | |
Yogesh Pande |
4:5d91b0f5038c | 712 | /* Get root certificate resource */ |
Yogesh Pande |
4:5d91b0f5038c | 713 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/3"); |
Yogesh Pande |
4:5d91b0f5038c | 714 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 715 | handle->sn_nsdl_free(certi_list_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 716 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 717 | } |
Yogesh Pande |
4:5d91b0f5038c | 718 | certi_list_ptr->certificate_ptr[1] = resource_ptr->resource; |
Yogesh Pande |
4:5d91b0f5038c | 719 | certi_list_ptr->certificate_len[1] = resource_ptr->resourcelen; |
Yogesh Pande |
4:5d91b0f5038c | 720 | |
Yogesh Pande |
4:5d91b0f5038c | 721 | /* return filled list */ |
Yogesh Pande |
4:5d91b0f5038c | 722 | return certi_list_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 723 | #else |
Yogesh Pande |
4:5d91b0f5038c | 724 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 725 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 726 | } |
Yogesh Pande |
4:5d91b0f5038c | 727 | |
Yogesh Pande |
4:5d91b0f5038c | 728 | int8_t sn_nsdl_update_certificates(struct nsdl_s *handle, omalw_certificate_list_t *certificate_ptr, uint8_t certificate_chain) |
Yogesh Pande |
4:5d91b0f5038c | 729 | { |
Yogesh Pande |
4:5d91b0f5038c | 730 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 731 | (void)certificate_chain; |
Yogesh Pande |
4:5d91b0f5038c | 732 | |
Yogesh Pande |
4:5d91b0f5038c | 733 | /* Check pointers */ |
Yogesh Pande |
4:5d91b0f5038c | 734 | if (!certificate_ptr || !handle) { |
Yogesh Pande |
4:5d91b0f5038c | 735 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 736 | } |
Yogesh Pande |
4:5d91b0f5038c | 737 | |
Yogesh Pande |
4:5d91b0f5038c | 738 | sn_nsdl_resource_info_s *resource_ptr = 0;; |
Yogesh Pande |
4:5d91b0f5038c | 739 | |
Yogesh Pande |
4:5d91b0f5038c | 740 | /* Get private key resource */ |
Yogesh Pande |
4:5d91b0f5038c | 741 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/5"); |
Yogesh Pande |
4:5d91b0f5038c | 742 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 743 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 744 | } |
Yogesh Pande |
4:5d91b0f5038c | 745 | handle->sn_nsdl_free(resource_ptr->resource); |
Yogesh Pande |
4:5d91b0f5038c | 746 | resource_ptr->resource = certificate_ptr->own_private_key_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 747 | resource_ptr->resourcelen = certificate_ptr->own_private_key_len; |
Yogesh Pande |
4:5d91b0f5038c | 748 | |
Yogesh Pande |
4:5d91b0f5038c | 749 | /* Get client certificate resource */ |
Yogesh Pande |
4:5d91b0f5038c | 750 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/4"); |
Yogesh Pande |
4:5d91b0f5038c | 751 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 752 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 753 | } |
Yogesh Pande |
4:5d91b0f5038c | 754 | handle->sn_nsdl_free(resource_ptr->resource); |
Yogesh Pande |
4:5d91b0f5038c | 755 | resource_ptr->resource = certificate_ptr->certificate_ptr[0]; |
Yogesh Pande |
4:5d91b0f5038c | 756 | resource_ptr->resourcelen = certificate_ptr->certificate_len[0]; |
Yogesh Pande |
4:5d91b0f5038c | 757 | |
Yogesh Pande |
4:5d91b0f5038c | 758 | /* Get root certificate resource */ |
Yogesh Pande |
4:5d91b0f5038c | 759 | resource_ptr = sn_nsdl_get_resource(handle, 5, (void *)"0/0/3"); |
Yogesh Pande |
4:5d91b0f5038c | 760 | if (!resource_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 761 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 762 | } |
Yogesh Pande |
4:5d91b0f5038c | 763 | handle->sn_nsdl_free(resource_ptr->resource); |
Yogesh Pande |
4:5d91b0f5038c | 764 | resource_ptr->resource = certificate_ptr->certificate_ptr[1]; |
Yogesh Pande |
4:5d91b0f5038c | 765 | resource_ptr->resourcelen = certificate_ptr->certificate_len[1]; |
Yogesh Pande |
4:5d91b0f5038c | 766 | |
Yogesh Pande |
4:5d91b0f5038c | 767 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 768 | #else |
Yogesh Pande |
4:5d91b0f5038c | 769 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 770 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 771 | } |
Yogesh Pande |
4:5d91b0f5038c | 772 | |
Yogesh Pande |
4:5d91b0f5038c | 773 | int8_t sn_nsdl_create_oma_device_object(struct nsdl_s *handle, sn_nsdl_oma_device_t *device_object_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 774 | { |
Yogesh Pande |
4:5d91b0f5038c | 775 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 776 | sn_nsdl_resource_info_s *resource_temp = 0; |
Yogesh Pande |
4:5d91b0f5038c | 777 | uint8_t path[8] = "3/0/11/0"; |
Yogesh Pande |
4:5d91b0f5038c | 778 | |
Yogesh Pande |
4:5d91b0f5038c | 779 | if (!device_object_ptr || !handle) { |
Yogesh Pande |
4:5d91b0f5038c | 780 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 781 | } |
Yogesh Pande |
4:5d91b0f5038c | 782 | |
Yogesh Pande |
4:5d91b0f5038c | 783 | /* * Error code * */ |
Yogesh Pande |
4:5d91b0f5038c | 784 | |
Yogesh Pande |
4:5d91b0f5038c | 785 | /* Get first error message */ |
Yogesh Pande |
4:5d91b0f5038c | 786 | resource_temp = sn_grs_search_resource(handle->grs, 8, path, SN_GRS_SEARCH_METHOD); |
Yogesh Pande |
4:5d91b0f5038c | 787 | |
Yogesh Pande |
4:5d91b0f5038c | 788 | while (resource_temp) { |
Yogesh Pande |
4:5d91b0f5038c | 789 | if (resource_temp->resource) { |
Yogesh Pande |
4:5d91b0f5038c | 790 | /* If no error code set */ |
Yogesh Pande |
4:5d91b0f5038c | 791 | if (*resource_temp->resource == 0) { |
Yogesh Pande |
4:5d91b0f5038c | 792 | /* Set error code */ |
Yogesh Pande |
4:5d91b0f5038c | 793 | *resource_temp->resource = (uint8_t)device_object_ptr->error_code; |
Yogesh Pande |
4:5d91b0f5038c | 794 | resource_temp->resourcelen = 1; |
Yogesh Pande |
4:5d91b0f5038c | 795 | |
Yogesh Pande |
4:5d91b0f5038c | 796 | sn_nsdl_update_resource(handle, resource_temp); |
Yogesh Pande |
4:5d91b0f5038c | 797 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 798 | } |
Yogesh Pande |
4:5d91b0f5038c | 799 | break; |
Yogesh Pande |
4:5d91b0f5038c | 800 | } |
Yogesh Pande |
4:5d91b0f5038c | 801 | |
Yogesh Pande |
4:5d91b0f5038c | 802 | if (path[7] == '9') { |
Yogesh Pande |
4:5d91b0f5038c | 803 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 804 | } |
Yogesh Pande |
4:5d91b0f5038c | 805 | |
Yogesh Pande |
4:5d91b0f5038c | 806 | path[7]++; |
Yogesh Pande |
4:5d91b0f5038c | 807 | resource_temp = sn_grs_search_resource(handle->grs, 8, path, SN_GRS_SEARCH_METHOD); |
Yogesh Pande |
4:5d91b0f5038c | 808 | } |
Yogesh Pande |
4:5d91b0f5038c | 809 | |
Yogesh Pande |
4:5d91b0f5038c | 810 | /* Create new resource for this error */ |
Yogesh Pande |
4:5d91b0f5038c | 811 | resource_temp = handle->sn_nsdl_alloc(sizeof(sn_nsdl_resource_info_s)); |
Yogesh Pande |
4:5d91b0f5038c | 812 | if (!resource_temp) { |
Yogesh Pande |
4:5d91b0f5038c | 813 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 814 | } |
Yogesh Pande |
4:5d91b0f5038c | 815 | |
Yogesh Pande |
4:5d91b0f5038c | 816 | memset(resource_temp, 0, sizeof(sn_nsdl_resource_info_s)); |
Yogesh Pande |
4:5d91b0f5038c | 817 | |
Yogesh Pande |
4:5d91b0f5038c | 818 | resource_temp->access = SN_GRS_GET_ALLOWED; |
Yogesh Pande |
4:5d91b0f5038c | 819 | resource_temp->mode = SN_GRS_DYNAMIC; |
Yogesh Pande |
4:5d91b0f5038c | 820 | |
Yogesh Pande |
4:5d91b0f5038c | 821 | resource_temp->path = path; |
Yogesh Pande |
4:5d91b0f5038c | 822 | resource_temp->pathlen = 8; |
Yogesh Pande |
4:5d91b0f5038c | 823 | |
Yogesh Pande |
4:5d91b0f5038c | 824 | resource_temp->resource = handle->sn_nsdl_alloc(1); |
Yogesh Pande |
4:5d91b0f5038c | 825 | if (!resource_temp->resource) { |
Yogesh Pande |
4:5d91b0f5038c | 826 | handle->sn_nsdl_free(resource_temp); |
Yogesh Pande |
4:5d91b0f5038c | 827 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 828 | } |
Yogesh Pande |
4:5d91b0f5038c | 829 | |
Yogesh Pande |
4:5d91b0f5038c | 830 | *resource_temp->resource = (uint8_t)device_object_ptr->error_code; |
Yogesh Pande |
4:5d91b0f5038c | 831 | resource_temp->resourcelen = 1; |
Yogesh Pande |
4:5d91b0f5038c | 832 | |
Yogesh Pande |
4:5d91b0f5038c | 833 | resource_temp->resource_parameters_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 834 | |
Yogesh Pande |
4:5d91b0f5038c | 835 | if (!resource_temp->resource_parameters_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 836 | handle->sn_nsdl_free(resource_temp->resource); |
Yogesh Pande |
4:5d91b0f5038c | 837 | handle->sn_nsdl_free(resource_temp); |
Yogesh Pande |
4:5d91b0f5038c | 838 | |
Yogesh Pande |
4:5d91b0f5038c | 839 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 840 | } |
Yogesh Pande |
4:5d91b0f5038c | 841 | |
Yogesh Pande |
4:5d91b0f5038c | 842 | memset(resource_temp->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 843 | |
Yogesh Pande |
4:5d91b0f5038c | 844 | sn_nsdl_create_resource(handle, resource_temp); |
Yogesh Pande |
4:5d91b0f5038c | 845 | |
Yogesh Pande |
4:5d91b0f5038c | 846 | handle->sn_nsdl_free(resource_temp->resource); |
Yogesh Pande |
4:5d91b0f5038c | 847 | handle->sn_nsdl_free(resource_temp->resource_parameters_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 848 | handle->sn_nsdl_free(resource_temp); |
Yogesh Pande |
4:5d91b0f5038c | 849 | |
Yogesh Pande |
4:5d91b0f5038c | 850 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 851 | #else |
Yogesh Pande |
4:5d91b0f5038c | 852 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 853 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 854 | } |
Yogesh Pande |
4:5d91b0f5038c | 855 | |
Yogesh Pande |
4:5d91b0f5038c | 856 | char *sn_nsdl_get_version(void) |
Yogesh Pande |
4:5d91b0f5038c | 857 | { |
Yogesh Pande |
4:5d91b0f5038c | 858 | #if defined(YOTTA_MBED_CLIENT_C_VERSION_STRING) |
Yogesh Pande |
4:5d91b0f5038c | 859 | return YOTTA_MBED_CLIENT_C_VERSION_STRING; |
Yogesh Pande |
4:5d91b0f5038c | 860 | #elif defined(VERSION) |
Yogesh Pande |
4:5d91b0f5038c | 861 | return VERSION; |
Yogesh Pande |
4:5d91b0f5038c | 862 | #else |
Yogesh Pande |
4:5d91b0f5038c | 863 | return "0.0.0"; |
Yogesh Pande |
4:5d91b0f5038c | 864 | #endif |
Yogesh Pande |
4:5d91b0f5038c | 865 | } |
Yogesh Pande |
4:5d91b0f5038c | 866 | |
Yogesh Pande |
4:5d91b0f5038c | 867 | |
Yogesh Pande |
4:5d91b0f5038c | 868 | int8_t sn_nsdl_process_coap(struct nsdl_s *handle, uint8_t *packet_ptr, uint16_t packet_len, sn_nsdl_addr_s *src_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 869 | { |
Yogesh Pande |
4:5d91b0f5038c | 870 | sn_coap_hdr_s *coap_packet_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 871 | sn_coap_hdr_s *coap_response_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 872 | |
Yogesh Pande |
4:5d91b0f5038c | 873 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 874 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 875 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 876 | } |
Yogesh Pande |
4:5d91b0f5038c | 877 | |
Yogesh Pande |
4:5d91b0f5038c | 878 | /* Parse CoAP packet */ |
Yogesh Pande |
4:5d91b0f5038c | 879 | coap_packet_ptr = sn_coap_protocol_parse(handle->grs->coap, src_ptr, packet_len, packet_ptr, (void *)handle); |
Yogesh Pande |
4:5d91b0f5038c | 880 | |
Yogesh Pande |
4:5d91b0f5038c | 881 | /* Check if parsing was successfull */ |
Yogesh Pande |
4:5d91b0f5038c | 882 | if (coap_packet_ptr == (sn_coap_hdr_s *)NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 883 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 884 | } |
Yogesh Pande |
4:5d91b0f5038c | 885 | |
Yogesh Pande |
4:5d91b0f5038c | 886 | /* Check, if coap itself sends response, or block receiving is ongoing... */ |
Yogesh Pande |
4:5d91b0f5038c | 887 | if (coap_packet_ptr->coap_status != COAP_STATUS_OK && coap_packet_ptr->coap_status != COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED) { |
Yogesh Pande |
4:5d91b0f5038c | 888 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 889 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 890 | } |
Yogesh Pande |
4:5d91b0f5038c | 891 | |
Yogesh Pande |
4:5d91b0f5038c | 892 | /* If proxy options added, return not supported */ |
Yogesh Pande |
4:5d91b0f5038c | 893 | if (coap_packet_ptr->options_list_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 894 | if (coap_packet_ptr->options_list_ptr->proxy_uri_len) { |
Yogesh Pande |
4:5d91b0f5038c | 895 | coap_response_ptr = sn_coap_build_response(handle->grs->coap, coap_packet_ptr, COAP_MSG_CODE_RESPONSE_PROXYING_NOT_SUPPORTED); |
Yogesh Pande |
4:5d91b0f5038c | 896 | if (coap_response_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 897 | sn_nsdl_send_coap_message(handle, src_ptr, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 898 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 899 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 900 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 901 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 902 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 903 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 904 | } |
Yogesh Pande |
4:5d91b0f5038c | 905 | } |
Yogesh Pande |
4:5d91b0f5038c | 906 | } |
Yogesh Pande |
4:5d91b0f5038c | 907 | |
Yogesh Pande |
4:5d91b0f5038c | 908 | /* * * * * * * * * * * * * * * * * * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 909 | /* If message is response message, call RX callback */ |
Yogesh Pande |
4:5d91b0f5038c | 910 | /* * * * * * * * * * * * * * * * * * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 911 | |
Yogesh Pande |
4:5d91b0f5038c | 912 | if ((coap_packet_ptr->msg_code > COAP_MSG_CODE_REQUEST_DELETE) || (coap_packet_ptr->msg_type == COAP_MSG_TYPE_ACKNOWLEDGEMENT)) { |
Yogesh Pande |
4:5d91b0f5038c | 913 | int8_t retval = sn_nsdl_local_rx_function(handle, coap_packet_ptr, src_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 914 | if (coap_packet_ptr->coap_status == COAP_STATUS_PARSER_BLOCKWISE_MSG_RECEIVED && coap_packet_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 915 | handle->sn_nsdl_free(coap_packet_ptr->payload_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 916 | coap_packet_ptr->payload_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 917 | } |
Yogesh Pande |
4:5d91b0f5038c | 918 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 919 | return retval; |
Yogesh Pande |
4:5d91b0f5038c | 920 | } |
Yogesh Pande |
4:5d91b0f5038c | 921 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 922 | /* * If OMA bootstrap message... * */ |
Yogesh Pande |
4:5d91b0f5038c | 923 | if (src_ptr && (handle->oma_bs_address_len == src_ptr->addr_len) && (handle->oma_bs_port == src_ptr->port) && !memcmp(handle->oma_bs_address_ptr, src_ptr->addr_ptr, handle->oma_bs_address_len)) { |
Yogesh Pande |
4:5d91b0f5038c | 924 | /* TLV message. Parse message and check status of the OMA bootstrap */ |
Yogesh Pande |
4:5d91b0f5038c | 925 | /* process. If ok, call cb function and return. Otherwise send error */ |
Yogesh Pande |
4:5d91b0f5038c | 926 | /* and return failure. */ |
Yogesh Pande |
4:5d91b0f5038c | 927 | |
Yogesh Pande |
4:5d91b0f5038c | 928 | if (coap_packet_ptr->content_type_len == 1) { //todo check message type |
Yogesh Pande |
4:5d91b0f5038c | 929 | if (*coap_packet_ptr->content_type_ptr == 99) { |
Yogesh Pande |
4:5d91b0f5038c | 930 | /* TLV parsing failed. Send response to get non-tlv messages */ |
Yogesh Pande |
4:5d91b0f5038c | 931 | if (sn_nsdl_process_oma_tlv(handle, coap_packet_ptr->payload_ptr, coap_packet_ptr->payload_len) == SN_NSDL_FAILURE) { |
Yogesh Pande |
4:5d91b0f5038c | 932 | coap_response_ptr = sn_coap_build_response(handle->grs->coap, coap_packet_ptr, COAP_MSG_CODE_RESPONSE_NOT_ACCEPTABLE); |
Yogesh Pande |
4:5d91b0f5038c | 933 | if (coap_response_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 934 | sn_nsdl_send_coap_message(handle, src_ptr, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 935 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 936 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 937 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 938 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 939 | } |
Yogesh Pande |
4:5d91b0f5038c | 940 | } |
Yogesh Pande |
4:5d91b0f5038c | 941 | /* Success TLV parsing */ |
Yogesh Pande |
4:5d91b0f5038c | 942 | else { |
Yogesh Pande |
4:5d91b0f5038c | 943 | coap_response_ptr = sn_coap_build_response(handle->grs->coap, coap_packet_ptr, COAP_MSG_CODE_RESPONSE_CREATED); |
Yogesh Pande |
4:5d91b0f5038c | 944 | if (coap_response_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 945 | sn_nsdl_send_coap_message(handle, src_ptr, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 946 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_response_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 947 | |
Yogesh Pande |
4:5d91b0f5038c | 948 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 949 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 950 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 951 | } |
Yogesh Pande |
4:5d91b0f5038c | 952 | sn_nsdl_check_oma_bs_status(handle); |
Yogesh Pande |
4:5d91b0f5038c | 953 | } |
Yogesh Pande |
4:5d91b0f5038c | 954 | |
Yogesh Pande |
4:5d91b0f5038c | 955 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 956 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 957 | } |
Yogesh Pande |
4:5d91b0f5038c | 958 | |
Yogesh Pande |
4:5d91b0f5038c | 959 | /* Non - TLV message */ |
Yogesh Pande |
4:5d91b0f5038c | 960 | else if (*coap_packet_ptr->content_type_ptr == 97) { |
Yogesh Pande |
4:5d91b0f5038c | 961 | sn_grs_process_coap(handle, coap_packet_ptr, src_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 962 | |
Yogesh Pande |
4:5d91b0f5038c | 963 | /* Todo: move this copying to sn_nsdl_check_oma_bs_status(), also from TLV parser */ |
Yogesh Pande |
4:5d91b0f5038c | 964 | /* Security mode */ |
Yogesh Pande |
4:5d91b0f5038c | 965 | if (*(coap_packet_ptr->uri_path_ptr + (coap_packet_ptr->uri_path_len - 1)) == '2') { |
Yogesh Pande |
4:5d91b0f5038c | 966 | handle->nsp_address_ptr->omalw_server_security = (omalw_server_security_t)sn_nsdl_atoi(coap_packet_ptr->payload_ptr, coap_packet_ptr->payload_len); |
Yogesh Pande |
4:5d91b0f5038c | 967 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 968 | } |
Yogesh Pande |
4:5d91b0f5038c | 969 | |
Yogesh Pande |
4:5d91b0f5038c | 970 | /* NSP address */ |
Yogesh Pande |
4:5d91b0f5038c | 971 | else if (*(coap_packet_ptr->uri_path_ptr + (coap_packet_ptr->uri_path_len - 1)) == '0') { |
Yogesh Pande |
4:5d91b0f5038c | 972 | sn_nsdl_resolve_lwm2m_address(handle, coap_packet_ptr->payload_ptr, coap_packet_ptr->payload_len); |
Yogesh Pande |
4:5d91b0f5038c | 973 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 974 | } |
Yogesh Pande |
4:5d91b0f5038c | 975 | |
Yogesh Pande |
4:5d91b0f5038c | 976 | sn_nsdl_check_oma_bs_status(handle); |
Yogesh Pande |
4:5d91b0f5038c | 977 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 978 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 979 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 980 | } |
Yogesh Pande |
4:5d91b0f5038c | 981 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 982 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, coap_packet_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 983 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 984 | } |
Yogesh Pande |
4:5d91b0f5038c | 985 | |
Yogesh Pande |
4:5d91b0f5038c | 986 | |
Yogesh Pande |
4:5d91b0f5038c | 987 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 988 | } |
Yogesh Pande |
4:5d91b0f5038c | 989 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 990 | |
Yogesh Pande |
4:5d91b0f5038c | 991 | /* * * * * * * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 992 | /* Other messages are for GRS */ |
Yogesh Pande |
4:5d91b0f5038c | 993 | /* * * * * * * * * * * * * * * */ |
Yogesh Pande |
4:5d91b0f5038c | 994 | |
Yogesh Pande |
4:5d91b0f5038c | 995 | return sn_grs_process_coap(handle, coap_packet_ptr, src_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 996 | } |
Yogesh Pande |
4:5d91b0f5038c | 997 | |
Yogesh Pande |
4:5d91b0f5038c | 998 | int8_t sn_nsdl_exec(struct nsdl_s *handle, uint32_t time) |
Yogesh Pande |
4:5d91b0f5038c | 999 | { |
Yogesh Pande |
4:5d91b0f5038c | 1000 | if(!handle || !handle->grs){ |
Yogesh Pande |
4:5d91b0f5038c | 1001 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1002 | } |
Yogesh Pande |
4:5d91b0f5038c | 1003 | /* Call CoAP execution function */ |
Yogesh Pande |
4:5d91b0f5038c | 1004 | return sn_coap_protocol_exec(handle->grs->coap, time); |
Yogesh Pande |
4:5d91b0f5038c | 1005 | } |
Yogesh Pande |
4:5d91b0f5038c | 1006 | |
Yogesh Pande |
4:5d91b0f5038c | 1007 | sn_nsdl_resource_info_s *sn_nsdl_get_resource(struct nsdl_s *handle, uint16_t pathlen, uint8_t *path_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1008 | { |
Yogesh Pande |
4:5d91b0f5038c | 1009 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 1010 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 1011 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 1012 | } |
Yogesh Pande |
4:5d91b0f5038c | 1013 | |
Yogesh Pande |
4:5d91b0f5038c | 1014 | return sn_grs_search_resource(handle->grs, pathlen, path_ptr, SN_GRS_SEARCH_METHOD); |
Yogesh Pande |
4:5d91b0f5038c | 1015 | } |
Yogesh Pande |
4:5d91b0f5038c | 1016 | |
Yogesh Pande |
4:5d91b0f5038c | 1017 | |
Yogesh Pande |
4:5d91b0f5038c | 1018 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1019 | * \fn static uint16_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description) |
Yogesh Pande |
4:5d91b0f5038c | 1020 | * |
Yogesh Pande |
4:5d91b0f5038c | 1021 | * |
Yogesh Pande |
4:5d91b0f5038c | 1022 | * \brief To send NSDL messages. Stores message id?s and message description to catch response from NSP server |
Yogesh Pande |
4:5d91b0f5038c | 1023 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1024 | * \param *coap_header_ptr Pointer to the CoAP message header to be sent |
Yogesh Pande |
4:5d91b0f5038c | 1025 | * \param *dst_addr_ptr Pointer to the address structure that contains destination address information |
Yogesh Pande |
4:5d91b0f5038c | 1026 | * \param message_description Message description to be stored to list for waiting response |
Yogesh Pande |
4:5d91b0f5038c | 1027 | * |
Yogesh Pande |
4:5d91b0f5038c | 1028 | * \return message id, 0 if failed |
Yogesh Pande |
4:5d91b0f5038c | 1029 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1030 | static uint16_t sn_nsdl_internal_coap_send(struct nsdl_s *handle, sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description) |
Yogesh Pande |
4:5d91b0f5038c | 1031 | { |
Yogesh Pande |
4:5d91b0f5038c | 1032 | uint8_t *coap_message_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 1033 | uint16_t coap_message_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1034 | |
Yogesh Pande |
4:5d91b0f5038c | 1035 | coap_message_len = sn_coap_builder_calc_needed_packet_data_size_2(coap_header_ptr, handle->grs->coap->sn_coap_block_data_size); |
Yogesh Pande |
4:5d91b0f5038c | 1036 | |
Yogesh Pande |
4:5d91b0f5038c | 1037 | if (coap_message_len == 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1038 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 1039 | } |
Yogesh Pande |
4:5d91b0f5038c | 1040 | |
Yogesh Pande |
4:5d91b0f5038c | 1041 | coap_message_ptr = handle->sn_nsdl_alloc(coap_message_len); |
Yogesh Pande |
4:5d91b0f5038c | 1042 | if (!coap_message_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1043 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 1044 | } |
Yogesh Pande |
4:5d91b0f5038c | 1045 | |
Yogesh Pande |
4:5d91b0f5038c | 1046 | /* Build message */ |
Yogesh Pande |
4:5d91b0f5038c | 1047 | if (sn_coap_protocol_build(handle->grs->coap, dst_addr_ptr, coap_message_ptr, coap_header_ptr, (void *)handle) < 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1048 | handle->sn_nsdl_free(coap_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1049 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 1050 | } |
Yogesh Pande |
4:5d91b0f5038c | 1051 | |
Yogesh Pande |
4:5d91b0f5038c | 1052 | /* If mesage type is confirmable, save it to list to wait for reply */ |
Yogesh Pande |
4:5d91b0f5038c | 1053 | if (coap_header_ptr->msg_type == COAP_MSG_TYPE_CONFIRMABLE) { |
Yogesh Pande |
4:5d91b0f5038c | 1054 | if (message_description == SN_NSDL_MSG_REGISTER) { |
Yogesh Pande |
4:5d91b0f5038c | 1055 | handle->register_msg_id = coap_header_ptr->msg_id; |
Yogesh Pande |
4:5d91b0f5038c | 1056 | } |
Yogesh Pande |
4:5d91b0f5038c | 1057 | if (message_description == SN_NSDL_MSG_UNREGISTER) { |
Yogesh Pande |
4:5d91b0f5038c | 1058 | handle->unregister_msg_id = coap_header_ptr->msg_id; |
Yogesh Pande |
4:5d91b0f5038c | 1059 | } |
Yogesh Pande |
4:5d91b0f5038c | 1060 | |
Yogesh Pande |
4:5d91b0f5038c | 1061 | } |
Yogesh Pande |
4:5d91b0f5038c | 1062 | |
Yogesh Pande |
4:5d91b0f5038c | 1063 | handle->sn_nsdl_tx_callback(handle, SN_NSDL_PROTOCOL_COAP, coap_message_ptr, coap_message_len, dst_addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1064 | handle->sn_nsdl_free(coap_message_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1065 | |
Yogesh Pande |
4:5d91b0f5038c | 1066 | return coap_header_ptr->msg_id; |
Yogesh Pande |
4:5d91b0f5038c | 1067 | } |
Yogesh Pande |
4:5d91b0f5038c | 1068 | |
Yogesh Pande |
4:5d91b0f5038c | 1069 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1070 | * \fn static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 1071 | * |
Yogesh Pande |
4:5d91b0f5038c | 1072 | * \brief Resolves NSP server address. |
Yogesh Pande |
4:5d91b0f5038c | 1073 | * |
Yogesh Pande |
4:5d91b0f5038c | 1074 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1075 | * \note Application must set NSP address with set_nsp_address |
Yogesh Pande |
4:5d91b0f5038c | 1076 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1077 | static void sn_nsdl_resolve_nsp_address(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 1078 | { |
Yogesh Pande |
4:5d91b0f5038c | 1079 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 1080 | if (!handle->nsp_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1081 | //allocate only if previously not allocated |
Yogesh Pande |
4:5d91b0f5038c | 1082 | handle->nsp_address_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_oma_server_info_t)); |
Yogesh Pande |
4:5d91b0f5038c | 1083 | } |
Yogesh Pande |
4:5d91b0f5038c | 1084 | |
Yogesh Pande |
4:5d91b0f5038c | 1085 | if (handle->nsp_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1086 | handle->nsp_address_ptr->omalw_server_security = SEC_NOT_SET; |
Yogesh Pande |
4:5d91b0f5038c | 1087 | handle->nsp_address_ptr->omalw_address_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_addr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 1088 | if (handle->nsp_address_ptr->omalw_address_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1089 | memset(handle->nsp_address_ptr->omalw_address_ptr, 0, sizeof(sn_nsdl_addr_s)); |
Yogesh Pande |
4:5d91b0f5038c | 1090 | handle->nsp_address_ptr->omalw_address_ptr->type = SN_NSDL_ADDRESS_TYPE_NONE; |
Yogesh Pande |
4:5d91b0f5038c | 1091 | } |
Yogesh Pande |
4:5d91b0f5038c | 1092 | } |
Yogesh Pande |
4:5d91b0f5038c | 1093 | } |
Yogesh Pande |
4:5d91b0f5038c | 1094 | |
Yogesh Pande |
4:5d91b0f5038c | 1095 | static int8_t sn_nsdl_create_oma_device_object_base(struct nsdl_s *handle, sn_nsdl_oma_device_t *oma_device_setup_ptr, sn_nsdl_oma_binding_and_mode_t binding_and_mode) |
Yogesh Pande |
4:5d91b0f5038c | 1096 | { |
Yogesh Pande |
4:5d91b0f5038c | 1097 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 1098 | sn_nsdl_resource_info_s new_resource; |
Yogesh Pande |
4:5d91b0f5038c | 1099 | uint8_t object_path[8] = "3/0/11/0"; |
Yogesh Pande |
4:5d91b0f5038c | 1100 | uint8_t resource_temp[3]; |
Yogesh Pande |
4:5d91b0f5038c | 1101 | uint8_t x = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1102 | |
Yogesh Pande |
4:5d91b0f5038c | 1103 | if (!oma_device_setup_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1104 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1105 | } |
Yogesh Pande |
4:5d91b0f5038c | 1106 | |
Yogesh Pande |
4:5d91b0f5038c | 1107 | /* * Create resources. * */ |
Yogesh Pande |
4:5d91b0f5038c | 1108 | |
Yogesh Pande |
4:5d91b0f5038c | 1109 | /* These resources can be created multiple times. */ |
Yogesh Pande |
4:5d91b0f5038c | 1110 | memset(&new_resource, 0, sizeof(sn_nsdl_resource_info_s)); |
Yogesh Pande |
4:5d91b0f5038c | 1111 | new_resource.resource_parameters_ptr = handle->sn_nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 1112 | if (!new_resource.resource_parameters_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1113 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1114 | } |
Yogesh Pande |
4:5d91b0f5038c | 1115 | |
Yogesh Pande |
4:5d91b0f5038c | 1116 | memset(new_resource.resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s)); |
Yogesh Pande |
4:5d91b0f5038c | 1117 | |
Yogesh Pande |
4:5d91b0f5038c | 1118 | /* Create error - resource */ |
Yogesh Pande |
4:5d91b0f5038c | 1119 | new_resource.mode = SN_GRS_STATIC; |
Yogesh Pande |
4:5d91b0f5038c | 1120 | new_resource.access = SN_GRS_GET_ALLOWED; |
Yogesh Pande |
4:5d91b0f5038c | 1121 | |
Yogesh Pande |
4:5d91b0f5038c | 1122 | new_resource.path = object_path; |
Yogesh Pande |
4:5d91b0f5038c | 1123 | new_resource.pathlen = 8; |
Yogesh Pande |
4:5d91b0f5038c | 1124 | |
Yogesh Pande |
4:5d91b0f5038c | 1125 | sn_nsdl_itoa(resource_temp, (uint8_t)oma_device_setup_ptr->error_code); |
Yogesh Pande |
4:5d91b0f5038c | 1126 | |
Yogesh Pande |
4:5d91b0f5038c | 1127 | new_resource.resource = resource_temp; |
Yogesh Pande |
4:5d91b0f5038c | 1128 | new_resource.resourcelen = 1; |
Yogesh Pande |
4:5d91b0f5038c | 1129 | |
Yogesh Pande |
4:5d91b0f5038c | 1130 | if (sn_nsdl_create_resource(handle, &new_resource) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 1131 | handle->sn_nsdl_free(new_resource.resource_parameters_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1132 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1133 | } |
Yogesh Pande |
4:5d91b0f5038c | 1134 | |
Yogesh Pande |
4:5d91b0f5038c | 1135 | /* These resources can be only once, during OMA bootstrap.. */ |
Yogesh Pande |
4:5d91b0f5038c | 1136 | /* Create supported binding and modes */ |
Yogesh Pande |
4:5d91b0f5038c | 1137 | object_path[5] = '6'; |
Yogesh Pande |
4:5d91b0f5038c | 1138 | new_resource.path = object_path; |
Yogesh Pande |
4:5d91b0f5038c | 1139 | new_resource.pathlen = 6; |
Yogesh Pande |
4:5d91b0f5038c | 1140 | |
Yogesh Pande |
4:5d91b0f5038c | 1141 | if (binding_and_mode & 0x01) { |
Yogesh Pande |
4:5d91b0f5038c | 1142 | resource_temp[x] = 'U'; |
Yogesh Pande |
4:5d91b0f5038c | 1143 | x++; |
Yogesh Pande |
4:5d91b0f5038c | 1144 | if (binding_and_mode & 0x02) { |
Yogesh Pande |
4:5d91b0f5038c | 1145 | resource_temp[x] = 'Q'; |
Yogesh Pande |
4:5d91b0f5038c | 1146 | x++; |
Yogesh Pande |
4:5d91b0f5038c | 1147 | } |
Yogesh Pande |
4:5d91b0f5038c | 1148 | } |
Yogesh Pande |
4:5d91b0f5038c | 1149 | if (binding_and_mode & 0x04) { |
Yogesh Pande |
4:5d91b0f5038c | 1150 | resource_temp[x] = 'S'; |
Yogesh Pande |
4:5d91b0f5038c | 1151 | x++; |
Yogesh Pande |
4:5d91b0f5038c | 1152 | if ((binding_and_mode & 0x02) && !(binding_and_mode & 0x01)) { |
Yogesh Pande |
4:5d91b0f5038c | 1153 | resource_temp[x] = 'Q'; |
Yogesh Pande |
4:5d91b0f5038c | 1154 | x++; |
Yogesh Pande |
4:5d91b0f5038c | 1155 | } |
Yogesh Pande |
4:5d91b0f5038c | 1156 | } |
Yogesh Pande |
4:5d91b0f5038c | 1157 | |
Yogesh Pande |
4:5d91b0f5038c | 1158 | new_resource.resourcelen = x; |
Yogesh Pande |
4:5d91b0f5038c | 1159 | |
Yogesh Pande |
4:5d91b0f5038c | 1160 | if (new_resource.resourcelen) { |
Yogesh Pande |
4:5d91b0f5038c | 1161 | new_resource.resource = resource_temp; |
Yogesh Pande |
4:5d91b0f5038c | 1162 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 1163 | new_resource.resource = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1164 | } |
Yogesh Pande |
4:5d91b0f5038c | 1165 | |
Yogesh Pande |
4:5d91b0f5038c | 1166 | |
Yogesh Pande |
4:5d91b0f5038c | 1167 | if (sn_nsdl_create_resource(handle, &new_resource) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 1168 | handle->sn_nsdl_free(new_resource.resource_parameters_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1169 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1170 | } |
Yogesh Pande |
4:5d91b0f5038c | 1171 | |
Yogesh Pande |
4:5d91b0f5038c | 1172 | |
Yogesh Pande |
4:5d91b0f5038c | 1173 | /* Create dynamic reboot object */ |
Yogesh Pande |
4:5d91b0f5038c | 1174 | new_resource.mode = SN_GRS_DYNAMIC; |
Yogesh Pande |
4:5d91b0f5038c | 1175 | |
Yogesh Pande |
4:5d91b0f5038c | 1176 | new_resource.access = SN_GRS_POST_ALLOWED; |
Yogesh Pande |
4:5d91b0f5038c | 1177 | |
Yogesh Pande |
4:5d91b0f5038c | 1178 | object_path[4] = '4'; |
Yogesh Pande |
4:5d91b0f5038c | 1179 | |
Yogesh Pande |
4:5d91b0f5038c | 1180 | new_resource.path = object_path; |
Yogesh Pande |
4:5d91b0f5038c | 1181 | new_resource.pathlen = 5; |
Yogesh Pande |
4:5d91b0f5038c | 1182 | |
Yogesh Pande |
4:5d91b0f5038c | 1183 | new_resource.resourcelen = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1184 | new_resource.resource = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1185 | |
Yogesh Pande |
4:5d91b0f5038c | 1186 | new_resource.sn_grs_dyn_res_callback = oma_device_setup_ptr->sn_oma_device_boot_callback; |
Yogesh Pande |
4:5d91b0f5038c | 1187 | |
Yogesh Pande |
4:5d91b0f5038c | 1188 | if (sn_nsdl_create_resource(handle, &new_resource) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 1189 | handle->sn_nsdl_free(new_resource.resource_parameters_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1190 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1191 | } |
Yogesh Pande |
4:5d91b0f5038c | 1192 | |
Yogesh Pande |
4:5d91b0f5038c | 1193 | handle->sn_nsdl_free(new_resource.resource_parameters_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1194 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1195 | #else |
Yogesh Pande |
4:5d91b0f5038c | 1196 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1197 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 1198 | } |
Yogesh Pande |
4:5d91b0f5038c | 1199 | |
Yogesh Pande |
4:5d91b0f5038c | 1200 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1201 | * \fn int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration) |
Yogesh Pande |
4:5d91b0f5038c | 1202 | * |
Yogesh Pande |
4:5d91b0f5038c | 1203 | * \brief To build GRS resources to registration message payload |
Yogesh Pande |
4:5d91b0f5038c | 1204 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1205 | * \param *message_ptr Pointer to CoAP message header |
Yogesh Pande |
4:5d91b0f5038c | 1206 | * |
Yogesh Pande |
4:5d91b0f5038c | 1207 | * \return SN_NSDL_SUCCESS = 0, Failed = -1 |
Yogesh Pande |
4:5d91b0f5038c | 1208 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1209 | int8_t sn_nsdl_build_registration_body(struct nsdl_s *handle, sn_coap_hdr_s *message_ptr, uint8_t updating_registeration) |
Yogesh Pande |
4:5d91b0f5038c | 1210 | { |
Yogesh Pande |
4:5d91b0f5038c | 1211 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 1212 | uint8_t *temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1213 | const sn_nsdl_resource_info_s *resource_temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1214 | |
Yogesh Pande |
4:5d91b0f5038c | 1215 | |
Yogesh Pande |
4:5d91b0f5038c | 1216 | /* Calculate needed memory and allocate */ |
Yogesh Pande |
4:5d91b0f5038c | 1217 | message_ptr->payload_len = sn_nsdl_calculate_registration_body_size(handle, updating_registeration); |
Yogesh Pande |
4:5d91b0f5038c | 1218 | |
Yogesh Pande |
4:5d91b0f5038c | 1219 | /* If no resources to be registered, return SN_NSDL_SUCCESS */ |
Yogesh Pande |
4:5d91b0f5038c | 1220 | if (!message_ptr->payload_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1221 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1222 | } |
Yogesh Pande |
4:5d91b0f5038c | 1223 | |
Yogesh Pande |
4:5d91b0f5038c | 1224 | message_ptr->payload_ptr = handle->sn_nsdl_alloc(message_ptr->payload_len); |
Yogesh Pande |
4:5d91b0f5038c | 1225 | if (!message_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1226 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1227 | } |
Yogesh Pande |
4:5d91b0f5038c | 1228 | |
Yogesh Pande |
4:5d91b0f5038c | 1229 | /* Build message */ |
Yogesh Pande |
4:5d91b0f5038c | 1230 | temp_ptr = message_ptr->payload_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1231 | |
Yogesh Pande |
4:5d91b0f5038c | 1232 | resource_temp_ptr = sn_grs_get_first_resource(handle->grs); |
Yogesh Pande |
4:5d91b0f5038c | 1233 | |
Yogesh Pande |
4:5d91b0f5038c | 1234 | /* Loop trough all resources */ |
Yogesh Pande |
4:5d91b0f5038c | 1235 | while (resource_temp_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1236 | /* if resource needs to be registered */ |
Yogesh Pande |
4:5d91b0f5038c | 1237 | if (resource_temp_ptr->resource_parameters_ptr && resource_temp_ptr->publish_uri) { |
Yogesh Pande |
4:5d91b0f5038c | 1238 | if (updating_registeration && resource_temp_ptr->resource_parameters_ptr->registered == SN_NDSL_RESOURCE_REGISTERED) { |
Yogesh Pande |
4:5d91b0f5038c | 1239 | resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1240 | continue; |
Yogesh Pande |
4:5d91b0f5038c | 1241 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 1242 | resource_temp_ptr->resource_parameters_ptr->registered = SN_NDSL_RESOURCE_REGISTERED; |
Yogesh Pande |
4:5d91b0f5038c | 1243 | } |
Yogesh Pande |
4:5d91b0f5038c | 1244 | |
Yogesh Pande |
4:5d91b0f5038c | 1245 | /* If not first resource, add '.' to separator */ |
Yogesh Pande |
4:5d91b0f5038c | 1246 | if (temp_ptr != message_ptr->payload_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1247 | *temp_ptr++ = ','; |
Yogesh Pande |
4:5d91b0f5038c | 1248 | } |
Yogesh Pande |
4:5d91b0f5038c | 1249 | |
Yogesh Pande |
4:5d91b0f5038c | 1250 | *temp_ptr++ = '<'; |
Yogesh Pande |
4:5d91b0f5038c | 1251 | *temp_ptr++ = '/'; |
Yogesh Pande |
4:5d91b0f5038c | 1252 | memcpy(temp_ptr, resource_temp_ptr->path, resource_temp_ptr->pathlen); |
Yogesh Pande |
4:5d91b0f5038c | 1253 | temp_ptr += resource_temp_ptr->pathlen; |
Yogesh Pande |
4:5d91b0f5038c | 1254 | *temp_ptr++ = '>'; |
Yogesh Pande |
4:5d91b0f5038c | 1255 | |
Yogesh Pande |
4:5d91b0f5038c | 1256 | /* Resource attributes */ |
Yogesh Pande |
4:5d91b0f5038c | 1257 | if (resource_temp_ptr->resource_parameters_ptr->resource_type_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1258 | *temp_ptr++ = ';'; |
Yogesh Pande |
4:5d91b0f5038c | 1259 | memcpy(temp_ptr, resource_type_parameter, RT_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 1260 | temp_ptr += RT_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1261 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1262 | memcpy(temp_ptr, resource_temp_ptr->resource_parameters_ptr->resource_type_ptr, resource_temp_ptr->resource_parameters_ptr->resource_type_len); |
Yogesh Pande |
4:5d91b0f5038c | 1263 | temp_ptr += resource_temp_ptr->resource_parameters_ptr->resource_type_len; |
Yogesh Pande |
4:5d91b0f5038c | 1264 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1265 | } |
Yogesh Pande |
4:5d91b0f5038c | 1266 | |
Yogesh Pande |
4:5d91b0f5038c | 1267 | if (resource_temp_ptr->resource_parameters_ptr->interface_description_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1268 | *temp_ptr++ = ';'; |
Yogesh Pande |
4:5d91b0f5038c | 1269 | memcpy(temp_ptr, if_description_parameter, IF_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 1270 | temp_ptr += IF_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1271 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1272 | memcpy(temp_ptr, resource_temp_ptr->resource_parameters_ptr->interface_description_ptr, resource_temp_ptr->resource_parameters_ptr->interface_description_len); |
Yogesh Pande |
4:5d91b0f5038c | 1273 | temp_ptr += resource_temp_ptr->resource_parameters_ptr->interface_description_len; |
Yogesh Pande |
4:5d91b0f5038c | 1274 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1275 | } |
Yogesh Pande |
4:5d91b0f5038c | 1276 | |
Yogesh Pande |
4:5d91b0f5038c | 1277 | if (resource_temp_ptr->resource_parameters_ptr->coap_content_type != 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1278 | *temp_ptr++ = ';'; |
Yogesh Pande |
4:5d91b0f5038c | 1279 | memcpy(temp_ptr, coap_con_type_parameter, COAP_CON_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 1280 | temp_ptr += COAP_CON_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1281 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1282 | temp_ptr = sn_nsdl_itoa(temp_ptr, resource_temp_ptr->resource_parameters_ptr->coap_content_type); |
Yogesh Pande |
4:5d91b0f5038c | 1283 | *temp_ptr++ = '"'; |
Yogesh Pande |
4:5d91b0f5038c | 1284 | } |
Yogesh Pande |
4:5d91b0f5038c | 1285 | |
Yogesh Pande |
4:5d91b0f5038c | 1286 | /* ;obs */ |
Yogesh Pande |
4:5d91b0f5038c | 1287 | // This needs to be re-visited and may be need an API for maganging obs value for different server implementation |
Yogesh Pande |
4:5d91b0f5038c | 1288 | #ifndef YOTTA_CFG_DISABLE_OBS_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 1289 | if (resource_temp_ptr->resource_parameters_ptr->observable) { |
Yogesh Pande |
4:5d91b0f5038c | 1290 | *temp_ptr++ = ';'; |
Yogesh Pande |
4:5d91b0f5038c | 1291 | memcpy(temp_ptr, obs_parameter, OBS_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 1292 | temp_ptr += OBS_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1293 | } |
Yogesh Pande |
4:5d91b0f5038c | 1294 | #endif |
Yogesh Pande |
4:5d91b0f5038c | 1295 | /* ;aobs;id= */ |
Yogesh Pande |
4:5d91b0f5038c | 1296 | /* todo: aosb not supported ATM */ |
Yogesh Pande |
4:5d91b0f5038c | 1297 | /* |
Yogesh Pande |
4:5d91b0f5038c | 1298 | if((resource_temp_ptr->resource_parameters_ptr->auto_obs_len > 0 && resource_temp_ptr->resource_parameters_ptr->auto_obs_len <= 8) && |
Yogesh Pande |
4:5d91b0f5038c | 1299 | resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1300 | { |
Yogesh Pande |
4:5d91b0f5038c | 1301 | uint8_t i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1302 | |
Yogesh Pande |
4:5d91b0f5038c | 1303 | *temp_ptr++ = ';'; |
Yogesh Pande |
4:5d91b0f5038c | 1304 | memcpy(temp_ptr, aobs_parameter, AOBS_PARAMETER_LEN); |
Yogesh Pande |
4:5d91b0f5038c | 1305 | temp_ptr += AOBS_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1306 | |
Yogesh Pande |
4:5d91b0f5038c | 1307 | while(i < resource_temp_ptr->resource_parameters_ptr->auto_obs_len) |
Yogesh Pande |
4:5d91b0f5038c | 1308 | { |
Yogesh Pande |
4:5d91b0f5038c | 1309 | temp_ptr = sn_nsdl_itoa(temp_ptr, *(resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr + i)); |
Yogesh Pande |
4:5d91b0f5038c | 1310 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1311 | } |
Yogesh Pande |
4:5d91b0f5038c | 1312 | } |
Yogesh Pande |
4:5d91b0f5038c | 1313 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1314 | |
Yogesh Pande |
4:5d91b0f5038c | 1315 | } |
Yogesh Pande |
4:5d91b0f5038c | 1316 | |
Yogesh Pande |
4:5d91b0f5038c | 1317 | resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1318 | } |
Yogesh Pande |
4:5d91b0f5038c | 1319 | |
Yogesh Pande |
4:5d91b0f5038c | 1320 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1321 | } |
Yogesh Pande |
4:5d91b0f5038c | 1322 | |
Yogesh Pande |
4:5d91b0f5038c | 1323 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1324 | * \fn static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration) |
Yogesh Pande |
4:5d91b0f5038c | 1325 | * |
Yogesh Pande |
4:5d91b0f5038c | 1326 | * |
Yogesh Pande |
4:5d91b0f5038c | 1327 | * \brief Calculates registration message payload size |
Yogesh Pande |
4:5d91b0f5038c | 1328 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1329 | * \param *grs_resources_list_ptr Pointer to list of GRS resources |
Yogesh Pande |
4:5d91b0f5038c | 1330 | * |
Yogesh Pande |
4:5d91b0f5038c | 1331 | * \return Needed payload size |
Yogesh Pande |
4:5d91b0f5038c | 1332 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1333 | static uint16_t sn_nsdl_calculate_registration_body_size(struct nsdl_s *handle, uint8_t updating_registeration) |
Yogesh Pande |
4:5d91b0f5038c | 1334 | { |
Yogesh Pande |
4:5d91b0f5038c | 1335 | /* Local variables */ |
Yogesh Pande |
4:5d91b0f5038c | 1336 | uint16_t return_value = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1337 | const sn_nsdl_resource_info_s *resource_temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1338 | |
Yogesh Pande |
4:5d91b0f5038c | 1339 | /* check pointer */ |
Yogesh Pande |
4:5d91b0f5038c | 1340 | |
Yogesh Pande |
4:5d91b0f5038c | 1341 | resource_temp_ptr = sn_grs_get_first_resource(handle->grs); |
Yogesh Pande |
4:5d91b0f5038c | 1342 | |
Yogesh Pande |
4:5d91b0f5038c | 1343 | while (resource_temp_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1344 | if (resource_temp_ptr->resource_parameters_ptr && resource_temp_ptr->publish_uri) { |
Yogesh Pande |
4:5d91b0f5038c | 1345 | if (updating_registeration && resource_temp_ptr->resource_parameters_ptr->registered == SN_NDSL_RESOURCE_REGISTERED) { |
Yogesh Pande |
4:5d91b0f5038c | 1346 | resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1347 | continue; |
Yogesh Pande |
4:5d91b0f5038c | 1348 | } |
Yogesh Pande |
4:5d91b0f5038c | 1349 | |
Yogesh Pande |
4:5d91b0f5038c | 1350 | /* If not first resource, then '.' will be added */ |
Yogesh Pande |
4:5d91b0f5038c | 1351 | if (return_value) { |
Yogesh Pande |
4:5d91b0f5038c | 1352 | return_value++; |
Yogesh Pande |
4:5d91b0f5038c | 1353 | } |
Yogesh Pande |
4:5d91b0f5038c | 1354 | |
Yogesh Pande |
4:5d91b0f5038c | 1355 | /* Count length for the resource path </path> */ |
Yogesh Pande |
4:5d91b0f5038c | 1356 | return_value += (3 + resource_temp_ptr->pathlen); |
Yogesh Pande |
4:5d91b0f5038c | 1357 | |
Yogesh Pande |
4:5d91b0f5038c | 1358 | /* Count lengths of the attributes */ |
Yogesh Pande |
4:5d91b0f5038c | 1359 | |
Yogesh Pande |
4:5d91b0f5038c | 1360 | /* Resource type parameter */ |
Yogesh Pande |
4:5d91b0f5038c | 1361 | if (resource_temp_ptr->resource_parameters_ptr->resource_type_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1362 | /* ;rt="restype" */ |
Yogesh Pande |
4:5d91b0f5038c | 1363 | return_value += (6 + resource_temp_ptr->resource_parameters_ptr->resource_type_len); |
Yogesh Pande |
4:5d91b0f5038c | 1364 | } |
Yogesh Pande |
4:5d91b0f5038c | 1365 | |
Yogesh Pande |
4:5d91b0f5038c | 1366 | /* Interface description parameter */ |
Yogesh Pande |
4:5d91b0f5038c | 1367 | if (resource_temp_ptr->resource_parameters_ptr->interface_description_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1368 | /* ;if="iftype" */ |
Yogesh Pande |
4:5d91b0f5038c | 1369 | return_value += (6 + resource_temp_ptr->resource_parameters_ptr->interface_description_len); |
Yogesh Pande |
4:5d91b0f5038c | 1370 | } |
Yogesh Pande |
4:5d91b0f5038c | 1371 | |
Yogesh Pande |
4:5d91b0f5038c | 1372 | if (resource_temp_ptr->resource_parameters_ptr->coap_content_type != 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1373 | /* ;if="content" */ |
Yogesh Pande |
4:5d91b0f5038c | 1374 | return_value += 6; // all but not content |
Yogesh Pande |
4:5d91b0f5038c | 1375 | return_value += sn_nsdl_itoa_len(resource_temp_ptr->resource_parameters_ptr->coap_content_type); |
Yogesh Pande |
4:5d91b0f5038c | 1376 | } |
Yogesh Pande |
4:5d91b0f5038c | 1377 | #ifndef YOTTA_CFG_DISABLE_OBS_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 1378 | // This needs to be re-visited and may be need an API for maganging obs value for different server implementation |
Yogesh Pande |
4:5d91b0f5038c | 1379 | if (resource_temp_ptr->resource_parameters_ptr->observable) { |
Yogesh Pande |
4:5d91b0f5038c | 1380 | return_value += 4; // ;obs |
Yogesh Pande |
4:5d91b0f5038c | 1381 | } |
Yogesh Pande |
4:5d91b0f5038c | 1382 | #endif |
Yogesh Pande |
4:5d91b0f5038c | 1383 | /*todo: aobs not supported ATM */ |
Yogesh Pande |
4:5d91b0f5038c | 1384 | /* |
Yogesh Pande |
4:5d91b0f5038c | 1385 | if((resource_temp_ptr->resource_parameters_ptr->auto_obs_len > 0 && resource_temp_ptr->resource_parameters_ptr->auto_obs_len <= 8) && |
Yogesh Pande |
4:5d91b0f5038c | 1386 | resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1387 | { |
Yogesh Pande |
4:5d91b0f5038c | 1388 | uint8_t i = resource_temp_ptr->resource_parameters_ptr->auto_obs_len; |
Yogesh Pande |
4:5d91b0f5038c | 1389 | // ;aobs;id= |
Yogesh Pande |
4:5d91b0f5038c | 1390 | return_value += 9; |
Yogesh Pande |
4:5d91b0f5038c | 1391 | while(i--) |
Yogesh Pande |
4:5d91b0f5038c | 1392 | { |
Yogesh Pande |
4:5d91b0f5038c | 1393 | return_value += sn_nsdl_itoa_len(*(resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr + i)); |
Yogesh Pande |
4:5d91b0f5038c | 1394 | } |
Yogesh Pande |
4:5d91b0f5038c | 1395 | } |
Yogesh Pande |
4:5d91b0f5038c | 1396 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1397 | |
Yogesh Pande |
4:5d91b0f5038c | 1398 | } |
Yogesh Pande |
4:5d91b0f5038c | 1399 | |
Yogesh Pande |
4:5d91b0f5038c | 1400 | resource_temp_ptr = sn_grs_get_next_resource(handle->grs, resource_temp_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1401 | |
Yogesh Pande |
4:5d91b0f5038c | 1402 | } |
Yogesh Pande |
4:5d91b0f5038c | 1403 | |
Yogesh Pande |
4:5d91b0f5038c | 1404 | return return_value; |
Yogesh Pande |
4:5d91b0f5038c | 1405 | } |
Yogesh Pande |
4:5d91b0f5038c | 1406 | |
Yogesh Pande |
4:5d91b0f5038c | 1407 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1408 | * \fn static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type) |
Yogesh Pande |
4:5d91b0f5038c | 1409 | * |
Yogesh Pande |
4:5d91b0f5038c | 1410 | * |
Yogesh Pande |
4:5d91b0f5038c | 1411 | * \brief Calculates needed uri query option length |
Yogesh Pande |
4:5d91b0f5038c | 1412 | * |
Yogesh Pande |
4:5d91b0f5038c | 1413 | * \param *endpoint_info_ptr Pointer to endpoint info structure |
Yogesh Pande |
4:5d91b0f5038c | 1414 | * \param msg_type Message type |
Yogesh Pande |
4:5d91b0f5038c | 1415 | * |
Yogesh Pande |
4:5d91b0f5038c | 1416 | * \return number of parameters in uri query |
Yogesh Pande |
4:5d91b0f5038c | 1417 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1418 | static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type) |
Yogesh Pande |
4:5d91b0f5038c | 1419 | { |
Yogesh Pande |
4:5d91b0f5038c | 1420 | uint8_t return_value = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1421 | uint8_t number_of_parameters = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1422 | |
Yogesh Pande |
4:5d91b0f5038c | 1423 | |
Yogesh Pande |
4:5d91b0f5038c | 1424 | if ((endpoint_info_ptr->endpoint_name_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && endpoint_info_ptr->endpoint_name_ptr != 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1425 | return_value += endpoint_info_ptr->endpoint_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 1426 | return_value += EP_NAME_PARAMETERS_LEN; //ep= |
Yogesh Pande |
4:5d91b0f5038c | 1427 | number_of_parameters++; |
Yogesh Pande |
4:5d91b0f5038c | 1428 | } |
Yogesh Pande |
4:5d91b0f5038c | 1429 | |
Yogesh Pande |
4:5d91b0f5038c | 1430 | if ((endpoint_info_ptr->type_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && (endpoint_info_ptr->type_ptr != 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 1431 | return_value += endpoint_info_ptr->type_len; |
Yogesh Pande |
4:5d91b0f5038c | 1432 | return_value += ET_PARAMETER_LEN; //et= |
Yogesh Pande |
4:5d91b0f5038c | 1433 | number_of_parameters++; |
Yogesh Pande |
4:5d91b0f5038c | 1434 | } |
Yogesh Pande |
4:5d91b0f5038c | 1435 | |
Yogesh Pande |
4:5d91b0f5038c | 1436 | if ((endpoint_info_ptr->lifetime_len != 0) && (endpoint_info_ptr->lifetime_ptr != 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 1437 | return_value += endpoint_info_ptr->lifetime_len; |
Yogesh Pande |
4:5d91b0f5038c | 1438 | return_value += LT_PARAMETER_LEN; //lt= |
Yogesh Pande |
4:5d91b0f5038c | 1439 | number_of_parameters++; |
Yogesh Pande |
4:5d91b0f5038c | 1440 | } |
Yogesh Pande |
4:5d91b0f5038c | 1441 | |
Yogesh Pande |
4:5d91b0f5038c | 1442 | if ((endpoint_info_ptr->domain_name_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && (endpoint_info_ptr->domain_name_ptr != 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 1443 | return_value += endpoint_info_ptr->domain_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 1444 | return_value += DOMAIN_PARAMETER_LEN; //d= |
Yogesh Pande |
4:5d91b0f5038c | 1445 | number_of_parameters++; |
Yogesh Pande |
4:5d91b0f5038c | 1446 | } |
Yogesh Pande |
4:5d91b0f5038c | 1447 | |
Yogesh Pande |
4:5d91b0f5038c | 1448 | if (((endpoint_info_ptr->binding_and_mode & 0x04) || (endpoint_info_ptr->binding_and_mode & 0x01)) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) { |
Yogesh Pande |
4:5d91b0f5038c | 1449 | return_value += BS_QUEUE_MODE_PARAMATER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1450 | |
Yogesh Pande |
4:5d91b0f5038c | 1451 | if (endpoint_info_ptr->binding_and_mode & 0x01) { |
Yogesh Pande |
4:5d91b0f5038c | 1452 | return_value++; |
Yogesh Pande |
4:5d91b0f5038c | 1453 | } |
Yogesh Pande |
4:5d91b0f5038c | 1454 | if (endpoint_info_ptr->binding_and_mode & 0x04) { |
Yogesh Pande |
4:5d91b0f5038c | 1455 | return_value++; |
Yogesh Pande |
4:5d91b0f5038c | 1456 | } |
Yogesh Pande |
4:5d91b0f5038c | 1457 | if ((endpoint_info_ptr->binding_and_mode & 0x02) && ((endpoint_info_ptr->binding_and_mode & 0x04) || (endpoint_info_ptr->binding_and_mode & 0x01))) { |
Yogesh Pande |
4:5d91b0f5038c | 1458 | return_value++; |
Yogesh Pande |
4:5d91b0f5038c | 1459 | } |
Yogesh Pande |
4:5d91b0f5038c | 1460 | |
Yogesh Pande |
4:5d91b0f5038c | 1461 | number_of_parameters++; |
Yogesh Pande |
4:5d91b0f5038c | 1462 | } |
Yogesh Pande |
4:5d91b0f5038c | 1463 | |
Yogesh Pande |
4:5d91b0f5038c | 1464 | if (number_of_parameters != 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1465 | return_value += (number_of_parameters - 1); |
Yogesh Pande |
4:5d91b0f5038c | 1466 | } |
Yogesh Pande |
4:5d91b0f5038c | 1467 | |
Yogesh Pande |
4:5d91b0f5038c | 1468 | return return_value; |
Yogesh Pande |
4:5d91b0f5038c | 1469 | } |
Yogesh Pande |
4:5d91b0f5038c | 1470 | |
Yogesh Pande |
4:5d91b0f5038c | 1471 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1472 | * \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) |
Yogesh Pande |
4:5d91b0f5038c | 1473 | * |
Yogesh Pande |
4:5d91b0f5038c | 1474 | * |
Yogesh Pande |
4:5d91b0f5038c | 1475 | * \brief Fills uri-query options to message header struct |
Yogesh Pande |
4:5d91b0f5038c | 1476 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1477 | * \param *parameter_ptr Pointer to endpoint parameters struct |
Yogesh Pande |
4:5d91b0f5038c | 1478 | * \param *source_msg_ptr Pointer to CoAP header struct |
Yogesh Pande |
4:5d91b0f5038c | 1479 | * \param msg_type Message type |
Yogesh Pande |
4:5d91b0f5038c | 1480 | * |
Yogesh Pande |
4:5d91b0f5038c | 1481 | * \return SN_NSDL_SUCCESS = 0, Failed = -1 |
Yogesh Pande |
4:5d91b0f5038c | 1482 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1483 | 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) |
Yogesh Pande |
4:5d91b0f5038c | 1484 | { |
Yogesh Pande |
4:5d91b0f5038c | 1485 | uint8_t *temp_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 1486 | if( !validateParameters(parameter_ptr) ){ |
Yogesh Pande |
4:5d91b0f5038c | 1487 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1488 | } |
Yogesh Pande |
4:5d91b0f5038c | 1489 | source_msg_ptr->options_list_ptr->uri_query_len = sn_nsdl_calculate_uri_query_option_len(parameter_ptr, msg_type); |
Yogesh Pande |
4:5d91b0f5038c | 1490 | if (source_msg_ptr->options_list_ptr->uri_query_len == 0) { |
Yogesh Pande |
4:5d91b0f5038c | 1491 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 1492 | } |
Yogesh Pande |
4:5d91b0f5038c | 1493 | |
Yogesh Pande |
4:5d91b0f5038c | 1494 | source_msg_ptr->options_list_ptr->uri_query_ptr = handle->sn_nsdl_alloc(source_msg_ptr->options_list_ptr->uri_query_len); |
Yogesh Pande |
4:5d91b0f5038c | 1495 | |
Yogesh Pande |
4:5d91b0f5038c | 1496 | if (source_msg_ptr->options_list_ptr->uri_query_ptr == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 1497 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1498 | } |
Yogesh Pande |
4:5d91b0f5038c | 1499 | memset(source_msg_ptr->options_list_ptr->uri_query_ptr,0,source_msg_ptr->options_list_ptr->uri_query_len); |
Yogesh Pande |
4:5d91b0f5038c | 1500 | |
Yogesh Pande |
4:5d91b0f5038c | 1501 | temp_ptr = source_msg_ptr->options_list_ptr->uri_query_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1502 | |
Yogesh Pande |
4:5d91b0f5038c | 1503 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1504 | /* If endpoint name is configured, fill needed fields */ |
Yogesh Pande |
4:5d91b0f5038c | 1505 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1506 | |
Yogesh Pande |
4:5d91b0f5038c | 1507 | if ((parameter_ptr->endpoint_name_len != 0) && (parameter_ptr->endpoint_name_ptr != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) { |
Yogesh Pande |
4:5d91b0f5038c | 1508 | /* fill endpoint name, first ?ep=, then endpoint name */ |
Yogesh Pande |
4:5d91b0f5038c | 1509 | memcpy(temp_ptr, ep_name_parameter_string, sizeof(ep_name_parameter_string)); |
Yogesh Pande |
4:5d91b0f5038c | 1510 | temp_ptr += EP_NAME_PARAMETERS_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1511 | memcpy(temp_ptr, parameter_ptr->endpoint_name_ptr, parameter_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1512 | temp_ptr += parameter_ptr->endpoint_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 1513 | } |
Yogesh Pande |
4:5d91b0f5038c | 1514 | |
Yogesh Pande |
4:5d91b0f5038c | 1515 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1516 | /* If endpoint type is configured, fill needed fields */ |
Yogesh Pande |
4:5d91b0f5038c | 1517 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1518 | |
Yogesh Pande |
4:5d91b0f5038c | 1519 | if ((parameter_ptr->type_len != 0) && (parameter_ptr->type_ptr != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) { |
Yogesh Pande |
4:5d91b0f5038c | 1520 | if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1521 | *temp_ptr++ = '&'; |
Yogesh Pande |
4:5d91b0f5038c | 1522 | } |
Yogesh Pande |
4:5d91b0f5038c | 1523 | |
Yogesh Pande |
4:5d91b0f5038c | 1524 | memcpy(temp_ptr, et_parameter, sizeof(et_parameter)); |
Yogesh Pande |
4:5d91b0f5038c | 1525 | temp_ptr += ET_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1526 | memcpy(temp_ptr, parameter_ptr->type_ptr, parameter_ptr->type_len); |
Yogesh Pande |
4:5d91b0f5038c | 1527 | temp_ptr += parameter_ptr->type_len; |
Yogesh Pande |
4:5d91b0f5038c | 1528 | } |
Yogesh Pande |
4:5d91b0f5038c | 1529 | |
Yogesh Pande |
4:5d91b0f5038c | 1530 | |
Yogesh Pande |
4:5d91b0f5038c | 1531 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1532 | /* If lifetime is configured, fill needed fields */ |
Yogesh Pande |
4:5d91b0f5038c | 1533 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1534 | |
Yogesh Pande |
4:5d91b0f5038c | 1535 | if ((parameter_ptr->lifetime_len != 0) && (parameter_ptr->lifetime_ptr != 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 1536 | if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1537 | *temp_ptr++ = '&'; |
Yogesh Pande |
4:5d91b0f5038c | 1538 | } |
Yogesh Pande |
4:5d91b0f5038c | 1539 | |
Yogesh Pande |
4:5d91b0f5038c | 1540 | memcpy(temp_ptr, ep_lifetime_parameter, sizeof(ep_lifetime_parameter)); |
Yogesh Pande |
4:5d91b0f5038c | 1541 | temp_ptr += LT_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1542 | memcpy(temp_ptr, parameter_ptr->lifetime_ptr, parameter_ptr->lifetime_len); |
Yogesh Pande |
4:5d91b0f5038c | 1543 | temp_ptr += parameter_ptr->lifetime_len; |
Yogesh Pande |
4:5d91b0f5038c | 1544 | } |
Yogesh Pande |
4:5d91b0f5038c | 1545 | |
Yogesh Pande |
4:5d91b0f5038c | 1546 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1547 | /* If domain is configured, fill needed fields */ |
Yogesh Pande |
4:5d91b0f5038c | 1548 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1549 | |
Yogesh Pande |
4:5d91b0f5038c | 1550 | if ((parameter_ptr->domain_name_len != 0) && (parameter_ptr->domain_name_ptr != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) { |
Yogesh Pande |
4:5d91b0f5038c | 1551 | if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1552 | *temp_ptr++ = '&'; |
Yogesh Pande |
4:5d91b0f5038c | 1553 | } |
Yogesh Pande |
4:5d91b0f5038c | 1554 | |
Yogesh Pande |
4:5d91b0f5038c | 1555 | memcpy(temp_ptr, ep_domain_parameter, sizeof(ep_domain_parameter)); |
Yogesh Pande |
4:5d91b0f5038c | 1556 | temp_ptr += DOMAIN_PARAMETER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1557 | memcpy(temp_ptr, parameter_ptr->domain_name_ptr, parameter_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1558 | temp_ptr += parameter_ptr->domain_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 1559 | } |
Yogesh Pande |
4:5d91b0f5038c | 1560 | |
Yogesh Pande |
4:5d91b0f5038c | 1561 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1562 | /* If queue-mode is configured, fill needed fields */ |
Yogesh Pande |
4:5d91b0f5038c | 1563 | /******************************************************/ |
Yogesh Pande |
4:5d91b0f5038c | 1564 | |
Yogesh Pande |
4:5d91b0f5038c | 1565 | if (((parameter_ptr->binding_and_mode & 0x01) || (parameter_ptr->binding_and_mode & 0x04)) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE)) { |
Yogesh Pande |
4:5d91b0f5038c | 1566 | if (temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1567 | *temp_ptr++ = '&'; |
Yogesh Pande |
4:5d91b0f5038c | 1568 | } |
Yogesh Pande |
4:5d91b0f5038c | 1569 | |
Yogesh Pande |
4:5d91b0f5038c | 1570 | memcpy(temp_ptr, bs_queue_mode, sizeof(bs_queue_mode)); |
Yogesh Pande |
4:5d91b0f5038c | 1571 | temp_ptr += BS_QUEUE_MODE_PARAMATER_LEN; |
Yogesh Pande |
4:5d91b0f5038c | 1572 | |
Yogesh Pande |
4:5d91b0f5038c | 1573 | if (parameter_ptr->binding_and_mode & 0x01) { |
Yogesh Pande |
4:5d91b0f5038c | 1574 | *temp_ptr++ = 'U'; |
Yogesh Pande |
4:5d91b0f5038c | 1575 | if (parameter_ptr->binding_and_mode & 0x02) { |
Yogesh Pande |
4:5d91b0f5038c | 1576 | *temp_ptr++ = 'Q'; |
Yogesh Pande |
4:5d91b0f5038c | 1577 | } |
Yogesh Pande |
4:5d91b0f5038c | 1578 | } |
Yogesh Pande |
4:5d91b0f5038c | 1579 | |
Yogesh Pande |
4:5d91b0f5038c | 1580 | if (parameter_ptr->binding_and_mode & 0x04) { |
Yogesh Pande |
4:5d91b0f5038c | 1581 | *temp_ptr++ = 'S'; |
Yogesh Pande |
4:5d91b0f5038c | 1582 | if ((parameter_ptr->binding_and_mode & 0x02) && !(parameter_ptr->binding_and_mode & 0x01)) { |
Yogesh Pande |
4:5d91b0f5038c | 1583 | *temp_ptr++ = 'Q'; |
Yogesh Pande |
4:5d91b0f5038c | 1584 | } |
Yogesh Pande |
4:5d91b0f5038c | 1585 | } |
Yogesh Pande |
4:5d91b0f5038c | 1586 | } |
Yogesh Pande |
4:5d91b0f5038c | 1587 | |
Yogesh Pande |
4:5d91b0f5038c | 1588 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1589 | } |
Yogesh Pande |
4:5d91b0f5038c | 1590 | |
Yogesh Pande |
4:5d91b0f5038c | 1591 | static bool validateParameters(sn_nsdl_ep_parameters_s *parameter_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1592 | { |
Yogesh Pande |
4:5d91b0f5038c | 1593 | if( !validate( parameter_ptr->domain_name_ptr, parameter_ptr->domain_name_len, '&' ) ){ |
Yogesh Pande |
4:5d91b0f5038c | 1594 | return false; |
Yogesh Pande |
4:5d91b0f5038c | 1595 | } |
Yogesh Pande |
4:5d91b0f5038c | 1596 | |
Yogesh Pande |
4:5d91b0f5038c | 1597 | if( !validate( parameter_ptr->endpoint_name_ptr, parameter_ptr->endpoint_name_len, '&' ) ){ |
Yogesh Pande |
4:5d91b0f5038c | 1598 | return false; |
Yogesh Pande |
4:5d91b0f5038c | 1599 | } |
Yogesh Pande |
4:5d91b0f5038c | 1600 | |
Yogesh Pande |
4:5d91b0f5038c | 1601 | if( !validate( parameter_ptr->lifetime_ptr, parameter_ptr->lifetime_len, '&' ) ){ |
Yogesh Pande |
4:5d91b0f5038c | 1602 | return false; |
Yogesh Pande |
4:5d91b0f5038c | 1603 | } |
Yogesh Pande |
4:5d91b0f5038c | 1604 | |
Yogesh Pande |
4:5d91b0f5038c | 1605 | if( !validate( parameter_ptr->type_ptr, parameter_ptr->type_len, '&' ) ){ |
Yogesh Pande |
4:5d91b0f5038c | 1606 | return false; |
Yogesh Pande |
4:5d91b0f5038c | 1607 | } |
Yogesh Pande |
4:5d91b0f5038c | 1608 | return true; |
Yogesh Pande |
4:5d91b0f5038c | 1609 | } |
Yogesh Pande |
4:5d91b0f5038c | 1610 | |
Yogesh Pande |
4:5d91b0f5038c | 1611 | static bool validate(uint8_t* ptr, uint32_t len, char illegalChar) |
Yogesh Pande |
4:5d91b0f5038c | 1612 | { |
Yogesh Pande |
4:5d91b0f5038c | 1613 | if( ptr ){ |
Yogesh Pande |
4:5d91b0f5038c | 1614 | for( uint32_t i=0; i < len; i++ ){ |
Yogesh Pande |
4:5d91b0f5038c | 1615 | if( ptr[i] == illegalChar ){ |
Yogesh Pande |
4:5d91b0f5038c | 1616 | return false; |
Yogesh Pande |
4:5d91b0f5038c | 1617 | } |
Yogesh Pande |
4:5d91b0f5038c | 1618 | } |
Yogesh Pande |
4:5d91b0f5038c | 1619 | } |
Yogesh Pande |
4:5d91b0f5038c | 1620 | return true; |
Yogesh Pande |
4:5d91b0f5038c | 1621 | } |
Yogesh Pande |
4:5d91b0f5038c | 1622 | |
Yogesh Pande |
4:5d91b0f5038c | 1623 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1624 | * \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) |
Yogesh Pande |
4:5d91b0f5038c | 1625 | * |
Yogesh Pande |
4:5d91b0f5038c | 1626 | * \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. |
Yogesh Pande |
4:5d91b0f5038c | 1627 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1628 | * \param *coap_packet_ptr Pointer to received CoAP packet |
Yogesh Pande |
4:5d91b0f5038c | 1629 | * \param *address_ptr Pointer to source address struct |
Yogesh Pande |
4:5d91b0f5038c | 1630 | * |
Yogesh Pande |
4:5d91b0f5038c | 1631 | * \return SN_NSDL_SUCCESS = 0, Failed = -1 |
Yogesh Pande |
4:5d91b0f5038c | 1632 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1633 | 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) |
Yogesh Pande |
4:5d91b0f5038c | 1634 | { |
Yogesh Pande |
4:5d91b0f5038c | 1635 | if ((coap_packet_ptr == 0) || (address_ptr == 0)) { |
Yogesh Pande |
4:5d91b0f5038c | 1636 | return -1; |
Yogesh Pande |
4:5d91b0f5038c | 1637 | } |
Yogesh Pande |
4:5d91b0f5038c | 1638 | |
Yogesh Pande |
4:5d91b0f5038c | 1639 | if (coap_packet_ptr->msg_id == handle->register_msg_id) { |
Yogesh Pande |
4:5d91b0f5038c | 1640 | if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_CREATED) { |
Yogesh Pande |
4:5d91b0f5038c | 1641 | handle->sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_IS_REGISTERED; |
Yogesh Pande |
4:5d91b0f5038c | 1642 | sn_grs_mark_resources_as_registered(handle); |
Yogesh Pande |
4:5d91b0f5038c | 1643 | if (sn_nsdl_resolve_ep_information(handle, coap_packet_ptr) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 1644 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1645 | } |
Yogesh Pande |
4:5d91b0f5038c | 1646 | |
Yogesh Pande |
4:5d91b0f5038c | 1647 | handle->register_msg_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1648 | } |
Yogesh Pande |
4:5d91b0f5038c | 1649 | } |
Yogesh Pande |
4:5d91b0f5038c | 1650 | |
Yogesh Pande |
4:5d91b0f5038c | 1651 | if (coap_packet_ptr->msg_id == handle->unregister_msg_id) { |
Yogesh Pande |
4:5d91b0f5038c | 1652 | if (coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_DELETED) { |
Yogesh Pande |
4:5d91b0f5038c | 1653 | if (handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1654 | handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1655 | handle->ep_information_ptr->endpoint_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1656 | handle->ep_information_ptr->endpoint_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1657 | } |
Yogesh Pande |
4:5d91b0f5038c | 1658 | if (handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1659 | handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1660 | handle->ep_information_ptr->domain_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1661 | handle->ep_information_ptr->domain_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1662 | } |
Yogesh Pande |
4:5d91b0f5038c | 1663 | |
Yogesh Pande |
4:5d91b0f5038c | 1664 | handle->unregister_msg_id = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1665 | } |
Yogesh Pande |
4:5d91b0f5038c | 1666 | } |
Yogesh Pande |
4:5d91b0f5038c | 1667 | |
Yogesh Pande |
4:5d91b0f5038c | 1668 | /* No messages to wait for, or message was not response to our request */ |
Yogesh Pande |
4:5d91b0f5038c | 1669 | return handle->sn_nsdl_rx_callback(handle, coap_packet_ptr, address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1670 | } |
Yogesh Pande |
4:5d91b0f5038c | 1671 | |
Yogesh Pande |
4:5d91b0f5038c | 1672 | /** |
Yogesh Pande |
4:5d91b0f5038c | 1673 | * \fn static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1674 | * |
Yogesh Pande |
4:5d91b0f5038c | 1675 | * |
Yogesh Pande |
4:5d91b0f5038c | 1676 | * \brief Resolves endpoint information from received CoAP message |
Yogesh Pande |
4:5d91b0f5038c | 1677 | * \param *handle Pointer to nsdl-library handle |
Yogesh Pande |
4:5d91b0f5038c | 1678 | * \param *coap_packet_ptr Pointer to received CoAP message |
Yogesh Pande |
4:5d91b0f5038c | 1679 | * |
Yogesh Pande |
4:5d91b0f5038c | 1680 | * \return SN_NSDL_SUCCESS = 0, Failed = -1 |
Yogesh Pande |
4:5d91b0f5038c | 1681 | */ |
Yogesh Pande |
4:5d91b0f5038c | 1682 | static int8_t sn_nsdl_resolve_ep_information(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 1683 | { |
Yogesh Pande |
4:5d91b0f5038c | 1684 | uint8_t *temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1685 | uint8_t parameter_count = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1686 | uint16_t parameter_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1687 | |
Yogesh Pande |
4:5d91b0f5038c | 1688 | if (!coap_packet_ptr || !coap_packet_ptr->options_list_ptr || |
Yogesh Pande |
4:5d91b0f5038c | 1689 | !coap_packet_ptr->options_list_ptr->location_path_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1690 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1691 | } |
Yogesh Pande |
4:5d91b0f5038c | 1692 | |
Yogesh Pande |
4:5d91b0f5038c | 1693 | temp_ptr = coap_packet_ptr->options_list_ptr->location_path_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 1694 | |
Yogesh Pande |
4:5d91b0f5038c | 1695 | while (temp_ptr <= (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len)) { |
Yogesh Pande |
4:5d91b0f5038c | 1696 | |
Yogesh Pande |
4:5d91b0f5038c | 1697 | if ((temp_ptr == (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len)) || (*temp_ptr == '/')) { |
Yogesh Pande |
4:5d91b0f5038c | 1698 | |
Yogesh Pande |
4:5d91b0f5038c | 1699 | parameter_count++; |
Yogesh Pande |
4:5d91b0f5038c | 1700 | if (parameter_count == 2) { |
Yogesh Pande |
4:5d91b0f5038c | 1701 | if (!handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1702 | handle->ep_information_ptr->domain_name_len = parameter_len - 1; |
Yogesh Pande |
4:5d91b0f5038c | 1703 | handle->ep_information_ptr->domain_name_ptr = handle->sn_nsdl_alloc(handle->ep_information_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1704 | if (!handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1705 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1706 | } |
Yogesh Pande |
4:5d91b0f5038c | 1707 | memcpy(handle->ep_information_ptr->domain_name_ptr, temp_ptr - handle->ep_information_ptr->domain_name_len, handle->ep_information_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1708 | } |
Yogesh Pande |
4:5d91b0f5038c | 1709 | |
Yogesh Pande |
4:5d91b0f5038c | 1710 | } |
Yogesh Pande |
4:5d91b0f5038c | 1711 | if (parameter_count == 3) { |
Yogesh Pande |
4:5d91b0f5038c | 1712 | if (!handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1713 | handle->ep_information_ptr->endpoint_name_len = parameter_len - 1; |
Yogesh Pande |
4:5d91b0f5038c | 1714 | handle->ep_information_ptr->endpoint_name_ptr = handle->sn_nsdl_alloc(handle->ep_information_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1715 | if (!handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1716 | if (handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1717 | handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1718 | handle->ep_information_ptr->domain_name_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 1719 | handle->ep_information_ptr->domain_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1720 | } |
Yogesh Pande |
4:5d91b0f5038c | 1721 | |
Yogesh Pande |
4:5d91b0f5038c | 1722 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1723 | |
Yogesh Pande |
4:5d91b0f5038c | 1724 | } |
Yogesh Pande |
4:5d91b0f5038c | 1725 | memcpy(handle->ep_information_ptr->endpoint_name_ptr, temp_ptr - handle->ep_information_ptr->endpoint_name_len, handle->ep_information_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 1726 | } |
Yogesh Pande |
4:5d91b0f5038c | 1727 | } |
Yogesh Pande |
4:5d91b0f5038c | 1728 | parameter_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1729 | } |
Yogesh Pande |
4:5d91b0f5038c | 1730 | parameter_len++; |
Yogesh Pande |
4:5d91b0f5038c | 1731 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1732 | } |
Yogesh Pande |
4:5d91b0f5038c | 1733 | |
Yogesh Pande |
4:5d91b0f5038c | 1734 | |
Yogesh Pande |
4:5d91b0f5038c | 1735 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1736 | } |
Yogesh Pande |
4:5d91b0f5038c | 1737 | |
Yogesh Pande |
4:5d91b0f5038c | 1738 | int8_t set_NSP_address(struct nsdl_s *handle, uint8_t *NSP_address, uint16_t port, sn_nsdl_addr_type_e address_type) |
Yogesh Pande |
4:5d91b0f5038c | 1739 | { |
Yogesh Pande |
4:5d91b0f5038c | 1740 | |
Yogesh Pande |
4:5d91b0f5038c | 1741 | /* Check parameters and source pointers */ |
Yogesh Pande |
4:5d91b0f5038c | 1742 | if (!handle || !handle->nsp_address_ptr || !handle->nsp_address_ptr->omalw_address_ptr || !NSP_address) { |
Yogesh Pande |
4:5d91b0f5038c | 1743 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1744 | } |
Yogesh Pande |
4:5d91b0f5038c | 1745 | |
Yogesh Pande |
4:5d91b0f5038c | 1746 | handle->nsp_address_ptr->omalw_address_ptr->type = address_type; |
Yogesh Pande |
4:5d91b0f5038c | 1747 | handle->nsp_address_ptr->omalw_server_security = SEC_NOT_SET; |
Yogesh Pande |
4:5d91b0f5038c | 1748 | |
Yogesh Pande |
4:5d91b0f5038c | 1749 | if (address_type == SN_NSDL_ADDRESS_TYPE_IPV4) { |
Yogesh Pande |
4:5d91b0f5038c | 1750 | if (handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1751 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1752 | } |
Yogesh Pande |
4:5d91b0f5038c | 1753 | |
Yogesh Pande |
4:5d91b0f5038c | 1754 | handle->nsp_address_ptr->omalw_address_ptr->addr_len = 4; |
Yogesh Pande |
4:5d91b0f5038c | 1755 | |
Yogesh Pande |
4:5d91b0f5038c | 1756 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = handle->sn_nsdl_alloc(handle->nsp_address_ptr->omalw_address_ptr->addr_len); |
Yogesh Pande |
4:5d91b0f5038c | 1757 | if (!handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1758 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1759 | } |
Yogesh Pande |
4:5d91b0f5038c | 1760 | |
Yogesh Pande |
4:5d91b0f5038c | 1761 | memcpy(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr, NSP_address, handle->nsp_address_ptr->omalw_address_ptr->addr_len); |
Yogesh Pande |
4:5d91b0f5038c | 1762 | handle->nsp_address_ptr->omalw_address_ptr->port = port; |
Yogesh Pande |
4:5d91b0f5038c | 1763 | } |
Yogesh Pande |
4:5d91b0f5038c | 1764 | |
Yogesh Pande |
4:5d91b0f5038c | 1765 | else if (address_type == SN_NSDL_ADDRESS_TYPE_IPV6) { |
Yogesh Pande |
4:5d91b0f5038c | 1766 | if (handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1767 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1768 | } |
Yogesh Pande |
4:5d91b0f5038c | 1769 | |
Yogesh Pande |
4:5d91b0f5038c | 1770 | handle->nsp_address_ptr->omalw_address_ptr->addr_len = 16; |
Yogesh Pande |
4:5d91b0f5038c | 1771 | |
Yogesh Pande |
4:5d91b0f5038c | 1772 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = handle->sn_nsdl_alloc(handle->nsp_address_ptr->omalw_address_ptr->addr_len); |
Yogesh Pande |
4:5d91b0f5038c | 1773 | if (!handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1774 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1775 | } |
Yogesh Pande |
4:5d91b0f5038c | 1776 | |
Yogesh Pande |
4:5d91b0f5038c | 1777 | memcpy(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr, NSP_address, handle->nsp_address_ptr->omalw_address_ptr->addr_len); |
Yogesh Pande |
4:5d91b0f5038c | 1778 | handle->nsp_address_ptr->omalw_address_ptr->port = port; |
Yogesh Pande |
4:5d91b0f5038c | 1779 | } |
Yogesh Pande |
4:5d91b0f5038c | 1780 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 1781 | } |
Yogesh Pande |
4:5d91b0f5038c | 1782 | |
Yogesh Pande |
4:5d91b0f5038c | 1783 | |
Yogesh Pande |
4:5d91b0f5038c | 1784 | static uint8_t sn_nsdl_itoa_len(uint8_t value) |
Yogesh Pande |
4:5d91b0f5038c | 1785 | { |
Yogesh Pande |
4:5d91b0f5038c | 1786 | uint8_t i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1787 | |
Yogesh Pande |
4:5d91b0f5038c | 1788 | do { |
Yogesh Pande |
4:5d91b0f5038c | 1789 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1790 | } while ((value /= 10) > 0); |
Yogesh Pande |
4:5d91b0f5038c | 1791 | |
Yogesh Pande |
4:5d91b0f5038c | 1792 | return i; |
Yogesh Pande |
4:5d91b0f5038c | 1793 | } |
Yogesh Pande |
4:5d91b0f5038c | 1794 | |
Yogesh Pande |
4:5d91b0f5038c | 1795 | static uint8_t *sn_nsdl_itoa(uint8_t *ptr, uint8_t value) |
Yogesh Pande |
4:5d91b0f5038c | 1796 | { |
Yogesh Pande |
4:5d91b0f5038c | 1797 | |
Yogesh Pande |
4:5d91b0f5038c | 1798 | uint8_t start = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1799 | uint8_t end = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1800 | uint8_t i; |
Yogesh Pande |
4:5d91b0f5038c | 1801 | |
Yogesh Pande |
4:5d91b0f5038c | 1802 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1803 | |
Yogesh Pande |
4:5d91b0f5038c | 1804 | /* ITOA */ |
Yogesh Pande |
4:5d91b0f5038c | 1805 | do { |
Yogesh Pande |
4:5d91b0f5038c | 1806 | ptr[i++] = (value % 10) + '0'; |
Yogesh Pande |
4:5d91b0f5038c | 1807 | } while ((value /= 10) > 0); |
Yogesh Pande |
4:5d91b0f5038c | 1808 | |
Yogesh Pande |
4:5d91b0f5038c | 1809 | end = i - 1; |
Yogesh Pande |
4:5d91b0f5038c | 1810 | |
Yogesh Pande |
4:5d91b0f5038c | 1811 | /* reverse (part of ITOA) */ |
Yogesh Pande |
4:5d91b0f5038c | 1812 | while (start < end) { |
Yogesh Pande |
4:5d91b0f5038c | 1813 | uint8_t chr; |
Yogesh Pande |
4:5d91b0f5038c | 1814 | |
Yogesh Pande |
4:5d91b0f5038c | 1815 | chr = ptr[start]; |
Yogesh Pande |
4:5d91b0f5038c | 1816 | ptr[start] = ptr[end]; |
Yogesh Pande |
4:5d91b0f5038c | 1817 | ptr[end] = chr; |
Yogesh Pande |
4:5d91b0f5038c | 1818 | |
Yogesh Pande |
4:5d91b0f5038c | 1819 | start++; |
Yogesh Pande |
4:5d91b0f5038c | 1820 | end--; |
Yogesh Pande |
4:5d91b0f5038c | 1821 | |
Yogesh Pande |
4:5d91b0f5038c | 1822 | } |
Yogesh Pande |
4:5d91b0f5038c | 1823 | return (ptr + i); |
Yogesh Pande |
4:5d91b0f5038c | 1824 | } |
Yogesh Pande |
4:5d91b0f5038c | 1825 | |
Yogesh Pande |
4:5d91b0f5038c | 1826 | static int32_t sn_nsdl_atoi(uint8_t *ptr, uint8_t len) |
Yogesh Pande |
4:5d91b0f5038c | 1827 | { |
Yogesh Pande |
4:5d91b0f5038c | 1828 | |
Yogesh Pande |
4:5d91b0f5038c | 1829 | int32_t result = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1830 | |
Yogesh Pande |
4:5d91b0f5038c | 1831 | while (len--) { |
Yogesh Pande |
4:5d91b0f5038c | 1832 | |
Yogesh Pande |
4:5d91b0f5038c | 1833 | if (result) { |
Yogesh Pande |
4:5d91b0f5038c | 1834 | result *= 10; |
Yogesh Pande |
4:5d91b0f5038c | 1835 | } |
Yogesh Pande |
4:5d91b0f5038c | 1836 | |
Yogesh Pande |
4:5d91b0f5038c | 1837 | if (*ptr >= '0' && *ptr <= '9') { |
Yogesh Pande |
4:5d91b0f5038c | 1838 | result += *ptr - '0'; |
Yogesh Pande |
4:5d91b0f5038c | 1839 | } else{ |
Yogesh Pande |
4:5d91b0f5038c | 1840 | return -1; |
Yogesh Pande |
4:5d91b0f5038c | 1841 | } |
Yogesh Pande |
4:5d91b0f5038c | 1842 | |
Yogesh Pande |
4:5d91b0f5038c | 1843 | ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1844 | |
Yogesh Pande |
4:5d91b0f5038c | 1845 | } |
Yogesh Pande |
4:5d91b0f5038c | 1846 | return result; |
Yogesh Pande |
4:5d91b0f5038c | 1847 | |
Yogesh Pande |
4:5d91b0f5038c | 1848 | } |
Yogesh Pande |
4:5d91b0f5038c | 1849 | |
Yogesh Pande |
4:5d91b0f5038c | 1850 | static uint32_t sn_nsdl_ahextoi(uint8_t *ptr, uint8_t len) |
Yogesh Pande |
4:5d91b0f5038c | 1851 | { |
Yogesh Pande |
4:5d91b0f5038c | 1852 | |
Yogesh Pande |
4:5d91b0f5038c | 1853 | uint32_t result = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1854 | |
Yogesh Pande |
4:5d91b0f5038c | 1855 | while (len--) { |
Yogesh Pande |
4:5d91b0f5038c | 1856 | |
Yogesh Pande |
4:5d91b0f5038c | 1857 | if (result) { |
Yogesh Pande |
4:5d91b0f5038c | 1858 | result *= 16; |
Yogesh Pande |
4:5d91b0f5038c | 1859 | } |
Yogesh Pande |
4:5d91b0f5038c | 1860 | |
Yogesh Pande |
4:5d91b0f5038c | 1861 | if (*ptr >= '0' && *ptr <= '9') { |
Yogesh Pande |
4:5d91b0f5038c | 1862 | result += *ptr - '0'; |
Yogesh Pande |
4:5d91b0f5038c | 1863 | } else if (*ptr >= 'a' && *ptr <= 'f') { |
Yogesh Pande |
4:5d91b0f5038c | 1864 | result += *ptr - 87; |
Yogesh Pande |
4:5d91b0f5038c | 1865 | } else if (*ptr >= 'A' && *ptr <= 'F') { |
Yogesh Pande |
4:5d91b0f5038c | 1866 | result += *ptr - 55; |
Yogesh Pande |
4:5d91b0f5038c | 1867 | } |
Yogesh Pande |
4:5d91b0f5038c | 1868 | |
Yogesh Pande |
4:5d91b0f5038c | 1869 | ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1870 | |
Yogesh Pande |
4:5d91b0f5038c | 1871 | } |
Yogesh Pande |
4:5d91b0f5038c | 1872 | return result; |
Yogesh Pande |
4:5d91b0f5038c | 1873 | |
Yogesh Pande |
4:5d91b0f5038c | 1874 | } |
Yogesh Pande |
4:5d91b0f5038c | 1875 | |
Yogesh Pande |
4:5d91b0f5038c | 1876 | static int8_t sn_nsdl_resolve_lwm2m_address(struct nsdl_s *handle, uint8_t *uri, uint16_t uri_len) |
Yogesh Pande |
4:5d91b0f5038c | 1877 | { |
Yogesh Pande |
4:5d91b0f5038c | 1878 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 1879 | if( uri_len < 2 ){ |
Yogesh Pande |
4:5d91b0f5038c | 1880 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1881 | } |
Yogesh Pande |
4:5d91b0f5038c | 1882 | uint8_t *temp_ptr = uri+2; |
Yogesh Pande |
4:5d91b0f5038c | 1883 | uint16_t i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1884 | uint8_t char_cnt = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1885 | |
Yogesh Pande |
4:5d91b0f5038c | 1886 | /* jump over coap// */ |
Yogesh Pande |
4:5d91b0f5038c | 1887 | while ((*(temp_ptr - 2) != '/') || (*(temp_ptr - 1) != '/')) { |
Yogesh Pande |
4:5d91b0f5038c | 1888 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1889 | if (temp_ptr - uri >= uri_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1890 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1891 | } |
Yogesh Pande |
4:5d91b0f5038c | 1892 | } |
Yogesh Pande |
4:5d91b0f5038c | 1893 | |
Yogesh Pande |
4:5d91b0f5038c | 1894 | /* Resolve address type */ |
Yogesh Pande |
4:5d91b0f5038c | 1895 | /* Count semicolons */ |
Yogesh Pande |
4:5d91b0f5038c | 1896 | |
Yogesh Pande |
4:5d91b0f5038c | 1897 | int8_t endPos = -1; |
Yogesh Pande |
4:5d91b0f5038c | 1898 | |
Yogesh Pande |
4:5d91b0f5038c | 1899 | while (i < (uri_len - (temp_ptr - uri))) { |
Yogesh Pande |
4:5d91b0f5038c | 1900 | if (*(temp_ptr + i) == ':') { |
Yogesh Pande |
4:5d91b0f5038c | 1901 | char_cnt++; |
Yogesh Pande |
4:5d91b0f5038c | 1902 | }else if(*(temp_ptr + i) == ']'){ |
Yogesh Pande |
4:5d91b0f5038c | 1903 | endPos = i; |
Yogesh Pande |
4:5d91b0f5038c | 1904 | } |
Yogesh Pande |
4:5d91b0f5038c | 1905 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1906 | } |
Yogesh Pande |
4:5d91b0f5038c | 1907 | |
Yogesh Pande |
4:5d91b0f5038c | 1908 | uint8_t *temp_pos = temp_ptr; //store starting point in case of IPv4 parsing fails |
Yogesh Pande |
4:5d91b0f5038c | 1909 | |
Yogesh Pande |
4:5d91b0f5038c | 1910 | /* IPv6 */ |
Yogesh Pande |
4:5d91b0f5038c | 1911 | if (char_cnt > 2) { |
Yogesh Pande |
4:5d91b0f5038c | 1912 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1913 | |
Yogesh Pande |
4:5d91b0f5038c | 1914 | if( handle->nsp_address_ptr->omalw_address_ptr->addr_ptr ){ |
Yogesh Pande |
4:5d91b0f5038c | 1915 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 1916 | } |
Yogesh Pande |
4:5d91b0f5038c | 1917 | |
Yogesh Pande |
4:5d91b0f5038c | 1918 | handle->nsp_address_ptr->omalw_address_ptr->type = SN_NSDL_ADDRESS_TYPE_IPV6; |
Yogesh Pande |
4:5d91b0f5038c | 1919 | handle->nsp_address_ptr->omalw_address_ptr->addr_len = 16; |
Yogesh Pande |
4:5d91b0f5038c | 1920 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = handle->sn_nsdl_alloc(16); |
Yogesh Pande |
4:5d91b0f5038c | 1921 | if (!handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 1922 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1923 | } |
Yogesh Pande |
4:5d91b0f5038c | 1924 | |
Yogesh Pande |
4:5d91b0f5038c | 1925 | memset(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr, 0, 16); |
Yogesh Pande |
4:5d91b0f5038c | 1926 | if (*temp_ptr == '[' && endPos > 0 && (temp_ptr - uri) + endPos < uri_len && *(temp_ptr + endPos + 1) == ':') { |
Yogesh Pande |
4:5d91b0f5038c | 1927 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1928 | endPos--; |
Yogesh Pande |
4:5d91b0f5038c | 1929 | }else{ |
Yogesh Pande |
4:5d91b0f5038c | 1930 | /* return failure, because port is mandatory */ |
Yogesh Pande |
4:5d91b0f5038c | 1931 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 1932 | } |
Yogesh Pande |
4:5d91b0f5038c | 1933 | |
Yogesh Pande |
4:5d91b0f5038c | 1934 | int8_t loopbackPos = -1; |
Yogesh Pande |
4:5d91b0f5038c | 1935 | if( char_cnt != 8 ){ |
Yogesh Pande |
4:5d91b0f5038c | 1936 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1937 | char_cnt -= 1; |
Yogesh Pande |
4:5d91b0f5038c | 1938 | while( i+1 < endPos ){ |
Yogesh Pande |
4:5d91b0f5038c | 1939 | if(*(temp_ptr + i) == ':' && *(temp_ptr + i+1) == ':') { |
Yogesh Pande |
4:5d91b0f5038c | 1940 | loopbackPos = i; |
Yogesh Pande |
4:5d91b0f5038c | 1941 | break; |
Yogesh Pande |
4:5d91b0f5038c | 1942 | } |
Yogesh Pande |
4:5d91b0f5038c | 1943 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1944 | } |
Yogesh Pande |
4:5d91b0f5038c | 1945 | } |
Yogesh Pande |
4:5d91b0f5038c | 1946 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1947 | |
Yogesh Pande |
4:5d91b0f5038c | 1948 | uint8_t numberOfZeros = 8 - char_cnt; |
Yogesh Pande |
4:5d91b0f5038c | 1949 | if(loopbackPos == 0){ |
Yogesh Pande |
4:5d91b0f5038c | 1950 | numberOfZeros++; |
Yogesh Pande |
4:5d91b0f5038c | 1951 | } |
Yogesh Pande |
4:5d91b0f5038c | 1952 | |
Yogesh Pande |
4:5d91b0f5038c | 1953 | if(loopbackPos == endPos-2){ |
Yogesh Pande |
4:5d91b0f5038c | 1954 | numberOfZeros++; |
Yogesh Pande |
4:5d91b0f5038c | 1955 | } |
Yogesh Pande |
4:5d91b0f5038c | 1956 | |
Yogesh Pande |
4:5d91b0f5038c | 1957 | /* Resolve address */ |
Yogesh Pande |
4:5d91b0f5038c | 1958 | int8_t pos = loopbackPos == 0?0:-1; |
Yogesh Pande |
4:5d91b0f5038c | 1959 | while (i < 16 && ((temp_ptr - uri) + char_cnt) < uri_len) { |
Yogesh Pande |
4:5d91b0f5038c | 1960 | char_cnt = 0; |
Yogesh Pande |
4:5d91b0f5038c | 1961 | if( pos == loopbackPos ){ |
Yogesh Pande |
4:5d91b0f5038c | 1962 | for( int k=0; k < numberOfZeros; k++ ){ |
Yogesh Pande |
4:5d91b0f5038c | 1963 | i+=2; |
Yogesh Pande |
4:5d91b0f5038c | 1964 | } |
Yogesh Pande |
4:5d91b0f5038c | 1965 | pos+=2; |
Yogesh Pande |
4:5d91b0f5038c | 1966 | temp_ptr += 2; |
Yogesh Pande |
4:5d91b0f5038c | 1967 | if( numberOfZeros == 8 ){ |
Yogesh Pande |
4:5d91b0f5038c | 1968 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1969 | } |
Yogesh Pande |
4:5d91b0f5038c | 1970 | continue; |
Yogesh Pande |
4:5d91b0f5038c | 1971 | } |
Yogesh Pande |
4:5d91b0f5038c | 1972 | while (*(temp_ptr + char_cnt) != ':' && *(temp_ptr + char_cnt) != ']') { |
Yogesh Pande |
4:5d91b0f5038c | 1973 | char_cnt++; |
Yogesh Pande |
4:5d91b0f5038c | 1974 | pos++; |
Yogesh Pande |
4:5d91b0f5038c | 1975 | } |
Yogesh Pande |
4:5d91b0f5038c | 1976 | pos++; |
Yogesh Pande |
4:5d91b0f5038c | 1977 | |
Yogesh Pande |
4:5d91b0f5038c | 1978 | if (char_cnt <= 2) { |
Yogesh Pande |
4:5d91b0f5038c | 1979 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1980 | } |
Yogesh Pande |
4:5d91b0f5038c | 1981 | |
Yogesh Pande |
4:5d91b0f5038c | 1982 | while (char_cnt) { |
Yogesh Pande |
4:5d91b0f5038c | 1983 | if (char_cnt % 2) { |
Yogesh Pande |
4:5d91b0f5038c | 1984 | *(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr + i) = (uint8_t)sn_nsdl_ahextoi(temp_ptr, 1); |
Yogesh Pande |
4:5d91b0f5038c | 1985 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1986 | char_cnt --; |
Yogesh Pande |
4:5d91b0f5038c | 1987 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 1988 | *(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr + i) = (uint8_t)sn_nsdl_ahextoi(temp_ptr, 2); |
Yogesh Pande |
4:5d91b0f5038c | 1989 | temp_ptr += 2; |
Yogesh Pande |
4:5d91b0f5038c | 1990 | char_cnt -= 2; |
Yogesh Pande |
4:5d91b0f5038c | 1991 | } |
Yogesh Pande |
4:5d91b0f5038c | 1992 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 1993 | } |
Yogesh Pande |
4:5d91b0f5038c | 1994 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1995 | } |
Yogesh Pande |
4:5d91b0f5038c | 1996 | |
Yogesh Pande |
4:5d91b0f5038c | 1997 | temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 1998 | uint16_t handled = (temp_ptr - uri); |
Yogesh Pande |
4:5d91b0f5038c | 1999 | if( handled < uri_len ){ |
Yogesh Pande |
4:5d91b0f5038c | 2000 | if( *(temp_ptr + (uri_len - (temp_ptr - uri) -1)) == '/' ){ |
Yogesh Pande |
4:5d91b0f5038c | 2001 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri) - 1); |
Yogesh Pande |
4:5d91b0f5038c | 2002 | }else{ |
Yogesh Pande |
4:5d91b0f5038c | 2003 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri)); |
Yogesh Pande |
4:5d91b0f5038c | 2004 | } |
Yogesh Pande |
4:5d91b0f5038c | 2005 | } |
Yogesh Pande |
4:5d91b0f5038c | 2006 | } |
Yogesh Pande |
4:5d91b0f5038c | 2007 | /* IPv4 or Hostname */ |
Yogesh Pande |
4:5d91b0f5038c | 2008 | else if (char_cnt == 1) { |
Yogesh Pande |
4:5d91b0f5038c | 2009 | char_cnt = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2010 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2011 | |
Yogesh Pande |
4:5d91b0f5038c | 2012 | if( handle->nsp_address_ptr->omalw_address_ptr->addr_ptr ){ |
Yogesh Pande |
4:5d91b0f5038c | 2013 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2014 | } |
Yogesh Pande |
4:5d91b0f5038c | 2015 | |
Yogesh Pande |
4:5d91b0f5038c | 2016 | /* Check address type */ |
Yogesh Pande |
4:5d91b0f5038c | 2017 | while (i < (uri_len - (temp_ptr - uri))) { |
Yogesh Pande |
4:5d91b0f5038c | 2018 | if (*(temp_ptr + i) == '.') { |
Yogesh Pande |
4:5d91b0f5038c | 2019 | char_cnt++; |
Yogesh Pande |
4:5d91b0f5038c | 2020 | } |
Yogesh Pande |
4:5d91b0f5038c | 2021 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 2022 | } |
Yogesh Pande |
4:5d91b0f5038c | 2023 | |
Yogesh Pande |
4:5d91b0f5038c | 2024 | bool parseOk = true; |
Yogesh Pande |
4:5d91b0f5038c | 2025 | |
Yogesh Pande |
4:5d91b0f5038c | 2026 | /* Try IPv4 first */ |
Yogesh Pande |
4:5d91b0f5038c | 2027 | if (char_cnt == 3) { |
Yogesh Pande |
4:5d91b0f5038c | 2028 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2029 | char_cnt = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2030 | |
Yogesh Pande |
4:5d91b0f5038c | 2031 | handle->nsp_address_ptr->omalw_address_ptr->type = SN_NSDL_ADDRESS_TYPE_IPV4; |
Yogesh Pande |
4:5d91b0f5038c | 2032 | handle->nsp_address_ptr->omalw_address_ptr->addr_len = 4; |
Yogesh Pande |
4:5d91b0f5038c | 2033 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = handle->sn_nsdl_alloc(4); |
Yogesh Pande |
4:5d91b0f5038c | 2034 | if (!handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2035 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2036 | } |
Yogesh Pande |
4:5d91b0f5038c | 2037 | |
Yogesh Pande |
4:5d91b0f5038c | 2038 | while (parseOk && ((temp_ptr - uri) < uri_len) && *(temp_ptr - 1) != ':') { |
Yogesh Pande |
4:5d91b0f5038c | 2039 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 2040 | |
Yogesh Pande |
4:5d91b0f5038c | 2041 | if (*(temp_ptr + i) == ':' || *(temp_ptr + i) == '.') { |
Yogesh Pande |
4:5d91b0f5038c | 2042 | int8_t value = (int8_t)sn_nsdl_atoi(temp_ptr, i); |
Yogesh Pande |
4:5d91b0f5038c | 2043 | if( value == -1 ){ |
Yogesh Pande |
4:5d91b0f5038c | 2044 | parseOk = false; |
Yogesh Pande |
4:5d91b0f5038c | 2045 | char_cnt = 3; |
Yogesh Pande |
4:5d91b0f5038c | 2046 | handle->sn_nsdl_free(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2047 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = NULL; |
Yogesh Pande |
4:5d91b0f5038c | 2048 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2049 | } |
Yogesh Pande |
4:5d91b0f5038c | 2050 | *(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr + char_cnt) = value; |
Yogesh Pande |
4:5d91b0f5038c | 2051 | temp_ptr = temp_ptr + i + 1; |
Yogesh Pande |
4:5d91b0f5038c | 2052 | char_cnt++; |
Yogesh Pande |
4:5d91b0f5038c | 2053 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2054 | } |
Yogesh Pande |
4:5d91b0f5038c | 2055 | } |
Yogesh Pande |
4:5d91b0f5038c | 2056 | if(parseOk) { |
Yogesh Pande |
4:5d91b0f5038c | 2057 | if( *(temp_ptr + (uri_len - (temp_ptr - uri) -1)) == '/' ){ |
Yogesh Pande |
4:5d91b0f5038c | 2058 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri) - 1); |
Yogesh Pande |
4:5d91b0f5038c | 2059 | }else{ |
Yogesh Pande |
4:5d91b0f5038c | 2060 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri)); |
Yogesh Pande |
4:5d91b0f5038c | 2061 | } |
Yogesh Pande |
4:5d91b0f5038c | 2062 | } |
Yogesh Pande |
4:5d91b0f5038c | 2063 | }else{ |
Yogesh Pande |
4:5d91b0f5038c | 2064 | parseOk = false; |
Yogesh Pande |
4:5d91b0f5038c | 2065 | } |
Yogesh Pande |
4:5d91b0f5038c | 2066 | |
Yogesh Pande |
4:5d91b0f5038c | 2067 | /* Then try Hostname */ |
Yogesh Pande |
4:5d91b0f5038c | 2068 | if(!parseOk) { |
Yogesh Pande |
4:5d91b0f5038c | 2069 | i = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2070 | temp_ptr = temp_pos; |
Yogesh Pande |
4:5d91b0f5038c | 2071 | |
Yogesh Pande |
4:5d91b0f5038c | 2072 | handle->nsp_address_ptr->omalw_address_ptr->type = SN_NSDL_ADDRESS_TYPE_HOSTNAME; |
Yogesh Pande |
4:5d91b0f5038c | 2073 | |
Yogesh Pande |
4:5d91b0f5038c | 2074 | /* Resolve address length */ |
Yogesh Pande |
4:5d91b0f5038c | 2075 | if (uri_len > 0xff) { |
Yogesh Pande |
4:5d91b0f5038c | 2076 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2077 | } |
Yogesh Pande |
4:5d91b0f5038c | 2078 | |
Yogesh Pande |
4:5d91b0f5038c | 2079 | while (((temp_ptr - uri) + i < uri_len) && *(temp_ptr + i) != ':') { |
Yogesh Pande |
4:5d91b0f5038c | 2080 | i++; |
Yogesh Pande |
4:5d91b0f5038c | 2081 | } |
Yogesh Pande |
4:5d91b0f5038c | 2082 | |
Yogesh Pande |
4:5d91b0f5038c | 2083 | handle->nsp_address_ptr->omalw_address_ptr->addr_len = i; |
Yogesh Pande |
4:5d91b0f5038c | 2084 | |
Yogesh Pande |
4:5d91b0f5038c | 2085 | /* Copy address */ |
Yogesh Pande |
4:5d91b0f5038c | 2086 | handle->nsp_address_ptr->omalw_address_ptr->addr_ptr = handle->sn_nsdl_alloc(i); |
Yogesh Pande |
4:5d91b0f5038c | 2087 | if (!handle->nsp_address_ptr->omalw_address_ptr->addr_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2088 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2089 | } |
Yogesh Pande |
4:5d91b0f5038c | 2090 | |
Yogesh Pande |
4:5d91b0f5038c | 2091 | memcpy(handle->nsp_address_ptr->omalw_address_ptr->addr_ptr, temp_ptr, i); |
Yogesh Pande |
4:5d91b0f5038c | 2092 | |
Yogesh Pande |
4:5d91b0f5038c | 2093 | temp_ptr += i + 1; |
Yogesh Pande |
4:5d91b0f5038c | 2094 | |
Yogesh Pande |
4:5d91b0f5038c | 2095 | /* Set port */ |
Yogesh Pande |
4:5d91b0f5038c | 2096 | if( *(temp_ptr + (uri_len - (temp_ptr - uri) - 1)) == '/' ){ |
Yogesh Pande |
4:5d91b0f5038c | 2097 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri) - 1); |
Yogesh Pande |
4:5d91b0f5038c | 2098 | }else{ |
Yogesh Pande |
4:5d91b0f5038c | 2099 | handle->nsp_address_ptr->omalw_address_ptr->port = sn_nsdl_atoi(temp_ptr, uri_len - (temp_ptr - uri)); |
Yogesh Pande |
4:5d91b0f5038c | 2100 | } |
Yogesh Pande |
4:5d91b0f5038c | 2101 | } |
Yogesh Pande |
4:5d91b0f5038c | 2102 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 2103 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2104 | } |
Yogesh Pande |
4:5d91b0f5038c | 2105 | |
Yogesh Pande |
4:5d91b0f5038c | 2106 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 2107 | #else |
Yogesh Pande |
4:5d91b0f5038c | 2108 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2109 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 2110 | } |
Yogesh Pande |
4:5d91b0f5038c | 2111 | |
Yogesh Pande |
4:5d91b0f5038c | 2112 | |
Yogesh Pande |
4:5d91b0f5038c | 2113 | int8_t sn_nsdl_process_oma_tlv(struct nsdl_s *handle, uint8_t *data_ptr, uint16_t data_len) |
Yogesh Pande |
4:5d91b0f5038c | 2114 | { |
Yogesh Pande |
4:5d91b0f5038c | 2115 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 2116 | uint8_t *temp_ptr = data_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2117 | uint8_t type = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2118 | uint16_t identifier = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2119 | uint32_t length = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2120 | uint8_t path_temp[5] = "0/0/x"; |
Yogesh Pande |
4:5d91b0f5038c | 2121 | |
Yogesh Pande |
4:5d91b0f5038c | 2122 | sn_nsdl_resource_info_s resource_temp = { |
Yogesh Pande |
4:5d91b0f5038c | 2123 | .resource_parameters_ptr = 0, |
Yogesh Pande |
4:5d91b0f5038c | 2124 | .mode = SN_GRS_STATIC, |
Yogesh Pande |
4:5d91b0f5038c | 2125 | .pathlen = 5, |
Yogesh Pande |
4:5d91b0f5038c | 2126 | .path = path_temp, |
Yogesh Pande |
4:5d91b0f5038c | 2127 | .resourcelen = 0, |
Yogesh Pande |
4:5d91b0f5038c | 2128 | .resource = 0, |
Yogesh Pande |
4:5d91b0f5038c | 2129 | .access = (sn_grs_resource_acl_e) 0x0f, /* All allowed */ |
Yogesh Pande |
4:5d91b0f5038c | 2130 | .sn_grs_dyn_res_callback = 0 |
Yogesh Pande |
4:5d91b0f5038c | 2131 | }; |
Yogesh Pande |
4:5d91b0f5038c | 2132 | |
Yogesh Pande |
4:5d91b0f5038c | 2133 | while ((temp_ptr - data_ptr) < data_len) { |
Yogesh Pande |
4:5d91b0f5038c | 2134 | /* Save type for future use */ |
Yogesh Pande |
4:5d91b0f5038c | 2135 | type = *temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2136 | |
Yogesh Pande |
4:5d91b0f5038c | 2137 | /* * Bit 5: Indicates the Length of the Identifier. * */ |
Yogesh Pande |
4:5d91b0f5038c | 2138 | if (type & 0x20) { |
Yogesh Pande |
4:5d91b0f5038c | 2139 | /* 1=The Identifier field of this TLV is 16 bits long */ |
Yogesh Pande |
4:5d91b0f5038c | 2140 | identifier = (uint8_t)(*temp_ptr++) << 8; |
Yogesh Pande |
4:5d91b0f5038c | 2141 | identifier += (uint8_t) * temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2142 | } else { |
Yogesh Pande |
4:5d91b0f5038c | 2143 | /* 0=The Identifier field of this TLV is 8 bits long */ |
Yogesh Pande |
4:5d91b0f5038c | 2144 | identifier = (uint8_t) * temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2145 | } |
Yogesh Pande |
4:5d91b0f5038c | 2146 | |
Yogesh Pande |
4:5d91b0f5038c | 2147 | /* * Bit 4-3: Indicates the type of Length. * */ |
Yogesh Pande |
4:5d91b0f5038c | 2148 | if ((type & 0x18) == 0) { |
Yogesh Pande |
4:5d91b0f5038c | 2149 | /* 00 = No length field, the value immediately follows the Identifier field in is of the length indicated by Bits 2-0 of this field */ |
Yogesh Pande |
4:5d91b0f5038c | 2150 | length = (type & 0x07); |
Yogesh Pande |
4:5d91b0f5038c | 2151 | } else if ((type & 0x18) == 0x08) { |
Yogesh Pande |
4:5d91b0f5038c | 2152 | /* 01 = The Length field is 8-bits and Bits 2-0 MUST be ignored */ |
Yogesh Pande |
4:5d91b0f5038c | 2153 | length = *temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2154 | } else if ((type & 0x18) == 0x10) { |
Yogesh Pande |
4:5d91b0f5038c | 2155 | /* 10 = The Length field is 16-bits and Bits 2-0 MUST be ignored */ |
Yogesh Pande |
4:5d91b0f5038c | 2156 | length = (uint8_t)(*temp_ptr++) << 8; |
Yogesh Pande |
4:5d91b0f5038c | 2157 | length += (uint8_t) * temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2158 | } else if ((type & 0x18) == 0x18) { |
Yogesh Pande |
4:5d91b0f5038c | 2159 | /* 11 = The Length field is 24-bits and Bits 2-0 MUST be ignored */ |
Yogesh Pande |
4:5d91b0f5038c | 2160 | length = (uint8_t)(*temp_ptr++); |
Yogesh Pande |
4:5d91b0f5038c | 2161 | length = length << 16; |
Yogesh Pande |
4:5d91b0f5038c | 2162 | length += (uint8_t)(*temp_ptr++) << 8; |
Yogesh Pande |
4:5d91b0f5038c | 2163 | length += (uint8_t) * temp_ptr++; |
Yogesh Pande |
4:5d91b0f5038c | 2164 | } |
Yogesh Pande |
4:5d91b0f5038c | 2165 | |
Yogesh Pande |
4:5d91b0f5038c | 2166 | /* * Bits 7-6: Indicates the type of Identifier. * */ |
Yogesh Pande |
4:5d91b0f5038c | 2167 | if ((type & 0xC0) == 0x00) { |
Yogesh Pande |
4:5d91b0f5038c | 2168 | /* 00 = Object Instance in which case the Value contains one or more Resource TLVs */ |
Yogesh Pande |
4:5d91b0f5038c | 2169 | /* Not implemented, return failure */ |
Yogesh Pande |
4:5d91b0f5038c | 2170 | } else if ((type & 0xC0) == 0xC0) { |
Yogesh Pande |
4:5d91b0f5038c | 2171 | /* 11 = Resource with Value */ |
Yogesh Pande |
4:5d91b0f5038c | 2172 | switch (identifier) { |
Yogesh Pande |
4:5d91b0f5038c | 2173 | case 0: |
Yogesh Pande |
4:5d91b0f5038c | 2174 | /* Resolve LWM2M Server URI */ |
Yogesh Pande |
4:5d91b0f5038c | 2175 | sn_nsdl_resolve_lwm2m_address(handle, temp_ptr, length); |
Yogesh Pande |
4:5d91b0f5038c | 2176 | path_temp[4] = '0'; |
Yogesh Pande |
4:5d91b0f5038c | 2177 | resource_temp.resource = temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2178 | resource_temp.resourcelen = length; |
Yogesh Pande |
4:5d91b0f5038c | 2179 | if (sn_nsdl_create_resource(handle, &resource_temp) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 2180 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2181 | } |
Yogesh Pande |
4:5d91b0f5038c | 2182 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2183 | case 2: |
Yogesh Pande |
4:5d91b0f5038c | 2184 | /* Resolve security Mode */ |
Yogesh Pande |
4:5d91b0f5038c | 2185 | handle->nsp_address_ptr->omalw_server_security = (omalw_server_security_t)sn_nsdl_atoi(temp_ptr, length); |
Yogesh Pande |
4:5d91b0f5038c | 2186 | path_temp[4] = '2'; |
Yogesh Pande |
4:5d91b0f5038c | 2187 | resource_temp.resource = temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2188 | resource_temp.resourcelen = length; |
Yogesh Pande |
4:5d91b0f5038c | 2189 | if (sn_nsdl_create_resource(handle, &resource_temp) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 2190 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2191 | } |
Yogesh Pande |
4:5d91b0f5038c | 2192 | |
Yogesh Pande |
4:5d91b0f5038c | 2193 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2194 | case 3: |
Yogesh Pande |
4:5d91b0f5038c | 2195 | /* Public Key or Identity */ |
Yogesh Pande |
4:5d91b0f5038c | 2196 | path_temp[4] = '3'; |
Yogesh Pande |
4:5d91b0f5038c | 2197 | resource_temp.resource = temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2198 | resource_temp.resourcelen = length; |
Yogesh Pande |
4:5d91b0f5038c | 2199 | if (sn_nsdl_create_resource(handle, &resource_temp) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 2200 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2201 | } |
Yogesh Pande |
4:5d91b0f5038c | 2202 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2203 | case 4: |
Yogesh Pande |
4:5d91b0f5038c | 2204 | /* Server Public Key or Identity */ |
Yogesh Pande |
4:5d91b0f5038c | 2205 | ; |
Yogesh Pande |
4:5d91b0f5038c | 2206 | path_temp[4] = '4'; |
Yogesh Pande |
4:5d91b0f5038c | 2207 | resource_temp.resource = temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2208 | resource_temp.resourcelen = length; |
Yogesh Pande |
4:5d91b0f5038c | 2209 | if (sn_nsdl_create_resource(handle, &resource_temp) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 2210 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2211 | } |
Yogesh Pande |
4:5d91b0f5038c | 2212 | |
Yogesh Pande |
4:5d91b0f5038c | 2213 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2214 | case 5: |
Yogesh Pande |
4:5d91b0f5038c | 2215 | /* Secret Key */ |
Yogesh Pande |
4:5d91b0f5038c | 2216 | path_temp[4] = '5'; |
Yogesh Pande |
4:5d91b0f5038c | 2217 | resource_temp.resource = temp_ptr; |
Yogesh Pande |
4:5d91b0f5038c | 2218 | resource_temp.resourcelen = length; |
Yogesh Pande |
4:5d91b0f5038c | 2219 | if (sn_nsdl_create_resource(handle, &resource_temp) != SN_NSDL_SUCCESS) { |
Yogesh Pande |
4:5d91b0f5038c | 2220 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2221 | } |
Yogesh Pande |
4:5d91b0f5038c | 2222 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2223 | default: |
Yogesh Pande |
4:5d91b0f5038c | 2224 | break; |
Yogesh Pande |
4:5d91b0f5038c | 2225 | } |
Yogesh Pande |
4:5d91b0f5038c | 2226 | |
Yogesh Pande |
4:5d91b0f5038c | 2227 | /* Move pointer to next TLV message */ |
Yogesh Pande |
4:5d91b0f5038c | 2228 | temp_ptr += length; |
Yogesh Pande |
4:5d91b0f5038c | 2229 | } |
Yogesh Pande |
4:5d91b0f5038c | 2230 | } |
Yogesh Pande |
4:5d91b0f5038c | 2231 | |
Yogesh Pande |
4:5d91b0f5038c | 2232 | return SN_NSDL_SUCCESS; |
Yogesh Pande |
4:5d91b0f5038c | 2233 | #else |
Yogesh Pande |
4:5d91b0f5038c | 2234 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2235 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 2236 | } |
Yogesh Pande |
4:5d91b0f5038c | 2237 | |
Yogesh Pande |
4:5d91b0f5038c | 2238 | static void sn_nsdl_check_oma_bs_status(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 2239 | { |
Yogesh Pande |
4:5d91b0f5038c | 2240 | #ifndef YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 2241 | /* Check OMA BS status */ |
Yogesh Pande |
4:5d91b0f5038c | 2242 | if ((handle->nsp_address_ptr->omalw_server_security == PSK) && (handle->nsp_address_ptr->omalw_address_ptr->type != SN_NSDL_ADDRESS_TYPE_NONE)) { |
Yogesh Pande |
4:5d91b0f5038c | 2243 | /* call cb that oma bootstrap is done */ |
Yogesh Pande |
4:5d91b0f5038c | 2244 | if(handle->sn_nsdl_oma_bs_done_cb != 0){ |
Yogesh Pande |
4:5d91b0f5038c | 2245 | handle->sn_nsdl_oma_bs_done_cb(handle->nsp_address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2246 | } |
Yogesh Pande |
4:5d91b0f5038c | 2247 | } else if ((handle->nsp_address_ptr->omalw_server_security == CERTIFICATE) && (handle->nsp_address_ptr->omalw_address_ptr->type != SN_NSDL_ADDRESS_TYPE_NONE) && |
Yogesh Pande |
4:5d91b0f5038c | 2248 | ((sn_nsdl_get_resource(handle, 5, (void *)"0/0/5") != 0) && |
Yogesh Pande |
4:5d91b0f5038c | 2249 | (sn_nsdl_get_resource(handle, 5, (void *)"0/0/4") != 0) && |
Yogesh Pande |
4:5d91b0f5038c | 2250 | (sn_nsdl_get_resource(handle, 5, (void *)"0/0/3") != 0))) { |
Yogesh Pande |
4:5d91b0f5038c | 2251 | if( handle->sn_nsdl_oma_bs_done_cb ){ |
Yogesh Pande |
4:5d91b0f5038c | 2252 | handle->sn_nsdl_oma_bs_done_cb(handle->nsp_address_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2253 | } |
Yogesh Pande |
4:5d91b0f5038c | 2254 | } |
Yogesh Pande |
4:5d91b0f5038c | 2255 | #endif //YOTTA_CFG_DISABLE_BOOTSTRAP_FEATURE |
Yogesh Pande |
4:5d91b0f5038c | 2256 | } |
Yogesh Pande |
4:5d91b0f5038c | 2257 | |
Yogesh Pande |
4:5d91b0f5038c | 2258 | static int8_t set_endpoint_info(struct nsdl_s *handle, sn_nsdl_ep_parameters_s *endpoint_info_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 2259 | { |
Yogesh Pande |
4:5d91b0f5038c | 2260 | if (handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2261 | handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2262 | handle->ep_information_ptr->domain_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2263 | handle->ep_information_ptr->domain_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2264 | } |
Yogesh Pande |
4:5d91b0f5038c | 2265 | |
Yogesh Pande |
4:5d91b0f5038c | 2266 | if (handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2267 | handle->sn_nsdl_free(handle->ep_information_ptr->endpoint_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2268 | handle->ep_information_ptr->endpoint_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2269 | handle->ep_information_ptr->endpoint_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2270 | } |
Yogesh Pande |
4:5d91b0f5038c | 2271 | |
Yogesh Pande |
4:5d91b0f5038c | 2272 | if (endpoint_info_ptr->domain_name_ptr && endpoint_info_ptr->domain_name_len) { |
Yogesh Pande |
4:5d91b0f5038c | 2273 | handle->ep_information_ptr->domain_name_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 2274 | |
Yogesh Pande |
4:5d91b0f5038c | 2275 | if (!handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2276 | return -1; |
Yogesh Pande |
4:5d91b0f5038c | 2277 | } |
Yogesh Pande |
4:5d91b0f5038c | 2278 | |
Yogesh Pande |
4:5d91b0f5038c | 2279 | memcpy(handle->ep_information_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 2280 | handle->ep_information_ptr->domain_name_len = endpoint_info_ptr->domain_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 2281 | } |
Yogesh Pande |
4:5d91b0f5038c | 2282 | |
Yogesh Pande |
4:5d91b0f5038c | 2283 | if (endpoint_info_ptr->endpoint_name_ptr && endpoint_info_ptr->endpoint_name_len) { |
Yogesh Pande |
4:5d91b0f5038c | 2284 | handle->ep_information_ptr->endpoint_name_ptr = handle->sn_nsdl_alloc(endpoint_info_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 2285 | |
Yogesh Pande |
4:5d91b0f5038c | 2286 | if (!handle->ep_information_ptr->endpoint_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2287 | if (handle->ep_information_ptr->domain_name_ptr) { |
Yogesh Pande |
4:5d91b0f5038c | 2288 | handle->sn_nsdl_free(handle->ep_information_ptr->domain_name_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2289 | handle->ep_information_ptr->domain_name_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2290 | handle->ep_information_ptr->domain_name_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2291 | } |
Yogesh Pande |
4:5d91b0f5038c | 2292 | return -1; |
Yogesh Pande |
4:5d91b0f5038c | 2293 | } |
Yogesh Pande |
4:5d91b0f5038c | 2294 | |
Yogesh Pande |
4:5d91b0f5038c | 2295 | memcpy(handle->ep_information_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_len); |
Yogesh Pande |
4:5d91b0f5038c | 2296 | handle->ep_information_ptr->endpoint_name_len = endpoint_info_ptr->endpoint_name_len; |
Yogesh Pande |
4:5d91b0f5038c | 2297 | } |
Yogesh Pande |
4:5d91b0f5038c | 2298 | |
Yogesh Pande |
4:5d91b0f5038c | 2299 | handle->ep_information_ptr->binding_and_mode = endpoint_info_ptr->binding_and_mode; |
Yogesh Pande |
4:5d91b0f5038c | 2300 | handle->ep_information_ptr->ds_register_mode = endpoint_info_ptr->ds_register_mode; |
Yogesh Pande |
4:5d91b0f5038c | 2301 | |
Yogesh Pande |
4:5d91b0f5038c | 2302 | handle->ep_information_ptr->location_ptr = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2303 | handle->ep_information_ptr->location_len = 0; |
Yogesh Pande |
4:5d91b0f5038c | 2304 | |
Yogesh Pande |
4:5d91b0f5038c | 2305 | return 0; |
Yogesh Pande |
4:5d91b0f5038c | 2306 | } |
Yogesh Pande |
4:5d91b0f5038c | 2307 | |
Yogesh Pande |
4:5d91b0f5038c | 2308 | /* Wrapper */ |
Yogesh Pande |
4:5d91b0f5038c | 2309 | sn_grs_resource_list_s *sn_nsdl_list_resource(struct nsdl_s *handle, uint16_t pathlen, uint8_t *path) |
Yogesh Pande |
4:5d91b0f5038c | 2310 | { |
Yogesh Pande |
4:5d91b0f5038c | 2311 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2312 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2313 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 2314 | } |
Yogesh Pande |
4:5d91b0f5038c | 2315 | |
Yogesh Pande |
4:5d91b0f5038c | 2316 | return sn_grs_list_resource(handle->grs, pathlen, path); |
Yogesh Pande |
4:5d91b0f5038c | 2317 | } |
Yogesh Pande |
4:5d91b0f5038c | 2318 | |
Yogesh Pande |
4:5d91b0f5038c | 2319 | void sn_nsdl_free_resource_list(struct nsdl_s *handle, sn_grs_resource_list_s *list) |
Yogesh Pande |
4:5d91b0f5038c | 2320 | { |
Yogesh Pande |
4:5d91b0f5038c | 2321 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2322 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2323 | return; |
Yogesh Pande |
4:5d91b0f5038c | 2324 | } |
Yogesh Pande |
4:5d91b0f5038c | 2325 | |
Yogesh Pande |
4:5d91b0f5038c | 2326 | sn_grs_free_resource_list(handle->grs, list); |
Yogesh Pande |
4:5d91b0f5038c | 2327 | } |
Yogesh Pande |
4:5d91b0f5038c | 2328 | |
Yogesh Pande |
4:5d91b0f5038c | 2329 | extern int8_t sn_nsdl_update_resource(struct nsdl_s *handle, sn_nsdl_resource_info_s *res) |
Yogesh Pande |
4:5d91b0f5038c | 2330 | { |
Yogesh Pande |
4:5d91b0f5038c | 2331 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2332 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2333 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2334 | } |
Yogesh Pande |
4:5d91b0f5038c | 2335 | |
Yogesh Pande |
4:5d91b0f5038c | 2336 | return sn_grs_update_resource(handle->grs, res); |
Yogesh Pande |
4:5d91b0f5038c | 2337 | } |
Yogesh Pande |
4:5d91b0f5038c | 2338 | |
Yogesh Pande |
4:5d91b0f5038c | 2339 | 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) |
Yogesh Pande |
4:5d91b0f5038c | 2340 | { |
Yogesh Pande |
4:5d91b0f5038c | 2341 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2342 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2343 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2344 | } |
Yogesh Pande |
4:5d91b0f5038c | 2345 | |
Yogesh Pande |
4:5d91b0f5038c | 2346 | return sn_grs_send_coap_message(handle, address_ptr, coap_hdr_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2347 | } |
Yogesh Pande |
4:5d91b0f5038c | 2348 | |
Yogesh Pande |
4:5d91b0f5038c | 2349 | extern int8_t sn_nsdl_create_resource(struct nsdl_s *handle, sn_nsdl_resource_info_s *res) |
Yogesh Pande |
4:5d91b0f5038c | 2350 | { |
Yogesh Pande |
4:5d91b0f5038c | 2351 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2352 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2353 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2354 | } |
Yogesh Pande |
4:5d91b0f5038c | 2355 | |
Yogesh Pande |
4:5d91b0f5038c | 2356 | return sn_grs_create_resource(handle->grs, res); |
Yogesh Pande |
4:5d91b0f5038c | 2357 | } |
Yogesh Pande |
4:5d91b0f5038c | 2358 | |
Yogesh Pande |
4:5d91b0f5038c | 2359 | extern int8_t sn_nsdl_delete_resource(struct nsdl_s *handle, uint16_t pathlen, uint8_t *path) |
Yogesh Pande |
4:5d91b0f5038c | 2360 | { |
Yogesh Pande |
4:5d91b0f5038c | 2361 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2362 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2363 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2364 | } |
Yogesh Pande |
4:5d91b0f5038c | 2365 | |
Yogesh Pande |
4:5d91b0f5038c | 2366 | return sn_grs_delete_resource(handle->grs, pathlen, path); |
Yogesh Pande |
4:5d91b0f5038c | 2367 | } |
Yogesh Pande |
4:5d91b0f5038c | 2368 | extern const sn_nsdl_resource_info_s *sn_nsdl_get_first_resource(struct nsdl_s *handle) |
Yogesh Pande |
4:5d91b0f5038c | 2369 | { |
Yogesh Pande |
4:5d91b0f5038c | 2370 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2371 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2372 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 2373 | } |
Yogesh Pande |
4:5d91b0f5038c | 2374 | |
Yogesh Pande |
4:5d91b0f5038c | 2375 | return sn_grs_get_first_resource(handle->grs); |
Yogesh Pande |
4:5d91b0f5038c | 2376 | } |
Yogesh Pande |
4:5d91b0f5038c | 2377 | extern const sn_nsdl_resource_info_s *sn_nsdl_get_next_resource(struct nsdl_s *handle, const sn_nsdl_resource_info_s *resource) |
Yogesh Pande |
4:5d91b0f5038c | 2378 | { |
Yogesh Pande |
4:5d91b0f5038c | 2379 | /* Check parameters */ |
Yogesh Pande |
4:5d91b0f5038c | 2380 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2381 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 2382 | } |
Yogesh Pande |
4:5d91b0f5038c | 2383 | |
Yogesh Pande |
4:5d91b0f5038c | 2384 | return sn_grs_get_next_resource(handle->grs, resource); |
Yogesh Pande |
4:5d91b0f5038c | 2385 | } |
Yogesh Pande |
4:5d91b0f5038c | 2386 | |
Yogesh Pande |
4:5d91b0f5038c | 2387 | extern sn_coap_hdr_s *sn_nsdl_build_response(struct nsdl_s *handle, sn_coap_hdr_s *coap_packet_ptr, uint8_t msg_code) |
Yogesh Pande |
4:5d91b0f5038c | 2388 | { |
Yogesh Pande |
4:5d91b0f5038c | 2389 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2390 | return NULL; |
Yogesh Pande |
4:5d91b0f5038c | 2391 | } |
Yogesh Pande |
4:5d91b0f5038c | 2392 | |
Yogesh Pande |
4:5d91b0f5038c | 2393 | return sn_coap_build_response(handle->grs->coap, coap_packet_ptr, msg_code); |
Yogesh Pande |
4:5d91b0f5038c | 2394 | } |
Yogesh Pande |
4:5d91b0f5038c | 2395 | |
Yogesh Pande |
4:5d91b0f5038c | 2396 | extern void sn_nsdl_release_allocated_coap_msg_mem(struct nsdl_s *handle, sn_coap_hdr_s *freed_coap_msg_ptr) |
Yogesh Pande |
4:5d91b0f5038c | 2397 | { |
Yogesh Pande |
4:5d91b0f5038c | 2398 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2399 | return; |
Yogesh Pande |
4:5d91b0f5038c | 2400 | } |
Yogesh Pande |
4:5d91b0f5038c | 2401 | |
Yogesh Pande |
4:5d91b0f5038c | 2402 | sn_coap_parser_release_allocated_coap_msg_mem(handle->grs->coap, freed_coap_msg_ptr); |
Yogesh Pande |
4:5d91b0f5038c | 2403 | } |
Yogesh Pande |
4:5d91b0f5038c | 2404 | |
Yogesh Pande |
4:5d91b0f5038c | 2405 | extern int8_t sn_nsdl_set_retransmission_parameters(struct nsdl_s *handle, |
Yogesh Pande |
4:5d91b0f5038c | 2406 | uint8_t resending_count, uint8_t resending_interval) |
Yogesh Pande |
4:5d91b0f5038c | 2407 | { |
Yogesh Pande |
4:5d91b0f5038c | 2408 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2409 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2410 | } |
Yogesh Pande |
4:5d91b0f5038c | 2411 | return sn_coap_protocol_set_retransmission_parameters(handle->grs->coap, |
Yogesh Pande |
4:5d91b0f5038c | 2412 | resending_count,resending_interval); |
Yogesh Pande |
4:5d91b0f5038c | 2413 | } |
Yogesh Pande |
4:5d91b0f5038c | 2414 | |
Yogesh Pande |
4:5d91b0f5038c | 2415 | extern int8_t sn_nsdl_set_retransmission_buffer(struct nsdl_s *handle, |
Yogesh Pande |
4:5d91b0f5038c | 2416 | uint8_t buffer_size_messages, uint16_t buffer_size_bytes) |
Yogesh Pande |
4:5d91b0f5038c | 2417 | { |
Yogesh Pande |
4:5d91b0f5038c | 2418 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2419 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2420 | } |
Yogesh Pande |
4:5d91b0f5038c | 2421 | return sn_coap_protocol_set_retransmission_buffer(handle->grs->coap, |
Yogesh Pande |
4:5d91b0f5038c | 2422 | buffer_size_messages, buffer_size_bytes); |
Yogesh Pande |
4:5d91b0f5038c | 2423 | } |
Yogesh Pande |
4:5d91b0f5038c | 2424 | |
Yogesh Pande |
4:5d91b0f5038c | 2425 | extern int8_t sn_nsdl_set_block_size(struct nsdl_s *handle, uint16_t block_size) |
Yogesh Pande |
4:5d91b0f5038c | 2426 | { |
Yogesh Pande |
4:5d91b0f5038c | 2427 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2428 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2429 | } |
Yogesh Pande |
4:5d91b0f5038c | 2430 | return sn_coap_protocol_set_block_size(handle->grs->coap, block_size); |
Yogesh Pande |
4:5d91b0f5038c | 2431 | } |
Yogesh Pande |
4:5d91b0f5038c | 2432 | |
Yogesh Pande |
4:5d91b0f5038c | 2433 | extern int8_t sn_nsdl_set_duplicate_buffer_size(struct nsdl_s *handle, uint8_t message_count) |
Yogesh Pande |
4:5d91b0f5038c | 2434 | { |
Yogesh Pande |
4:5d91b0f5038c | 2435 | if (handle == NULL) { |
Yogesh Pande |
4:5d91b0f5038c | 2436 | return SN_NSDL_FAILURE; |
Yogesh Pande |
4:5d91b0f5038c | 2437 | } |
Yogesh Pande |
4:5d91b0f5038c | 2438 | return sn_coap_protocol_set_duplicate_buffer_size(handle->grs->coap, message_count); |
Yogesh Pande |
4:5d91b0f5038c | 2439 | } |
Yogesh Pande |
4:5d91b0f5038c | 2440 |