56#include "lwm2m-security.h"
66#if LWM2M_QUEUE_MODE_ENABLED
73#define LOG_MODULE "lwm2m-rd"
74#define LOG_LEVEL LOG_LEVEL_LWM2M
76#ifndef LWM2M_DEFAULT_CLIENT_LIFETIME
77#define LWM2M_DEFAULT_CLIENT_LIFETIME 30
80#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT)
81#define BS_REMOTE_PORT UIP_HTONS(5685)
83#define STATE_MACHINE_UPDATE_INTERVAL 500
92#define BOOTSTRAP_SENT 4
93#define BOOTSTRAP_DONE 5
94#define DO_REGISTRATION 6
95#define REGISTRATION_SENT 7
96#define REGISTRATION_DONE 8
99#define DEREGISTER_SENT 11
100#define DEREGISTER_FAILED 12
101#define DEREGISTERED 13
102#if LWM2M_QUEUE_MODE_ENABLED
103#define QUEUE_MODE_AWAKE 14
104#define QUEUE_MODE_SEND_UPDATE 15
107#define FLAG_RD_DATA_DIRTY 0x01
108#define FLAG_RD_DATA_UPDATE_TRIGGERED 0x02
109#define FLAG_RD_DATA_UPDATE_ON_DIRTY 0x10
111LIST(session_info_list);
114static char query_data[64];
115static uint8_t rd_data[128];
117static coap_timer_t rd_timer;
118static char default_ep[20];
120#if LWM2M_QUEUE_MODE_ENABLED
121static coap_timer_t queue_mode_client_awake_timer;
124static uint8_t queue_mode_client_awake;
127static uint16_t queue_mode_client_awake_time;
129static void queue_mode_awake_timer_callback(coap_timer_t *
timer);
132static void check_periodic_observations();
133static void update_callback(coap_callback_request_state_t *callback_state);
136set_rd_data(lwm2m_session_info_t *session_info)
138 lwm2m_buffer_t outbuf;
141 outbuf.buffer = rd_data;
142 outbuf.size =
sizeof(rd_data);
146 session_info->rd_more = lwm2m_engine_set_rd_data(&outbuf, 0);
147 coap_set_payload(session_info->request, rd_data, outbuf.len);
149 if(session_info->rd_more) {
151 LOG_DBG(
"Setting block1 in request\n");
152 coap_set_header_block1(session_info->request, 0, 1,
sizeof(rd_data));
158prepare_update(lwm2m_session_info_t *session_info,
int triggered)
160 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
161 coap_set_header_uri_path(session_info->request, session_info->assigned_ep);
163 snprintf(query_data,
sizeof(query_data) - 1,
"?lt=%d&b=%s", session_info->lifetime, session_info->binding);
164 LOG_DBG(
"UPDATE:%s %s\n", session_info->assigned_ep, query_data);
165 coap_set_header_uri_query(session_info->request, query_data);
167 if((triggered || session_info->rd_flags & FLAG_RD_DATA_UPDATE_ON_DIRTY) && (session_info->rd_flags & FLAG_RD_DATA_DIRTY)) {
168 session_info->rd_flags &= ~FLAG_RD_DATA_DIRTY;
169 set_rd_data(session_info);
170 session_info->rd_callback = update_callback;
175has_network_access(
void)
179#ifndef CONTIKI_TARGET_NATIVE
180 if(rpl_get_any_dag() == NULL) {
189lwm2m_rd_client_is_registered(lwm2m_session_info_t *session_info)
191 return session_info->rd_state == REGISTRATION_DONE || session_info->rd_state == UPDATE_SENT;
196lwm2m_rd_client_set_session_callback(lwm2m_session_info_t *session_info, session_callback_t cb)
198 session_info->callback = cb;
202perform_session_callback(lwm2m_session_info_t *session_info,
int state)
204 if(session_info->callback != NULL) {
205 LOG_DBG(
"Performing session callback: %d cb:%p\n",
206 state, session_info->callback);
207 session_info->callback(session_info, state);
212lwm2m_rd_client_get_lifetime(lwm2m_session_info_t *session_info)
214 return session_info->lifetime;
218lwm2m_rd_client_set_lifetime(lwm2m_session_info_t *session_info, uint16_t lifetime)
221 session_info->lifetime = lifetime;
223 session_info->lifetime = LWM2M_DEFAULT_CLIENT_LIFETIME;
228lwm2m_rd_client_set_endpoint_name(lwm2m_session_info_t *session_info,
const char *endpoint)
230 if(endpoint != NULL) {
231 session_info->ep = endpoint;
236lwm2m_rd_client_set_default_endpoint_name(
const char *endpoint)
238 strncpy(default_ep, endpoint,
sizeof(default_ep) - 1);
239 default_ep[
sizeof(default_ep) - 1] =
'\0';
243lwm2m_rd_client_set_update_rd(
void)
245 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
246 while(session_info != NULL) {
247 session_info->rd_flags |= FLAG_RD_DATA_DIRTY;
248 session_info = session_info->next;
253lwm2m_rd_client_set_automatic_update(lwm2m_session_info_t *session_info,
int update)
255 session_info->rd_flags = (session_info->rd_flags & ~FLAG_RD_DATA_UPDATE_ON_DIRTY) |
256 (update != 0 ? FLAG_RD_DATA_UPDATE_ON_DIRTY : 0);
260lwm2m_rd_client_register_with_server(lwm2m_session_info_t *session_info,
261 const coap_endpoint_t *server,
262 lwm2m_rd_client_server_type_t server_type)
264 if(session_info->ep == NULL) {
265 session_info->ep = default_ep;
268#if LWM2M_QUEUE_MODE_CONF_ENABLED
269 session_info->binding =
"UQ";
273 session_info->lifetime = (LWM2M_QUEUE_MODE_DEFAULT_CLIENT_SLEEP_TIME / 1000) * 2;
275 session_info->binding =
"U";
276 if(session_info->lifetime == 0) {
277 session_info->lifetime = LWM2M_DEFAULT_CLIENT_LIFETIME;
281 session_info->rd_flags = FLAG_RD_DATA_UPDATE_ON_DIRTY;
282 session_info->has_bs_server_info = 0;
283 session_info->has_registration_server_info = 0;
284 session_info->wait_until_network_check = 0;
285 session_info->last_update = 0;
286 session_info->last_rd_progress = 0;
287 session_info->bootstrapped = 0;
288 session_info->rd_state = INIT;
290 if(server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
292 session_info->has_bs_server_info = 1;
293 session_info->use_server_type = LWM2M_RD_CLIENT_BOOTSTRAP_SERVER;
296 session_info->use_server_type = LWM2M_RD_CLIENT_LWM2M_SERVER;
297 session_info->has_registration_server_info = 1;
300 list_add(session_info_list, session_info);
304lwm2m_rd_client_deregister(lwm2m_session_info_t *session_info)
306 if(lwm2m_rd_client_is_registered(session_info)) {
307 session_info->rd_state = DEREGISTER;
314static lwm2m_session_info_t *
315get_session_info_from_server_ep(
const coap_endpoint_t *server_ep)
317 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
318 while(session_info != NULL) {
322 session_info = session_info->next;
328lwm2m_rd_client_update_triggered(
const coap_endpoint_t *server_ep)
330 lwm2m_session_info_t *session_info = get_session_info_from_server_ep(server_ep);
332 session_info->rd_flags |= FLAG_RD_DATA_UPDATE_TRIGGERED;
348bootstrap_callback(coap_callback_request_state_t *callback_state)
350 coap_request_state_t *state = &callback_state->state;
351 LOG_DBG(
"Bootstrap callback Response: %d, ", state->response != NULL);
353 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
355 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
356 if(CHANGED_2_04 == state->response->code) {
357 LOG_DBG_(
"Considered done!\n");
358 session_info->rd_state = BOOTSTRAP_DONE;
362 LOG_DBG_(
"Failed with code %d. Retrying\n", state->response->code);
364 session_info->rd_state = INIT;
365 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
366 LOG_DBG_(
"Server not responding! Retry?");
367 session_info->rd_state = DO_BOOTSTRAP;
368 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
369 LOG_DBG_(
"Request finished. Ignore\n");
371 LOG_DBG_(
"Unexpected error! Retry?");
372 session_info->rd_state = DO_BOOTSTRAP;
377produce_more_rd(lwm2m_session_info_t *session_info)
379 lwm2m_buffer_t outbuf;
381 LOG_DBG(
"GOT Continue!\n");
384 outbuf.buffer = rd_data;
385 outbuf.size =
sizeof(rd_data);
388 session_info->rd_block1++;
391 session_info->rd_more = lwm2m_engine_set_rd_data(&outbuf, session_info->rd_block1);
392 coap_set_payload(session_info->request, rd_data, outbuf.len);
394 LOG_DBG(
"Setting block1 in request - block: %d more: %d\n",
395 (
int)session_info->rd_block1, (
int)session_info->rd_more);
396 coap_set_header_block1(session_info->request, session_info->rd_block1, session_info->rd_more,
sizeof(rd_data));
398 coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request, session_info->rd_callback);
402block1_rd_callback(coap_timer_t *
timer)
404 produce_more_rd((lwm2m_session_info_t *)
timer->user_data);
411registration_callback(coap_callback_request_state_t *callback_state)
413 coap_request_state_t *state = &callback_state->state;
414 LOG_DBG(
"Registration callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
415 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
417 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
421 if(CONTINUE_2_31 == state->response->code) {
423 coap_get_header_block1(state->response, &session_info->rd_block1, NULL, NULL, NULL);
427 LOG_DBG_(
"Continue\n");
428 }
else if(CREATED_2_01 == state->response->code) {
429 if(state->response->location_path_len < LWM2M_RD_CLIENT_ASSIGNED_ENDPOINT_MAX_LEN) {
430 memcpy(session_info->assigned_ep, state->response->location_path,
431 state->response->location_path_len);
432 session_info->assigned_ep[state->response->location_path_len] = 0;
434#if LWM2M_QUEUE_MODE_ENABLED
435#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
436 if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
437 lwm2m_queue_mode_set_first_request();
440 lwm2m_rd_client_fsm_execute_queue_mode_awake(session_info);
442 session_info->rd_state = REGISTRATION_DONE;
446 LOG_DBG_(
"Done (assigned EP='%s')!\n", session_info->assigned_ep);
447 perform_session_callback(session_info, LWM2M_RD_CLIENT_REGISTERED);
451 LOG_DBG_(
"failed to handle assigned EP: '");
452 LOG_DBG_COAP_STRING(state->response->location_path,
453 state->response->location_path_len);
454 LOG_DBG_(
"'. Re-init network.\n");
457 LOG_DBG_(
"failed with code %d. Re-init network\n", state->response->code);
460 session_info->rd_state = INIT;
461 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
462 LOG_DBG_(
"Server not responding, trying to reconnect\n");
463 session_info->rd_state = INIT;
464 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
465 LOG_DBG_(
"Request finished. Ignore\n");
467 LOG_DBG_(
"Unexpected error, trying to reconnect\n");
468 session_info->rd_state = INIT;
476update_callback(coap_callback_request_state_t *callback_state)
478 coap_request_state_t *state = &callback_state->state;
479 LOG_DBG(
"Update callback. Status: %d. Response: %d, ", state->status, state->response != NULL);
481 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
483 if(state->status == COAP_REQUEST_STATUS_RESPONSE) {
485 if(CONTINUE_2_31 == state->response->code) {
487 LOG_DBG_(
"Continue\n");
488 coap_get_header_block1(state->response, &session_info->rd_block1, NULL, NULL, NULL);
491 }
else if(CHANGED_2_04 == state->response->code) {
495#if LWM2M_QUEUE_MODE_ENABLED
497 if(lwm2m_queue_mode_is_waked_up_by_notification()) {
499 lwm2m_queue_mode_clear_waked_up_by_notification();
500 lwm2m_notification_queue_send_notifications();
502#if LWM2M_QUEUE_MODE_INCLUDE_DYNAMIC_ADAPTATION
503 if(lwm2m_queue_mode_get_dynamic_adaptation_flag()) {
504 lwm2m_queue_mode_set_first_request();
507 lwm2m_rd_client_fsm_execute_queue_mode_awake(session_info);
510 session_info->rd_state = REGISTRATION_DONE;
511 session_info->rd_flags &= ~FLAG_RD_DATA_UPDATE_TRIGGERED;
515 LOG_DBG_(
"Failed with code %d. Retrying registration\n",
516 state->response->code);
517 session_info->rd_state = DO_REGISTRATION;
519 }
else if(state->status == COAP_REQUEST_STATUS_TIMEOUT) {
520 LOG_DBG_(
"Server not responding, trying to reconnect\n");
521 session_info->rd_state = INIT;
522 }
else if(state->status == COAP_REQUEST_STATUS_FINISHED) {
523 LOG_DBG_(
"Request finished. Ignore\n");
525 LOG_DBG_(
"Unexpected error, trying to reconnect\n");
526 session_info->rd_state = INIT;
531deregister_callback(coap_callback_request_state_t *callback_state)
533 coap_request_state_t *state = &callback_state->state;
534 LOG_DBG(
"Deregister callback. Status: %d. Response Code: %d\n",
536 state->response != NULL ? state->response->code : 0);
538 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)state->user_data;
540 if(state->status == COAP_REQUEST_STATUS_RESPONSE && (DELETED_2_02 == state->response->code)) {
541 LOG_DBG(
"Deregistration success\n");
542 session_info->rd_state = DEREGISTERED;
543 perform_session_callback(session_info, LWM2M_RD_CLIENT_DEREGISTERED);
545 LOG_DBG(
"Deregistration failed\n");
546 if(session_info->rd_state == DEREGISTER_SENT) {
547 session_info->rd_state = DEREGISTER_FAILED;
548 perform_session_callback(session_info, LWM2M_RD_CLIENT_DEREGISTER_FAILED);
553#if LWM2M_QUEUE_MODE_ENABLED
555all_sessions_in_queue_mode_state(
void)
557 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
558 while(session_info != NULL) {
559 if(((session_info->rd_state & 0xF) != 0xE)) {
562 session_info = session_info->next;
568all_sessions_in_queue_mode_awake(
void)
570 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
571 while(session_info != NULL) {
572 if(session_info->rd_state != QUEUE_MODE_AWAKE) {
575 session_info = session_info->next;
583periodic_process(coap_timer_t *
timer)
588#if LWM2M_QUEUE_MODE_ENABLED
590 if(!all_sessions_in_queue_mode_state()) {
599 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
600 while(session_info != NULL) {
602 LOG_DBG(
"RD Client with assigned ep: %s - state: %d, ms: %lu\n", session_info->assigned_ep, session_info->rd_state,
605 switch(session_info->rd_state) {
607 LOG_DBG(
"RD Client started with endpoint '%s' and client lifetime %d\n", session_info->ep, session_info->lifetime);
608 session_info->rd_state = WAIT_NETWORK;
611 if(now > session_info->wait_until_network_check) {
613 LOG_DBG(
"Checking for network... %lu\n",
614 (
unsigned long)session_info->wait_until_network_check);
615 session_info->wait_until_network_check = now + 10000;
616 if(has_network_access()) {
618 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
619 session_info->rd_state = DO_BOOTSTRAP;
621 session_info->rd_state = DO_REGISTRATION;
628 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER &&
629 session_info->bootstrapped == 0 &&
630 session_info->has_bs_server_info) {
633 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
634 coap_set_header_uri_path(session_info->request,
"/bs");
636 snprintf(query_data,
sizeof(query_data) - 1,
"?ep=%s", session_info->ep);
637 coap_set_header_uri_query(session_info->request, query_data);
638 LOG_INFO(
"Registering ID with bootstrap server [");
639 LOG_INFO_COAP_EP(&session_info->bs_server_ep);
640 LOG_INFO_(
"] as '%s'\n", query_data);
642 session_info->rd_request_state.state.user_data = (
void *)session_info;
643 if(
coap_send_request(&session_info->rd_request_state, &session_info->bs_server_ep,
644 session_info->request, bootstrap_callback)) {
645 session_info->rd_state = BOOTSTRAP_SENT;
654 if(session_info->use_server_type == LWM2M_RD_CLIENT_BOOTSTRAP_SERVER) {
655 lwm2m_security_server_t *security;
656 LOG_DBG(
"*** Bootstrap - checking for server info...\n");
658 for(security = lwm2m_security_get_first();
660 security = lwm2m_security_get_next(security)) {
661 if(security->bootstrap == 0) {
666 if(security != NULL) {
668 if(security->server_uri_len > 0) {
671 LOG_DBG(
"**** Found security instance using: ");
672 LOG_DBG_COAP_STRING((
const char *)security->server_uri,
673 security->server_uri_len);
674 LOG_DBG_(
" (len %d) \n", security->server_uri_len);
677 secure = strncmp((
const char *)security->server_uri,
681 security->server_uri_len,
682 &session_info->server_ep)) {
683 LOG_DBG(
"Failed to parse server URI!\n");
685 LOG_DBG(
"Server address:");
686 LOG_DBG_COAP_EP(&session_info->server_ep);
689 LOG_DBG(
"Secure CoAP requested but not supported - can not bootstrap\n");
691 lwm2m_rd_client_register_with_server(session_info, &session_info->server_ep, LWM2M_RD_CLIENT_LWM2M_SERVER);
692 session_info->bootstrapped++;
696 LOG_DBG(
"** failed to parse URI ");
697 LOG_DBG_COAP_STRING((
const char *)security->server_uri,
698 security->server_uri_len);
704 if(session_info->bootstrapped == 0) {
706 session_info->rd_state = DO_BOOTSTRAP;
708 session_info->rd_state = DO_REGISTRATION;
712 case DO_REGISTRATION:
716 LOG_DBG(
"Wait until connected... \n");
720 if(session_info->use_server_type == LWM2M_RD_CLIENT_LWM2M_SERVER &&
721 !lwm2m_rd_client_is_registered(session_info) &&
722 session_info->has_registration_server_info) {
726 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_POST, 0);
727 coap_set_header_uri_path(session_info->request,
"/rd");
729 snprintf(query_data,
sizeof(query_data) - 1,
"?lwm2m=%s&ep=%s<=%d&b=%s",
730 LWM2M_PROTOCOL_VERSION, session_info->ep, session_info->lifetime, session_info->binding);
731 coap_set_header_uri_query(session_info->request, query_data);
733 len = set_rd_data(session_info);
734 session_info->rd_callback = registration_callback;
736 LOG_INFO(
"Registering with [");
737 LOG_INFO_COAP_EP(&session_info->server_ep);
738 LOG_INFO_(
"] lwm2m endpoint '%s': '", query_data);
740 LOG_INFO_COAP_STRING((
const char *)rd_data, len);
742 LOG_INFO_(
"' More:%d\n", session_info->rd_more);
745 session_info->rd_request_state.state.user_data = (
void *)session_info;
747 session_info->request, registration_callback)) {
749 session_info->rd_state = REGISTRATION_SENT;
754 case REGISTRATION_SENT:
757 case REGISTRATION_DONE:
760 check_periodic_observations();
763 if((session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED) ||
764 ((uint32_t)session_info->lifetime * 500) <= now - session_info->last_update) {
766 prepare_update(session_info, session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
769 session_info->rd_request_state.state.user_data = (
void *)session_info;
770 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
772 session_info->rd_state = UPDATE_SENT;
778#if LWM2M_QUEUE_MODE_ENABLED
779 case QUEUE_MODE_AWAKE:
780 LOG_DBG(
"Queue Mode: Client is AWAKE at %lu\n", (
unsigned long)
coap_timer_uptime());
781 if((queue_mode_client_awake = all_sessions_in_queue_mode_awake())) {
782 queue_mode_client_awake_time = lwm2m_queue_mode_get_awake_time();
783 coap_timer_set(&queue_mode_client_awake_timer, queue_mode_client_awake_time);
786 case QUEUE_MODE_SEND_UPDATE:
790#ifdef LWM2M_QUEUE_MODE_WAKE_UP
791 LWM2M_QUEUE_MODE_WAKE_UP();
793 prepare_update(session_info, session_info->rd_flags & FLAG_RD_DATA_UPDATE_TRIGGERED);
795 session_info->rd_request_state.state.user_data = (
void *)session_info;
796 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
798 session_info->rd_state = UPDATE_SENT;
808 LOG_INFO(
"DEREGISTER %s\n", session_info->assigned_ep);
809 coap_init_message(session_info->request, COAP_TYPE_CON, COAP_DELETE, 0);
810 coap_set_header_uri_path(session_info->request, session_info->assigned_ep);
813 session_info->rd_request_state.state.user_data = (
void *)session_info;
814 if(
coap_send_request(&session_info->rd_request_state, &session_info->server_ep, session_info->request,
815 deregister_callback)) {
816 session_info->rd_state = DEREGISTER_SENT;
819 case DEREGISTER_SENT:
821 case DEREGISTER_FAILED:
827 LOG_WARN(
"Unhandled state: %d\n", session_info->rd_state);
829 session_info = session_info->next;
834lwm2m_rd_client_init(
const char *ep)
836 lwm2m_rd_client_set_default_endpoint_name(ep);
841#if LWM2M_QUEUE_MODE_ENABLED
847check_periodic_observations(
void)
855#if LWM2M_QUEUE_MODE_ENABLED
858lwm2m_rd_client_restart_client_awake_timer(
void)
860 coap_timer_set(&queue_mode_client_awake_timer, queue_mode_client_awake_time);
864lwm2m_rd_client_is_client_awake(
void)
866 return queue_mode_client_awake;
870queue_mode_awake_timer_callback(coap_timer_t *
timer)
873 LOG_DBG(
"Queue Mode: Client is SLEEPING at %lu\n", (
unsigned long)
coap_timer_uptime());
874 queue_mode_client_awake = 0;
876 lwm2m_session_info_t *session_info = (lwm2m_session_info_t *)
list_head(session_info_list);
877 while(session_info != NULL) {
878 session_info->rd_state = QUEUE_MODE_SEND_UPDATE;
879 session_info = session_info->next;
883#ifdef LWM2M_QUEUE_MODE_SLEEP_MS
884 LWM2M_QUEUE_MODE_SLEEP_MS(lwm2m_queue_mode_get_sleep_time());
889lwm2m_rd_client_fsm_execute_queue_mode_awake(lwm2m_session_info_t *session_info)
892 session_info->rd_state = QUEUE_MODE_AWAKE;
893 periodic_process(&rd_timer);
897lwm2m_rd_client_fsm_execute_queue_mode_update(lwm2m_session_info_t *session_info)
900 session_info->rd_state = QUEUE_MODE_SEND_UPDATE;
901 periodic_process(&rd_timer);
Callback API for doing CoAP requests Adapted from the blocking API.
API to address CoAP endpoints.
CoAP engine implementation.
An implementation of the Constrained Application Protocol (RFC 7252).
static uint64_t coap_timer_uptime(void)
Get the time since boot in milliseconds.
void coap_timer_reset(coap_timer_t *timer, uint64_t time)
Reset a CoAP timer to expire a specified time after the last expiration time.
void coap_timer_stop(coap_timer_t *timer)
Stop a pending CoAP timer.
static void coap_timer_set_user_data(coap_timer_t *timer, void *data)
Attach user data to a CoAP timer.
void coap_timer_set(coap_timer_t *timer, uint64_t time)
Set a CoAP timer to expire after the specified time.
static void coap_timer_set_callback(coap_timer_t *timer, void(*callback)(coap_timer_t *))
Set a callback function to be called when a CoAP timer expires.
int coap_endpoint_cmp(const coap_endpoint_t *e1, const coap_endpoint_t *e2)
Compare two CoAP endpoints.
int coap_endpoint_parse(const char *text, size_t size, coap_endpoint_t *ep)
Parse a CoAP endpoint.
int coap_endpoint_connect(coap_endpoint_t *ep)
Request a connection to a CoAP endpoint.
void coap_endpoint_copy(coap_endpoint_t *dest, const coap_endpoint_t *src)
Copy a CoAP endpoint from one memory area to another.
int coap_endpoint_is_connected(const coap_endpoint_t *ep)
Check if a CoAP endpoint is connected.
int coap_send_request(coap_callback_request_state_t *callback_state, coap_endpoint_t *endpoint, coap_message_t *request, void(*callback)(coap_callback_request_state_t *callback_state))
Send a CoAP request to a remote endpoint.
#define LIST(name)
Declare a linked list.
void list_add(list_t list, void *item)
Add an item at the end of a list.
static void * list_head(const_list_t list)
Get a pointer to the first element of a list.
Linked list manipulation routines.
Header file for the Contiki OMA LWM2M device.
Header file for the Contiki OMA LWM2M engine.
Header file for the Contiki OMA LWM2M JSON writer.
Header file for functions to manage the queue to store notifications when waiting for the response to...
Header file for the LWM2M object API.
Header file for the Contiki OMA LWM2M plain text reader / writer.
Header file for the Contiki OMA LWM2M Queue Mode implementation to manage the parameters.
Header file for the Contiki OMA LWM2M Registration and Bootstrap Client.