oic; change coap_separate to use os_mempools.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/f861cf8d Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f861cf8d Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f861cf8d Branch: refs/heads/develop Commit: f861cf8d3f66c6f6777b459756729c592361b441 Parents: 3320d47 Author: Marko Kiiskila <ma...@runtime.io> Authored: Mon Nov 21 14:47:19 2016 -0800 Committer: Marko Kiiskila <ma...@runtime.io> Committed: Mon Nov 21 17:15:49 2016 -0800 ---------------------------------------------------------------------- net/oic/src/messaging/coap/engine.c | 3 + net/oic/src/messaging/coap/separate.c | 140 ++++++++++++++++------------- net/oic/src/messaging/coap/separate.h | 2 + 3 files changed, 81 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f861cf8d/net/oic/src/messaging/coap/engine.c ---------------------------------------------------------------------- diff --git a/net/oic/src/messaging/coap/engine.c b/net/oic/src/messaging/coap/engine.c index cff4505..a17ebd6 100644 --- a/net/oic/src/messaging/coap/engine.c +++ b/net/oic/src/messaging/coap/engine.c @@ -304,4 +304,7 @@ coap_engine_init(void) { coap_init_connection(); coap_transaction_init(); +#ifdef OC_SERVER + coap_separate_init(); +#endif } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f861cf8d/net/oic/src/messaging/coap/separate.c ---------------------------------------------------------------------- diff --git a/net/oic/src/messaging/coap/separate.c b/net/oic/src/messaging/coap/separate.c index 5be01e7..2aad061 100644 --- a/net/oic/src/messaging/coap/separate.c +++ b/net/oic/src/messaging/coap/separate.c @@ -35,14 +35,18 @@ #ifdef OC_SERVER +#include <stdio.h> +#include <string.h> + +#include <os/os_mempool.h> + #include "oc_buffer.h" #include "separate.h" #include "transactions.h" -#include "util/oc_memb.h" -#include <stdio.h> -#include <string.h> -OC_MEMB(separate_requests, coap_separate_t, MAX_NUM_CONCURRENT_REQUESTS); +static struct os_mempool coap_separate_pool; +static uint8_t coap_separate_area[OS_MEMPOOL_BYTES(MAX_NUM_CONCURRENT_REQUESTS, + sizeof(coap_separate_t))]; /*---------------------------------------------------------------------------*/ /*- Separate Response API ---------------------------------------------------*/ @@ -63,90 +67,98 @@ int coap_separate_accept(void *request, oc_separate_response_t *separate_response, oc_endpoint_t *endpoint, int observe) { - if (separate_response->active == 0) { - OC_LIST_STRUCT_INIT(separate_response, requests); - } - - coap_packet_t *const coap_req = (coap_packet_t *)request; - - for (coap_separate_t *item = oc_list_head(separate_response->requests); - item != NULL; item = oc_list_item_next(separate_response->requests)) { - if (item->token_len == coap_req->token_len && - memcmp(item->token, coap_req->token, item->token_len) == 0) { - return 0; + if (separate_response->active == 0) { + OC_LIST_STRUCT_INIT(separate_response, requests); } - } - coap_separate_t *separate_store = oc_memb_alloc(&separate_requests); + coap_packet_t *const coap_req = (coap_packet_t *)request; - if (!separate_store) - return 0; + for (coap_separate_t *item = oc_list_head(separate_response->requests); + item != NULL; item = oc_list_item_next(separate_response->requests)) { + if (item->token_len == coap_req->token_len && + memcmp(item->token, coap_req->token, item->token_len) == 0) { + return 0; + } + } - oc_list_add(separate_response->requests, separate_store); + coap_separate_t *separate_store = os_memblock_get(&coap_separate_pool); - erbium_status_code = CLEAR_TRANSACTION; - /* send separate ACK for CON */ - if (coap_req->type == COAP_TYPE_CON) { - LOG("Sending ACK for separate response\n"); - coap_packet_t ack[1]; - /* ACK with empty code (0) */ - coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid); - if (observe < 2) { - coap_set_header_observe(ack, observe); + if (!separate_store) { + return 0; } - coap_set_token(ack, coap_req->token, coap_req->token_len); - oc_message_t *message = oc_allocate_message(); - if (message != NULL) { - message->endpoint.flags = IP; - memcpy(&message->endpoint, endpoint, sizeof(oc_endpoint_t)); - message->length = coap_serialize_message(ack, message->data); - coap_send_message(message); - } else { - coap_separate_clear(separate_response, separate_store); - erbium_status_code = SERVICE_UNAVAILABLE_5_03; - return 0; + + oc_list_add(separate_response->requests, separate_store); + + erbium_status_code = CLEAR_TRANSACTION; + /* send separate ACK for CON */ + if (coap_req->type == COAP_TYPE_CON) { + LOG("Sending ACK for separate response\n"); + coap_packet_t ack[1]; + /* ACK with empty code (0) */ + coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid); + if (observe < 2) { + coap_set_header_observe(ack, observe); + } + coap_set_token(ack, coap_req->token, coap_req->token_len); + oc_message_t *message = oc_allocate_message(); + if (message != NULL) { + message->endpoint.flags = IP; + memcpy(&message->endpoint, endpoint, sizeof(oc_endpoint_t)); + message->length = coap_serialize_message(ack, message->data); + coap_send_message(message); + } else { + coap_separate_clear(separate_response, separate_store); + erbium_status_code = SERVICE_UNAVAILABLE_5_03; + return 0; + } } - } - memcpy(&separate_store->endpoint, endpoint, sizeof(oc_endpoint_t)); + memcpy(&separate_store->endpoint, endpoint, sizeof(oc_endpoint_t)); - /* store correct response type */ - separate_store->type = COAP_TYPE_NON; + /* store correct response type */ + separate_store->type = COAP_TYPE_NON; - memcpy(separate_store->token, coap_req->token, coap_req->token_len); - separate_store->token_len = coap_req->token_len; + memcpy(separate_store->token, coap_req->token, coap_req->token_len); + separate_store->token_len = coap_req->token_len; - separate_store->block1_num = coap_req->block1_num; - separate_store->block1_size = coap_req->block1_size; + separate_store->block1_num = coap_req->block1_num; + separate_store->block1_size = coap_req->block1_size; - separate_store->block2_num = coap_req->block2_num; - separate_store->block2_size = - coap_req->block2_size > 0 ? MIN(COAP_MAX_BLOCK_SIZE, coap_req->block2_size) - : COAP_MAX_BLOCK_SIZE; + separate_store->block2_num = coap_req->block2_num; + separate_store->block2_size = + coap_req->block2_size > 0 ? + MIN(COAP_MAX_BLOCK_SIZE, coap_req->block2_size) : COAP_MAX_BLOCK_SIZE; - separate_store->observe = observe; - return 1; + separate_store->observe = observe; + return 1; } /*----------------------------------------------------------------------------*/ void coap_separate_resume(void *response, coap_separate_t *separate_store, uint8_t code, uint16_t mid) { - coap_init_message(response, separate_store->type, code, mid); - if (separate_store->token_len) { - coap_set_token(response, separate_store->token, separate_store->token_len); - } - if (separate_store->block1_size) { - coap_set_header_block1(response, separate_store->block1_num, 0, - separate_store->block1_size); - } + coap_init_message(response, separate_store->type, code, mid); + if (separate_store->token_len) { + coap_set_token(response, separate_store->token, + separate_store->token_len); + } + if (separate_store->block1_size) { + coap_set_header_block1(response, separate_store->block1_num, 0, + separate_store->block1_size); + } } /*---------------------------------------------------------------------------*/ void coap_separate_clear(oc_separate_response_t *separate_response, coap_separate_t *separate_store) { - oc_list_remove(separate_response->requests, separate_store); - oc_memb_free(&separate_requests, separate_store); + oc_list_remove(separate_response->requests, separate_store); + os_memblock_put(&coap_separate_pool, separate_store); } +void +coap_separate_init(void) +{ + os_mempool_init(&coap_separate_pool, MAX_NUM_CONCURRENT_REQUESTS, + sizeof(coap_separate_t), coap_separate_area, "coap_sep"); +} #endif /* OC_SERVER */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f861cf8d/net/oic/src/messaging/coap/separate.h ---------------------------------------------------------------------- diff --git a/net/oic/src/messaging/coap/separate.h b/net/oic/src/messaging/coap/separate.h index 7f32da1..9b3379e 100644 --- a/net/oic/src/messaging/coap/separate.h +++ b/net/oic/src/messaging/coap/separate.h @@ -72,6 +72,8 @@ void coap_separate_resume(void *response, coap_separate_t *separate_store, void coap_separate_clear(oc_separate_response_t *separate_response, coap_separate_t *separate_store); +void coap_separate_init(void); + #ifdef __cplusplus } #endif