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/09/15 22:18:07 UTC

[1/3] incubator-mynewt-core git commit: sys/mn_socket, native sockets; add API to list network interfaces and their addresses.

Repository: incubator-mynewt-core
Updated Branches:
  refs/heads/develop 97c5750a9 -> d11c52fca


sys/mn_socket, native sockets; add API to list network interfaces
and their addresses.


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

Branch: refs/heads/develop
Commit: fc14ad83d570887814c3fd2caf24dc1c44bb2ab0
Parents: 97c5750
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Thu Sep 15 13:43:50 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Thu Sep 15 13:43:50 2016 -0700

----------------------------------------------------------------------
 sys/mn_socket/include/mn_socket/mn_socket.h     |  44 ++++-
 sys/mn_socket/include/mn_socket/mn_socket_ops.h |   3 +
 sys/mn_socket/src/arch/sim/native_itf.c         | 179 +++++++++++++++++++
 sys/mn_socket/src/arch/sim/native_sock.c        |  40 ++++-
 sys/mn_socket/src/arch/sim/native_sock_priv.h   |  31 ++++
 sys/mn_socket/src/mn_socket.c                   |  12 ++
 sys/mn_socket/src/test/mn_sock_test.c           |  66 ++++++-
 7 files changed, 363 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/include/mn_socket/mn_socket.h
----------------------------------------------------------------------
diff --git a/sys/mn_socket/include/mn_socket/mn_socket.h b/sys/mn_socket/include/mn_socket/mn_socket.h
index cd3ab06..0ae247c 100644
--- a/sys/mn_socket/include/mn_socket/mn_socket.h
+++ b/sys/mn_socket/include/mn_socket/mn_socket.h
@@ -91,11 +91,19 @@ struct mn_sockaddr {
     char    msa_data[2];
 };
 
+struct mn_in_addr {
+    uint32_t s_addr;
+};
+
 struct mn_sockaddr_in {
     uint8_t msin_len;
     uint8_t msin_family;
     uint16_t msin_port;
-    uint32_t msin_addr;
+    struct mn_in_addr msin_addr;
+};
+
+struct mn_in6_addr {
+    uint8_t s_addr[16];
 };
 
 struct mn_sockaddr_in6 {
@@ -103,7 +111,7 @@ struct mn_sockaddr_in6 {
     uint8_t msin6_family;
     uint16_t msin6_port;
     uint32_t msin6_flowinfo;
-    uint32_t msin6_addr[4];
+    struct mn_in6_addr msin6_addr;
 };
 
 extern const uint32_t nm_in6addr_any[4];
@@ -156,4 +164,36 @@ int mn_close(struct mn_socket *);
 int mn_inet_pton(int af, const char *src, void *dst);
 const char *mn_inet_ntop(int af, const void *src, void *dst, int len);
 
+/*
+ * Info about interfaces.
+ */
+#define MN_ITF_NAME_MAX    8
+
+/*
+ * Interface flags
+ */
+#define MN_ITF_F_UP        1
+
+struct mn_itf {
+    char mif_name[MN_ITF_NAME_MAX];
+    uint8_t mif_idx;
+    uint8_t mif_flags;
+    uint8_t mif_addr_cnt;
+};
+
+struct mn_itf_addr {
+    uint8_t mifa_family;
+    uint8_t mifa_plen;
+    union {
+        struct mn_in_addr v4;
+        struct mn_in6_addr v6;
+    } mifa_addr;
+};
+
+/*
+ * Iterate through interfaces, and their addresses
+ */
+int mn_itf_getnext(struct mn_itf *);
+int mn_itf_addr_getnext(struct mn_itf *, struct mn_itf_addr *);
+
 #endif /* __SYS_MN_SOCKET_H_ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/include/mn_socket/mn_socket_ops.h
----------------------------------------------------------------------
diff --git a/sys/mn_socket/include/mn_socket/mn_socket_ops.h b/sys/mn_socket/include/mn_socket/mn_socket_ops.h
index 61be054..39f11c1 100644
--- a/sys/mn_socket/include/mn_socket/mn_socket_ops.h
+++ b/sys/mn_socket/include/mn_socket/mn_socket_ops.h
@@ -49,6 +49,9 @@ struct mn_socket_ops {
 
     int (*mso_getsockname)(struct mn_socket *, struct mn_sockaddr *);
     int (*mso_getpeername)(struct mn_socket *, struct mn_sockaddr *);
+
+    int (*mso_itf_getnext)(struct mn_itf *);
+    int (*mso_itf_addr_getnext)(struct mn_itf *, struct mn_itf_addr *);
 };
 
 int mn_socket_ops_reg(const struct mn_socket_ops *ops);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/src/arch/sim/native_itf.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/arch/sim/native_itf.c b/sys/mn_socket/src/arch/sim/native_itf.c
new file mode 100644
index 0000000..09318b3
--- /dev/null
+++ b/sys/mn_socket/src/arch/sim/native_itf.c
@@ -0,0 +1,179 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "mn_socket/mn_socket.h"
+#include "native_sock_priv.h"
+
+static uint8_t
+itf_flags(int if_flags)
+{
+    uint8_t flags;
+
+    flags = 0;
+
+    if ((if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING)) {
+        flags |= MN_ITF_F_UP;
+    }
+    return flags;
+}
+
+int
+native_sock_itf_getnext(struct mn_itf *mi)
+{
+    int prev_idx, cur_idx;
+    struct ifaddrs *ifap;
+    struct ifaddrs *ifa;
+    int rc;
+
+    if (mi->mif_name[0] == '\0') {
+        prev_idx = 0;
+    } else {
+        prev_idx = mi->mif_idx;
+    }
+    mi->mif_idx = UCHAR_MAX;
+    rc = getifaddrs(&ifap);
+    if (rc < 0) {
+        rc = native_sock_err_to_mn_err(errno);
+        return rc;
+    }
+
+    rc = MN_ENOBUFS;
+    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+        cur_idx = if_nametoindex(ifa->ifa_name);
+        if (cur_idx <= prev_idx || cur_idx >= mi->mif_idx) {
+            continue;
+        }
+        strncpy(mi->mif_name, ifa->ifa_name, sizeof(mi->mif_name));
+        mi->mif_idx = cur_idx;
+        mi->mif_flags = itf_flags(ifa->ifa_flags);
+        rc = 0;
+    }
+    freeifaddrs(ifap);
+    return rc;
+}
+
+static int
+addrcmp(uint8_t fam1, void *addr1, uint8_t fam2, void *addr2, int alen)
+{
+    if (fam1 != fam2) {
+        return fam1 - fam2;
+    }
+    return memcmp(addr1, addr2, alen);
+}
+
+static int
+plen(void *addr, int alen)
+{
+    int i;
+    int j;
+    uint8_t b;
+
+    for (i = 0; i < alen; i++) {
+        b = ((uint8_t *)addr)[i];
+        if (b == 0xff) {
+            continue;
+        }
+        for (j = 0; j < 7; j++) {
+            if ((b & (0x80 >> j)) == 0) {
+                return i * 8 + j;
+            }
+        }
+    }
+    return alen * 8;
+}
+
+int
+native_sock_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
+{
+    struct ifaddrs *ifap;
+    struct ifaddrs *ifa;
+    struct sockaddr_in *sin;
+    struct sockaddr_in6 *sin6;
+    int rc;
+    uint8_t prev_family;
+    uint8_t prev_addr[16];
+
+    rc = getifaddrs(&ifap);
+    if (rc < 0) {
+        rc = native_sock_err_to_mn_err(errno);
+        return rc;
+    }
+
+    prev_family = mia->mifa_family;
+    memcpy(prev_addr, &mia->mifa_addr, sizeof(mia->mifa_addr));
+    mia->mifa_family = UCHAR_MAX;
+    memset(&mia->mifa_addr, 0xff, sizeof(mia->mifa_addr));
+
+    rc = MN_ENOBUFS;
+
+    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+        if (if_nametoindex(ifa->ifa_name) != mi->mif_idx) {
+            continue;
+        }
+        if (ifa->ifa_addr->sa_family == AF_INET) {
+            sin = (struct sockaddr_in *)ifa->ifa_addr;
+            if (addrcmp(MN_AF_INET, &sin->sin_addr,
+                prev_family, prev_addr,
+                sizeof(struct in_addr)) <= 0) {
+                continue;
+            }
+            if (addrcmp(MN_AF_INET, &sin->sin_addr,
+                mia->mifa_family, &mia->mifa_addr,
+                sizeof(struct in_addr)) >= 0) {
+                continue;
+            }
+            mia->mifa_family = MN_AF_INET;
+            memcpy(&mia->mifa_addr, &sin->sin_addr, sizeof(struct in_addr));
+
+            sin = (struct sockaddr_in *)ifa->ifa_netmask;
+            mia->mifa_plen = plen(&sin->sin_addr, sizeof(struct in_addr));
+        } else if (ifa->ifa_addr->sa_family == AF_INET6) {
+            sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+            if (addrcmp(MN_AF_INET6, &sin6->sin6_addr,
+                prev_family, prev_addr,
+                sizeof(struct in6_addr)) <= 0) {
+                continue;
+            }
+            if (addrcmp(MN_AF_INET6, &sin6->sin6_addr,
+                mia->mifa_family, &mia->mifa_addr,
+                sizeof(struct in6_addr)) >= 0) {
+                continue;
+            }
+            mia->mifa_family = MN_AF_INET6;
+            memcpy(&mia->mifa_addr, &sin6->sin6_addr, sizeof(struct in6_addr));
+
+            sin6 = (struct sockaddr_in6 *)ifa->ifa_netmask;
+            mia->mifa_plen = plen(&sin6->sin6_addr, sizeof(struct in6_addr));
+        } else {
+            continue;
+        }
+        rc = 0;
+    }
+    freeifaddrs(ifap);
+    return rc;
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/src/arch/sim/native_sock.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/arch/sim/native_sock.c b/sys/mn_socket/src/arch/sim/native_sock.c
index f305201..6ef4b79 100644
--- a/sys/mn_socket/src/arch/sim/native_sock.c
+++ b/sys/mn_socket/src/arch/sim/native_sock.c
@@ -32,6 +32,9 @@
 #include "mn_socket/mn_socket.h"
 #include "mn_socket/mn_socket_ops.h"
 
+#include "mn_socket/arch/sim/native_sock.h"
+#include "native_sock_priv.h"
+
 #define NATIVE_SOCK_MAX 8
 #define NATIVE_SOCK_MAX_UDP 2048
 #define NATIVE_SOCK_POLL_ITVL (OS_TICKS_PER_SEC / 5)
@@ -48,6 +51,7 @@ static int native_sock_sendto(struct mn_socket *, struct os_mbuf *,
   struct mn_sockaddr *);
 static int native_sock_recvfrom(struct mn_socket *, struct os_mbuf **,
   struct mn_sockaddr *);
+static int native_sock_getsockname(struct mn_socket *, struct mn_sockaddr *);
 static int native_sock_getpeername(struct mn_socket *, struct mn_sockaddr *);
 
 static struct native_sock {
@@ -79,8 +83,11 @@ static const struct mn_socket_ops native_sock_ops = {
     .mso_sendto = native_sock_sendto,
     .mso_recvfrom = native_sock_recvfrom,
 
+    .mso_getsockname = native_sock_getsockname,
     .mso_getpeername = native_sock_getpeername,
 
+    .mso_itf_getnext = native_sock_itf_getnext,
+    .mso_itf_addr_getnext = native_sock_itf_addr_getnext
 };
 
 static struct native_sock *
@@ -138,7 +145,7 @@ native_sock_poll_rebuild(struct native_sock_state *nss)
     os_mutex_release(&nss->mtx);
 }
 
-static int
+int
 native_sock_err_to_mn_err(int err)
 {
     switch (err) {
@@ -166,7 +173,7 @@ native_sock_mn_addr_to_addr(struct mn_sockaddr *ms, struct sockaddr *sa)
     case MN_AF_INET:
         sin->sin_family = AF_INET;
         sin->sin_len = sizeof(*sin);
-        sin->sin_addr.s_addr = msin->msin_addr;
+        sin->sin_addr.s_addr = msin->msin_addr.s_addr;
         sin->sin_port = msin->msin_port;
         break;
     case MN_AF_INET6:
@@ -175,7 +182,7 @@ native_sock_mn_addr_to_addr(struct mn_sockaddr *ms, struct sockaddr *sa)
         sin6->sin6_port = msin6->msin6_port;
         sin6->sin6_flowinfo = msin6->msin6_flowinfo;
         sin6->sin6_scope_id = 0; /* XXX need this */
-        memcpy(&sin6->sin6_addr, msin6->msin6_addr, sizeof(msin6->msin6_addr));
+        memcpy(&sin6->sin6_addr, &msin6->msin6_addr, sizeof(msin6->msin6_addr));
         break;
     default:
         return MN_EPROTONOSUPPORT;
@@ -195,7 +202,7 @@ native_sock_addr_to_mn_addr( struct sockaddr *sa, struct mn_sockaddr *ms)
     case AF_INET:
         msin->msin_family = MN_AF_INET;
         msin->msin_len = sizeof(*msin);
-        msin->msin_addr = sin->sin_addr.s_addr;
+        msin->msin_addr.s_addr = sin->sin_addr.s_addr;
         msin->msin_port = sin->sin_port;
         break;
     case AF_INET6:
@@ -203,7 +210,7 @@ native_sock_addr_to_mn_addr( struct sockaddr *sa, struct mn_sockaddr *ms)
         msin6->msin6_len = sizeof(*msin6);
         msin6->msin6_port = sin6->sin6_port;
         msin6->msin6_flowinfo = sin6->sin6_flowinfo;
-        memcpy(msin6->msin6_addr, &sin6->sin6_addr, sizeof(msin6->msin6_addr));
+        memcpy(&msin6->msin6_addr, &sin6->sin6_addr, sizeof(msin6->msin6_addr));
         break;
     default:
         return MN_EPROTONOSUPPORT;
@@ -506,6 +513,27 @@ native_sock_recvfrom(struct mn_socket *s, struct os_mbuf **mp,
 }
 
 static int
+native_sock_getsockname(struct mn_socket *s, struct mn_sockaddr *addr)
+{
+    struct native_sock *ns = (struct native_sock *)s;
+    struct sockaddr_storage ss;
+    struct sockaddr *sa = (struct sockaddr *)&ss;
+    socklen_t len;
+    int rc;
+
+    len = sizeof(struct sockaddr_storage);
+    rc = getsockname(ns->ns_fd, sa, &len);
+    if (rc) {
+        return native_sock_err_to_mn_err(errno);
+    }
+    rc = native_sock_addr_to_mn_addr(sa, addr);
+    if (rc) {
+        return rc;
+    }
+    return 0;
+}
+
+static int
 native_sock_getpeername(struct mn_socket *s, struct mn_sockaddr *addr)
 {
     struct native_sock *ns = (struct native_sock *)s;
@@ -553,12 +581,10 @@ socket_task(void *arg)
         if (rc == 0) {
             continue;
         }
-        printf("events %d\n", rc);
         for (i = 0; i < nss->poll_fd_cnt; i++) {
             if (!nss->poll_fds[i].revents) {
                 continue;
             }
-            printf("  on %d - %d\n", i, nss->poll_fds[i].fd);
             nss->poll_fds[i].revents = 0;
             ns = native_find_sock(nss->poll_fds[i].fd);
             assert(ns);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/src/arch/sim/native_sock_priv.h
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/arch/sim/native_sock_priv.h b/sys/mn_socket/src/arch/sim/native_sock_priv.h
new file mode 100644
index 0000000..aec3809
--- /dev/null
+++ b/sys/mn_socket/src/arch/sim/native_sock_priv.h
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef __NATIVE_SOCK_PRIV_H_
+#define __NATIVE_SOCK_PRIV_H_
+
+struct mn_itf;
+struct mn_itf_addr;
+
+int native_sock_itf_getnext(struct mn_itf *);
+int native_sock_itf_addr_getnext(struct mn_itf *, struct mn_itf_addr *);
+
+int native_sock_err_to_mn_err(int err);
+
+#endif

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/src/mn_socket.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/mn_socket.c b/sys/mn_socket/src/mn_socket.c
index 3e4ba58..1bf2b4c 100644
--- a/sys/mn_socket/src/mn_socket.c
+++ b/sys/mn_socket/src/mn_socket.c
@@ -124,3 +124,15 @@ mn_close(struct mn_socket *s)
 {
     return s->ms_ops->mso_close(s);
 }
+
+int
+mn_itf_getnext(struct mn_itf *mi)
+{
+    return mn_sock_tgt->mso_itf_getnext(mi);
+}
+
+int
+mn_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
+{
+    return mn_sock_tgt->mso_itf_addr_getnext(mi, mia);
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/fc14ad83/sys/mn_socket/src/test/mn_sock_test.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/test/mn_sock_test.c b/sys/mn_socket/src/test/mn_sock_test.c
index acb1dd7..2814170 100644
--- a/sys/mn_socket/src/test/mn_sock_test.c
+++ b/sys/mn_socket/src/test/mn_sock_test.c
@@ -186,6 +186,7 @@ sock_tcp_connect(void)
     struct mn_socket *listen_sock;
     struct mn_socket *sock;
     struct mn_sockaddr_in msin;
+    struct mn_sockaddr_in msin2;
     int rc;
     union mn_socket_cb listen_cbs = {
         .listen.newconn = stc_newconn,
@@ -225,6 +226,22 @@ sock_tcp_connect(void)
     TEST_ASSERT(connected == 1);
     TEST_ASSERT(new_sock != NULL);
 
+    /*
+     * Check endpoint data matches
+     */
+    rc = mn_getsockname(sock, (struct mn_sockaddr *)&msin);
+    TEST_ASSERT(rc == 0);
+    rc = mn_getpeername(new_sock, (struct mn_sockaddr *)&msin2);
+    TEST_ASSERT(rc == 0);
+    TEST_ASSERT(!memcmp(&msin, &msin2, sizeof(msin)));
+
+    rc = mn_getsockname(new_sock, (struct mn_sockaddr *)&msin);
+    TEST_ASSERT(rc == 0);
+    rc = mn_getpeername(sock, (struct mn_sockaddr *)&msin2);
+    TEST_ASSERT(rc == 0);
+    TEST_ASSERT(!memcmp(&msin, &msin2, sizeof(msin)));
+
+
     if (new_sock) {
         mn_close(new_sock);
     }
@@ -272,7 +289,7 @@ sock_udp_data(void)
     msin2.msin_family = MN_PF_INET;
     msin2.msin_len = sizeof(msin2);
     msin2.msin_port = 0;
-    msin2.msin_addr = 0;
+    msin2.msin_addr.s_addr = 0;
     rc = mn_bind(sock2, (struct mn_sockaddr *)&msin2);
     TEST_ASSERT(rc == 0);
 
@@ -295,7 +312,7 @@ sock_udp_data(void)
     TEST_ASSERT(msin2.msin_family == MN_AF_INET);
     TEST_ASSERT(msin2.msin_len == sizeof(msin2));
     TEST_ASSERT(msin2.msin_port != 0);
-    TEST_ASSERT(msin2.msin_addr != 0);
+    TEST_ASSERT(msin2.msin_addr.s_addr != 0);
 
     if (m) {
         TEST_ASSERT(OS_MBUF_IS_PKTHDR(m));
@@ -426,7 +443,7 @@ sock_tcp_data(void)
     TEST_ASSERT(msin.msin_family == MN_AF_INET);
     TEST_ASSERT(msin.msin_len == sizeof(msin));
     TEST_ASSERT(msin.msin_port != 0);
-    TEST_ASSERT(msin.msin_addr != 0);
+    TEST_ASSERT(msin.msin_addr.s_addr != 0);
     os_mbuf_free_chain(m);
 
     if (new_sock) {
@@ -437,6 +454,48 @@ sock_tcp_data(void)
 }
 
 void
+sock_itf_list(void)
+{
+    struct mn_itf itf;
+    struct mn_itf_addr itf_addr;
+    int if_cnt = 0;
+    int seen_127;
+    struct mn_in_addr addr127;
+    char addr_str[64];
+    int rc;
+
+    mn_inet_pton(MN_PF_INET, "127.0.0.1", &addr127);
+
+    memset(&itf, 0, sizeof(itf));
+
+    while (1) {
+        rc = mn_itf_getnext(&itf);
+        if (rc) {
+            break;
+        }
+        printf("%d: %x %s\n", itf.mif_idx, itf.mif_flags, itf.mif_name);
+        memset(&itf_addr, 0, sizeof(itf_addr));
+        while (1) {
+            rc = mn_itf_addr_getnext(&itf, &itf_addr);
+            if (rc) {
+                break;
+            }
+            if (itf_addr.mifa_family == MN_AF_INET &&
+              !memcmp(&itf_addr.mifa_addr, &addr127, sizeof(addr127))) {
+                seen_127 = 1;
+            }
+            addr_str[0] = '\0';
+            mn_inet_ntop(itf_addr.mifa_family, &itf_addr.mifa_addr,
+              addr_str, sizeof(addr_str));
+            printf(" %s/%d\n", addr_str, itf_addr.mifa_plen);
+        }
+        if_cnt++;
+    }
+    TEST_ASSERT(if_cnt > 0);
+    TEST_ASSERT(seen_127);
+}
+
+void
 mn_socket_test_handler(void *arg)
 {
     sock_open_close();
@@ -444,6 +503,7 @@ mn_socket_test_handler(void *arg)
     sock_tcp_connect();
     sock_udp_data();
     sock_tcp_data();
+    sock_itf_list();
     os_test_restart();
 }
 


[3/3] incubator-mynewt-core git commit: mn_socket - native_sock; add scope_id to v6 sockaddr.

Posted by ma...@apache.org.
mn_socket - native_sock; add scope_id to v6 sockaddr.


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

Branch: refs/heads/develop
Commit: d11c52fca0da7367b3ea3f548479fa503e3c0fcb
Parents: 5951351
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Thu Sep 15 15:17:10 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Thu Sep 15 15:17:10 2016 -0700

----------------------------------------------------------------------
 sys/mn_socket/include/mn_socket/mn_socket.h |   1 +
 sys/mn_socket/src/arch/sim/native_sock.c    |   3 +-
 sys/mn_socket/src/test/mn_sock_test.c       | 106 +++++++++++++++++++++++
 3 files changed, 109 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d11c52fc/sys/mn_socket/include/mn_socket/mn_socket.h
----------------------------------------------------------------------
diff --git a/sys/mn_socket/include/mn_socket/mn_socket.h b/sys/mn_socket/include/mn_socket/mn_socket.h
index 0ae247c..bcbe34f 100644
--- a/sys/mn_socket/include/mn_socket/mn_socket.h
+++ b/sys/mn_socket/include/mn_socket/mn_socket.h
@@ -112,6 +112,7 @@ struct mn_sockaddr_in6 {
     uint16_t msin6_port;
     uint32_t msin6_flowinfo;
     struct mn_in6_addr msin6_addr;
+    uint32_t msin6_scope_id;
 };
 
 extern const uint32_t nm_in6addr_any[4];

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d11c52fc/sys/mn_socket/src/arch/sim/native_sock.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/arch/sim/native_sock.c b/sys/mn_socket/src/arch/sim/native_sock.c
index 6ef4b79..73ca6c7 100644
--- a/sys/mn_socket/src/arch/sim/native_sock.c
+++ b/sys/mn_socket/src/arch/sim/native_sock.c
@@ -181,8 +181,8 @@ native_sock_mn_addr_to_addr(struct mn_sockaddr *ms, struct sockaddr *sa)
         sin6->sin6_len = sizeof(*sin6);
         sin6->sin6_port = msin6->msin6_port;
         sin6->sin6_flowinfo = msin6->msin6_flowinfo;
-        sin6->sin6_scope_id = 0; /* XXX need this */
         memcpy(&sin6->sin6_addr, &msin6->msin6_addr, sizeof(msin6->msin6_addr));
+        sin6->sin6_scope_id = msin6->msin6_scope_id;
         break;
     default:
         return MN_EPROTONOSUPPORT;
@@ -211,6 +211,7 @@ native_sock_addr_to_mn_addr( struct sockaddr *sa, struct mn_sockaddr *ms)
         msin6->msin6_port = sin6->sin6_port;
         msin6->msin6_flowinfo = sin6->sin6_flowinfo;
         memcpy(&msin6->msin6_addr, &sin6->sin6_addr, sizeof(msin6->msin6_addr));
+        msin6->msin6_scope_id = sin6->sin6_scope_id;
         break;
     default:
         return MN_EPROTONOSUPPORT;

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/d11c52fc/sys/mn_socket/src/test/mn_sock_test.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/test/mn_sock_test.c b/sys/mn_socket/src/test/mn_sock_test.c
index 2814170..a0f85da 100644
--- a/sys/mn_socket/src/test/mn_sock_test.c
+++ b/sys/mn_socket/src/test/mn_sock_test.c
@@ -495,6 +495,111 @@ sock_itf_list(void)
     TEST_ASSERT(seen_127);
 }
 
+static int
+first_ll_addr(struct mn_sockaddr_in6 *ra)
+{
+    struct mn_itf itf;
+    struct mn_itf_addr itf_addr;
+    int rc;
+    struct mn_in6_addr *addr;
+
+    memset(&itf, 0, sizeof(itf));
+    addr = (struct mn_in6_addr *)&itf_addr.mifa_addr;
+    while (1) {
+        rc = mn_itf_getnext(&itf);
+        if (rc) {
+            break;
+        }
+        memset(&itf_addr, 0, sizeof(itf_addr));
+        while (1) {
+            rc = mn_itf_addr_getnext(&itf, &itf_addr);
+            if (rc) {
+                break;
+            }
+            if (itf_addr.mifa_family == MN_AF_INET6 &&
+              addr->s_addr[0] == 0xfe && addr->s_addr[1] == 0x80) {
+                memset(ra, 0, sizeof(*ra));
+                ra->msin6_family = MN_AF_INET6;
+                ra->msin6_len = sizeof(*ra);
+                ra->msin6_scope_id = itf.mif_idx;
+                memcpy(&ra->msin6_addr, addr, sizeof(*addr));
+                return 0;
+            }
+        }
+    }
+    return -1;
+}
+
+void
+sul_readable(void *cb_arg, int err)
+{
+    os_sem_release(&test_sem);
+}
+
+void
+sock_udp_ll(void)
+{
+    struct mn_socket *sock1;
+    struct mn_socket *sock2;
+    struct mn_sockaddr_in6 msin;
+    struct mn_sockaddr_in6 msin2;
+    int rc;
+    union mn_socket_cb sock_cbs = {
+        .socket.readable = sul_readable
+    };
+    struct os_mbuf *m;
+    char data[] = "1234567890";
+
+    rc = mn_socket(&sock1, MN_PF_INET6, MN_SOCK_DGRAM, 0);
+    TEST_ASSERT(rc == 0);
+    mn_socket_set_cbs(sock1, NULL, &sock_cbs);
+
+    rc = mn_socket(&sock2, MN_PF_INET6, MN_SOCK_DGRAM, 0);
+    TEST_ASSERT(rc == 0);
+    mn_socket_set_cbs(sock2, NULL, &sock_cbs);
+
+    rc = first_ll_addr(&msin);
+    if (rc != 0) {
+        printf("No ipv6 address present?\n");
+        return;
+    }
+    msin.msin6_port = htons(12445);
+
+    rc = mn_bind(sock1, (struct mn_sockaddr *)&msin);
+    TEST_ASSERT(rc == 0);
+
+    rc = mn_getsockname(sock1, (struct mn_sockaddr *)&msin2);
+    TEST_ASSERT(rc == 0);
+
+    m = os_msys_get(sizeof(data), 0);
+    TEST_ASSERT(m);
+    rc = os_mbuf_copyinto(m, 0, data, sizeof(data));
+    TEST_ASSERT(rc == 0);
+    rc = mn_sendto(sock2, (struct os_mbuf *)m, (struct mn_sockaddr *)&msin2);
+    TEST_ASSERT(rc == 0);
+
+    /*
+     * Wait for the packet.
+     */
+    rc = os_sem_pend(&test_sem, OS_TICKS_PER_SEC);
+    TEST_ASSERT(rc == 0);
+
+    rc = mn_recvfrom(sock1, &m, (struct mn_sockaddr *)&msin);
+    TEST_ASSERT(rc == 0);
+    TEST_ASSERT(m != NULL);
+
+    if (m) {
+        TEST_ASSERT(OS_MBUF_IS_PKTHDR(m));
+        TEST_ASSERT(OS_MBUF_PKTLEN(m) == sizeof(data));
+        TEST_ASSERT(m->om_len == sizeof(data));
+        TEST_ASSERT(!memcmp(m->om_data, data, sizeof(data)));
+        os_mbuf_free_chain(m);
+    }
+
+    mn_close(sock1);
+    mn_close(sock2);
+}
+
 void
 mn_socket_test_handler(void *arg)
 {
@@ -504,6 +609,7 @@ mn_socket_test_handler(void *arg)
     sock_udp_data();
     sock_tcp_data();
     sock_itf_list();
+    sock_udp_ll();
     os_test_restart();
 }
 


[2/3] incubator-mynewt-core git commit: mn_socket; mn_inet_ntop() for ipv6.

Posted by ma...@apache.org.
mn_socket; mn_inet_ntop() for ipv6.


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

Branch: refs/heads/develop
Commit: 5951351e34ae7651aa381e2b8fae9cea1a626dfd
Parents: fc14ad8
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Thu Sep 15 13:44:45 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Thu Sep 15 13:44:45 2016 -0700

----------------------------------------------------------------------
 sys/mn_socket/src/mn_socket_aconv.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/5951351e/sys/mn_socket/src/mn_socket_aconv.c
----------------------------------------------------------------------
diff --git a/sys/mn_socket/src/mn_socket_aconv.c b/sys/mn_socket/src/mn_socket_aconv.c
index 23c500b..1ca6010 100644
--- a/sys/mn_socket/src/mn_socket_aconv.c
+++ b/sys/mn_socket/src/mn_socket_aconv.c
@@ -18,7 +18,7 @@
  */
 #include <ctype.h>
 #include <stdio.h>
-#include <os/queue.h>
+#include <os/endian.h>
 #include "mn_socket/mn_socket.h"
 
 int
@@ -61,7 +61,9 @@ const char *
 mn_inet_ntop(int af, const void *src_v, void *dst, int len)
 {
     const unsigned char *src = src_v;
+    const struct mn_in6_addr *a6;
     int rc;
+    int i;
 
     if (af == MN_PF_INET) {
         rc = snprintf(dst, len, "%u.%u.%u.%u",
@@ -72,6 +74,22 @@ mn_inet_ntop(int af, const void *src_v, void *dst, int len)
             return dst;
         }
     } else {
-        return NULL;
+        a6 = src_v;
+        rc = 0;
+
+        for (i = 0; i < sizeof(*a6); i += 2) {
+            rc += snprintf(dst + rc, len - rc, "%x",
+              htons(*(uint16_t *)&a6->s_addr[i]));
+            if (rc >= len) {
+                return NULL;
+            }
+            if (i < sizeof(*a6) - 2) {
+                rc += snprintf(dst + rc, len - rc, ":");
+                if (rc >= len) {
+                    return NULL;
+                }
+            }
+        }
+        return dst;
     }
 }