You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/11/22 01:17:21 UTC
[22/27] incubator-mynewt-core git commit: oic;
change coap_separate to use os_mempools.
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