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/30 16:57:53 UTC

[05/16] incubator-mynewt-core git commit: oic; change to use os_mbufs from oc_buffer_tx to transport.

oic; change to use os_mbufs from oc_buffer_tx to transport.


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/4487aa69
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/4487aa69
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/4487aa69

Branch: refs/heads/develop
Commit: 4487aa69f4f1bfe98c9b79e753a68328226bc9d0
Parents: ae88843
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Nov 28 10:40:15 2016 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Wed Nov 30 08:45:23 2016 -0800

----------------------------------------------------------------------
 net/oic/src/api/oc_buffer.c              | 43 ++++++++++----
 net/oic/src/port/mynewt/adaptor.c        | 59 ++++++++++--------
 net/oic/src/port/mynewt/adaptor.h        |  9 ++-
 net/oic/src/port/mynewt/ble_adaptor.c    | 30 ++--------
 net/oic/src/port/mynewt/ip_adaptor.c     | 86 ++++++++++++++++-----------
 net/oic/src/port/mynewt/serial_adaptor.c | 36 ++---------
 net/oic/src/port/oc_connectivity.h       |  6 +-
 7 files changed, 136 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/api/oc_buffer.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_buffer.c b/net/oic/src/api/oc_buffer.c
index b92ac8f..6a38301 100644
--- a/net/oic/src/api/oc_buffer.c
+++ b/net/oic/src/api/oc_buffer.c
@@ -113,35 +113,58 @@ oc_send_message(oc_message_t *message)
 }
 
 static void
-oc_buffer_tx(struct oc_message *message)
+oc_buffer_tx(struct oc_message *msg)
 {
+    struct os_mbuf *m;
+    struct oc_endpoint *oe;
+    int rc;
+
+    /* get a packet header */
+    m = os_msys_get_pkthdr(0, sizeof(struct oc_endpoint));
+    if (!m) {
+        ERROR("oc_buffer_tx: failed to alloc mbuf\n");
+        oc_message_unref(msg);
+        return;
+    }
+
+    /* add this data to the mbuf */
+    rc = os_mbuf_append(m, msg->data, msg->length);
+    if (rc != 0) {
+        ERROR("oc_buffer_tx: could not append data\n");
+        oc_message_unref(msg);
+        return;
+    }
+
+    oe = OC_MBUF_ENDPOINT(m);
+    memcpy(oe, &msg->endpoint, sizeof(msg->endpoint));
+
+    oc_message_unref(msg);
+
 #ifdef OC_CLIENT
-    if (message->endpoint.flags & MULTICAST) {
+    if (oe->flags & MULTICAST) {
         LOG("Outbound network event: multicast request\n");
-        oc_send_multicast_message(message);
-        oc_message_unref(message);
+        oc_send_multicast_message(m);
     } else {
 #endif
 #ifdef OC_SECURITY
         /* XXX convert this */
-        if (message->endpoint.flags & SECURED) {
+        if (oe->flags & SECURED) {
             LOG("Outbound network event: forwarding to DTLS\n");
 
-            if (!oc_sec_dtls_connected(&message->endpoint)) {
+            if (!oc_sec_dtls_connected(oe)) {
                 LOG("Posting INIT_DTLS_CONN_EVENT\n");
                 oc_process_post(&oc_dtls_handler,
-                  oc_events[INIT_DTLS_CONN_EVENT], msg);
+                  oc_events[INIT_DTLS_CONN_EVENT], m);
             } else {
                 LOG("Posting RI_TO_DTLS_EVENT\n");
                 oc_process_post(&oc_dtls_handler,
-                  oc_events[RI_TO_DTLS_EVENT], msg);
+                  oc_events[RI_TO_DTLS_EVENT], m);
             }
         } else
 #endif
         {
             LOG("Outbound network event: unicast message\n");
-            oc_send_buffer(message);
-            oc_message_unref(message);
+            oc_send_buffer(m);
         }
 #ifdef OC_CLIENT
     }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/mynewt/adaptor.c
----------------------------------------------------------------------
diff --git a/net/oic/src/port/mynewt/adaptor.c b/net/oic/src/port/mynewt/adaptor.c
index 40785c2..cdd31f5 100644
--- a/net/oic/src/port/mynewt/adaptor.c
+++ b/net/oic/src/port/mynewt/adaptor.c
@@ -68,54 +68,65 @@ oc_network_event_handler_mutex_unlock(void)
 }
 
 void
-oc_send_buffer(oc_message_t *message)
+oc_send_buffer(struct os_mbuf *m)
 {
-    switch (message->endpoint.flags) {
+    struct oc_endpoint *oe;
+
+    oe = OC_MBUF_ENDPOINT(m);
+
+    switch (oe->flags) {
 #if (MYNEWT_VAL(OC_TRANSPORT_IP) == 1)
     case IP:
-        oc_send_buffer_ip(message);
+        oc_send_buffer_ip(m);
         break;
 #endif
 #if (MYNEWT_VAL(OC_TRANSPORT_GATT) == 1)
     case GATT:
-        oc_send_buffer_gatt(message);
+        oc_send_buffer_gatt(m);
         break;
 #endif
 #if (MYNEWT_VAL(OC_TRANSPORT_SERIAL) == 1)
     case SERIAL:
-        oc_send_buffer_serial(message);
+        oc_send_buffer_serial(m);
         break;
 #endif
     default:
-        ERROR("Unknown transport option %u\n", message->endpoint.flags);
-        oc_message_unref(message);
+        ERROR("Unknown transport option %u\n", oe->flags);
+        os_mbuf_free_chain(m);
     }
 }
 
-void oc_send_multicast_message(oc_message_t *message)
+void
+oc_send_multicast_message(struct os_mbuf *m)
 {
-    oc_message_add_ref(message);
-
-    /* send on all the transports.  Don't forget to reference the message
-     * so it doesn't get deleted  */
-
+    /*
+     * Send on all the transports.
+     */
+    void (*funcs[])(struct os_mbuf *) = {
 #if (MYNEWT_VAL(OC_TRANSPORT_IP) == 1)
-    oc_send_buffer_ip_mcast(message);
+        oc_send_buffer_ip_mcast,
 #endif
-
 #if (MYNEWT_VAL(OC_TRANSPORT_GATT) == 1)
-    /* no multicast for GATT, just send unicast */
-    oc_message_add_ref(message);
-    oc_send_buffer_gatt(message);
+        /* no multicast for GATT, just send unicast */
+        oc_send_buffer_gatt,
 #endif
-
 #if (MYNEWT_VAL(OC_TRANSPORT_SERIAL) == 1)
-    /* no multi-cast for serial.  just send unicast */
-    oc_message_add_ref(message);
-    oc_send_buffer_serial(message);
+        /* no multi-cast for serial.  just send unicast */
+        oc_send_buffer_serial,
 #endif
-
-    oc_message_unref(message);
+    };
+    struct os_mbuf *n;
+    int i;
+
+    for (i = 0; i < (sizeof(funcs) / sizeof(funcs[0])) - 1; i++) {
+        n = os_mbuf_dup(m);
+        funcs[i](m);
+        if (!n) {
+            return;
+        }
+        m = n;
+    }
+    funcs[(sizeof(funcs) / sizeof(funcs[0])) - 1](m);
 }
 
 void

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/mynewt/adaptor.h
----------------------------------------------------------------------
diff --git a/net/oic/src/port/mynewt/adaptor.h b/net/oic/src/port/mynewt/adaptor.h
index c6ea8bb..025efd6 100644
--- a/net/oic/src/port/mynewt/adaptor.h
+++ b/net/oic/src/port/mynewt/adaptor.h
@@ -32,21 +32,20 @@ struct oc_message;
 #if (MYNEWT_VAL(OC_TRANSPORT_IP) == 1)
 int oc_connectivity_init_ip(void);
 void oc_connectivity_shutdown_ip(void);
-void oc_send_buffer_ip(struct oc_message *message);
-void oc_send_buffer_ip_mcast(struct oc_message *message);
+void oc_send_buffer_ip(struct os_mbuf *);
+void oc_send_buffer_ip_mcast(struct os_mbuf *);
 #endif
 
 #if (MYNEWT_VAL(OC_TRANSPORT_GATT) == 1)
 int oc_connectivity_init_gatt(void);
 void oc_connectivity_shutdown_gatt(void);
-void oc_send_buffer_gatt(struct oc_message *message);
-void oc_send_buffer_gatt_mcast(struct oc_message *message);
+void oc_send_buffer_gatt(struct os_mbuf *);
 #endif
 
 #if (MYNEWT_VAL(OC_TRANSPORT_SERIAL) == 1)
 int oc_connectivity_init_serial(void);
 void oc_connectivity_shutdown_serial(void);
-void oc_send_buffer_serial(struct oc_message *message);
+void oc_send_buffer_serial(struct os_mbuf *);
 #endif
 
 #ifdef __cplusplus

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/mynewt/ble_adaptor.c
----------------------------------------------------------------------
diff --git a/net/oic/src/port/mynewt/ble_adaptor.c b/net/oic/src/port/mynewt/ble_adaptor.c
index 0c3363f..81f2d2c 100644
--- a/net/oic/src/port/mynewt/ble_adaptor.c
+++ b/net/oic/src/port/mynewt/ble_adaptor.c
@@ -208,41 +208,19 @@ oc_connectivity_shutdown_gatt(void)
 }
 
 void
-oc_send_buffer_gatt(oc_message_t *message)
+oc_send_buffer_gatt(struct os_mbuf *m)
 {
-    struct os_mbuf *m = NULL;
-    int rc;
-
-    /* get a packet header */
-    m = os_msys_get_pkthdr(0, 0);
-    if (m == NULL) {
-        ERROR("oc_transport_gatt: No mbuf available\n");
-        goto err;
-    }
+    struct oc_endpoint *oe;
 
-    /* add this data to the mbuf */
-    rc = os_mbuf_append(m, message->data, message->length);
-    if (rc != 0) {
-        ERROR("oc_transport_gatt: could not append data \n");
-        goto err;
-    }
+    oe = OC_MBUF_ENDPOINT(m);
 
 #if (MYNEWT_VAL(OC_CLIENT) == 1)
     ERROR("send not supported on client");
 #endif
 
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-    ble_gattc_notify_custom(message->endpoint.bt_addr.conn_handle,
-                            g_ble_coap_attr_handle, m);
-    m = NULL;
+    ble_gattc_notify_custom(oe->bt_addr.conn_handle, g_ble_coap_attr_handle, m);
 #endif
-
-err:
-    if (m) {
-        os_mbuf_free_chain(m);
-    }
-    oc_message_unref(message);
-    return;
 }
 
 void

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/mynewt/ip_adaptor.c
----------------------------------------------------------------------
diff --git a/net/oic/src/port/mynewt/ip_adaptor.c b/net/oic/src/port/mynewt/ip_adaptor.c
index 181bc68..90edd42 100644
--- a/net/oic/src/port/mynewt/ip_adaptor.c
+++ b/net/oic/src/port/mynewt/ip_adaptor.c
@@ -35,7 +35,7 @@
 
 static void oc_event_ip(struct os_event *ev);
 
-struct os_event oc_sock_read_event = {
+static struct os_event oc_sock_read_event = {
     .ev_cb = oc_event_ip,
 };
 
@@ -46,45 +46,43 @@ struct os_event oc_sock_read_event = {
 
 #define COAP_PORT_UNSECURED (5683)
 /* TODO use inet_pton when its available */
-const struct mn_in6_addr coap_all_nodes_v6 = {
+static const struct mn_in6_addr coap_all_nodes_v6 = {
     .s_addr = {0xFF,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD}
 };
 
 
 /* sockets to use for coap unicast and multicast */
-struct mn_socket *ucast;
+static struct mn_socket *ucast;
 
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-struct mn_socket *mcast;
+static struct mn_socket *mcast;
 #endif
 
 static void
-oc_send_buffer_ip_int(oc_message_t *message, int mcast)
+oc_send_buffer_ip_int(struct os_mbuf *m, int is_mcast)
 {
     struct mn_sockaddr_in6 to;
-    struct os_mbuf m;
+    struct oc_endpoint *oe;
+    struct mn_itf itf;
+    struct mn_itf itf2;
+    struct os_mbuf *n;
     int rc;
 
-    LOG("oc_transport_ip attempt send buffer %lu\n",
-        (unsigned long)message->length);
+    LOG("oc_transport_ip attempt send buffer %u\n",
+      OS_MBUF_PKTHDR(m)->omp_len);
+
+    oe = OC_MBUF_ENDPOINT(m);
 
     to.msin6_len = sizeof(to);
     to.msin6_family = MN_AF_INET6;
+    to.msin6_port = htons(oe->ipv6_addr.port);
+    to.msin6_scope_id = oe->ipv6_addr.scope;
+    memcpy(&to.msin6_addr, oe->ipv6_addr.address, sizeof(to.msin6_addr));
 
-    to.msin6_port = htons(message->endpoint.ipv6_addr.port);
-    memcpy(&to.msin6_addr, message->endpoint.ipv6_addr.address,
-           sizeof(to.msin6_addr));
-
-    /* put on an mbuf header to make the socket happy */
-    memset(&m, 0, sizeof(m));
-    m.om_data = message->data;
-    m.om_len = message->length;
-    to.msin6_scope_id = message->endpoint.ipv6_addr.scope;
-
-    if (mcast) {
-        struct mn_itf itf;
+    if (is_mcast) {
         memset(&itf, 0, sizeof(itf));
+        memset(&itf2, 0, sizeof(itf2));
 
         while (1) {
             rc = mn_itf_getnext(&itf);
@@ -96,37 +94,57 @@ oc_send_buffer_ip_int(oc_message_t *message, int mcast)
                 continue;
             }
 
-            to.msin6_scope_id = itf.mif_idx;
-
-            rc = mn_sendto(ucast, &m, (struct mn_sockaddr *) &to);
+            if (!itf2.mif_idx) {
+                memcpy(&itf2, &itf, sizeof(itf));
+                continue;
+            }
+            n = os_mbuf_dup(m);
+            if (!n) {
+                break;
+            }
+            to.msin6_scope_id = itf2.mif_idx;
+            rc = mn_sendto(ucast, n, (struct mn_sockaddr *) &to);
             if (rc != 0) {
-                ERROR("Failed sending buffer %lu on itf %d\n",
-                      (unsigned long)message->length, to.msin6_scope_id);
+                ERROR("Failed sending buffer %u on itf %d\n",
+                  OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+                os_mbuf_free_chain(n);
+            }
+        }
+        if (itf2.mif_idx) {
+            to.msin6_scope_id = itf2.mif_idx;
+            rc = mn_sendto(ucast, m, (struct mn_sockaddr *) &to);
+            if (rc != 0) {
+                ERROR("Failed sending buffer %u on itf %d\n",
+                  OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+                os_mbuf_free_chain(m);
             }
         }
     } else {
-        rc = mn_sendto(ucast, &m, (struct mn_sockaddr *) &to);
+        rc = mn_sendto(ucast, m, (struct mn_sockaddr *) &to);
         if (rc != 0) {
-            ERROR("Failed sending buffer %lu on itf %d\n",
-                  (unsigned long)message->length, to.msin6_scope_id);
+            ERROR("Failed sending buffer %u on itf %d\n",
+                  OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+            os_mbuf_free_chain(m);
         }
     }
-    oc_message_unref(message);
+    if (rc) {
+        os_mbuf_free_chain(m);
+    }
 }
 
 void
-oc_send_buffer_ip(oc_message_t *message)
+oc_send_buffer_ip(struct os_mbuf *m)
 {
-    oc_send_buffer_ip_int(message, 0);
+    oc_send_buffer_ip_int(m, 0);
 }
 void
-oc_send_buffer_ip_mcast(oc_message_t *message)
+oc_send_buffer_ip_mcast(struct os_mbuf *m)
 {
-    oc_send_buffer_ip_int(message, 1);
+    oc_send_buffer_ip_int(m, 1);
 }
 
 static struct os_mbuf *
-oc_attempt_rx_ip_sock(struct mn_socket * rxsock)
+oc_attempt_rx_ip_sock(struct mn_socket *rxsock)
 {
     int rc;
     struct os_mbuf *m;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/mynewt/serial_adaptor.c
----------------------------------------------------------------------
diff --git a/net/oic/src/port/mynewt/serial_adaptor.c b/net/oic/src/port/mynewt/serial_adaptor.c
index 209a9c7..59342a9 100644
--- a/net/oic/src/port/mynewt/serial_adaptor.c
+++ b/net/oic/src/port/mynewt/serial_adaptor.c
@@ -58,7 +58,8 @@ oc_event_serial(struct os_event *ev)
 }
 
 int
-oc_connectivity_init_serial(void) {
+oc_connectivity_init_serial(void)
+{
     int rc;
 
     rc = shell_nlip_input_register(oc_serial_in, NULL);
@@ -80,39 +81,14 @@ err:
 
 
 void
-oc_send_buffer_serial(oc_message_t *message)
+oc_send_buffer_serial(struct os_mbuf *m)
 {
-    int rc;
-    struct os_mbuf *m;
-
-    /* get a packet header */
-    m = os_msys_get_pkthdr(0, 0);
-    if (m == NULL) {
-        ERROR("oc_transport_serial: No mbuf available\n");
-        goto err;
-    }
-
-    /* add this data to the mbuf */
-    rc = os_mbuf_append(m, message->data, message->length);
-    if (rc != 0) {
-
-        ERROR("oc_transport_serial: could not append data \n");
-        goto err;
-    }
+    LOG("oc_transport_serial: send buffer %u\n", OS_MBUF_PKTHDR(m)->omp_len);
 
     /* send over the shell output */
-    rc = shell_nlip_output(m);
-    if (rc != 0) {
-        ERROR("oc_transport_serial: nlip output failed \n");
-        goto err;
+    if (shell_nlip_output(m)) {
+        ERROR("oc_transport_serial: nlip output failed\n");
     }
-
-    LOG("oc_transport_serial: send buffer %zu\n", message->length);
-
-err:
-    oc_message_unref(message);
-    return;
-
 }
 
 static struct os_mbuf *

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/4487aa69/net/oic/src/port/oc_connectivity.h
----------------------------------------------------------------------
diff --git a/net/oic/src/port/oc_connectivity.h b/net/oic/src/port/oc_connectivity.h
index 493b30e..123db7c 100644
--- a/net/oic/src/port/oc_connectivity.h
+++ b/net/oic/src/port/oc_connectivity.h
@@ -66,17 +66,15 @@ typedef struct oc_message {
     uint8_t data[MAX_PAYLOAD_SIZE];
 } oc_message_t;
 
-void oc_send_buffer(oc_message_t *message);
-
 #ifdef OC_SECURITY
 uint16_t oc_connectivity_get_dtls_port(void);
 #endif /* OC_SECURITY */
 
 int oc_connectivity_init(void);
-
 void oc_connectivity_shutdown(void);
 
-void oc_send_multicast_message(oc_message_t *message);
+void oc_send_buffer(struct os_mbuf *);
+void oc_send_multicast_message(struct os_mbuf *);
 
 #ifdef __cplusplus
 }