version of nsdl to work with lwm2m, updated RD parameters and location option handling

Dependents:   ArchPro_LWM2M_LED_Client Weather_Station_LWM2M mbedEndpointNetwork

Fork of nanoservice_client_1_12 by Zach Shelby

Committer:
michaeljkoster
Date:
Mon Apr 13 22:13:40 2015 +0000
Revision:
10:b5ecd6660d71
Parent:
9:92486dc835ee
Add error return from sn_nsdl_register_endpoint() in sn_nsdl.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljkoster 2:1026c63b698f 1 /**
michaeljkoster 2:1026c63b698f 2 * \file sn_nsdl.c
michaeljkoster 2:1026c63b698f 3 *
michaeljkoster 2:1026c63b698f 4 * \brief Nano service device library
michaeljkoster 2:1026c63b698f 5 *
michaeljkoster 2:1026c63b698f 6 * Application interface to CoAP, GRS and NSP handling.
michaeljkoster 2:1026c63b698f 7 *
michaeljkoster 2:1026c63b698f 8 */
michaeljkoster 2:1026c63b698f 9
michaeljkoster 2:1026c63b698f 10 #include <string.h>
michaeljkoster 2:1026c63b698f 11
michaeljkoster 2:1026c63b698f 12 #include "nsdl_types.h"
michaeljkoster 2:1026c63b698f 13 #include "sn_nsdl.h"
michaeljkoster 2:1026c63b698f 14 #include "sn_coap_header.h"
michaeljkoster 2:1026c63b698f 15 #include "sn_coap_protocol.h"
michaeljkoster 2:1026c63b698f 16 #include "sn_nsdl_lib.h"
michaeljkoster 2:1026c63b698f 17 #include "sn_grs.h"
michaeljkoster 2:1026c63b698f 18 #include "sn_linked_list.h"
michaeljkoster 2:1026c63b698f 19
michaeljkoster 2:1026c63b698f 20 /* Defines */
michaeljkoster 2:1026c63b698f 21 #define RESOURCE_DIR_LEN 2
michaeljkoster 2:1026c63b698f 22 #define RESOURCE_DIR_PATH {'r','d'}
michaeljkoster 2:1026c63b698f 23
michaeljkoster 2:1026c63b698f 24 #define EP_NAME_PARAMETERS_LEN 3
michaeljkoster 2:1026c63b698f 25 #define EP_NAME_PARAMETERS {'e','p','='}
michaeljkoster 2:1026c63b698f 26
michaeljkoster 2:1026c63b698f 27 #define EP_TYPE_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 28 #define EP_TYPE_PARAMETER {'e','t','='}
michaeljkoster 2:1026c63b698f 29
michaeljkoster 2:1026c63b698f 30 #define RT_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 31 #define RT_PARAMETER {'r','t','='}
michaeljkoster 2:1026c63b698f 32
michaeljkoster 2:1026c63b698f 33 #define IF_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 34 #define IF_PARAMETER {'i','f','='}
michaeljkoster 2:1026c63b698f 35
michaeljkoster 2:1026c63b698f 36 #define CON_PARAMETER_LEN 4
michaeljkoster 2:1026c63b698f 37 #define CON_PARAMETER {'c','o','n','='}
michaeljkoster 2:1026c63b698f 38
michaeljkoster 2:1026c63b698f 39 #define LT_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 40 #define LT_PARAMETER {'l','t','='}
michaeljkoster 2:1026c63b698f 41
michaeljkoster 2:1026c63b698f 42 #define OBS_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 43 #define OBS_PARAMETER {'o','b','s'}
michaeljkoster 2:1026c63b698f 44
michaeljkoster 2:1026c63b698f 45 #define AOBS_PARAMETER_LEN 8
michaeljkoster 2:1026c63b698f 46 #define AOBS_PARAMETER {'a','o','b','s',';','i','d','='}
michaeljkoster 2:1026c63b698f 47
michaeljkoster 2:1026c63b698f 48 #define COAP_CON_PARAMETER_LEN 3
michaeljkoster 2:1026c63b698f 49 #define COAP_CON_PARAMETER {'c','t','='}
michaeljkoster 2:1026c63b698f 50
michaeljkoster 2:1026c63b698f 51 #define EVENT_PATH_LEN 6
michaeljkoster 2:1026c63b698f 52 #define EVENT_PATH {'e','v','e','n','t','/'}
michaeljkoster 2:1026c63b698f 53
michaeljkoster 2:1026c63b698f 54 #define SN_NSDL_EP_REGISTER_MESSAGE 1
michaeljkoster 2:1026c63b698f 55 #define SN_NSDL_EP_UPDATE_MESSAGE 2
michaeljkoster 2:1026c63b698f 56
michaeljkoster 2:1026c63b698f 57 #define SN_NSDL_MSG_NO_TYPE 0
michaeljkoster 2:1026c63b698f 58 #define SN_NSDL_MSG_REGISTER 1
michaeljkoster 2:1026c63b698f 59 #define SN_NSDL_MSG_UNREGISTER 2
michaeljkoster 2:1026c63b698f 60 #define SN_NSDL_MSG_UPDATE 3
michaeljkoster 2:1026c63b698f 61 #define SN_NSDL_MSG_EVENT 4
michaeljkoster 2:1026c63b698f 62
michaeljkoster 2:1026c63b698f 63 #define SN_NSDL_MAX_MESSAGE_COUNT 1
michaeljkoster 2:1026c63b698f 64
michaeljkoster 2:1026c63b698f 65 /* Constants */
michaeljkoster 2:1026c63b698f 66 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 67 static uint8_t ep_name_parameter_string[] = EP_NAME_PARAMETERS;
michaeljkoster 2:1026c63b698f 68
michaeljkoster 2:1026c63b698f 69 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 70 static uint8_t ep_type_parameter_string[] = EP_TYPE_PARAMETER;
michaeljkoster 2:1026c63b698f 71
michaeljkoster 2:1026c63b698f 72 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 73 static uint8_t resource_path_ptr[] = RESOURCE_DIR_PATH;
michaeljkoster 2:1026c63b698f 74
michaeljkoster 2:1026c63b698f 75 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 76 static uint8_t resource_type_parameter[] = RT_PARAMETER;
michaeljkoster 2:1026c63b698f 77
michaeljkoster 2:1026c63b698f 78 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 79 static uint8_t obs_parameter[] = OBS_PARAMETER;
michaeljkoster 2:1026c63b698f 80
michaeljkoster 2:1026c63b698f 81 //SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 82 //static uint8_t aobs_parameter[] = AOBS_PARAMETER;
michaeljkoster 2:1026c63b698f 83
michaeljkoster 2:1026c63b698f 84 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 85 static uint8_t if_description_parameter[] = IF_PARAMETER;
michaeljkoster 2:1026c63b698f 86
michaeljkoster 2:1026c63b698f 87 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 88 static uint8_t ep_lifetime_parameter[] = LT_PARAMETER;
michaeljkoster 2:1026c63b698f 89
michaeljkoster 2:1026c63b698f 90 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 91 static uint8_t coap_con_type_parameter[] = COAP_CON_PARAMETER;
michaeljkoster 2:1026c63b698f 92
michaeljkoster 2:1026c63b698f 93 SN_NSDL_CONST_MEMORY_ATTRIBUTE
michaeljkoster 2:1026c63b698f 94 static uint8_t event_path_parameter[] = EVENT_PATH;
michaeljkoster 2:1026c63b698f 95
michaeljkoster 2:1026c63b698f 96 /* Global function pointers */
michaeljkoster 2:1026c63b698f 97 static void *(*sn_nsdl_alloc)(uint16_t) = 0;
michaeljkoster 2:1026c63b698f 98 static void (*sn_nsdl_free)(void*) = 0;
michaeljkoster 2:1026c63b698f 99 static uint8_t (*sn_nsdl_tx_callback)(sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *) = 0;
michaeljkoster 2:1026c63b698f 100 static uint8_t (*sn_nsdl_rx_callback)(sn_coap_hdr_s *, sn_nsdl_addr_s *) = 0;
michaeljkoster 2:1026c63b698f 101
michaeljkoster 2:1026c63b698f 102 /* Global variables */
michaeljkoster 2:1026c63b698f 103 static sn_nsdl_ep_parameters_s *ep_information_ptr = 0; // Endpoint parameters, Name, Domain etc..
michaeljkoster 2:1026c63b698f 104 static sn_nsdl_addr_s *nsp_address_ptr = 0; // NSP server address information
michaeljkoster 2:1026c63b698f 105 static sn_linked_list_t *message_list_ptr = 0; //
michaeljkoster 2:1026c63b698f 106 static uint8_t sn_nsdl_endpoint_registered = 0;
michaeljkoster 4:bfa3d2283925 107 static uint8_t *ep_registration_location_ptr = 0; // captured location path from EP registration
michaeljkoster 4:bfa3d2283925 108 static uint8_t ep_registration_location_len = 0; // location path length from registration
michaeljkoster 2:1026c63b698f 109
michaeljkoster 2:1026c63b698f 110 /* Function prototypes */
michaeljkoster 2:1026c63b698f 111 static int8_t sn_nsdl_internal_coap_send (sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description);
michaeljkoster 2:1026c63b698f 112 static void sn_nsdl_resolve_nsp_address (void);
michaeljkoster 2:1026c63b698f 113 int8_t sn_nsdl_build_registration_body (sn_coap_hdr_s *message_ptr, uint8_t updating_registeration);
michaeljkoster 2:1026c63b698f 114 static uint16_t sn_nsdl_calculate_registration_body_size (uint8_t updating_registeration);
michaeljkoster 2:1026c63b698f 115 static uint8_t sn_nsdl_calculate_uri_query_option_len (sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type);
michaeljkoster 2:1026c63b698f 116 static int8_t sn_nsdl_fill_uri_query_options (sn_nsdl_ep_parameters_s *parameter_ptr, sn_coap_hdr_s *source_msg_ptr, uint8_t msg_type);
michaeljkoster 2:1026c63b698f 117 static int8_t sn_nsdl_local_rx_function (sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr);
michaeljkoster 2:1026c63b698f 118 static int8_t sn_nsdl_resolve_ep_information (sn_coap_hdr_s *coap_packet_ptr);
michaeljkoster 2:1026c63b698f 119 static void sn_nsdl_mark_resources_as_registered (void);
michaeljkoster 2:1026c63b698f 120 static uint8_t sn_nsdl_itoa_len (uint8_t value);
michaeljkoster 2:1026c63b698f 121 static uint8_t *sn_nsdl_itoa (uint8_t *ptr, uint8_t value);
michaeljkoster 2:1026c63b698f 122
michaeljkoster 2:1026c63b698f 123
michaeljkoster 2:1026c63b698f 124 int8_t sn_nsdl_destroy(void)
michaeljkoster 2:1026c63b698f 125 {
michaeljkoster 2:1026c63b698f 126 if(message_list_ptr)
michaeljkoster 2:1026c63b698f 127 {
michaeljkoster 2:1026c63b698f 128 uint16_t size = sn_linked_list_count_nodes(message_list_ptr);
michaeljkoster 2:1026c63b698f 129 uint16_t i = 0;
michaeljkoster 2:1026c63b698f 130 sn_nsdl_sent_messages_s*tmp;
michaeljkoster 2:1026c63b698f 131
michaeljkoster 2:1026c63b698f 132
michaeljkoster 2:1026c63b698f 133 for(i=0;i<size;i++)
michaeljkoster 2:1026c63b698f 134 {
michaeljkoster 2:1026c63b698f 135 tmp = sn_linked_list_get_first_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 136
michaeljkoster 2:1026c63b698f 137 if(tmp)
michaeljkoster 2:1026c63b698f 138 {
michaeljkoster 2:1026c63b698f 139 sn_linked_list_remove_current_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 140 sn_nsdl_free(tmp);
michaeljkoster 2:1026c63b698f 141 tmp = 0;
michaeljkoster 2:1026c63b698f 142 }
michaeljkoster 2:1026c63b698f 143 }
michaeljkoster 2:1026c63b698f 144
michaeljkoster 2:1026c63b698f 145 if(!sn_linked_list_count_nodes(message_list_ptr))
michaeljkoster 2:1026c63b698f 146 {
michaeljkoster 2:1026c63b698f 147 sn_linked_list_free(message_list_ptr);
michaeljkoster 2:1026c63b698f 148 message_list_ptr = 0;
michaeljkoster 2:1026c63b698f 149 }
michaeljkoster 2:1026c63b698f 150 }
michaeljkoster 2:1026c63b698f 151
michaeljkoster 2:1026c63b698f 152 if(ep_information_ptr)
michaeljkoster 2:1026c63b698f 153 {
michaeljkoster 2:1026c63b698f 154 if(ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 155 {
michaeljkoster 2:1026c63b698f 156 sn_nsdl_free(ep_information_ptr->endpoint_name_ptr);
michaeljkoster 2:1026c63b698f 157 ep_information_ptr->endpoint_name_ptr = 0;
michaeljkoster 2:1026c63b698f 158 }
michaeljkoster 2:1026c63b698f 159 if(ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 160 {
michaeljkoster 2:1026c63b698f 161 sn_nsdl_free(ep_information_ptr->domain_name_ptr);
michaeljkoster 2:1026c63b698f 162 ep_information_ptr->domain_name_ptr = 0;
michaeljkoster 2:1026c63b698f 163 ep_information_ptr->domain_name_len = 0;
michaeljkoster 2:1026c63b698f 164 }
michaeljkoster 2:1026c63b698f 165 if(ep_information_ptr->type_ptr)
michaeljkoster 2:1026c63b698f 166 {
michaeljkoster 2:1026c63b698f 167 sn_nsdl_free(ep_information_ptr->type_ptr);
michaeljkoster 2:1026c63b698f 168 ep_information_ptr->type_ptr = 0;
michaeljkoster 2:1026c63b698f 169 }
michaeljkoster 2:1026c63b698f 170
michaeljkoster 2:1026c63b698f 171 if(ep_information_ptr->lifetime_ptr)
michaeljkoster 2:1026c63b698f 172
michaeljkoster 2:1026c63b698f 173 {
michaeljkoster 2:1026c63b698f 174 sn_nsdl_free(ep_information_ptr->lifetime_ptr);
michaeljkoster 2:1026c63b698f 175 ep_information_ptr->lifetime_ptr = 0;
michaeljkoster 2:1026c63b698f 176 }
michaeljkoster 2:1026c63b698f 177
michaeljkoster 2:1026c63b698f 178 sn_nsdl_free(ep_information_ptr);
michaeljkoster 2:1026c63b698f 179 ep_information_ptr = 0;
michaeljkoster 2:1026c63b698f 180 }
michaeljkoster 2:1026c63b698f 181
michaeljkoster 2:1026c63b698f 182 if(nsp_address_ptr)
michaeljkoster 2:1026c63b698f 183 {
michaeljkoster 2:1026c63b698f 184 if(nsp_address_ptr->socket_information)
michaeljkoster 2:1026c63b698f 185 {
michaeljkoster 2:1026c63b698f 186 sn_nsdl_free(nsp_address_ptr->socket_information);
michaeljkoster 2:1026c63b698f 187 nsp_address_ptr->socket_information= 0;
michaeljkoster 2:1026c63b698f 188 }
michaeljkoster 2:1026c63b698f 189
michaeljkoster 2:1026c63b698f 190 if(nsp_address_ptr->addr_ptr)
michaeljkoster 2:1026c63b698f 191 {
michaeljkoster 2:1026c63b698f 192 sn_nsdl_free(nsp_address_ptr->addr_ptr);
michaeljkoster 2:1026c63b698f 193 nsp_address_ptr->addr_ptr = 0;
michaeljkoster 2:1026c63b698f 194 }
michaeljkoster 2:1026c63b698f 195 sn_nsdl_free(nsp_address_ptr);
michaeljkoster 2:1026c63b698f 196 nsp_address_ptr = 0;
michaeljkoster 2:1026c63b698f 197 }
michaeljkoster 5:613a7624c473 198
michaeljkoster 4:bfa3d2283925 199 if (ep_registration_location_ptr)
michaeljkoster 4:bfa3d2283925 200 {
michaeljkoster 4:bfa3d2283925 201 sn_nsdl_free(ep_registration_location_ptr);
michaeljkoster 4:bfa3d2283925 202 ep_registration_location_ptr = 0;
michaeljkoster 4:bfa3d2283925 203 }
michaeljkoster 4:bfa3d2283925 204
michaeljkoster 2:1026c63b698f 205 /* Destroy also libCoap and grs part of libNsdl */
michaeljkoster 2:1026c63b698f 206 sn_grs_destroy();
michaeljkoster 2:1026c63b698f 207 sn_coap_protocol_destroy();
michaeljkoster 2:1026c63b698f 208
michaeljkoster 2:1026c63b698f 209 return 0;
michaeljkoster 2:1026c63b698f 210 }
michaeljkoster 2:1026c63b698f 211
michaeljkoster 2:1026c63b698f 212 int8_t sn_nsdl_init (uint8_t (*sn_nsdl_tx_cb)(sn_nsdl_capab_e , uint8_t *, uint16_t, sn_nsdl_addr_s *),
michaeljkoster 2:1026c63b698f 213 uint8_t (*sn_nsdl_rx_cb)(sn_coap_hdr_s *, sn_nsdl_addr_s *),
michaeljkoster 2:1026c63b698f 214 sn_nsdl_mem_s *sn_memory)
michaeljkoster 2:1026c63b698f 215 {
michaeljkoster 2:1026c63b698f 216 /* Check pointers and define function pointers */
michaeljkoster 2:1026c63b698f 217 if(!sn_memory || !sn_memory->sn_nsdl_alloc || !sn_memory->sn_nsdl_free || !sn_nsdl_tx_cb || !sn_nsdl_rx_cb)
michaeljkoster 2:1026c63b698f 218 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 219
michaeljkoster 2:1026c63b698f 220 /* Define function pointers */
michaeljkoster 2:1026c63b698f 221 sn_nsdl_alloc = sn_memory->sn_nsdl_alloc;
michaeljkoster 2:1026c63b698f 222 sn_nsdl_free = sn_memory->sn_nsdl_free;
michaeljkoster 2:1026c63b698f 223
michaeljkoster 2:1026c63b698f 224 sn_nsdl_tx_callback = sn_nsdl_tx_cb;
michaeljkoster 2:1026c63b698f 225 sn_nsdl_rx_callback = sn_nsdl_rx_cb;
michaeljkoster 2:1026c63b698f 226
michaeljkoster 2:1026c63b698f 227 sn_linked_list_init(sn_nsdl_alloc, sn_nsdl_free);
michaeljkoster 2:1026c63b698f 228
michaeljkoster 2:1026c63b698f 229 message_list_ptr = sn_linked_list_create();
michaeljkoster 2:1026c63b698f 230 if(!message_list_ptr)
michaeljkoster 2:1026c63b698f 231 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 232
michaeljkoster 2:1026c63b698f 233 /* Initialize ep parameters struct */
michaeljkoster 2:1026c63b698f 234 if(!ep_information_ptr)
michaeljkoster 2:1026c63b698f 235 {
michaeljkoster 2:1026c63b698f 236 ep_information_ptr = sn_nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 2:1026c63b698f 237 if(!ep_information_ptr)
michaeljkoster 2:1026c63b698f 238 {
michaeljkoster 2:1026c63b698f 239 sn_linked_list_free(message_list_ptr);
michaeljkoster 2:1026c63b698f 240 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 241 }
michaeljkoster 2:1026c63b698f 242 memset(ep_information_ptr, 0, sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 2:1026c63b698f 243 }
michaeljkoster 2:1026c63b698f 244
michaeljkoster 2:1026c63b698f 245 /* Initialize GRS */
michaeljkoster 2:1026c63b698f 246 if(sn_grs_init(sn_nsdl_tx_cb,&sn_nsdl_local_rx_function, sn_memory))
michaeljkoster 2:1026c63b698f 247 {
michaeljkoster 2:1026c63b698f 248
michaeljkoster 2:1026c63b698f 249 sn_nsdl_free(ep_information_ptr);
michaeljkoster 2:1026c63b698f 250 ep_information_ptr = 0;
michaeljkoster 2:1026c63b698f 251 sn_linked_list_free(message_list_ptr);
michaeljkoster 2:1026c63b698f 252 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 253
michaeljkoster 2:1026c63b698f 254 }
michaeljkoster 2:1026c63b698f 255
michaeljkoster 2:1026c63b698f 256 // todo: Resolve NS server address -> v0.5 = hardcoded address
michaeljkoster 2:1026c63b698f 257 sn_nsdl_resolve_nsp_address();
michaeljkoster 2:1026c63b698f 258
michaeljkoster 2:1026c63b698f 259 sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED;
michaeljkoster 2:1026c63b698f 260
michaeljkoster 2:1026c63b698f 261 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 262 }
michaeljkoster 2:1026c63b698f 263
michaeljkoster 2:1026c63b698f 264 int8_t sn_nsdl_GET_with_QUERY(char * uri, uint16_t urilen, uint8_t*destination, uint16_t port, char *query, uint8_t query_len)
michaeljkoster 2:1026c63b698f 265 {
michaeljkoster 2:1026c63b698f 266 sn_coap_hdr_s *message_ptr;
michaeljkoster 2:1026c63b698f 267 sn_nsdl_addr_s *dst = 0;
michaeljkoster 2:1026c63b698f 268
michaeljkoster 2:1026c63b698f 269 message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 270 if(message_ptr == NULL)
michaeljkoster 2:1026c63b698f 271 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 272
michaeljkoster 2:1026c63b698f 273 memset(message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 274
michaeljkoster 2:1026c63b698f 275 /* Fill message fields -> confirmable post to specified NSP path */
michaeljkoster 2:1026c63b698f 276 message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 277 message_ptr->msg_code = COAP_MSG_CODE_REQUEST_GET;
michaeljkoster 2:1026c63b698f 278 /* Allocate memory for the extended options list */
michaeljkoster 2:1026c63b698f 279 message_ptr->options_list_ptr = sn_nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 280 if(message_ptr->options_list_ptr == NULL)
michaeljkoster 2:1026c63b698f 281 {
michaeljkoster 2:1026c63b698f 282 sn_nsdl_free(message_ptr);
michaeljkoster 2:1026c63b698f 283 message_ptr = 0;
michaeljkoster 2:1026c63b698f 284 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 285 }
michaeljkoster 2:1026c63b698f 286
michaeljkoster 2:1026c63b698f 287
michaeljkoster 2:1026c63b698f 288 memset(message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 289 message_ptr->options_list_ptr->uri_query_len =query_len;
michaeljkoster 2:1026c63b698f 290 message_ptr->options_list_ptr->uri_query_ptr = (uint8_t *)query;
michaeljkoster 2:1026c63b698f 291 message_ptr->uri_path_len = urilen;
michaeljkoster 2:1026c63b698f 292 message_ptr->uri_path_ptr = (uint8_t *)uri;
michaeljkoster 2:1026c63b698f 293
michaeljkoster 2:1026c63b698f 294 /* Build and send coap message to NSP */
michaeljkoster 2:1026c63b698f 295 /* Local variables */
michaeljkoster 2:1026c63b698f 296 if(!dst)
michaeljkoster 2:1026c63b698f 297 {
michaeljkoster 2:1026c63b698f 298 //allocate only if previously not allocated
michaeljkoster 2:1026c63b698f 299 dst = sn_nsdl_alloc(sizeof(sn_nsdl_addr_s));
michaeljkoster 2:1026c63b698f 300 }
michaeljkoster 2:1026c63b698f 301
michaeljkoster 2:1026c63b698f 302 if(dst)
michaeljkoster 2:1026c63b698f 303 {
michaeljkoster 2:1026c63b698f 304 /* This is only for version 0.5 */
michaeljkoster 2:1026c63b698f 305 dst->type = SN_NSDL_ADDRESS_TYPE_IPV6;
michaeljkoster 2:1026c63b698f 306 dst->port = port;
michaeljkoster 2:1026c63b698f 307 dst->addr_len = 16;
michaeljkoster 2:1026c63b698f 308 if(!dst->addr_ptr)
michaeljkoster 2:1026c63b698f 309 {
michaeljkoster 2:1026c63b698f 310 dst->addr_ptr = sn_nsdl_alloc(dst->addr_len);
michaeljkoster 2:1026c63b698f 311 memcpy(dst->addr_ptr, destination, 16);
michaeljkoster 2:1026c63b698f 312 }
michaeljkoster 2:1026c63b698f 313 }
michaeljkoster 2:1026c63b698f 314
michaeljkoster 2:1026c63b698f 315 sn_grs_send_coap_message(dst, message_ptr);
michaeljkoster 2:1026c63b698f 316
michaeljkoster 2:1026c63b698f 317 if(dst->addr_ptr)
michaeljkoster 2:1026c63b698f 318 sn_nsdl_free(dst->addr_ptr);
michaeljkoster 2:1026c63b698f 319
michaeljkoster 2:1026c63b698f 320 if(dst)
michaeljkoster 2:1026c63b698f 321 sn_nsdl_free(dst);
michaeljkoster 2:1026c63b698f 322 message_ptr->uri_path_ptr = NULL;
michaeljkoster 2:1026c63b698f 323 message_ptr->options_list_ptr->uri_host_ptr = NULL;
michaeljkoster 2:1026c63b698f 324 message_ptr->options_list_ptr->uri_query_ptr = NULL;
michaeljkoster 2:1026c63b698f 325
michaeljkoster 2:1026c63b698f 326 sn_coap_parser_release_allocated_coap_msg_mem(message_ptr);
michaeljkoster 2:1026c63b698f 327 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 328 }
michaeljkoster 2:1026c63b698f 329
michaeljkoster 2:1026c63b698f 330 int8_t sn_nsdl_GET(char * uri, uint16_t urilen, uint8_t*destination, uint16_t port)
michaeljkoster 2:1026c63b698f 331 {
michaeljkoster 2:1026c63b698f 332 sn_coap_hdr_s *message_ptr;
michaeljkoster 2:1026c63b698f 333 sn_nsdl_addr_s *dst = 0;
michaeljkoster 2:1026c63b698f 334
michaeljkoster 2:1026c63b698f 335
michaeljkoster 2:1026c63b698f 336 message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 337 if(message_ptr == NULL)
michaeljkoster 2:1026c63b698f 338 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 339
michaeljkoster 2:1026c63b698f 340 memset(message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 341
michaeljkoster 2:1026c63b698f 342 /* Fill message fields -> confirmable post to specified NSP path */
michaeljkoster 2:1026c63b698f 343 message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 344 message_ptr->msg_code = COAP_MSG_CODE_REQUEST_GET;
michaeljkoster 2:1026c63b698f 345 /* Allocate memory for the extended options list */
michaeljkoster 2:1026c63b698f 346 message_ptr->options_list_ptr = sn_nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 347 if(message_ptr->options_list_ptr == NULL)
michaeljkoster 2:1026c63b698f 348 {
michaeljkoster 2:1026c63b698f 349 sn_nsdl_free(message_ptr);
michaeljkoster 2:1026c63b698f 350 message_ptr = 0;
michaeljkoster 2:1026c63b698f 351 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 352 }
michaeljkoster 2:1026c63b698f 353
michaeljkoster 2:1026c63b698f 354
michaeljkoster 2:1026c63b698f 355 memset(message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 356
michaeljkoster 2:1026c63b698f 357 message_ptr->uri_path_len = urilen;
michaeljkoster 2:1026c63b698f 358 message_ptr->uri_path_ptr = (uint8_t *)uri;
michaeljkoster 2:1026c63b698f 359
michaeljkoster 2:1026c63b698f 360 /* Build and send coap message to NSP */
michaeljkoster 2:1026c63b698f 361 /* Local variables */
michaeljkoster 2:1026c63b698f 362 if(!dst)
michaeljkoster 2:1026c63b698f 363 {
michaeljkoster 2:1026c63b698f 364 //allocate only if previously not allocated
michaeljkoster 2:1026c63b698f 365 dst = sn_nsdl_alloc(sizeof(sn_nsdl_addr_s));
michaeljkoster 2:1026c63b698f 366 memset(dst, 0, sizeof(sn_nsdl_addr_s));
michaeljkoster 2:1026c63b698f 367 }
michaeljkoster 2:1026c63b698f 368
michaeljkoster 2:1026c63b698f 369 if(dst)
michaeljkoster 2:1026c63b698f 370 {
michaeljkoster 2:1026c63b698f 371 /* This is only for version 0.5 */
michaeljkoster 2:1026c63b698f 372 dst->type = SN_NSDL_ADDRESS_TYPE_IPV6;
michaeljkoster 2:1026c63b698f 373 dst->port = port;
michaeljkoster 2:1026c63b698f 374 dst->addr_len = 16;
michaeljkoster 2:1026c63b698f 375 if(!dst->addr_ptr)
michaeljkoster 2:1026c63b698f 376 {
michaeljkoster 2:1026c63b698f 377 dst->addr_ptr = sn_nsdl_alloc(dst->addr_len);
michaeljkoster 2:1026c63b698f 378 memcpy(dst->addr_ptr, destination, 16);
michaeljkoster 2:1026c63b698f 379 }
michaeljkoster 2:1026c63b698f 380 }
michaeljkoster 2:1026c63b698f 381 sn_grs_send_coap_message(dst, message_ptr);
michaeljkoster 2:1026c63b698f 382
michaeljkoster 2:1026c63b698f 383 if(dst->addr_ptr)
michaeljkoster 2:1026c63b698f 384 sn_nsdl_free(dst->addr_ptr);
michaeljkoster 2:1026c63b698f 385 if(dst)
michaeljkoster 2:1026c63b698f 386 sn_nsdl_free(dst);
michaeljkoster 2:1026c63b698f 387 message_ptr->uri_path_ptr = NULL;
michaeljkoster 2:1026c63b698f 388 message_ptr->options_list_ptr->uri_host_ptr = NULL;
michaeljkoster 2:1026c63b698f 389
michaeljkoster 2:1026c63b698f 390 sn_coap_parser_release_allocated_coap_msg_mem(message_ptr);
michaeljkoster 2:1026c63b698f 391 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 392 }
michaeljkoster 2:1026c63b698f 393
michaeljkoster 2:1026c63b698f 394
michaeljkoster 2:1026c63b698f 395
michaeljkoster 2:1026c63b698f 396 int8_t sn_nsdl_register_endpoint(sn_nsdl_ep_parameters_s *endpoint_info_ptr)
michaeljkoster 2:1026c63b698f 397 {
michaeljkoster 2:1026c63b698f 398 /* Local variables */
michaeljkoster 2:1026c63b698f 399 sn_coap_hdr_s *register_message_ptr;
michaeljkoster 2:1026c63b698f 400 int8_t status = 0;
michaeljkoster 2:1026c63b698f 401
michaeljkoster 2:1026c63b698f 402 if(!endpoint_info_ptr)
michaeljkoster 2:1026c63b698f 403 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 404
michaeljkoster 2:1026c63b698f 405 /*** Build endpoint register message ***/
michaeljkoster 2:1026c63b698f 406
michaeljkoster 2:1026c63b698f 407 /* Allocate memory for header struct */
michaeljkoster 2:1026c63b698f 408 register_message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 409 if(register_message_ptr == NULL)
michaeljkoster 2:1026c63b698f 410 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 411
michaeljkoster 2:1026c63b698f 412 memset(register_message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 413
michaeljkoster 2:1026c63b698f 414 /* Fill message fields -> confirmable post to specified NSP path */
michaeljkoster 2:1026c63b698f 415 register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 416 register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST;
michaeljkoster 2:1026c63b698f 417
michaeljkoster 2:1026c63b698f 418 /* Allocate memory for the extended options list */
michaeljkoster 2:1026c63b698f 419 register_message_ptr->options_list_ptr = sn_nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 420 if(register_message_ptr->options_list_ptr == NULL)
michaeljkoster 2:1026c63b698f 421 {
michaeljkoster 2:1026c63b698f 422 sn_nsdl_free(register_message_ptr);
michaeljkoster 2:1026c63b698f 423 register_message_ptr = 0;
michaeljkoster 2:1026c63b698f 424 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 425 }
michaeljkoster 2:1026c63b698f 426
michaeljkoster 2:1026c63b698f 427 memset(register_message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 428
michaeljkoster 2:1026c63b698f 429 register_message_ptr->uri_path_len = sizeof(resource_path_ptr);
michaeljkoster 2:1026c63b698f 430 register_message_ptr->uri_path_ptr = resource_path_ptr;
michaeljkoster 2:1026c63b698f 431
michaeljkoster 2:1026c63b698f 432 /* If domain name is configured, fill needed fields */
michaeljkoster 5:613a7624c473 433 // FIXME Domain name should be registered as "d=domain" query parameter, not in option uri-host
michaeljkoster 2:1026c63b698f 434 if(endpoint_info_ptr->domain_name_len)
michaeljkoster 2:1026c63b698f 435 {
michaeljkoster 2:1026c63b698f 436 register_message_ptr->options_list_ptr->uri_host_len = endpoint_info_ptr->domain_name_len;
michaeljkoster 2:1026c63b698f 437 register_message_ptr->options_list_ptr->uri_host_ptr = endpoint_info_ptr->domain_name_ptr;
michaeljkoster 2:1026c63b698f 438 }
michaeljkoster 2:1026c63b698f 439
michaeljkoster 2:1026c63b698f 440 /* Fill Uri-query options */
michaeljkoster 2:1026c63b698f 441 sn_nsdl_fill_uri_query_options(endpoint_info_ptr, register_message_ptr, SN_NSDL_EP_REGISTER_MESSAGE);
michaeljkoster 2:1026c63b698f 442 #ifndef REG_TEMPLATE
michaeljkoster 2:1026c63b698f 443 /* Built body for message */
michaeljkoster 2:1026c63b698f 444 status = sn_nsdl_build_registration_body(register_message_ptr, 0);
michaeljkoster 2:1026c63b698f 445 if(status == SN_NSDL_FAILURE)
michaeljkoster 2:1026c63b698f 446 {
michaeljkoster 2:1026c63b698f 447 register_message_ptr->uri_path_ptr = NULL;
michaeljkoster 2:1026c63b698f 448 register_message_ptr->options_list_ptr->uri_host_ptr = NULL;
michaeljkoster 2:1026c63b698f 449 sn_coap_parser_release_allocated_coap_msg_mem(register_message_ptr);
michaeljkoster 2:1026c63b698f 450 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 451 }
michaeljkoster 2:1026c63b698f 452 #endif
michaeljkoster 2:1026c63b698f 453 /* Build and send coap message to NSP */
michaeljkoster 2:1026c63b698f 454 status = sn_nsdl_internal_coap_send(register_message_ptr, nsp_address_ptr, SN_NSDL_MSG_REGISTER);
michaeljkoster 2:1026c63b698f 455
michaeljkoster 2:1026c63b698f 456 if(register_message_ptr->payload_ptr)
michaeljkoster 2:1026c63b698f 457 {
michaeljkoster 2:1026c63b698f 458 sn_nsdl_free(register_message_ptr->payload_ptr);
michaeljkoster 2:1026c63b698f 459 register_message_ptr->payload_ptr = NULL;
michaeljkoster 2:1026c63b698f 460 }
michaeljkoster 2:1026c63b698f 461
michaeljkoster 2:1026c63b698f 462 register_message_ptr->uri_path_ptr = NULL;
michaeljkoster 2:1026c63b698f 463 register_message_ptr->options_list_ptr->uri_host_ptr = NULL;
michaeljkoster 2:1026c63b698f 464
michaeljkoster 2:1026c63b698f 465 sn_coap_parser_release_allocated_coap_msg_mem(register_message_ptr);
michaeljkoster 2:1026c63b698f 466
michaeljkoster 2:1026c63b698f 467 if(ep_information_ptr)
michaeljkoster 2:1026c63b698f 468 {
michaeljkoster 2:1026c63b698f 469 if(ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 470 {
michaeljkoster 2:1026c63b698f 471 sn_nsdl_free(ep_information_ptr->domain_name_ptr);
michaeljkoster 2:1026c63b698f 472 ep_information_ptr->domain_name_ptr = 0;
michaeljkoster 2:1026c63b698f 473 ep_information_ptr->domain_name_len = 0;
michaeljkoster 2:1026c63b698f 474 }
michaeljkoster 2:1026c63b698f 475
michaeljkoster 2:1026c63b698f 476 if(ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 477 {
michaeljkoster 2:1026c63b698f 478 sn_nsdl_free(ep_information_ptr->endpoint_name_ptr);
michaeljkoster 2:1026c63b698f 479 ep_information_ptr->endpoint_name_ptr = 0;
michaeljkoster 2:1026c63b698f 480 ep_information_ptr->endpoint_name_len = 0;
michaeljkoster 2:1026c63b698f 481 }
michaeljkoster 2:1026c63b698f 482
michaeljkoster 2:1026c63b698f 483 if(endpoint_info_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 484 {
michaeljkoster 2:1026c63b698f 485
michaeljkoster 2:1026c63b698f 486 if(!ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 487 {
michaeljkoster 2:1026c63b698f 488 ep_information_ptr->domain_name_ptr = sn_nsdl_alloc(endpoint_info_ptr->domain_name_len);
michaeljkoster 2:1026c63b698f 489 }
michaeljkoster 2:1026c63b698f 490 if(!ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 491 {
michaeljkoster 2:1026c63b698f 492 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 493 }
michaeljkoster 2:1026c63b698f 494
michaeljkoster 2:1026c63b698f 495 memcpy(ep_information_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_ptr, endpoint_info_ptr->domain_name_len);
michaeljkoster 2:1026c63b698f 496 ep_information_ptr->domain_name_len = endpoint_info_ptr->domain_name_len;
michaeljkoster 2:1026c63b698f 497
michaeljkoster 2:1026c63b698f 498 }
michaeljkoster 2:1026c63b698f 499
michaeljkoster 2:1026c63b698f 500 if(endpoint_info_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 501 {
michaeljkoster 2:1026c63b698f 502
michaeljkoster 2:1026c63b698f 503 if(!ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 504 {
michaeljkoster 2:1026c63b698f 505 ep_information_ptr->endpoint_name_ptr = sn_nsdl_alloc(endpoint_info_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 506 }
michaeljkoster 2:1026c63b698f 507 if(!ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 508 {
michaeljkoster 2:1026c63b698f 509 if(ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 510 {
michaeljkoster 2:1026c63b698f 511 sn_nsdl_free(ep_information_ptr->domain_name_ptr);
michaeljkoster 2:1026c63b698f 512 ep_information_ptr->domain_name_ptr = 0;
michaeljkoster 2:1026c63b698f 513 ep_information_ptr->domain_name_len = 0;
michaeljkoster 2:1026c63b698f 514 }
michaeljkoster 2:1026c63b698f 515 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 516 }
michaeljkoster 2:1026c63b698f 517
michaeljkoster 2:1026c63b698f 518 memcpy(ep_information_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_ptr, endpoint_info_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 519 ep_information_ptr->endpoint_name_len = endpoint_info_ptr->endpoint_name_len;
michaeljkoster 2:1026c63b698f 520
michaeljkoster 2:1026c63b698f 521 }
michaeljkoster 2:1026c63b698f 522 }
michaeljkoster 2:1026c63b698f 523
michaeljkoster 2:1026c63b698f 524 return status;
michaeljkoster 2:1026c63b698f 525 }
michaeljkoster 2:1026c63b698f 526
michaeljkoster 2:1026c63b698f 527 int8_t sn_nsdl_unregister_endpoint(void)
michaeljkoster 2:1026c63b698f 528 {
michaeljkoster 2:1026c63b698f 529 /* Local variables */
michaeljkoster 2:1026c63b698f 530 sn_coap_hdr_s *unregister_message_ptr;
michaeljkoster 2:1026c63b698f 531 uint8_t *temp_ptr = 0;
michaeljkoster 2:1026c63b698f 532
michaeljkoster 2:1026c63b698f 533 /* Check that EP have been registered */
michaeljkoster 2:1026c63b698f 534 if(sn_nsdl_is_ep_registered())
michaeljkoster 2:1026c63b698f 535 {
michaeljkoster 2:1026c63b698f 536
michaeljkoster 2:1026c63b698f 537 /* Memory allocation for unregister message */
michaeljkoster 2:1026c63b698f 538 unregister_message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 539 if(!unregister_message_ptr)
michaeljkoster 2:1026c63b698f 540 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 541
michaeljkoster 2:1026c63b698f 542 memset(unregister_message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 543
michaeljkoster 2:1026c63b698f 544 /* Fill unregister message */
michaeljkoster 2:1026c63b698f 545 unregister_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 546 unregister_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_DELETE;
michaeljkoster 2:1026c63b698f 547
michaeljkoster 5:613a7624c473 548 //FIXME use the captured location path - ep_registration_location_ptr, look at reg update code
michaeljkoster 8:620c2c28c079 549 /*
michaeljkoster 2:1026c63b698f 550 unregister_message_ptr->uri_path_len = (RESOURCE_DIR_LEN + 1 + ep_information_ptr->domain_name_len + 1 + ep_information_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 551 unregister_message_ptr->uri_path_ptr = sn_nsdl_alloc(unregister_message_ptr->uri_path_len);
michaeljkoster 2:1026c63b698f 552 if (!unregister_message_ptr->uri_path_ptr)
michaeljkoster 2:1026c63b698f 553 {
michaeljkoster 2:1026c63b698f 554 sn_coap_parser_release_allocated_coap_msg_mem(unregister_message_ptr);
michaeljkoster 2:1026c63b698f 555 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 556 }
michaeljkoster 2:1026c63b698f 557
michaeljkoster 2:1026c63b698f 558 temp_ptr = unregister_message_ptr->uri_path_ptr;
michaeljkoster 2:1026c63b698f 559
michaeljkoster 2:1026c63b698f 560 memcpy(temp_ptr,resource_path_ptr, RESOURCE_DIR_LEN);
michaeljkoster 2:1026c63b698f 561 temp_ptr += RESOURCE_DIR_LEN;
michaeljkoster 2:1026c63b698f 562
michaeljkoster 2:1026c63b698f 563 *temp_ptr++ = '/';
michaeljkoster 2:1026c63b698f 564
michaeljkoster 2:1026c63b698f 565 memcpy(temp_ptr ,ep_information_ptr->domain_name_ptr, ep_information_ptr->domain_name_len);
michaeljkoster 2:1026c63b698f 566 temp_ptr += ep_information_ptr->domain_name_len;
michaeljkoster 2:1026c63b698f 567
michaeljkoster 2:1026c63b698f 568 *temp_ptr++ = '/';
michaeljkoster 2:1026c63b698f 569
michaeljkoster 2:1026c63b698f 570 memcpy(temp_ptr ,ep_information_ptr->endpoint_name_ptr, ep_information_ptr->endpoint_name_len);
michaeljkoster 8:620c2c28c079 571 */
michaeljkoster 8:620c2c28c079 572
michaeljkoster 8:620c2c28c079 573 unregister_message_ptr->uri_path_len = ep_registration_location_len;
michaeljkoster 8:620c2c28c079 574
michaeljkoster 8:620c2c28c079 575 unregister_message_ptr->uri_path_ptr = sn_nsdl_alloc(unregister_message_ptr->uri_path_len);
michaeljkoster 8:620c2c28c079 576 if (!unregister_message_ptr->uri_path_ptr)
michaeljkoster 8:620c2c28c079 577 {
michaeljkoster 8:620c2c28c079 578 sn_coap_parser_release_allocated_coap_msg_mem(unregister_message_ptr);
michaeljkoster 8:620c2c28c079 579 return SN_NSDL_FAILURE;
michaeljkoster 8:620c2c28c079 580 }
michaeljkoster 8:620c2c28c079 581
michaeljkoster 8:620c2c28c079 582 temp_ptr = unregister_message_ptr->uri_path_ptr;
michaeljkoster 8:620c2c28c079 583 memcpy(temp_ptr, ep_registration_location_ptr, ep_registration_location_len);
michaeljkoster 2:1026c63b698f 584
michaeljkoster 2:1026c63b698f 585 /* Send message */
michaeljkoster 2:1026c63b698f 586 sn_nsdl_internal_coap_send(unregister_message_ptr, nsp_address_ptr, SN_NSDL_MSG_UNREGISTER);
michaeljkoster 2:1026c63b698f 587
michaeljkoster 2:1026c63b698f 588 /* Free memory */
michaeljkoster 2:1026c63b698f 589 sn_coap_parser_release_allocated_coap_msg_mem(unregister_message_ptr);
michaeljkoster 2:1026c63b698f 590
michaeljkoster 2:1026c63b698f 591 }
michaeljkoster 2:1026c63b698f 592
michaeljkoster 2:1026c63b698f 593 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 594 }
michaeljkoster 2:1026c63b698f 595
michaeljkoster 2:1026c63b698f 596 int8_t sn_nsdl_update_registration (sn_nsdl_ep_parameters_s *endpoint_info_ptr)
michaeljkoster 2:1026c63b698f 597 {
michaeljkoster 2:1026c63b698f 598 /* Local variables */
michaeljkoster 2:1026c63b698f 599 sn_coap_hdr_s *register_message_ptr;
michaeljkoster 2:1026c63b698f 600 uint8_t *temp_ptr;
michaeljkoster 2:1026c63b698f 601
michaeljkoster 2:1026c63b698f 602 /*** Build endpoint register update message ***/
michaeljkoster 2:1026c63b698f 603
michaeljkoster 2:1026c63b698f 604 /* Allocate memory for header struct */
michaeljkoster 2:1026c63b698f 605 register_message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 606 if(register_message_ptr == NULL)
michaeljkoster 2:1026c63b698f 607 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 608
michaeljkoster 2:1026c63b698f 609 memset(register_message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 610
michaeljkoster 2:1026c63b698f 611 /* Fill message fields -> confirmable post to specified NSP path */
michaeljkoster 2:1026c63b698f 612 register_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 613 register_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_PUT;
michaeljkoster 2:1026c63b698f 614
michaeljkoster 4:bfa3d2283925 615 register_message_ptr->uri_path_len = ep_registration_location_len; // captured location path from registration response header
michaeljkoster 2:1026c63b698f 616 // register_message_ptr->uri_path_len = sizeof(resource_path_ptr) + ep_information_ptr->domain_name_len + ep_information_ptr->endpoint_name_len + 2; // = rd/domain/endpoint
michaeljkoster 4:bfa3d2283925 617 // register_message_ptr->uri_path_len = sizeof(resource_path_ptr) + ep_information_ptr->domain_name_len + 1; // = rd/domain where domain is the location as a UID
michaeljkoster 2:1026c63b698f 618
michaeljkoster 2:1026c63b698f 619 register_message_ptr->uri_path_ptr = sn_nsdl_alloc(register_message_ptr->uri_path_len);
michaeljkoster 2:1026c63b698f 620 if(!register_message_ptr->uri_path_ptr)
michaeljkoster 2:1026c63b698f 621 {
michaeljkoster 2:1026c63b698f 622 sn_coap_parser_release_allocated_coap_msg_mem(register_message_ptr);
michaeljkoster 2:1026c63b698f 623 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 624 }
michaeljkoster 2:1026c63b698f 625
michaeljkoster 2:1026c63b698f 626 temp_ptr = register_message_ptr->uri_path_ptr;
michaeljkoster 4:bfa3d2283925 627 memcpy(temp_ptr, ep_registration_location_ptr, ep_registration_location_len);
michaeljkoster 2:1026c63b698f 628
michaeljkoster 4:bfa3d2283925 629 // used to assume domain and endpoint location construction
michaeljkoster 2:1026c63b698f 630 /* rd/ */
michaeljkoster 4:bfa3d2283925 631 // memcpy(temp_ptr, resource_path_ptr, sizeof(resource_path_ptr));
michaeljkoster 4:bfa3d2283925 632 // temp_ptr += sizeof(resource_path_ptr);
michaeljkoster 4:bfa3d2283925 633 // *temp_ptr++ = '/';
michaeljkoster 2:1026c63b698f 634
michaeljkoster 2:1026c63b698f 635 /* rd/DOMAIN/ */
michaeljkoster 4:bfa3d2283925 636 // memcpy(temp_ptr, ep_information_ptr->domain_name_ptr, ep_information_ptr->domain_name_len);
michaeljkoster 4:bfa3d2283925 637 // temp_ptr += ep_information_ptr->domain_name_len;
michaeljkoster 2:1026c63b698f 638 // *temp_ptr++ = '/';
michaeljkoster 2:1026c63b698f 639
michaeljkoster 2:1026c63b698f 640 /* rd/domain/ENDPOINT */
michaeljkoster 2:1026c63b698f 641 // memcpy(temp_ptr, ep_information_ptr->endpoint_name_ptr, ep_information_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 642
michaeljkoster 2:1026c63b698f 643
michaeljkoster 2:1026c63b698f 644 /* Allocate memory for the extended options list */
michaeljkoster 2:1026c63b698f 645 register_message_ptr->options_list_ptr = sn_nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 646 if(register_message_ptr->options_list_ptr == NULL)
michaeljkoster 2:1026c63b698f 647 {
michaeljkoster 2:1026c63b698f 648 sn_coap_parser_release_allocated_coap_msg_mem(register_message_ptr);
michaeljkoster 2:1026c63b698f 649 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 650 }
michaeljkoster 2:1026c63b698f 651
michaeljkoster 2:1026c63b698f 652 memset(register_message_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 653
michaeljkoster 2:1026c63b698f 654 /* Fill Uri-query options */
michaeljkoster 2:1026c63b698f 655 sn_nsdl_fill_uri_query_options(endpoint_info_ptr, register_message_ptr, SN_NSDL_EP_UPDATE_MESSAGE);
michaeljkoster 2:1026c63b698f 656
michaeljkoster 2:1026c63b698f 657 /* Build and send coap message to NSP */
michaeljkoster 2:1026c63b698f 658 sn_nsdl_internal_coap_send(register_message_ptr, nsp_address_ptr, SN_NSDL_MSG_UPDATE);
michaeljkoster 2:1026c63b698f 659
michaeljkoster 2:1026c63b698f 660 if(register_message_ptr->payload_ptr)
michaeljkoster 2:1026c63b698f 661 sn_nsdl_free(register_message_ptr->payload_ptr);
michaeljkoster 2:1026c63b698f 662 sn_coap_parser_release_allocated_coap_msg_mem(register_message_ptr);
michaeljkoster 2:1026c63b698f 663
michaeljkoster 2:1026c63b698f 664 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 665 }
michaeljkoster 2:1026c63b698f 666
michaeljkoster 2:1026c63b698f 667 int8_t sn_nsdl_send_eventing_message (uint8_t *event_name_ptr, uint16_t event_name_len, uint8_t *message_body_ptr, uint16_t message_body_len)
michaeljkoster 2:1026c63b698f 668 {
michaeljkoster 2:1026c63b698f 669 sn_coap_hdr_s *eventing_message_ptr;
michaeljkoster 2:1026c63b698f 670 int8_t status = 0;
michaeljkoster 2:1026c63b698f 671
michaeljkoster 2:1026c63b698f 672 /* Allocate and initialize memory for header struct */
michaeljkoster 2:1026c63b698f 673 eventing_message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 674 if(eventing_message_ptr == NULL)
michaeljkoster 2:1026c63b698f 675 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 676
michaeljkoster 2:1026c63b698f 677 memset(eventing_message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 678
michaeljkoster 2:1026c63b698f 679 /* Fill header */
michaeljkoster 2:1026c63b698f 680 eventing_message_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE;
michaeljkoster 2:1026c63b698f 681 eventing_message_ptr->msg_code = COAP_MSG_CODE_REQUEST_POST;
michaeljkoster 2:1026c63b698f 682
michaeljkoster 2:1026c63b698f 683 /* Fill uri path option */
michaeljkoster 2:1026c63b698f 684 eventing_message_ptr->uri_path_len = sizeof(event_path_parameter) + event_name_len;
michaeljkoster 2:1026c63b698f 685 eventing_message_ptr->uri_path_ptr = sn_nsdl_alloc(eventing_message_ptr->uri_path_len);
michaeljkoster 2:1026c63b698f 686
michaeljkoster 2:1026c63b698f 687 if(!eventing_message_ptr->uri_path_ptr)
michaeljkoster 2:1026c63b698f 688 {
michaeljkoster 2:1026c63b698f 689 sn_coap_parser_release_allocated_coap_msg_mem(eventing_message_ptr);
michaeljkoster 2:1026c63b698f 690 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 691 }
michaeljkoster 2:1026c63b698f 692
michaeljkoster 2:1026c63b698f 693 memcpy(eventing_message_ptr->uri_path_ptr, event_path_parameter, sizeof(event_path_parameter));
michaeljkoster 2:1026c63b698f 694 memcpy(eventing_message_ptr->uri_path_ptr + sizeof(event_path_parameter), event_name_ptr, event_name_len);
michaeljkoster 2:1026c63b698f 695
michaeljkoster 2:1026c63b698f 696 /* Fill payload */
michaeljkoster 2:1026c63b698f 697 eventing_message_ptr->payload_len = message_body_len;
michaeljkoster 2:1026c63b698f 698 eventing_message_ptr->payload_ptr = message_body_ptr;
michaeljkoster 2:1026c63b698f 699
michaeljkoster 2:1026c63b698f 700 /* Send coap message */
michaeljkoster 2:1026c63b698f 701 status = sn_nsdl_internal_coap_send(eventing_message_ptr, nsp_address_ptr, SN_NSDL_MSG_EVENT);
michaeljkoster 2:1026c63b698f 702
michaeljkoster 2:1026c63b698f 703 eventing_message_ptr->payload_ptr = NULL;
michaeljkoster 2:1026c63b698f 704
michaeljkoster 2:1026c63b698f 705 sn_coap_parser_release_allocated_coap_msg_mem(eventing_message_ptr);
michaeljkoster 2:1026c63b698f 706
michaeljkoster 2:1026c63b698f 707 return status;
michaeljkoster 2:1026c63b698f 708 }
michaeljkoster 2:1026c63b698f 709
michaeljkoster 2:1026c63b698f 710 void sn_nsdl_nsp_lost(void)
michaeljkoster 2:1026c63b698f 711 {
michaeljkoster 2:1026c63b698f 712 sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_NOT_REGISTERED;
michaeljkoster 2:1026c63b698f 713 return;
michaeljkoster 2:1026c63b698f 714 }
michaeljkoster 2:1026c63b698f 715
michaeljkoster 2:1026c63b698f 716 int8_t sn_nsdl_is_ep_registered(void)
michaeljkoster 2:1026c63b698f 717 {
michaeljkoster 2:1026c63b698f 718
michaeljkoster 2:1026c63b698f 719 return sn_nsdl_endpoint_registered;
michaeljkoster 2:1026c63b698f 720 }
michaeljkoster 2:1026c63b698f 721
michaeljkoster 2:1026c63b698f 722 uint16_t sn_nsdl_send_observation_notification(uint8_t *token_ptr, uint8_t token_len,
michaeljkoster 2:1026c63b698f 723 uint8_t *payload_ptr, uint16_t payload_len,
michaeljkoster 2:1026c63b698f 724 uint8_t *observe_ptr, uint8_t observe_len,
michaeljkoster 2:1026c63b698f 725 sn_coap_msg_type_e message_type, uint8_t content_type)
michaeljkoster 2:1026c63b698f 726 {
michaeljkoster 2:1026c63b698f 727 sn_coap_hdr_s *notification_message_ptr;
michaeljkoster 2:1026c63b698f 728 uint16_t return_msg_id = 0;
michaeljkoster 2:1026c63b698f 729
michaeljkoster 2:1026c63b698f 730 /* Allocate and initialize memory for header struct */
michaeljkoster 2:1026c63b698f 731 notification_message_ptr = sn_nsdl_alloc(sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 732 if(notification_message_ptr == NULL)
michaeljkoster 2:1026c63b698f 733 return 0;
michaeljkoster 2:1026c63b698f 734
michaeljkoster 2:1026c63b698f 735 memset(notification_message_ptr, 0, sizeof(sn_coap_hdr_s));
michaeljkoster 2:1026c63b698f 736
michaeljkoster 2:1026c63b698f 737 notification_message_ptr->options_list_ptr = sn_nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 738 if(notification_message_ptr->options_list_ptr == NULL)
michaeljkoster 2:1026c63b698f 739 {
michaeljkoster 2:1026c63b698f 740 sn_nsdl_free(notification_message_ptr);
michaeljkoster 2:1026c63b698f 741 return 0;
michaeljkoster 2:1026c63b698f 742 }
michaeljkoster 2:1026c63b698f 743
michaeljkoster 2:1026c63b698f 744 memset(notification_message_ptr->options_list_ptr , 0, sizeof(sn_coap_options_list_s));
michaeljkoster 2:1026c63b698f 745
michaeljkoster 2:1026c63b698f 746 /* Fill header */
michaeljkoster 2:1026c63b698f 747 notification_message_ptr->msg_type = message_type;
michaeljkoster 2:1026c63b698f 748 notification_message_ptr->msg_code = COAP_MSG_CODE_RESPONSE_CONTENT;
michaeljkoster 2:1026c63b698f 749
michaeljkoster 2:1026c63b698f 750 /* Fill token */
michaeljkoster 2:1026c63b698f 751 notification_message_ptr->token_len = token_len;
michaeljkoster 2:1026c63b698f 752 notification_message_ptr->token_ptr = token_ptr;
michaeljkoster 2:1026c63b698f 753
michaeljkoster 2:1026c63b698f 754 /* Fill payload */
michaeljkoster 2:1026c63b698f 755 notification_message_ptr->payload_len = payload_len;
michaeljkoster 2:1026c63b698f 756 notification_message_ptr->payload_ptr = payload_ptr;
michaeljkoster 2:1026c63b698f 757
michaeljkoster 2:1026c63b698f 758 /* Fill observe */
michaeljkoster 2:1026c63b698f 759 notification_message_ptr->options_list_ptr->observe_len = observe_len;
michaeljkoster 2:1026c63b698f 760 notification_message_ptr->options_list_ptr->observe_ptr = observe_ptr;
michaeljkoster 2:1026c63b698f 761
michaeljkoster 2:1026c63b698f 762 /* Fill content type */
michaeljkoster 2:1026c63b698f 763 if(content_type)
michaeljkoster 2:1026c63b698f 764 {
michaeljkoster 2:1026c63b698f 765 notification_message_ptr->content_type_len = 1;
michaeljkoster 2:1026c63b698f 766 notification_message_ptr->content_type_ptr = &content_type;
michaeljkoster 2:1026c63b698f 767 }
michaeljkoster 2:1026c63b698f 768
michaeljkoster 2:1026c63b698f 769 /* Send message */
michaeljkoster 2:1026c63b698f 770 if(sn_grs_send_coap_message(nsp_address_ptr,notification_message_ptr) == SN_NSDL_FAILURE)
michaeljkoster 2:1026c63b698f 771 return_msg_id = 0;
michaeljkoster 2:1026c63b698f 772 else
michaeljkoster 2:1026c63b698f 773 return_msg_id = notification_message_ptr->msg_id;
michaeljkoster 2:1026c63b698f 774
michaeljkoster 2:1026c63b698f 775 /* Free memory */
michaeljkoster 2:1026c63b698f 776
michaeljkoster 2:1026c63b698f 777 notification_message_ptr->payload_ptr = NULL;
michaeljkoster 2:1026c63b698f 778 notification_message_ptr->options_list_ptr->observe_ptr = NULL;
michaeljkoster 2:1026c63b698f 779 notification_message_ptr->token_ptr = NULL;
michaeljkoster 2:1026c63b698f 780 notification_message_ptr->content_type_ptr = NULL;
michaeljkoster 2:1026c63b698f 781
michaeljkoster 2:1026c63b698f 782 sn_coap_parser_release_allocated_coap_msg_mem(notification_message_ptr);
michaeljkoster 2:1026c63b698f 783
michaeljkoster 2:1026c63b698f 784 return return_msg_id;
michaeljkoster 2:1026c63b698f 785 }
michaeljkoster 2:1026c63b698f 786
michaeljkoster 2:1026c63b698f 787
michaeljkoster 2:1026c63b698f 788 /* * * * * * * * * * * * * * * * * * * * * */
michaeljkoster 2:1026c63b698f 789 /* GRS Wrapper */
michaeljkoster 2:1026c63b698f 790 /* These are documented in sn_grs.c - file */
michaeljkoster 2:1026c63b698f 791 /* * * * * * * * * * * * * * * * * * * * * */
michaeljkoster 2:1026c63b698f 792
michaeljkoster 2:1026c63b698f 793 int16_t sn_nsdl_get_capability(void)
michaeljkoster 2:1026c63b698f 794 {
michaeljkoster 2:1026c63b698f 795 return sn_grs_get_capability();
michaeljkoster 2:1026c63b698f 796 }
michaeljkoster 2:1026c63b698f 797
michaeljkoster 2:1026c63b698f 798
michaeljkoster 2:1026c63b698f 799 uint32_t sn_nsdl_get_version(void)
michaeljkoster 2:1026c63b698f 800 {
michaeljkoster 2:1026c63b698f 801 return sn_grs_get_version();
michaeljkoster 2:1026c63b698f 802 }
michaeljkoster 2:1026c63b698f 803
zdshelby 1:14a9b0f4b9d6 804
michaeljkoster 2:1026c63b698f 805 int8_t sn_nsdl_process_http(uint8_t *packet_ptr, uint16_t *packet_len_ptr, sn_nsdl_addr_s *src_ptr)
michaeljkoster 2:1026c63b698f 806 {
michaeljkoster 2:1026c63b698f 807 return sn_grs_process_http(packet_ptr, packet_len_ptr, src_ptr);
michaeljkoster 2:1026c63b698f 808 }
michaeljkoster 2:1026c63b698f 809
michaeljkoster 2:1026c63b698f 810
michaeljkoster 2:1026c63b698f 811 int8_t sn_nsdl_process_coap(uint8_t *packet_ptr, uint16_t packet_len_ptr, sn_nsdl_addr_s *src_ptr)
michaeljkoster 2:1026c63b698f 812 {
michaeljkoster 2:1026c63b698f 813 return sn_grs_process_coap(packet_ptr, packet_len_ptr, src_ptr);
michaeljkoster 2:1026c63b698f 814 }
michaeljkoster 2:1026c63b698f 815
michaeljkoster 2:1026c63b698f 816 int8_t sn_nsdl_exec(uint32_t time)
michaeljkoster 2:1026c63b698f 817 {
michaeljkoster 2:1026c63b698f 818 return sn_grs_exec(time);
michaeljkoster 2:1026c63b698f 819 }
michaeljkoster 2:1026c63b698f 820
michaeljkoster 2:1026c63b698f 821 int8_t sn_nsdl_create_resource(sn_nsdl_resource_info_s *res_ptr)
michaeljkoster 2:1026c63b698f 822 {
michaeljkoster 2:1026c63b698f 823 return sn_grs_create_resource(res_ptr);
michaeljkoster 2:1026c63b698f 824 }
michaeljkoster 2:1026c63b698f 825
michaeljkoster 2:1026c63b698f 826 int8_t sn_nsdl_update_resource(sn_nsdl_resource_info_s *res_ptr)
michaeljkoster 2:1026c63b698f 827 {
michaeljkoster 2:1026c63b698f 828 return sn_grs_update_resource(res_ptr);
michaeljkoster 2:1026c63b698f 829 }
michaeljkoster 2:1026c63b698f 830
michaeljkoster 2:1026c63b698f 831 int8_t sn_nsdl_delete_resource(uint8_t pathlen, uint8_t *path_ptr)
michaeljkoster 2:1026c63b698f 832 {
michaeljkoster 2:1026c63b698f 833 return sn_grs_delete_resource(pathlen, path_ptr);
michaeljkoster 2:1026c63b698f 834 }
michaeljkoster 2:1026c63b698f 835
michaeljkoster 2:1026c63b698f 836 sn_nsdl_resource_info_s *sn_nsdl_get_resource(uint16_t pathlen, uint8_t *path_ptr)
michaeljkoster 2:1026c63b698f 837 {
michaeljkoster 2:1026c63b698f 838 return sn_grs_get_resource(pathlen, path_ptr);
michaeljkoster 2:1026c63b698f 839 }
michaeljkoster 2:1026c63b698f 840
michaeljkoster 2:1026c63b698f 841 sn_grs_resource_list_s *sn_nsdl_list_resource(uint16_t pathlen, uint8_t *path_ptr)
michaeljkoster 2:1026c63b698f 842 {
michaeljkoster 2:1026c63b698f 843 return sn_grs_list_resource(pathlen, path_ptr);
michaeljkoster 2:1026c63b698f 844 }
michaeljkoster 2:1026c63b698f 845
michaeljkoster 2:1026c63b698f 846 int8_t sn_nsdl_send_coap_message(sn_nsdl_addr_s *address_ptr, sn_coap_hdr_s *coap_hdr_ptr)
michaeljkoster 2:1026c63b698f 847 {
michaeljkoster 2:1026c63b698f 848 return sn_grs_send_coap_message(address_ptr, coap_hdr_ptr);
michaeljkoster 2:1026c63b698f 849 }
michaeljkoster 2:1026c63b698f 850
michaeljkoster 2:1026c63b698f 851 /********************/
michaeljkoster 2:1026c63b698f 852 /* Static functions */
michaeljkoster 2:1026c63b698f 853 /********************/
michaeljkoster 2:1026c63b698f 854
michaeljkoster 2:1026c63b698f 855
michaeljkoster 2:1026c63b698f 856 /**
michaeljkoster 2:1026c63b698f 857 * \fn static int8_t sn_nsdl_send_coap_message(sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description)
michaeljkoster 2:1026c63b698f 858 *
michaeljkoster 2:1026c63b698f 859 *
michaeljkoster 2:1026c63b698f 860 * \brief To send NSDL messages. Stores message id?s and message description to catch response from NSP server
michaeljkoster 2:1026c63b698f 861 *
michaeljkoster 2:1026c63b698f 862 * \param *coap_header_ptr Pointer to the CoAP message header to be sent
michaeljkoster 2:1026c63b698f 863 * \param *dst_addr_ptr Pointer to the address structure that contains destination address information
michaeljkoster 2:1026c63b698f 864 * \param message_description Message description to be stored to list for waiting response
michaeljkoster 2:1026c63b698f 865 *
michaeljkoster 2:1026c63b698f 866 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 867 */
michaeljkoster 2:1026c63b698f 868 static int8_t sn_nsdl_internal_coap_send(sn_coap_hdr_s *coap_header_ptr, sn_nsdl_addr_s *dst_addr_ptr, uint8_t message_description)
michaeljkoster 2:1026c63b698f 869 {
michaeljkoster 2:1026c63b698f 870 uint8_t *coap_message_ptr = NULL;
michaeljkoster 2:1026c63b698f 871 uint16_t coap_message_len = 0;
michaeljkoster 2:1026c63b698f 872 int16_t status = 0;
michaeljkoster 2:1026c63b698f 873
michaeljkoster 2:1026c63b698f 874 coap_message_len = sn_coap_builder_calc_needed_packet_data_size(coap_header_ptr);
michaeljkoster 2:1026c63b698f 875
michaeljkoster 2:1026c63b698f 876 if(coap_message_len == 0)
michaeljkoster 2:1026c63b698f 877 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 878
michaeljkoster 2:1026c63b698f 879 coap_message_ptr = sn_nsdl_alloc(coap_message_len);
michaeljkoster 2:1026c63b698f 880 if(!coap_message_ptr)
michaeljkoster 2:1026c63b698f 881 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 882
michaeljkoster 2:1026c63b698f 883 /* Build message */
michaeljkoster 2:1026c63b698f 884 status = sn_coap_protocol_build(dst_addr_ptr,coap_message_ptr, coap_header_ptr);
michaeljkoster 2:1026c63b698f 885
michaeljkoster 2:1026c63b698f 886 /* If message building failed */
michaeljkoster 2:1026c63b698f 887 if(status < 0)
michaeljkoster 2:1026c63b698f 888 {
michaeljkoster 2:1026c63b698f 889 sn_nsdl_free(coap_message_ptr);
michaeljkoster 2:1026c63b698f 890 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 891 }
michaeljkoster 2:1026c63b698f 892
michaeljkoster 2:1026c63b698f 893 /* If mesage type is confirmable, save it to list to wait for reply */
michaeljkoster 2:1026c63b698f 894 if(coap_header_ptr->msg_type == COAP_MSG_TYPE_CONFIRMABLE)
michaeljkoster 2:1026c63b698f 895 {
michaeljkoster 2:1026c63b698f 896 sn_nsdl_sent_messages_s *message_ptr = sn_nsdl_alloc(sizeof(sn_nsdl_sent_messages_s));
michaeljkoster 2:1026c63b698f 897 if(message_ptr)
michaeljkoster 2:1026c63b698f 898 {
michaeljkoster 2:1026c63b698f 899 if(sn_linked_list_count_nodes(message_list_ptr) >= SN_NSDL_MAX_MESSAGE_COUNT)
michaeljkoster 2:1026c63b698f 900 {
michaeljkoster 2:1026c63b698f 901 sn_nsdl_sent_messages_s *message_temp_ptr = sn_linked_list_get_last_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 902 if(message_temp_ptr)
michaeljkoster 2:1026c63b698f 903 sn_nsdl_free(message_temp_ptr);
michaeljkoster 2:1026c63b698f 904 sn_linked_list_remove_current_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 905 }
michaeljkoster 2:1026c63b698f 906
michaeljkoster 2:1026c63b698f 907 message_ptr->message_type = message_description;
michaeljkoster 2:1026c63b698f 908 message_ptr->msg_id_number = coap_header_ptr->msg_id;
michaeljkoster 2:1026c63b698f 909 sn_linked_list_add_node(message_list_ptr, (void*)message_ptr);
michaeljkoster 2:1026c63b698f 910
michaeljkoster 2:1026c63b698f 911 status = SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 912 }
michaeljkoster 2:1026c63b698f 913 else
michaeljkoster 2:1026c63b698f 914 {
michaeljkoster 2:1026c63b698f 915 status = SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 916 }
michaeljkoster 2:1026c63b698f 917
michaeljkoster 2:1026c63b698f 918 }
michaeljkoster 2:1026c63b698f 919
michaeljkoster 10:b5ecd6660d71 920 if(0 == sn_nsdl_tx_callback(SN_NSDL_PROTOCOL_COAP, coap_message_ptr, coap_message_len, dst_addr_ptr)){
michaeljkoster 10:b5ecd6660d71 921 status=SN_NSDL_FAILURE;
michaeljkoster 10:b5ecd6660d71 922 }
michaeljkoster 10:b5ecd6660d71 923
michaeljkoster 2:1026c63b698f 924 sn_nsdl_free(coap_message_ptr);
michaeljkoster 2:1026c63b698f 925 return status;
michaeljkoster 2:1026c63b698f 926 }
michaeljkoster 2:1026c63b698f 927
michaeljkoster 2:1026c63b698f 928 /**
michaeljkoster 2:1026c63b698f 929 * \fn static void sn_nsdl_resolve_nsp_address(void)
michaeljkoster 2:1026c63b698f 930 *
michaeljkoster 2:1026c63b698f 931 * \brief Resolves NSP server address.
michaeljkoster 2:1026c63b698f 932 *
michaeljkoster 2:1026c63b698f 933 * \note Application must set NSP address with set_nsp_address
michaeljkoster 2:1026c63b698f 934 */
michaeljkoster 2:1026c63b698f 935 static void sn_nsdl_resolve_nsp_address(void)
michaeljkoster 2:1026c63b698f 936 {
michaeljkoster 2:1026c63b698f 937 /* Local variables */
michaeljkoster 2:1026c63b698f 938 if(!nsp_address_ptr)
michaeljkoster 2:1026c63b698f 939 {
michaeljkoster 2:1026c63b698f 940 //allocate only if previously not allocated
michaeljkoster 2:1026c63b698f 941 nsp_address_ptr = sn_nsdl_alloc(sizeof(sn_nsdl_addr_s));
michaeljkoster 2:1026c63b698f 942 }
michaeljkoster 2:1026c63b698f 943
michaeljkoster 2:1026c63b698f 944 if(nsp_address_ptr)
michaeljkoster 2:1026c63b698f 945 {
michaeljkoster 2:1026c63b698f 946 memset(nsp_address_ptr, 0, sizeof(sn_nsdl_addr_s));
michaeljkoster 2:1026c63b698f 947 /* This is only for version 0.5 */
michaeljkoster 2:1026c63b698f 948 nsp_address_ptr->type = SN_NSDL_ADDRESS_TYPE_NONE;
michaeljkoster 2:1026c63b698f 949 }
michaeljkoster 2:1026c63b698f 950
michaeljkoster 2:1026c63b698f 951 /* Todo: get NSP address */
michaeljkoster 2:1026c63b698f 952 }
michaeljkoster 2:1026c63b698f 953
michaeljkoster 2:1026c63b698f 954 /**
michaeljkoster 2:1026c63b698f 955 * \fn static int8_t sn_nsdl_build_registration_body(sn_coap_hdr_s *message_ptr)
michaeljkoster 2:1026c63b698f 956 *
michaeljkoster 2:1026c63b698f 957 * \brief To build GRS resources to registration message payload
michaeljkoster 2:1026c63b698f 958 *
michaeljkoster 2:1026c63b698f 959 * \param *message_ptr Pointer to CoAP message header
michaeljkoster 2:1026c63b698f 960 *
michaeljkoster 2:1026c63b698f 961 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 962 */
michaeljkoster 2:1026c63b698f 963 int8_t sn_nsdl_build_registration_body(sn_coap_hdr_s *message_ptr, uint8_t updating_registeration)
michaeljkoster 2:1026c63b698f 964 {
michaeljkoster 2:1026c63b698f 965 /* Local variables */
michaeljkoster 2:1026c63b698f 966 uint8_t *temp_ptr;
michaeljkoster 2:1026c63b698f 967 sn_nsdl_resource_info_s *resource_temp_ptr;
michaeljkoster 2:1026c63b698f 968
michaeljkoster 2:1026c63b698f 969
michaeljkoster 2:1026c63b698f 970 /* Get list of resources */
michaeljkoster 2:1026c63b698f 971
michaeljkoster 2:1026c63b698f 972
michaeljkoster 2:1026c63b698f 973 /* Calculate needed memory and allocate */
michaeljkoster 2:1026c63b698f 974 message_ptr->payload_len = sn_nsdl_calculate_registration_body_size(updating_registeration);
michaeljkoster 2:1026c63b698f 975
michaeljkoster 2:1026c63b698f 976 /* If no resources to be registered, return SN_NSDL_SUCCESS */
michaeljkoster 2:1026c63b698f 977 if(!message_ptr->payload_len)
michaeljkoster 2:1026c63b698f 978 {
michaeljkoster 2:1026c63b698f 979 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 980 }
michaeljkoster 2:1026c63b698f 981
michaeljkoster 2:1026c63b698f 982 message_ptr->payload_ptr = sn_nsdl_alloc(message_ptr->payload_len);
michaeljkoster 2:1026c63b698f 983 if(!message_ptr->payload_ptr)
michaeljkoster 2:1026c63b698f 984 {
michaeljkoster 2:1026c63b698f 985 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 986 }
michaeljkoster 2:1026c63b698f 987
michaeljkoster 2:1026c63b698f 988 /* Build message */
michaeljkoster 2:1026c63b698f 989 temp_ptr = message_ptr->payload_ptr;
michaeljkoster 2:1026c63b698f 990
michaeljkoster 2:1026c63b698f 991 resource_temp_ptr = sn_grs_get_first_resource();
michaeljkoster 2:1026c63b698f 992
michaeljkoster 2:1026c63b698f 993 /* Loop trough all resources */
michaeljkoster 2:1026c63b698f 994 while(resource_temp_ptr)
michaeljkoster 2:1026c63b698f 995 {
michaeljkoster 2:1026c63b698f 996
michaeljkoster 2:1026c63b698f 997 /* if resource needs to be registered */
michaeljkoster 2:1026c63b698f 998 if(resource_temp_ptr->resource_parameters_ptr)
michaeljkoster 2:1026c63b698f 999 {
michaeljkoster 2:1026c63b698f 1000
michaeljkoster 2:1026c63b698f 1001 if(updating_registeration && resource_temp_ptr->resource_parameters_ptr->registered == SN_NDSL_RESOURCE_REGISTERED)
michaeljkoster 2:1026c63b698f 1002 {
michaeljkoster 2:1026c63b698f 1003 resource_temp_ptr = sn_grs_get_next_resource();
michaeljkoster 2:1026c63b698f 1004 continue;
michaeljkoster 2:1026c63b698f 1005 }
michaeljkoster 2:1026c63b698f 1006 else
michaeljkoster 2:1026c63b698f 1007 {
michaeljkoster 2:1026c63b698f 1008 resource_temp_ptr->resource_parameters_ptr->registered = SN_NDSL_RESOURCE_REGISTERING;
michaeljkoster 2:1026c63b698f 1009 }
michaeljkoster 2:1026c63b698f 1010
michaeljkoster 2:1026c63b698f 1011 /* If not first resource, add '.' to separator */
michaeljkoster 2:1026c63b698f 1012 if(temp_ptr != message_ptr->payload_ptr)
michaeljkoster 2:1026c63b698f 1013 *temp_ptr++ = ',';
michaeljkoster 2:1026c63b698f 1014
michaeljkoster 2:1026c63b698f 1015 *temp_ptr++ = '<';
michaeljkoster 2:1026c63b698f 1016 *temp_ptr++ = '/';
michaeljkoster 2:1026c63b698f 1017 memcpy(temp_ptr, resource_temp_ptr->path, resource_temp_ptr->pathlen);
michaeljkoster 2:1026c63b698f 1018 temp_ptr += resource_temp_ptr->pathlen;
michaeljkoster 2:1026c63b698f 1019 *temp_ptr++ = '>';
michaeljkoster 2:1026c63b698f 1020
michaeljkoster 2:1026c63b698f 1021 /* Resource attributes */
michaeljkoster 2:1026c63b698f 1022 if(resource_temp_ptr->resource_parameters_ptr->resource_type_len)
michaeljkoster 2:1026c63b698f 1023 {
michaeljkoster 2:1026c63b698f 1024 *temp_ptr++ = ';';
michaeljkoster 2:1026c63b698f 1025 memcpy(temp_ptr, resource_type_parameter, RT_PARAMETER_LEN);
michaeljkoster 2:1026c63b698f 1026 temp_ptr += RT_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1027 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1028 memcpy(temp_ptr, resource_temp_ptr->resource_parameters_ptr->resource_type_ptr, resource_temp_ptr->resource_parameters_ptr->resource_type_len);
michaeljkoster 2:1026c63b698f 1029 temp_ptr += resource_temp_ptr->resource_parameters_ptr->resource_type_len;
michaeljkoster 2:1026c63b698f 1030 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1031 }
michaeljkoster 2:1026c63b698f 1032
michaeljkoster 2:1026c63b698f 1033 if(resource_temp_ptr->resource_parameters_ptr->interface_description_len)
michaeljkoster 2:1026c63b698f 1034 {
michaeljkoster 2:1026c63b698f 1035 *temp_ptr++ = ';';
michaeljkoster 2:1026c63b698f 1036 memcpy(temp_ptr, if_description_parameter, IF_PARAMETER_LEN);
michaeljkoster 2:1026c63b698f 1037 temp_ptr += IF_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1038 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1039 memcpy(temp_ptr, resource_temp_ptr->resource_parameters_ptr->interface_description_ptr, resource_temp_ptr->resource_parameters_ptr->interface_description_len);
michaeljkoster 2:1026c63b698f 1040 temp_ptr += resource_temp_ptr->resource_parameters_ptr->interface_description_len;
michaeljkoster 2:1026c63b698f 1041 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1042 }
michaeljkoster 2:1026c63b698f 1043
michaeljkoster 2:1026c63b698f 1044 if(resource_temp_ptr->resource_parameters_ptr->coap_content_type != 0)
michaeljkoster 2:1026c63b698f 1045 {
michaeljkoster 2:1026c63b698f 1046 *temp_ptr++ = ';';
michaeljkoster 2:1026c63b698f 1047 memcpy(temp_ptr, coap_con_type_parameter, COAP_CON_PARAMETER_LEN);
michaeljkoster 2:1026c63b698f 1048 temp_ptr += COAP_CON_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1049 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1050 temp_ptr = sn_nsdl_itoa(temp_ptr, resource_temp_ptr->resource_parameters_ptr->coap_content_type);
michaeljkoster 2:1026c63b698f 1051 *temp_ptr++ = '"';
michaeljkoster 2:1026c63b698f 1052 }
michaeljkoster 2:1026c63b698f 1053
michaeljkoster 2:1026c63b698f 1054 /* ;obs */
michaeljkoster 2:1026c63b698f 1055 if(resource_temp_ptr->resource_parameters_ptr->observable)
michaeljkoster 2:1026c63b698f 1056 {
michaeljkoster 2:1026c63b698f 1057 *temp_ptr++ = ';';
michaeljkoster 2:1026c63b698f 1058 memcpy(temp_ptr, obs_parameter, OBS_PARAMETER_LEN);
michaeljkoster 2:1026c63b698f 1059 temp_ptr += OBS_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1060 }
michaeljkoster 2:1026c63b698f 1061
michaeljkoster 2:1026c63b698f 1062 /* ;aobs;id= */
michaeljkoster 2:1026c63b698f 1063 /* todo: aosb not supported ATM - needs fixing */
michaeljkoster 2:1026c63b698f 1064 /*
michaeljkoster 2:1026c63b698f 1065 if((resource_temp_ptr->resource_parameters_ptr->auto_obs_len > 0 && resource_temp_ptr->resource_parameters_ptr->auto_obs_len <= 8) &&
michaeljkoster 2:1026c63b698f 1066 resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr)
michaeljkoster 2:1026c63b698f 1067 {
michaeljkoster 2:1026c63b698f 1068 uint8_t i = 0;
michaeljkoster 2:1026c63b698f 1069
michaeljkoster 2:1026c63b698f 1070 *temp_ptr++ = ';';
michaeljkoster 2:1026c63b698f 1071 memcpy(temp_ptr, aobs_parameter, AOBS_PARAMETER_LEN);
michaeljkoster 2:1026c63b698f 1072 temp_ptr += AOBS_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1073
michaeljkoster 2:1026c63b698f 1074 while(i < resource_temp_ptr->resource_parameters_ptr->auto_obs_len)
michaeljkoster 2:1026c63b698f 1075 {
michaeljkoster 2:1026c63b698f 1076 temp_ptr = sn_nsdl_itoa(temp_ptr, *(resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr + i));
michaeljkoster 2:1026c63b698f 1077 i++;
michaeljkoster 2:1026c63b698f 1078 }
michaeljkoster 2:1026c63b698f 1079 }
michaeljkoster 2:1026c63b698f 1080 */
michaeljkoster 2:1026c63b698f 1081
michaeljkoster 2:1026c63b698f 1082 }
michaeljkoster 2:1026c63b698f 1083
michaeljkoster 2:1026c63b698f 1084 resource_temp_ptr = sn_grs_get_next_resource();
michaeljkoster 2:1026c63b698f 1085
michaeljkoster 2:1026c63b698f 1086 }
michaeljkoster 2:1026c63b698f 1087
michaeljkoster 2:1026c63b698f 1088 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 1089 }
michaeljkoster 2:1026c63b698f 1090
michaeljkoster 2:1026c63b698f 1091 /**
michaeljkoster 2:1026c63b698f 1092 * \fn static uint16_t sn_nsdl_calculate_registration_body_size(sn_grs_resource_list_s *grs_resources_list_ptr)
michaeljkoster 2:1026c63b698f 1093 *
michaeljkoster 2:1026c63b698f 1094 *
michaeljkoster 2:1026c63b698f 1095 * \brief Calculates registration message payload size
michaeljkoster 2:1026c63b698f 1096 *
michaeljkoster 2:1026c63b698f 1097 * \param *grs_resources_list_ptr Pointer to list of GRS resources
michaeljkoster 2:1026c63b698f 1098 *
michaeljkoster 2:1026c63b698f 1099 * \return Needed payload size
michaeljkoster 2:1026c63b698f 1100 */
michaeljkoster 2:1026c63b698f 1101 static uint16_t sn_nsdl_calculate_registration_body_size(uint8_t updating_registeration)
michaeljkoster 2:1026c63b698f 1102 {
michaeljkoster 2:1026c63b698f 1103 /* Local variables */
michaeljkoster 2:1026c63b698f 1104 uint16_t return_value = 0;
michaeljkoster 2:1026c63b698f 1105 sn_nsdl_resource_info_s *resource_temp_ptr;
michaeljkoster 2:1026c63b698f 1106
michaeljkoster 2:1026c63b698f 1107 /* check pointer */
michaeljkoster 2:1026c63b698f 1108
michaeljkoster 2:1026c63b698f 1109 resource_temp_ptr = sn_grs_get_first_resource();
michaeljkoster 2:1026c63b698f 1110
michaeljkoster 2:1026c63b698f 1111 while(resource_temp_ptr)
michaeljkoster 2:1026c63b698f 1112 {
michaeljkoster 2:1026c63b698f 1113
michaeljkoster 2:1026c63b698f 1114 if(resource_temp_ptr->resource_parameters_ptr)
michaeljkoster 2:1026c63b698f 1115 {
michaeljkoster 2:1026c63b698f 1116
michaeljkoster 2:1026c63b698f 1117 if(updating_registeration && resource_temp_ptr->resource_parameters_ptr->registered == SN_NDSL_RESOURCE_REGISTERED)
michaeljkoster 2:1026c63b698f 1118 {
michaeljkoster 2:1026c63b698f 1119 resource_temp_ptr = sn_grs_get_next_resource();
michaeljkoster 2:1026c63b698f 1120 continue;
michaeljkoster 2:1026c63b698f 1121 }
michaeljkoster 2:1026c63b698f 1122
michaeljkoster 2:1026c63b698f 1123 /* If not first resource, then '.' will be added */
michaeljkoster 2:1026c63b698f 1124 if(return_value)
michaeljkoster 2:1026c63b698f 1125 return_value++;
michaeljkoster 2:1026c63b698f 1126
michaeljkoster 2:1026c63b698f 1127 /* Count length for the resource path </path> */
michaeljkoster 2:1026c63b698f 1128 return_value += (3 + resource_temp_ptr->pathlen);
michaeljkoster 2:1026c63b698f 1129
michaeljkoster 2:1026c63b698f 1130 /* Count lengths of the attributes */
michaeljkoster 2:1026c63b698f 1131
michaeljkoster 2:1026c63b698f 1132 /* Resource type parameter */
michaeljkoster 2:1026c63b698f 1133 if(resource_temp_ptr->resource_parameters_ptr->resource_type_len)
michaeljkoster 2:1026c63b698f 1134 {
michaeljkoster 2:1026c63b698f 1135 /* ;rt="restype" */
michaeljkoster 2:1026c63b698f 1136 return_value += (6 + resource_temp_ptr->resource_parameters_ptr->resource_type_len);
michaeljkoster 2:1026c63b698f 1137 }
michaeljkoster 2:1026c63b698f 1138
michaeljkoster 2:1026c63b698f 1139 /* Interface description parameter */
michaeljkoster 2:1026c63b698f 1140 if(resource_temp_ptr->resource_parameters_ptr->interface_description_len)
michaeljkoster 2:1026c63b698f 1141 {
michaeljkoster 2:1026c63b698f 1142 /* ;if="iftype" */
michaeljkoster 2:1026c63b698f 1143 return_value += (6 + resource_temp_ptr->resource_parameters_ptr->interface_description_len);
michaeljkoster 2:1026c63b698f 1144 }
michaeljkoster 2:1026c63b698f 1145
michaeljkoster 2:1026c63b698f 1146 if(resource_temp_ptr->resource_parameters_ptr->coap_content_type != 0)
michaeljkoster 2:1026c63b698f 1147 {
michaeljkoster 2:1026c63b698f 1148 /* ;if="content" */
michaeljkoster 2:1026c63b698f 1149 return_value += 6; // all but not content
michaeljkoster 2:1026c63b698f 1150 return_value += sn_nsdl_itoa_len(resource_temp_ptr->resource_parameters_ptr->coap_content_type);
michaeljkoster 2:1026c63b698f 1151 }
michaeljkoster 2:1026c63b698f 1152
michaeljkoster 2:1026c63b698f 1153 if(resource_temp_ptr->resource_parameters_ptr->observable)
michaeljkoster 2:1026c63b698f 1154 {
michaeljkoster 2:1026c63b698f 1155 /* ;obs */
michaeljkoster 2:1026c63b698f 1156 return_value += 4;
michaeljkoster 2:1026c63b698f 1157 }
michaeljkoster 2:1026c63b698f 1158 /*todo: aobs not supported ATM - needs fixing*/
michaeljkoster 2:1026c63b698f 1159 /*
michaeljkoster 2:1026c63b698f 1160 if((resource_temp_ptr->resource_parameters_ptr->auto_obs_len > 0 && resource_temp_ptr->resource_parameters_ptr->auto_obs_len <= 8) &&
michaeljkoster 2:1026c63b698f 1161 resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr)
michaeljkoster 2:1026c63b698f 1162 {
michaeljkoster 2:1026c63b698f 1163 uint8_t i = resource_temp_ptr->resource_parameters_ptr->auto_obs_len;
michaeljkoster 2:1026c63b698f 1164 // ;aobs;id=
michaeljkoster 2:1026c63b698f 1165 return_value += 9;
michaeljkoster 2:1026c63b698f 1166 while(i--)
michaeljkoster 2:1026c63b698f 1167 {
michaeljkoster 2:1026c63b698f 1168 return_value += sn_nsdl_itoa_len(*(resource_temp_ptr->resource_parameters_ptr->auto_obs_ptr + i));
michaeljkoster 2:1026c63b698f 1169 }
michaeljkoster 2:1026c63b698f 1170 }
michaeljkoster 2:1026c63b698f 1171 */
michaeljkoster 2:1026c63b698f 1172
michaeljkoster 2:1026c63b698f 1173 }
michaeljkoster 2:1026c63b698f 1174
michaeljkoster 2:1026c63b698f 1175 resource_temp_ptr = sn_grs_get_next_resource();
michaeljkoster 2:1026c63b698f 1176
michaeljkoster 2:1026c63b698f 1177 }
michaeljkoster 2:1026c63b698f 1178
michaeljkoster 2:1026c63b698f 1179 return return_value;
michaeljkoster 2:1026c63b698f 1180
michaeljkoster 2:1026c63b698f 1181 }
michaeljkoster 2:1026c63b698f 1182
michaeljkoster 2:1026c63b698f 1183 /**
michaeljkoster 2:1026c63b698f 1184 * \fn static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type)
michaeljkoster 2:1026c63b698f 1185 *
michaeljkoster 2:1026c63b698f 1186 *
michaeljkoster 2:1026c63b698f 1187 * \brief Calculates needed uri query option length
michaeljkoster 2:1026c63b698f 1188 *
michaeljkoster 2:1026c63b698f 1189 * \param *endpoint_info_ptr Pointer to endpoint info structure
michaeljkoster 2:1026c63b698f 1190 * \param msg_type Message type
michaeljkoster 2:1026c63b698f 1191 *
michaeljkoster 2:1026c63b698f 1192 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 1193 */
michaeljkoster 2:1026c63b698f 1194 static uint8_t sn_nsdl_calculate_uri_query_option_len(sn_nsdl_ep_parameters_s *endpoint_info_ptr, uint8_t msg_type)
michaeljkoster 2:1026c63b698f 1195 {
michaeljkoster 2:1026c63b698f 1196 uint8_t return_value = 0;
michaeljkoster 2:1026c63b698f 1197 uint8_t number_of_parameters = 0;
michaeljkoster 2:1026c63b698f 1198
michaeljkoster 2:1026c63b698f 1199
michaeljkoster 2:1026c63b698f 1200 if((endpoint_info_ptr->endpoint_name_len != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE) && endpoint_info_ptr->endpoint_name_ptr != 0)
michaeljkoster 2:1026c63b698f 1201 {
michaeljkoster 2:1026c63b698f 1202 return_value += endpoint_info_ptr->endpoint_name_len;
michaeljkoster 7:2b79bf135ec2 1203 return_value += 3; //ep= should use sizeof here, very subtle packet truncation bug
michaeljkoster 2:1026c63b698f 1204 number_of_parameters++;
michaeljkoster 2:1026c63b698f 1205 }
michaeljkoster 2:1026c63b698f 1206
michaeljkoster 2:1026c63b698f 1207 if((endpoint_info_ptr->type_len != 0) && (endpoint_info_ptr->type_ptr != 0))
michaeljkoster 2:1026c63b698f 1208 {
michaeljkoster 2:1026c63b698f 1209 return_value+=endpoint_info_ptr->type_len;
michaeljkoster 2:1026c63b698f 1210 return_value += 3;
michaeljkoster 2:1026c63b698f 1211 number_of_parameters++;
michaeljkoster 2:1026c63b698f 1212 }
michaeljkoster 2:1026c63b698f 1213
michaeljkoster 2:1026c63b698f 1214 if((endpoint_info_ptr->lifetime_len != 0) && (endpoint_info_ptr->lifetime_ptr != 0))
michaeljkoster 2:1026c63b698f 1215 {
michaeljkoster 2:1026c63b698f 1216 return_value+=endpoint_info_ptr->lifetime_len;
michaeljkoster 2:1026c63b698f 1217 return_value += 3;
michaeljkoster 2:1026c63b698f 1218 number_of_parameters++;
michaeljkoster 2:1026c63b698f 1219 }
michaeljkoster 2:1026c63b698f 1220
michaeljkoster 2:1026c63b698f 1221 if(number_of_parameters != 0)
michaeljkoster 2:1026c63b698f 1222 return_value += (number_of_parameters - 1);
michaeljkoster 2:1026c63b698f 1223
michaeljkoster 2:1026c63b698f 1224 return return_value;
michaeljkoster 2:1026c63b698f 1225 }
michaeljkoster 2:1026c63b698f 1226
michaeljkoster 2:1026c63b698f 1227 /**
michaeljkoster 2:1026c63b698f 1228 * \fn static int8_t sn_nsdl_fill_uri_query_options(sn_nsdl_ep_parameters_s *parameter_ptr, sn_coap_hdr_s *source_msg_ptr, uint8_t msg_type)
michaeljkoster 2:1026c63b698f 1229 *
michaeljkoster 2:1026c63b698f 1230 *
michaeljkoster 2:1026c63b698f 1231 * \brief Fills uri-query options to message header struct
michaeljkoster 2:1026c63b698f 1232 *
michaeljkoster 2:1026c63b698f 1233 * \param *parameter_ptr Pointer to endpoint parameters struct
michaeljkoster 2:1026c63b698f 1234 * \param *source_msg_ptr Pointer to CoAP header struct
michaeljkoster 2:1026c63b698f 1235 * \param msg_type Message type
michaeljkoster 2:1026c63b698f 1236 *
michaeljkoster 2:1026c63b698f 1237 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 1238 */
michaeljkoster 2:1026c63b698f 1239 static int8_t sn_nsdl_fill_uri_query_options(sn_nsdl_ep_parameters_s *parameter_ptr, sn_coap_hdr_s *source_msg_ptr, uint8_t msg_type)
michaeljkoster 2:1026c63b698f 1240 {
michaeljkoster 2:1026c63b698f 1241 uint8_t *temp_ptr = NULL;
michaeljkoster 2:1026c63b698f 1242 source_msg_ptr->options_list_ptr->uri_query_len = sn_nsdl_calculate_uri_query_option_len(parameter_ptr, msg_type);
michaeljkoster 2:1026c63b698f 1243
michaeljkoster 2:1026c63b698f 1244 if(source_msg_ptr->options_list_ptr->uri_query_len == 0)
michaeljkoster 2:1026c63b698f 1245 return 0;
michaeljkoster 2:1026c63b698f 1246
michaeljkoster 2:1026c63b698f 1247 source_msg_ptr->options_list_ptr->uri_query_ptr = sn_nsdl_alloc(source_msg_ptr->options_list_ptr->uri_query_len);
michaeljkoster 2:1026c63b698f 1248
michaeljkoster 2:1026c63b698f 1249 if (source_msg_ptr->options_list_ptr->uri_query_ptr == NULL)
michaeljkoster 2:1026c63b698f 1250 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1251
michaeljkoster 2:1026c63b698f 1252 temp_ptr = source_msg_ptr->options_list_ptr->uri_query_ptr;
michaeljkoster 2:1026c63b698f 1253
michaeljkoster 2:1026c63b698f 1254 /******************************************************/
michaeljkoster 2:1026c63b698f 1255 /* If endpoint name is configured, fill needed fields */
michaeljkoster 2:1026c63b698f 1256 /******************************************************/
michaeljkoster 2:1026c63b698f 1257
michaeljkoster 2:1026c63b698f 1258 if((parameter_ptr->endpoint_name_len != 0) && (parameter_ptr->endpoint_name_ptr != 0) && (msg_type == SN_NSDL_EP_REGISTER_MESSAGE))
michaeljkoster 2:1026c63b698f 1259 {
michaeljkoster 7:2b79bf135ec2 1260 /* fill endpoint name, first ?ep=, then endpoint name */
michaeljkoster 2:1026c63b698f 1261 memcpy(temp_ptr, ep_name_parameter_string, sizeof(ep_name_parameter_string));
michaeljkoster 2:1026c63b698f 1262 temp_ptr += EP_NAME_PARAMETERS_LEN;
michaeljkoster 2:1026c63b698f 1263 memcpy(temp_ptr, parameter_ptr->endpoint_name_ptr, parameter_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 1264 temp_ptr += parameter_ptr->endpoint_name_len;
michaeljkoster 2:1026c63b698f 1265 }
michaeljkoster 2:1026c63b698f 1266
michaeljkoster 2:1026c63b698f 1267 /******************************************************/
michaeljkoster 2:1026c63b698f 1268 /* If endpoint type is configured, fill needed fields */
michaeljkoster 2:1026c63b698f 1269 /******************************************************/
michaeljkoster 2:1026c63b698f 1270
michaeljkoster 2:1026c63b698f 1271 if((parameter_ptr->type_len != 0) && (parameter_ptr->type_ptr != 0))
michaeljkoster 2:1026c63b698f 1272 {
michaeljkoster 2:1026c63b698f 1273 if(temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr)
michaeljkoster 2:1026c63b698f 1274 *temp_ptr++ = '&';
michaeljkoster 2:1026c63b698f 1275
michaeljkoster 2:1026c63b698f 1276 memcpy(temp_ptr, ep_type_parameter_string, sizeof(ep_type_parameter_string));
michaeljkoster 2:1026c63b698f 1277 temp_ptr += EP_TYPE_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1278 memcpy(temp_ptr, parameter_ptr->type_ptr, parameter_ptr->type_len);
michaeljkoster 2:1026c63b698f 1279 temp_ptr += parameter_ptr->type_len;
michaeljkoster 2:1026c63b698f 1280 }
michaeljkoster 2:1026c63b698f 1281
michaeljkoster 2:1026c63b698f 1282
michaeljkoster 2:1026c63b698f 1283 /******************************************************/
michaeljkoster 2:1026c63b698f 1284 /* If lifetime is configured, fill needed fields */
michaeljkoster 2:1026c63b698f 1285 /******************************************************/
michaeljkoster 2:1026c63b698f 1286
michaeljkoster 2:1026c63b698f 1287 if((parameter_ptr->lifetime_len != 0) && (parameter_ptr->lifetime_ptr != 0))
michaeljkoster 2:1026c63b698f 1288 {
michaeljkoster 2:1026c63b698f 1289 if(temp_ptr != source_msg_ptr->options_list_ptr->uri_query_ptr)
michaeljkoster 2:1026c63b698f 1290 *temp_ptr++ = '&';
michaeljkoster 2:1026c63b698f 1291
michaeljkoster 2:1026c63b698f 1292 memcpy(temp_ptr, ep_lifetime_parameter, sizeof(ep_lifetime_parameter));
michaeljkoster 2:1026c63b698f 1293 temp_ptr += LT_PARAMETER_LEN;
michaeljkoster 2:1026c63b698f 1294 memcpy(temp_ptr, parameter_ptr->lifetime_ptr, parameter_ptr->lifetime_len);
michaeljkoster 7:2b79bf135ec2 1295 temp_ptr += parameter_ptr->lifetime_len;// why does the last char of lifetime get cut off (only on reg, not on update)?
michaeljkoster 2:1026c63b698f 1296 }
michaeljkoster 2:1026c63b698f 1297
michaeljkoster 5:613a7624c473 1298 //FIXME need to add domain to query options
michaeljkoster 5:613a7624c473 1299
michaeljkoster 2:1026c63b698f 1300 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 1301 }
michaeljkoster 2:1026c63b698f 1302
michaeljkoster 2:1026c63b698f 1303 /**
michaeljkoster 2:1026c63b698f 1304 * \fn static uint8_t sn_nsdl_local_rx_function(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
michaeljkoster 2:1026c63b698f 1305 *
michaeljkoster 2:1026c63b698f 1306 * \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.
michaeljkoster 2:1026c63b698f 1307 *
michaeljkoster 2:1026c63b698f 1308 * \param *coap_packet_ptr Pointer to received CoAP packet
michaeljkoster 2:1026c63b698f 1309 * \param *address_ptr Pointer to source address struct
michaeljkoster 2:1026c63b698f 1310 *
michaeljkoster 2:1026c63b698f 1311 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 1312 */
michaeljkoster 2:1026c63b698f 1313 static int8_t sn_nsdl_local_rx_function(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
michaeljkoster 2:1026c63b698f 1314 {
michaeljkoster 2:1026c63b698f 1315 int8_t status = 0;
michaeljkoster 2:1026c63b698f 1316 uint16_t number_of_messages;
michaeljkoster 2:1026c63b698f 1317 sn_nsdl_sent_messages_s *sent_message_temp_ptr;
michaeljkoster 2:1026c63b698f 1318
michaeljkoster 2:1026c63b698f 1319 if((coap_packet_ptr == 0) || (address_ptr == 0))
michaeljkoster 2:1026c63b698f 1320 return -1;
michaeljkoster 2:1026c63b698f 1321
michaeljkoster 2:1026c63b698f 1322 /* If we wait for a response to some message.. */
michaeljkoster 2:1026c63b698f 1323 number_of_messages = sn_linked_list_count_nodes(message_list_ptr);
michaeljkoster 2:1026c63b698f 1324
michaeljkoster 2:1026c63b698f 1325 if(number_of_messages)
michaeljkoster 2:1026c63b698f 1326 {
michaeljkoster 2:1026c63b698f 1327 while(number_of_messages--)
michaeljkoster 2:1026c63b698f 1328 {
michaeljkoster 2:1026c63b698f 1329 sent_message_temp_ptr = sn_linked_list_get_last_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 1330
michaeljkoster 2:1026c63b698f 1331 if(sent_message_temp_ptr)
michaeljkoster 2:1026c63b698f 1332 {
michaeljkoster 2:1026c63b698f 1333 if(sent_message_temp_ptr->msg_id_number == coap_packet_ptr->msg_id)
michaeljkoster 2:1026c63b698f 1334 {
michaeljkoster 2:1026c63b698f 1335 switch(sent_message_temp_ptr->message_type)
michaeljkoster 2:1026c63b698f 1336 {
michaeljkoster 2:1026c63b698f 1337 case SN_NSDL_MSG_REGISTER:
michaeljkoster 2:1026c63b698f 1338 if(coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_CREATED)
michaeljkoster 2:1026c63b698f 1339 {
michaeljkoster 2:1026c63b698f 1340 sn_nsdl_endpoint_registered = SN_NSDL_ENDPOINT_IS_REGISTERED;
michaeljkoster 2:1026c63b698f 1341 sn_nsdl_mark_resources_as_registered();
michaeljkoster 2:1026c63b698f 1342 status = sn_nsdl_resolve_ep_information(coap_packet_ptr);
michaeljkoster 2:1026c63b698f 1343 if(status != SN_NSDL_SUCCESS)
michaeljkoster 2:1026c63b698f 1344 {
michaeljkoster 2:1026c63b698f 1345 /* Node can be removed */
michaeljkoster 2:1026c63b698f 1346 sn_nsdl_free(sent_message_temp_ptr);
michaeljkoster 2:1026c63b698f 1347 sn_linked_list_remove_current_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 1348 return status;
michaeljkoster 2:1026c63b698f 1349 }
michaeljkoster 2:1026c63b698f 1350 }
michaeljkoster 2:1026c63b698f 1351 break;
michaeljkoster 2:1026c63b698f 1352 case SN_NSDL_MSG_UNREGISTER:
michaeljkoster 2:1026c63b698f 1353 if(coap_packet_ptr->msg_code == COAP_MSG_CODE_RESPONSE_DELETED)
michaeljkoster 9:92486dc835ee 1354 // FIXME how does this work with RD and LWM2M registration handles?
michaeljkoster 2:1026c63b698f 1355 {
michaeljkoster 2:1026c63b698f 1356 if(ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 1357 {
michaeljkoster 2:1026c63b698f 1358 sn_nsdl_free(ep_information_ptr->endpoint_name_ptr);
michaeljkoster 2:1026c63b698f 1359 ep_information_ptr->endpoint_name_ptr = 0;
michaeljkoster 2:1026c63b698f 1360 ep_information_ptr->endpoint_name_len = 0;
michaeljkoster 2:1026c63b698f 1361 }
michaeljkoster 2:1026c63b698f 1362
michaeljkoster 2:1026c63b698f 1363 if(ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 1364 {
michaeljkoster 2:1026c63b698f 1365 sn_nsdl_free(ep_information_ptr->domain_name_ptr);
michaeljkoster 2:1026c63b698f 1366 ep_information_ptr->domain_name_ptr = 0;
michaeljkoster 2:1026c63b698f 1367 ep_information_ptr->domain_name_len = 0;
michaeljkoster 2:1026c63b698f 1368 }
michaeljkoster 2:1026c63b698f 1369
michaeljkoster 2:1026c63b698f 1370 }
michaeljkoster 2:1026c63b698f 1371 break;
michaeljkoster 2:1026c63b698f 1372 case SN_NSDL_MSG_EVENT:
michaeljkoster 2:1026c63b698f 1373 case SN_NSDL_MSG_UPDATE:
michaeljkoster 2:1026c63b698f 1374 break;
michaeljkoster 2:1026c63b698f 1375 }
michaeljkoster 2:1026c63b698f 1376 /* Node can be removed */
michaeljkoster 2:1026c63b698f 1377 sn_nsdl_free(sent_message_temp_ptr);
michaeljkoster 2:1026c63b698f 1378 sn_linked_list_remove_current_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 1379
michaeljkoster 2:1026c63b698f 1380 sn_nsdl_rx_callback(coap_packet_ptr, address_ptr);
michaeljkoster 2:1026c63b698f 1381 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 1382 }
michaeljkoster 2:1026c63b698f 1383 }
michaeljkoster 2:1026c63b698f 1384 sent_message_temp_ptr = sn_linked_list_get_previous_node(message_list_ptr);
michaeljkoster 2:1026c63b698f 1385 }
michaeljkoster 2:1026c63b698f 1386 }
michaeljkoster 2:1026c63b698f 1387
michaeljkoster 2:1026c63b698f 1388 /* No messages to wait for, or message was not response to our request */
michaeljkoster 2:1026c63b698f 1389 status = sn_nsdl_rx_callback(coap_packet_ptr, address_ptr);
michaeljkoster 2:1026c63b698f 1390
michaeljkoster 2:1026c63b698f 1391 return status;
michaeljkoster 2:1026c63b698f 1392 }
michaeljkoster 2:1026c63b698f 1393
michaeljkoster 2:1026c63b698f 1394 void sn_nsdl_mark_resources_as_registered(void)
michaeljkoster 2:1026c63b698f 1395 {
michaeljkoster 2:1026c63b698f 1396
michaeljkoster 2:1026c63b698f 1397 sn_nsdl_resource_info_s *temp_resource;
michaeljkoster 2:1026c63b698f 1398
michaeljkoster 2:1026c63b698f 1399 temp_resource = sn_grs_get_first_resource();
michaeljkoster 2:1026c63b698f 1400
michaeljkoster 2:1026c63b698f 1401 while(temp_resource)
michaeljkoster 2:1026c63b698f 1402 {
michaeljkoster 2:1026c63b698f 1403
michaeljkoster 2:1026c63b698f 1404 if(temp_resource->resource_parameters_ptr->registered == SN_NDSL_RESOURCE_REGISTERING)
michaeljkoster 2:1026c63b698f 1405 {
michaeljkoster 2:1026c63b698f 1406
michaeljkoster 2:1026c63b698f 1407 temp_resource->resource_parameters_ptr->registered = SN_NDSL_RESOURCE_REGISTERED;
michaeljkoster 2:1026c63b698f 1408
michaeljkoster 2:1026c63b698f 1409 }
michaeljkoster 2:1026c63b698f 1410
michaeljkoster 2:1026c63b698f 1411 temp_resource = sn_grs_get_next_resource();
michaeljkoster 2:1026c63b698f 1412
michaeljkoster 2:1026c63b698f 1413 }
michaeljkoster 2:1026c63b698f 1414
michaeljkoster 2:1026c63b698f 1415
michaeljkoster 2:1026c63b698f 1416 }
michaeljkoster 2:1026c63b698f 1417
michaeljkoster 2:1026c63b698f 1418 /**
michaeljkoster 2:1026c63b698f 1419 * \fn static int8_t sn_nsdl_resolve_ep_information(sn_coap_hdr_s *coap_packet_ptr)
michaeljkoster 2:1026c63b698f 1420 *
michaeljkoster 2:1026c63b698f 1421 *
michaeljkoster 2:1026c63b698f 1422 * \brief Resolves endpoint information from received CoAP message
michaeljkoster 2:1026c63b698f 1423 *
michaeljkoster 2:1026c63b698f 1424 * \param *coap_packet_ptr Pointer to received CoAP message
michaeljkoster 2:1026c63b698f 1425 *
michaeljkoster 2:1026c63b698f 1426 * \return SN_NSDL_SUCCESS = 0, Failed = -1
michaeljkoster 2:1026c63b698f 1427 */
michaeljkoster 2:1026c63b698f 1428 static int8_t sn_nsdl_resolve_ep_information(sn_coap_hdr_s *coap_packet_ptr)
michaeljkoster 2:1026c63b698f 1429 {
michaeljkoster 2:1026c63b698f 1430 uint8_t *temp_ptr;
michaeljkoster 2:1026c63b698f 1431 uint8_t parameter_count = 0;
michaeljkoster 2:1026c63b698f 1432 uint16_t parameter_len = 0;
michaeljkoster 4:bfa3d2283925 1433 uint16_t location_path_len = 0;
michaeljkoster 2:1026c63b698f 1434
michaeljkoster 2:1026c63b698f 1435 if(!coap_packet_ptr)
michaeljkoster 2:1026c63b698f 1436 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1437 if(!coap_packet_ptr->options_list_ptr)
michaeljkoster 2:1026c63b698f 1438 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1439 if(!coap_packet_ptr->options_list_ptr->location_path_ptr)
michaeljkoster 2:1026c63b698f 1440 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1441
michaeljkoster 2:1026c63b698f 1442 temp_ptr = coap_packet_ptr->options_list_ptr->location_path_ptr;
michaeljkoster 2:1026c63b698f 1443
michaeljkoster 2:1026c63b698f 1444 while(temp_ptr <= (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len))
michaeljkoster 2:1026c63b698f 1445 {
michaeljkoster 2:1026c63b698f 1446
michaeljkoster 2:1026c63b698f 1447 if((temp_ptr == (coap_packet_ptr->options_list_ptr->location_path_ptr + coap_packet_ptr->options_list_ptr->location_path_len)) || (*temp_ptr == '/'))
michaeljkoster 2:1026c63b698f 1448 {
michaeljkoster 5:613a7624c473 1449 //FIXME need to count parameters before guessing about meanings, e.g. 1 parameter = location, 2 = /rd/location, 3 = /rd/domain/location
michaeljkoster 2:1026c63b698f 1450 parameter_count++;
michaeljkoster 2:1026c63b698f 1451 if(parameter_count == 2)
michaeljkoster 2:1026c63b698f 1452 {
michaeljkoster 2:1026c63b698f 1453 if(!ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 1454 {
michaeljkoster 2:1026c63b698f 1455 ep_information_ptr->domain_name_len = parameter_len - 1;
michaeljkoster 2:1026c63b698f 1456 ep_information_ptr->domain_name_ptr = sn_nsdl_alloc(ep_information_ptr->domain_name_len);
michaeljkoster 2:1026c63b698f 1457 if(!ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 1458 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1459 memcpy(ep_information_ptr->domain_name_ptr, temp_ptr - ep_information_ptr->domain_name_len, ep_information_ptr->domain_name_len);
michaeljkoster 2:1026c63b698f 1460 }
michaeljkoster 2:1026c63b698f 1461
michaeljkoster 2:1026c63b698f 1462 }
michaeljkoster 2:1026c63b698f 1463 if(parameter_count == 3)
michaeljkoster 2:1026c63b698f 1464 {
michaeljkoster 2:1026c63b698f 1465 if(!ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 1466 {
michaeljkoster 2:1026c63b698f 1467 ep_information_ptr->endpoint_name_len = parameter_len - 1;
michaeljkoster 2:1026c63b698f 1468 ep_information_ptr->endpoint_name_ptr = sn_nsdl_alloc(ep_information_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 1469 if(!ep_information_ptr->endpoint_name_ptr)
michaeljkoster 2:1026c63b698f 1470 {
michaeljkoster 2:1026c63b698f 1471 if(ep_information_ptr->domain_name_ptr)
michaeljkoster 2:1026c63b698f 1472 {
michaeljkoster 2:1026c63b698f 1473 sn_nsdl_free(ep_information_ptr->domain_name_ptr);
michaeljkoster 2:1026c63b698f 1474 ep_information_ptr->domain_name_ptr = NULL;
michaeljkoster 2:1026c63b698f 1475 ep_information_ptr->domain_name_len = 0;
michaeljkoster 2:1026c63b698f 1476 }
michaeljkoster 2:1026c63b698f 1477
michaeljkoster 2:1026c63b698f 1478 return SN_NSDL_FAILURE;
michaeljkoster 2:1026c63b698f 1479
michaeljkoster 2:1026c63b698f 1480 }
michaeljkoster 2:1026c63b698f 1481 memcpy(ep_information_ptr->endpoint_name_ptr, temp_ptr - ep_information_ptr->endpoint_name_len, ep_information_ptr->endpoint_name_len);
michaeljkoster 2:1026c63b698f 1482 }
michaeljkoster 2:1026c63b698f 1483 }
michaeljkoster 2:1026c63b698f 1484 parameter_len = 0;
michaeljkoster 2:1026c63b698f 1485 }
michaeljkoster 4:bfa3d2283925 1486 location_path_len++;
michaeljkoster 2:1026c63b698f 1487 parameter_len++;
michaeljkoster 2:1026c63b698f 1488 temp_ptr++;
michaeljkoster 2:1026c63b698f 1489 }
michaeljkoster 4:bfa3d2283925 1490 // capture the entire location path for registration updates
michaeljkoster 4:bfa3d2283925 1491 ep_registration_location_len = location_path_len -1;
michaeljkoster 4:bfa3d2283925 1492 ep_registration_location_ptr = sn_nsdl_alloc(ep_registration_location_len);
michaeljkoster 4:bfa3d2283925 1493 if(!ep_registration_location_ptr)
michaeljkoster 4:bfa3d2283925 1494 return SN_NSDL_FAILURE;
michaeljkoster 4:bfa3d2283925 1495 memcpy(ep_registration_location_ptr, (temp_ptr-1) - ep_registration_location_len, ep_registration_location_len);
michaeljkoster 4:bfa3d2283925 1496
michaeljkoster 2:1026c63b698f 1497 return SN_NSDL_SUCCESS;
michaeljkoster 2:1026c63b698f 1498 }
michaeljkoster 2:1026c63b698f 1499
michaeljkoster 2:1026c63b698f 1500 /**
michaeljkoster 2:1026c63b698f 1501 * \fn int8_t set_NSP_address(uint8_t *NSP_address, uint16_t port, sn_nsdl_addr_type_e address_type)
michaeljkoster 2:1026c63b698f 1502 * \brief This function is used to set the NSP address given by an application.
michaeljkoster 2:1026c63b698f 1503 * \param uint8_t *NSP_address Pointer to NSP address Note! IPv6 address must always be 16 bytes long and IPv4 address must always be 4 bytes long!
michaeljkoster 2:1026c63b698f 1504 * \param uint16_t port NSP port
michaeljkoster 2:1026c63b698f 1505 * \param sn_nsdl_addr_type_e address_type NSP address type (SN_NSDL_ADDRESS_TYPE_IPV6 or SN_NSDL_ADDRESS_TYPE_IPV4)
michaeljkoster 2:1026c63b698f 1506 * \return 0 on success, -1 on false to indicate that NSDL internal address pointer is not allocated (call nsdl_init() first).
michaeljkoster 2:1026c63b698f 1507 *
michaeljkoster 2:1026c63b698f 1508 */
michaeljkoster 2:1026c63b698f 1509 int8_t set_NSP_address(uint8_t *NSP_address, uint16_t port, sn_nsdl_addr_type_e address_type)
michaeljkoster 2:1026c63b698f 1510 {
michaeljkoster 2:1026c63b698f 1511
michaeljkoster 2:1026c63b698f 1512 /* Check parameters and source pointers */
michaeljkoster 2:1026c63b698f 1513 if(!nsp_address_ptr || !NSP_address)
michaeljkoster 2:1026c63b698f 1514 {
michaeljkoster 2:1026c63b698f 1515 return -1;
michaeljkoster 2:1026c63b698f 1516 }
michaeljkoster 2:1026c63b698f 1517
michaeljkoster 2:1026c63b698f 1518 nsp_address_ptr->type = address_type;
michaeljkoster 2:1026c63b698f 1519
michaeljkoster 2:1026c63b698f 1520 if(address_type == SN_NSDL_ADDRESS_TYPE_IPV4)
michaeljkoster 2:1026c63b698f 1521 {
michaeljkoster 2:1026c63b698f 1522 if(nsp_address_ptr->addr_ptr)
michaeljkoster 2:1026c63b698f 1523 {
michaeljkoster 2:1026c63b698f 1524 sn_nsdl_free(nsp_address_ptr->addr_ptr);
michaeljkoster 2:1026c63b698f 1525 }
michaeljkoster 2:1026c63b698f 1526
michaeljkoster 2:1026c63b698f 1527 nsp_address_ptr->addr_len = 4;
michaeljkoster 2:1026c63b698f 1528
michaeljkoster 2:1026c63b698f 1529 nsp_address_ptr->addr_ptr = sn_nsdl_alloc(nsp_address_ptr->addr_len);
michaeljkoster 2:1026c63b698f 1530 if(!nsp_address_ptr->addr_ptr)
michaeljkoster 2:1026c63b698f 1531 return -1;
michaeljkoster 2:1026c63b698f 1532
michaeljkoster 2:1026c63b698f 1533 memcpy(nsp_address_ptr->addr_ptr, NSP_address, nsp_address_ptr->addr_len);
michaeljkoster 2:1026c63b698f 1534 nsp_address_ptr->port = port;
michaeljkoster 2:1026c63b698f 1535 }
michaeljkoster 2:1026c63b698f 1536
michaeljkoster 2:1026c63b698f 1537 else if(address_type == SN_NSDL_ADDRESS_TYPE_IPV6)
michaeljkoster 2:1026c63b698f 1538 {
michaeljkoster 2:1026c63b698f 1539 if(nsp_address_ptr->addr_ptr)
michaeljkoster 2:1026c63b698f 1540 {
michaeljkoster 2:1026c63b698f 1541 sn_nsdl_free(nsp_address_ptr->addr_ptr);
michaeljkoster 2:1026c63b698f 1542 }
michaeljkoster 2:1026c63b698f 1543
michaeljkoster 2:1026c63b698f 1544 nsp_address_ptr->addr_len = 16;
michaeljkoster 2:1026c63b698f 1545
michaeljkoster 2:1026c63b698f 1546 nsp_address_ptr->addr_ptr = sn_nsdl_alloc(nsp_address_ptr->addr_len);
michaeljkoster 2:1026c63b698f 1547 if(!nsp_address_ptr->addr_ptr)
michaeljkoster 2:1026c63b698f 1548 return -1;
michaeljkoster 2:1026c63b698f 1549
michaeljkoster 2:1026c63b698f 1550 memcpy(nsp_address_ptr->addr_ptr, NSP_address, nsp_address_ptr->addr_len);
michaeljkoster 2:1026c63b698f 1551 nsp_address_ptr->port = port;
michaeljkoster 2:1026c63b698f 1552 }
michaeljkoster 2:1026c63b698f 1553 return 0;
michaeljkoster 2:1026c63b698f 1554 }
michaeljkoster 2:1026c63b698f 1555
michaeljkoster 2:1026c63b698f 1556
michaeljkoster 2:1026c63b698f 1557 static uint8_t sn_nsdl_itoa_len(uint8_t value)
michaeljkoster 2:1026c63b698f 1558 {
michaeljkoster 2:1026c63b698f 1559 uint8_t i = 0;
michaeljkoster 2:1026c63b698f 1560
michaeljkoster 2:1026c63b698f 1561 do
michaeljkoster 2:1026c63b698f 1562 {
michaeljkoster 2:1026c63b698f 1563 i++;
michaeljkoster 2:1026c63b698f 1564 }while((value /= 10) > 0);
michaeljkoster 2:1026c63b698f 1565
michaeljkoster 2:1026c63b698f 1566 return i;
michaeljkoster 2:1026c63b698f 1567 }
michaeljkoster 2:1026c63b698f 1568
michaeljkoster 2:1026c63b698f 1569 static uint8_t *sn_nsdl_itoa(uint8_t *ptr, uint8_t value)
michaeljkoster 2:1026c63b698f 1570 {
michaeljkoster 2:1026c63b698f 1571
michaeljkoster 2:1026c63b698f 1572 uint8_t start = 0;
michaeljkoster 2:1026c63b698f 1573 uint8_t end = 0;
michaeljkoster 2:1026c63b698f 1574 uint8_t i;
michaeljkoster 2:1026c63b698f 1575
michaeljkoster 2:1026c63b698f 1576 i = 0;
michaeljkoster 2:1026c63b698f 1577
michaeljkoster 2:1026c63b698f 1578 /* ITOA */
michaeljkoster 2:1026c63b698f 1579 do
michaeljkoster 2:1026c63b698f 1580 {
michaeljkoster 2:1026c63b698f 1581 ptr[i++] = (value % 10) + '0';
michaeljkoster 2:1026c63b698f 1582 }while((value /= 10) > 0);
michaeljkoster 2:1026c63b698f 1583
michaeljkoster 2:1026c63b698f 1584 end = i - 1;
michaeljkoster 2:1026c63b698f 1585
michaeljkoster 2:1026c63b698f 1586 /* reverse (part of ITOA) */
michaeljkoster 2:1026c63b698f 1587 while(start < end)
michaeljkoster 2:1026c63b698f 1588 {
michaeljkoster 2:1026c63b698f 1589 uint8_t chr;
michaeljkoster 2:1026c63b698f 1590
michaeljkoster 2:1026c63b698f 1591 chr = ptr[start];
michaeljkoster 2:1026c63b698f 1592 ptr[start] = ptr[end];
michaeljkoster 2:1026c63b698f 1593 ptr[end] = chr;
michaeljkoster 2:1026c63b698f 1594
michaeljkoster 2:1026c63b698f 1595 start++;
michaeljkoster 2:1026c63b698f 1596 end--;
michaeljkoster 2:1026c63b698f 1597
michaeljkoster 2:1026c63b698f 1598 }
michaeljkoster 2:1026c63b698f 1599 return (ptr + i);
michaeljkoster 2:1026c63b698f 1600 }
michaeljkoster 2:1026c63b698f 1601