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