1 /* async.c -- state management for asynchronous messages
3 * Copyright (C) 2010,2011 Olaf Bergmann <bergmann@tzi.org>
5 * This file is part of the CoAP library libcoap. Please see
6 * README for terms of use.
11 * @brief state management for asynchronous messages
25 coap_register_async(coap_context_t *context, coap_address_t *peer, coap_pdu_t *request,
26 unsigned char flags, void *data)
28 coap_async_state_t *s;
31 coap_transaction_id(peer, request, &id);
32 LL_SEARCH_SCALAR(context->async_state, s, id, id);
36 /* We must return NULL here as the caller must know that he is
37 * responsible for releasing @p data. */
38 debug("asynchronous state for transaction %d already registered\n", id);
42 /* store information for handling the asynchronous task */
43 s = (coap_async_state_t *) coap_malloc(sizeof(coap_async_state_t) +
44 request->hdr->coap_hdr_udp_t.token_length);
47 coap_log(LOG_CRIT, "coap_register_async: insufficient memory\n");
51 memset(s, 0, sizeof(coap_async_state_t) + request->hdr->coap_hdr_udp_t.token_length);
53 /* set COAP_ASYNC_CONFIRM according to request's type */
54 s->flags = flags & ~COAP_ASYNC_CONFIRM;
55 if (request->hdr->coap_hdr_udp_t.type == COAP_MESSAGE_CON)
56 s->flags |= COAP_ASYNC_CONFIRM;
60 memcpy(&s->peer, peer, sizeof(coap_address_t));
62 if (request->hdr->coap_hdr_udp_t.token_length)
64 s->tokenlen = request->hdr->coap_hdr_udp_t.token_length;
65 memcpy(s->token, request->hdr->coap_hdr_udp_t.token, request->hdr->coap_hdr_udp_t.token_length);
68 memcpy(&s->id, &id, sizeof(coap_tid_t));
72 LL_PREPEND(context->async_state, s);
78 coap_find_async(coap_context_t *context, coap_tid_t id)
80 coap_async_state_t *tmp;
81 LL_SEARCH_SCALAR(context->async_state, tmp, id, id);
85 int coap_remove_async(coap_context_t *context, coap_tid_t id, coap_async_state_t **s)
87 coap_async_state_t *tmp = coap_find_async(context, id);
90 LL_DELETE(context->async_state, tmp);
96 void coap_free_async(coap_async_state_t *s)
98 if (s && (s->flags & COAP_ASYNC_RELEASE_DATA) != 0)
99 coap_free(s->appdata);
104 void does_not_exist(); /* make some compilers happy */
105 #endif /* WITHOUT_ASYNC */