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;
}
}