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