You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ad...@apache.org on 2017/04/19 18:17:58 UTC
[02/30] incubator-mynewt-core git commit: net/ip;
add locking, and other bug fixes.
net/ip; add locking, and other bug fixes.
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/c700fc74
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/c700fc74
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/c700fc74
Branch: refs/heads/master
Commit: c700fc74b966dccff481039c7fd7f617915de779
Parents: 66ae3df
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Fri Apr 14 12:52:29 2017 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Fri Apr 14 13:21:30 2017 -0700
----------------------------------------------------------------------
net/ip/src/lwip_if.c | 17 +++---
net/ip/src/lwip_socket.c | 121 +++++++++++++++++++++++++++---------------
2 files changed, 89 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c700fc74/net/ip/src/lwip_if.c
----------------------------------------------------------------------
diff --git a/net/ip/src/lwip_if.c b/net/ip/src/lwip_if.c
index 1b4c427..41d6b2e 100644
--- a/net/ip/src/lwip_if.c
+++ b/net/ip/src/lwip_if.c
@@ -36,19 +36,18 @@ lwip_if_flags(uint8_t if_flags)
flags = 0;
- if ((if_flags & (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) ==
- (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) {
+ if (if_flags & NETIF_FLAG_UP) {
flags |= MN_ITF_F_UP;
}
+ if (if_flags & NETIF_FLAG_LINK_UP) {
+ flags |= MN_ITF_F_LINK;
+ }
if (if_flags & (NETIF_FLAG_IGMP | NETIF_FLAG_MLD6)) {
flags |= MN_ITF_F_MULTICAST;
}
return flags;
}
-/*
- * XXX locking
- */
int
lwip_itf_getnext(struct mn_itf *mi)
{
@@ -64,6 +63,7 @@ lwip_itf_getnext(struct mn_itf *mi)
mi->mif_idx = UCHAR_MAX;
rc = MN_ENOBUFS;
+ LOCK_TCPIP_CORE();
for (nif = netif_list; nif; nif = nif->next) {
cur_idx = nif->num;
if (cur_idx <= prev_idx || cur_idx >= mi->mif_idx) {
@@ -76,6 +76,7 @@ lwip_itf_getnext(struct mn_itf *mi)
mi->mif_flags = lwip_if_flags(nif->flags);
rc = 0;
}
+ UNLOCK_TCPIP_CORE();
return rc;
}
@@ -109,8 +110,10 @@ lwip_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
int copy_next = 0;
#endif
+ LOCK_TCPIP_CORE();
nif = netif_find(mi->mif_name);
if (!nif) {
+ UNLOCK_TCPIP_CORE();
return MN_EINVAL;
}
@@ -122,6 +125,7 @@ lwip_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
sizeof(struct mn_in_addr));
mia->mifa_plen = plen(ip_2_ip4(&nif->netmask),
sizeof(struct mn_in_addr));
+ UNLOCK_TCPIP_CORE();
return 0;
}
#endif
@@ -139,6 +143,7 @@ lwip_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
memcpy(&mia->mifa_addr, netif_ip6_addr(nif, i),
sizeof(struct mn_in6_addr));
mia->mifa_plen = 64;
+ UNLOCK_TCPIP_CORE();
return 0;
}
if (!memcmp(&mia->mifa_addr, netif_ip6_addr(nif, i),
@@ -147,6 +152,6 @@ lwip_itf_addr_getnext(struct mn_itf *mi, struct mn_itf_addr *mia)
}
}
#endif
+ UNLOCK_TCPIP_CORE();
return -1;
}
-
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/c700fc74/net/ip/src/lwip_socket.c
----------------------------------------------------------------------
diff --git a/net/ip/src/lwip_socket.c b/net/ip/src/lwip_socket.c
index ddf7be7..1a57392 100644
--- a/net/ip/src/lwip_socket.c
+++ b/net/ip/src/lwip_socket.c
@@ -24,6 +24,7 @@
#include <mn_socket/mn_socket.h>
#include <mn_socket/mn_socket_ops.h>
+#include <lwip/tcpip.h>
#include <lwip/udp.h>
#include <lwip/tcp.h>
#include "ip_priv.h"
@@ -63,7 +64,7 @@ static const struct mn_socket_ops lwip_sock_ops = {
.mso_getpeername = lwip_getpeername,
.mso_itf_getnext = lwip_itf_getnext,
- .mso_itf_addr_getnext = lwip_itf_addr_getnext
+ .mso_itf_addr_getnext = lwip_itf_addr_getnext,
};
struct lwip_sock {
@@ -93,7 +94,7 @@ lwip_mn_addr_to_addr(struct mn_sockaddr *ms, ip_addr_t *addr, uint16_t *port)
case MN_AF_INET:
msin = (struct mn_sockaddr_in *)ms;
IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V4);
- *port = msin->msin_port;
+ *port = ntohs(msin->msin_port);
memcpy(ip_2_ip4(addr), &msin->msin_addr, sizeof(struct mn_in_addr));
return 0;
#endif
@@ -101,7 +102,7 @@ lwip_mn_addr_to_addr(struct mn_sockaddr *ms, ip_addr_t *addr, uint16_t *port)
case MN_AF_INET6:
msin6 = (struct mn_sockaddr_in6 *)ms;
IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V6);
- *port = msin6->msin6_port;
+ *port = ntohs(msin6->msin6_port);
memcpy(ip_2_ip6(addr), &msin6->msin6_addr, sizeof(struct mn_in6_addr));
return 0;
#endif
@@ -122,9 +123,7 @@ lwip_addr_to_mn_addr(struct mn_sockaddr *ms, const ip_addr_t *addr,
} else {
ms->msa_family = MN_AF_INET6;
}
-#if !LWIP_IPV4
- ms->msa_family = MN_AF_INET;
-#endif
+ port = htons(port);
switch (ms->msa_family) {
#if LWIP_IPV4
case MN_AF_INET:
@@ -145,7 +144,7 @@ lwip_addr_to_mn_addr(struct mn_sockaddr *ms, const ip_addr_t *addr,
}
}
-static int
+int
lwip_err_to_mn_err(int rc)
{
switch (rc) {
@@ -198,6 +197,7 @@ lwip_sock_udp_rx(void *arg, struct udp_pcb *pcb, struct pbuf *p,
for (q = p; q; q = q->next) {
os_mbuf_copyinto(m, off, q->payload, p->len);
}
+ pbuf_free(p);
STAILQ_INSERT_TAIL(&s->ls_rx, OS_MBUF_PKTHDR(m), omp_next);
mn_socket_readable(&s->ls_sock, 0);
}
@@ -226,6 +226,7 @@ lwip_sock_tcp_rx(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
for (q = p; q; q = q->next) {
os_mbuf_copyinto(m, off, q->payload, p->len);
}
+ pbuf_free(p);
STAILQ_INSERT_TAIL(&s->ls_rx, OS_MBUF_PKTHDR(m), omp_next);
mn_socket_readable(&s->ls_sock, 0);
@@ -246,7 +247,7 @@ lwip_sock_tcp_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{
struct lwip_sock *s = (struct lwip_sock *)arg;
- mn_socket_writable(&s->ls_sock, err);
+ mn_socket_writable(&s->ls_sock, lwip_err_to_mn_err(err));
return ERR_OK;
}
@@ -255,7 +256,7 @@ lwip_sock_tcp_err(void *arg, err_t err)
{
struct lwip_sock *s = (struct lwip_sock *)arg;
- mn_socket_writable(&s->ls_sock, err);
+ mn_socket_writable(&s->ls_sock, lwip_err_to_mn_err(err));
}
static err_t
@@ -264,11 +265,20 @@ lwip_sock_accept(void *arg, struct tcp_pcb *new, err_t err)
struct lwip_sock *s = (struct lwip_sock *)arg;
struct lwip_sock *new_s;
+ if (err != ERR_OK) {
+ return err;
+ }
new_s = os_memblock_get(&lwip_sockets);
- assert(new_s); /* memory pool should be sized correctly */
+ if (!new_s) {
+ return ERR_MEM;
+ }
new_s->ls_type = MN_SOCK_STREAM;
new_s->ls_sock.ms_ops = &lwip_sock_ops;
new_s->ls_pcb.tcp = new;
+ tcp_arg(new, new_s);
+ tcp_recv(new, lwip_sock_tcp_rx);
+ tcp_sent(new, lwip_sock_tcp_sent);
+ tcp_err(new, lwip_sock_tcp_err);
STAILQ_INIT(&new_s->ls_rx);
new_s->ls_tx = NULL;
if (mn_socket_newconn(&s->ls_sock, &new_s->ls_sock)) {
@@ -293,6 +303,7 @@ lwip_sock_create(struct mn_socket **sp, uint8_t domain, uint8_t type,
STAILQ_INIT(&s->ls_rx);
s->ls_tx = NULL;
+ LOCK_TCPIP_CORE();
switch (type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
@@ -312,6 +323,7 @@ lwip_sock_create(struct mn_socket **sp, uint8_t domain, uint8_t type,
default:
break;
}
+ UNLOCK_TCPIP_CORE();
if (!s->ls_pcb.ip) {
os_memblock_put(&lwip_sockets, s);
return MN_EPROTONOSUPPORT;
@@ -327,6 +339,7 @@ lwip_close(struct mn_socket *ms)
struct lwip_sock *s = (struct lwip_sock *)ms;
struct os_mbuf_pkthdr *m;
+ LOCK_TCPIP_CORE();
switch (s->ls_type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
@@ -335,10 +348,14 @@ lwip_close(struct mn_socket *ms)
#endif
#if LWIP_TCP
case MN_SOCK_STREAM:
+ tcp_recv(s->ls_pcb.tcp, NULL);
+ tcp_sent(s->ls_pcb.tcp, NULL);
+ tcp_err(s->ls_pcb.tcp, NULL);
tcp_close(s->ls_pcb.tcp);
break;
}
#endif
+ UNLOCK_TCPIP_CORE();
while ((m = STAILQ_FIRST(&s->ls_rx))) {
STAILQ_REMOVE_HEAD(&s->ls_rx, omp_next);
os_mbuf_free_chain(OS_MBUF_PKTHDR_TO_MBUF(m));
@@ -363,27 +380,26 @@ lwip_connect(struct mn_socket *ms, struct mn_sockaddr *addr)
if (rc) {
return rc;
}
+ rc = MN_EPROTONOSUPPORT;
+ LOCK_TCPIP_CORE();
switch (s->ls_type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
rc = udp_connect(s->ls_pcb.udp, &ip, port);
- if (rc) {
- return lwip_err_to_mn_err(rc);
- }
- return 0;
+ rc = lwip_err_to_mn_err(rc);
+ break;
#endif
#if LWIP_TCP
case MN_SOCK_STREAM:
rc = tcp_connect(s->ls_pcb.tcp, &ip, port, lwip_sock_tcp_connected);
- if (rc) {
- return lwip_err_to_mn_err(rc);
- }
- return 0;
+ rc = lwip_err_to_mn_err(rc);
+ break;
#endif
default:
break;
}
- return MN_EPROTONOSUPPORT;
+ UNLOCK_TCPIP_CORE();
+ return rc;
}
static int
@@ -398,27 +414,26 @@ lwip_bind(struct mn_socket *ms, struct mn_sockaddr *addr)
if (rc) {
return rc;
}
+ rc = MN_EPROTONOSUPPORT;
+ LOCK_TCPIP_CORE();
switch (s->ls_type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
rc = udp_bind(s->ls_pcb.udp, &ip, port);
- if (rc) {
- return lwip_err_to_mn_err(rc);
- }
- return 0;
+ rc = lwip_err_to_mn_err(rc);
+ break;
#endif
#if LWIP_TCP
case MN_SOCK_STREAM:
rc = tcp_bind(s->ls_pcb.tcp, &ip, port);
- if (rc) {
- return lwip_err_to_mn_err(rc);
- }
- return 0;
+ rc = lwip_err_to_mn_err(rc);
+ break;
#endif
default:
break;
}
- return MN_EPROTONOSUPPORT;
+ UNLOCK_TCPIP_CORE();
+ return rc;
}
static int
@@ -429,12 +444,14 @@ lwip_listen(struct mn_socket *ms, uint8_t qlen)
struct tcp_pcb *pcb;
if (s->ls_type == MN_SOCK_STREAM) {
- tcp_accept(s->ls_pcb.tcp, lwip_sock_accept);
+ LOCK_TCPIP_CORE();
pcb = tcp_listen_with_backlog(s->ls_pcb.tcp, qlen);
+ UNLOCK_TCPIP_CORE();
if (!pcb) {
return MN_EADDRINUSE;
}
s->ls_pcb.tcp = pcb;
+ tcp_accept(pcb, lwip_sock_accept);
return 0;
}
#endif
@@ -448,6 +465,7 @@ lwip_stream_tx(struct lwip_sock *s, int notify)
struct os_mbuf *m;
struct os_mbuf *n;
+ rc = 0;
while (s->ls_tx && rc == 0) {
m = s->ls_tx;
n = SLIST_NEXT(m, om_next);
@@ -510,8 +528,9 @@ lwip_sendto(struct mn_socket *ms, struct os_mbuf *m,
pbuf_take_at(p, n->om_data, n->om_len, off);
off += n->om_len;
}
-
+ LOCK_TCPIP_CORE();
rc = udp_sendto(s->ls_pcb.udp, p, &ip_addr, port);
+ UNLOCK_TCPIP_CORE();
if (rc) {
rc = lwip_err_to_mn_err(rc);
pbuf_free(p);
@@ -525,8 +544,13 @@ lwip_sendto(struct mn_socket *ms, struct os_mbuf *m,
if (s->ls_tx) {
return MN_EAGAIN;
}
+ if (addr) {
+ return MN_EINVAL;
+ }
+ LOCK_TCPIP_CORE();
s->ls_tx = m;
rc = lwip_stream_tx(s, 0);
+ UNLOCK_TCPIP_CORE();
return rc;
#endif
default:
@@ -543,6 +567,7 @@ lwip_recvfrom(struct mn_socket *ms, struct os_mbuf **mp,
struct os_mbuf_pkthdr *m;
int slen;
+ LOCK_TCPIP_CORE();
m = STAILQ_FIRST(&s->ls_rx);
if (m) {
STAILQ_REMOVE_HEAD(&s->ls_rx, omp_next);
@@ -562,12 +587,14 @@ lwip_recvfrom(struct mn_socket *ms, struct os_mbuf **mp,
} else {
#if LWIP_TCP
lwip_addr_to_mn_addr(addr, &s->ls_pcb.ip->local_ip,
- s->ls_pcb.tcp->local_port);
+ s->ls_pcb.tcp->local_port);
#endif
}
}
+ UNLOCK_TCPIP_CORE();
return 0;
} else {
+ UNLOCK_TCPIP_CORE();
*mp = NULL;
return MN_EAGAIN;
}
@@ -591,48 +618,56 @@ static int
lwip_getsockname(struct mn_socket *ms, struct mn_sockaddr *addr)
{
struct lwip_sock *s = (struct lwip_sock *)ms;
+ int rc;
+ rc = MN_EPROTONOSUPPORT;
+ LOCK_TCPIP_CORE();
switch (s->ls_type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
lwip_addr_to_mn_addr(addr, &s->ls_pcb.ip->local_ip,
- s->ls_pcb.udp->local_port);
- return 0;
+ s->ls_pcb.udp->local_port);
+ rc = 0;
#endif
#if LWIP_TCP
case MN_SOCK_STREAM:
lwip_addr_to_mn_addr(addr, &s->ls_pcb.ip->local_ip,
- s->ls_pcb.tcp->local_port);
- return 0;
+ s->ls_pcb.tcp->local_port);
+ rc = 0;
#endif
default:
break;
}
- return MN_EPROTONOSUPPORT;
+ UNLOCK_TCPIP_CORE();
+ return rc;
}
static int
lwip_getpeername(struct mn_socket *ms, struct mn_sockaddr *addr)
{
struct lwip_sock *s = (struct lwip_sock *)ms;
+ int rc;
+ rc = MN_EPROTONOSUPPORT;
+ LOCK_TCPIP_CORE();
switch (s->ls_type) {
#if LWIP_UDP
case MN_SOCK_DGRAM:
lwip_addr_to_mn_addr(addr, &s->ls_pcb.ip->remote_ip,
- s->ls_pcb.udp->remote_port);
- return 0;
+ s->ls_pcb.udp->remote_port);
+ rc = 0;
#endif
#if LWIP_TCP
case MN_SOCK_STREAM:
lwip_addr_to_mn_addr(addr, &s->ls_pcb.ip->remote_ip,
- s->ls_pcb.tcp->remote_port);
- return 0;
+ s->ls_pcb.tcp->remote_port);
+ rc = 0;
#endif
default:
break;
}
- return MN_EPROTONOSUPPORT;
+ UNLOCK_TCPIP_CORE();
+ return rc;
}
int
@@ -642,8 +677,8 @@ lwip_socket_init(void)
int cnt;
void *mem;
- cnt = MEMP_NUM_TCP_PCB + MEMP_NUM_UDP_PCB;
- mem = malloc(OS_MEMPOOL_SIZE(cnt, sizeof(struct lwip_sock)));
+ cnt = MEMP_NUM_TCP_PCB + MEMP_NUM_UDP_PCB + MEMP_NUM_TCP_PCB_LISTEN;
+ mem = os_malloc(OS_MEMPOOL_BYTES(cnt, sizeof(struct lwip_sock)));
if (!mem) {
return -1;
}