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