hello

Dependents:   nespresso_demo nespresso_endpoint EnvoyNespressoEndpointColorDetectorV2

Fork of nsdl by Robert Taylor

Committer:
bjblazkowicz
Date:
Mon Jul 14 12:33:59 2014 +0000
Revision:
2:05e4cd1a1542
Parent:
0:f6e4e1bbb3fe
WIP - registration is broken in this commit.

Who changed what in which revision?

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