oic; ip - multicast TX was not right. Fix mbuf frees on failure
paths. Add statistics.


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

Branch: refs/heads/develop
Commit: 0573c3409d546ac278c63f9828381bb16acee0b2
Parents: 4aad793
Author: Marko Kiiskila <[email protected]>
Authored: Thu Jan 12 08:16:58 2017 -0800
Committer: Marko Kiiskila <[email protected]>
Committed: Thu Jan 12 08:16:58 2017 -0800

----------------------------------------------------------------------
 net/oic/src/port/mynewt/ip_adaptor.c | 87 +++++++++++++++++++++----------
 1 file changed, 60 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/0573c340/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 a228128..6f5846f 100644
--- a/net/oic/src/port/mynewt/ip_adaptor.c
+++ b/net/oic/src/port/mynewt/ip_adaptor.c
@@ -27,6 +27,7 @@
 
 #include <log/log.h>
 #include <mn_socket/mn_socket.h>
+#include <stats/stats.h>
 
 #include "port/oc_connectivity.h"
 #include "oic/oc_log.h"
@@ -51,12 +52,31 @@ static const struct mn_in6_addr coap_all_nodes_v6 = {
                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFD}
 };
 
+STATS_SECT_START(oc_ip_stats)
+    STATS_SECT_ENTRY(iframe)
+    STATS_SECT_ENTRY(ibytes)
+    STATS_SECT_ENTRY(ierr)
+    STATS_SECT_ENTRY(oucast)
+    STATS_SECT_ENTRY(omcast)
+    STATS_SECT_ENTRY(obytes)
+    STATS_SECT_ENTRY(oerr)
+STATS_SECT_END
+static STATS_SECT_DECL(oc_ip_stats) oc_ip_stats;
+STATS_NAME_START(oc_ip_stats)
+    STATS_NAME(oc_ip_stats, iframe)
+    STATS_NAME(oc_ip_stats, ibytes)
+    STATS_NAME(oc_ip_stats, ierr)
+    STATS_NAME(oc_ip_stats, oucast)
+    STATS_NAME(oc_ip_stats, omcast)
+    STATS_NAME(oc_ip_stats, obytes)
+    STATS_NAME(oc_ip_stats, oerr)
+STATS_NAME_END(oc_ip_stats)
 
 /* sockets to use for coap unicast and multicast */
-static struct mn_socket *ucast;
+static struct mn_socket *oc_ucast;
 
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-static struct mn_socket *mcast;
+static struct mn_socket *oc_mcast;
 #endif
 
 static void
@@ -78,6 +98,7 @@ oc_send_buffer_ip_int(struct os_mbuf *m, int is_mcast)
     to.msin6_scope_id = oe->oe_ip.v6.scope;
     memcpy(&to.msin6_addr, oe->oe_ip.v6.address, sizeof(to.msin6_addr));
 
+    STATS_INCN(oc_ip_stats, obytes, OS_MBUF_PKTLEN(m));
     if (is_mcast) {
         memset(&itf, 0, sizeof(itf));
         memset(&itf2, 0, sizeof(itf2));
@@ -88,7 +109,8 @@ oc_send_buffer_ip_int(struct os_mbuf *m, int is_mcast)
                 break;
             }
 
-            if (0 == (itf.mif_flags & MN_ITF_F_UP)) {
+            if ((itf.mif_flags & (MN_ITF_F_UP | MN_ITF_F_MULTICAST)) !=
+              (MN_ITF_F_UP | MN_ITF_F_MULTICAST)) {
                 continue;
             }
 
@@ -99,46 +121,52 @@ oc_send_buffer_ip_int(struct os_mbuf *m, int is_mcast)
 
             n = os_mbuf_dup(m);
             if (!n) {
+                STATS_INC(oc_ip_stats, oerr);
                 break;
             }
             to.msin6_scope_id = itf2.mif_idx;
-            rc = mn_sendto(ucast, n, (struct mn_sockaddr *) &to);
+            rc = mn_sendto(oc_ucast, n, (struct mn_sockaddr *) &to);
             if (rc != 0) {
                 OC_LOG_ERROR("Failed to send buffer %u on itf %d\n",
                              OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+                STATS_INC(oc_ip_stats, oerr);
                 os_mbuf_free_chain(n);
             }
+            memcpy(&itf2, &itf, sizeof(itf));
         }
         if (itf2.mif_idx) {
             to.msin6_scope_id = itf2.mif_idx;
-            rc = mn_sendto(ucast, m, (struct mn_sockaddr *) &to);
+            rc = mn_sendto(oc_ucast, m, (struct mn_sockaddr *) &to);
             if (rc != 0) {
                 OC_LOG_ERROR("Failed sending buffer %u on itf %d\n",
                              OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+                STATS_INC(oc_ip_stats, oerr);
                 os_mbuf_free_chain(m);
             }
+        } else {
+            os_mbuf_free_chain(m);
         }
     } else {
-        rc = mn_sendto(ucast, m, (struct mn_sockaddr *) &to);
+        rc = mn_sendto(oc_ucast, m, (struct mn_sockaddr *) &to);
         if (rc != 0) {
             OC_LOG_ERROR("Failed to send buffer %u on itf %d\n",
                          OS_MBUF_PKTHDR(m)->omp_len, to.msin6_scope_id);
+            STATS_INC(oc_ip_stats, oerr);
             os_mbuf_free_chain(m);
         }
     }
-    if (rc) {
-        os_mbuf_free_chain(m);
-    }
 }
 
 void
 oc_send_buffer_ip(struct os_mbuf *m)
 {
+    STATS_INC(oc_ip_stats, oucast);
     oc_send_buffer_ip_int(m, 0);
 }
 void
 oc_send_buffer_ip_mcast(struct os_mbuf *m)
 {
+    STATS_INC(oc_ip_stats, omcast);
     oc_send_buffer_ip_int(m, 1);
 }
 
@@ -157,6 +185,8 @@ oc_attempt_rx_ip_sock(struct mn_socket *rxsock)
     }
     assert(OS_MBUF_IS_PKTHDR(n));
 
+    STATS_INC(oc_ip_stats, iframe);
+    STATS_INCN(oc_ip_stats, ibytes, OS_MBUF_PKTLEN(n));
     m = os_msys_get_pkthdr(0, sizeof(struct oc_endpoint_ip));
     if (!m) {
         OC_LOG_ERROR("Could not allocate RX buffer\n");
@@ -177,6 +207,7 @@ oc_attempt_rx_ip_sock(struct mn_socket *rxsock)
 
     /* add the addr info to the message */
 rx_attempt_err:
+    STATS_INC(oc_ip_stats, ierr);
     os_mbuf_free_chain(n);
     return NULL;
 }
@@ -186,10 +217,10 @@ oc_attempt_rx_ip(void)
 {
     struct os_mbuf *m;
 
-    m = oc_attempt_rx_ip_sock(ucast);
+    m = oc_attempt_rx_ip_sock(oc_ucast);
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-    if (m == NULL ) {
-        m = oc_attempt_rx_ip_sock(mcast);
+    if (m == NULL) {
+        m = oc_attempt_rx_ip_sock(oc_mcast);
     }
 #endif
     return m;
@@ -211,13 +242,13 @@ oc_socks_readable(void *cb_arg, int err)
 void
 oc_connectivity_shutdown_ip(void)
 {
-    if (ucast) {
-        mn_close(ucast);
+    if (oc_ucast) {
+        mn_close(oc_ucast);
     }
 
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-    if (mcast) {
-        mn_close(mcast);
+    if (oc_mcast) {
+        mn_close(oc_mcast);
     }
 #endif
 
@@ -242,30 +273,31 @@ oc_connectivity_init_ip(void)
 
     memset(&itf, 0, sizeof(itf));
 
-    rc = mn_socket(&ucast, MN_PF_INET6, MN_SOCK_DGRAM, 0);
-    if (rc != 0 || !ucast) {
+    rc = mn_socket(&oc_ucast, MN_PF_INET6, MN_SOCK_DGRAM, 0);
+    if (rc != 0 || !oc_ucast) {
         OC_LOG_ERROR("Could not create oc unicast socket\n");
         return rc;
     }
-    mn_socket_set_cbs(ucast, ucast, &oc_sock_cbs);
+    mn_socket_set_cbs(oc_ucast, oc_ucast, &oc_sock_cbs);
 
 #if (MYNEWT_VAL(OC_SERVER) == 1)
-    rc = mn_socket(&mcast, MN_PF_INET6, MN_SOCK_DGRAM, 0);
-    if (rc != 0 || !mcast) {
-        mn_close(ucast);
+    rc = mn_socket(&oc_mcast, MN_PF_INET6, MN_SOCK_DGRAM, 0);
+    if (rc != 0 || !oc_mcast) {
+        mn_close(oc_ucast);
         OC_LOG_ERROR("Could not create oc multicast socket\n");
         return rc;
     }
-    mn_socket_set_cbs(mcast, mcast, &oc_sock_cbs);
+    mn_socket_set_cbs(oc_mcast, oc_mcast, &oc_sock_cbs);
 #endif
 
     sin.msin6_len = sizeof(sin);
     sin.msin6_family = MN_AF_INET6;
     sin.msin6_port = 0;
     sin.msin6_flowinfo = 0;
+    sin.msin6_scope_id = 0;
     memcpy(&sin.msin6_addr, nm_in6addr_any, sizeof(sin.msin6_addr));
 
-    rc = mn_bind(ucast, (struct mn_sockaddr *)&sin);
+    rc = mn_bind(oc_ucast, (struct mn_sockaddr *)&sin);
     if (rc != 0) {
         OC_LOG_ERROR("Could not bind oc unicast socket\n");
         goto oc_connectivity_init_err;
@@ -281,7 +313,8 @@ oc_connectivity_init_ip(void)
             break;
         }
 
-        if (0 == (itf.mif_flags & MN_ITF_F_UP)) {
+        if ((itf.mif_flags & (MN_ITF_F_UP | MN_ITF_F_MULTICAST)) !=
+          (MN_ITF_F_UP | MN_ITF_F_MULTICAST)) {
             continue;
         }
 
@@ -289,7 +322,7 @@ oc_connectivity_init_ip(void)
         join.mm_idx = itf.mif_idx;
         join.mm_family = MN_AF_INET6;
 
-        rc = mn_setsockopt(mcast, MN_SO_LEVEL, MN_MCAST_JOIN_GROUP, &join);
+        rc = mn_setsockopt(oc_mcast, MN_SO_LEVEL, MN_MCAST_JOIN_GROUP, &join);
         if (rc != 0) {
             continue;
         }
@@ -298,7 +331,7 @@ oc_connectivity_init_ip(void)
     }
 
     sin.msin6_port = htons(COAP_PORT_UNSECURED);
-    rc = mn_bind(mcast, (struct mn_sockaddr *)&sin);
+    rc = mn_bind(oc_mcast, (struct mn_sockaddr *)&sin);
     if (rc != 0) {
         OC_LOG_ERROR("Could not bind oc multicast socket\n");
         goto oc_connectivity_init_err;

Reply via email to