[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 2/7] POSIX: Allow enabling/disabling POSIX sockets



---
 debian/patches/posix | 1830 ++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 1562 insertions(+), 268 deletions(-)

diff --git a/debian/patches/posix b/debian/patches/posix
index ef83cc7..b86452d 100644
--- a/debian/patches/posix
+++ b/debian/patches/posix
@@ -1,29 +1,222 @@
-Manual hack for now, next lwip version will contain needed tweaks.
-
-Index: lwip/src/include/lwip/inet.h
-===================================================================
---- lwip.orig/src/include/lwip/inet.h
-+++ lwip/src/include/lwip/inet.h
-@@ -49,6 +49,7 @@
- extern "C" {
- #endif
- 
-+#if 0
- /* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
-    to prevent this code from redefining it. */
- #if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
-@@ -129,6 +130,7 @@ extern const struct in6_addr in6addr_any
- #define INET6_ADDRSTRLEN    IP6ADDR_STRLEN_MAX
- #endif
- #endif
-+#endif
+--- /dev/null
++++ b/port/include/posix/inet.h
+@@ -0,0 +1,63 @@
++/*
++   Copyright (C) 2018 Free Software Foundation, Inc.
++   Written by Joan Lledó.
++
++   This file is part of the GNU Hurd.
++
++   The GNU Hurd is free software; you can redistribute it and/or
++   modify it under the terms of the GNU General Public License as
++   published by the Free Software Foundation; either version 2, or (at
++   your option) any later version.
++
++   The GNU Hurd is distributed in the hope that it will be useful, but
++   WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef HURD_LWIP_POSIX_INET_H
++#define HURD_LWIP_POSIX_INET_H
++
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/tcp.h>
++#include <netinet/udp.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define SIN_ZERO_LEN sizeof (struct sockaddr) - \
++                           __SOCKADDR_COMMON_SIZE - \
++                           sizeof (in_port_t) - \
++                           sizeof (struct in_addr)
++
++#if LWIP_IPV4
++
++#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
++#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr)   (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
++/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */
++#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr)   ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr))
++
++#endif /* LWIP_IPV4 */
++
++#if LWIP_IPV6
++#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->s6_addr32[0] = (source_ip6addr)->addr[0]; \
++                                                                 (target_in6addr)->s6_addr32[1] = (source_ip6addr)->addr[1]; \
++                                                                 (target_in6addr)->s6_addr32[2] = (source_ip6addr)->addr[2]; \
++                                                                 (target_in6addr)->s6_addr32[3] = (source_ip6addr)->addr[3];}
++#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr)   {(target_ip6addr)->addr[0] = (source_in6addr)->s6_addr32[0]; \
++                                                                 (target_ip6addr)->addr[1] = (source_in6addr)->s6_addr32[1]; \
++                                                                 (target_ip6addr)->addr[2] = (source_in6addr)->s6_addr32[2]; \
++                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->s6_addr32[3];}
++/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
++#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
++#endif /* LWIP_IPV6 */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* HURD_LWIP_POSIX_INET_H */
+--- /dev/null
++++ b/port/include/posix/socket.h
+@@ -0,0 +1,39 @@
++/*
++   Copyright (C) 2018 Free Software Foundation, Inc.
++   Written by Joan Lledó.
++
++   This file is part of the GNU Hurd.
++
++   The GNU Hurd is free software; you can redistribute it and/or
++   modify it under the terms of the GNU General Public License as
++   published by the Free Software Foundation; either version 2, or (at
++   your option) any later version.
++
++   The GNU Hurd is distributed in the hope that it will be useful, but
++   WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef HURD_LWIP_POSIX_SOCKET_H
++#define HURD_LWIP_POSIX_SOCKET_H
++
++#include <sys/socket.h>
++#include <poll.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* Unsuported indetifiers */
++#define SO_NO_CHECK         0x0
++#define MSG_MORE            0x0
++#define TCP_KEEPALIVE       0x0
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* HURD_LWIP_POSIX_SOCKET_H */
+--- a/src/include/lwip/inet.h
++++ b/src/include/lwip/inet.h
+@@ -41,132 +41,11 @@
+ #define LWIP_HDR_INET_H
  
- #if LWIP_IPV4
+ #include "lwip/opt.h"
+-#include "lwip/def.h"
+-#include "lwip/ip_addr.h"
+-#include "lwip/ip6_addr.h"
  
-@@ -146,14 +148,14 @@ extern const struct in6_addr in6addr_any
- #endif /* LWIP_IPV4 */
- 
- #if LWIP_IPV6
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-/* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
+-   to prevent this code from redefining it. */
+-#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
+-typedef u32_t in_addr_t;
+-#endif
+-
+-struct in_addr {
+-  in_addr_t s_addr;
+-};
+-
+-struct in6_addr {
+-  union {
+-    u32_t u32_addr[4];
+-    u8_t  u8_addr[16];
+-  } un;
+-#define s6_addr  un.u8_addr
+-};
+-
+-/** 255.255.255.255 */
+-#define INADDR_NONE         IPADDR_NONE
+-/** 127.0.0.1 */
+-#define INADDR_LOOPBACK     IPADDR_LOOPBACK
+-/** 0.0.0.0 */
+-#define INADDR_ANY          IPADDR_ANY
+-/** 255.255.255.255 */
+-#define INADDR_BROADCAST    IPADDR_BROADCAST
+-
+-/** This macro can be used to initialize a variable of type struct in6_addr
+-    to the IPv6 wildcard address. */
+-#define IN6ADDR_ANY_INIT {{{0,0,0,0}}}
+-/** This macro can be used to initialize a variable of type struct in6_addr
+-    to the IPv6 loopback address. */
+-#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}}
+-/** This variable is initialized by the system to contain the wildcard IPv6 address. */
+-extern const struct in6_addr in6addr_any;
+-
+-/* Definitions of the bits in an (IPv4) Internet address integer.
+-
+-   On subnets, host and network parts are found according to
+-   the subnet mask, not these masks.  */
+-#define IN_CLASSA(a)        IP_CLASSA(a)
+-#define IN_CLASSA_NET       IP_CLASSA_NET
+-#define IN_CLASSA_NSHIFT    IP_CLASSA_NSHIFT
+-#define IN_CLASSA_HOST      IP_CLASSA_HOST
+-#define IN_CLASSA_MAX       IP_CLASSA_MAX
+-
+-#define IN_CLASSB(b)        IP_CLASSB(b)
+-#define IN_CLASSB_NET       IP_CLASSB_NET
+-#define IN_CLASSB_NSHIFT    IP_CLASSB_NSHIFT
+-#define IN_CLASSB_HOST      IP_CLASSB_HOST
+-#define IN_CLASSB_MAX       IP_CLASSB_MAX
+-
+-#define IN_CLASSC(c)        IP_CLASSC(c)
+-#define IN_CLASSC_NET       IP_CLASSC_NET
+-#define IN_CLASSC_NSHIFT    IP_CLASSC_NSHIFT
+-#define IN_CLASSC_HOST      IP_CLASSC_HOST
+-#define IN_CLASSC_MAX       IP_CLASSC_MAX
+-
+-#define IN_CLASSD(d)        IP_CLASSD(d)
+-#define IN_CLASSD_NET       IP_CLASSD_NET     /* These ones aren't really */
+-#define IN_CLASSD_NSHIFT    IP_CLASSD_NSHIFT  /*   net and host fields, but */
+-#define IN_CLASSD_HOST      IP_CLASSD_HOST    /*   routing needn't know. */
+-#define IN_CLASSD_MAX       IP_CLASSD_MAX
+-
+-#define IN_MULTICAST(a)     IP_MULTICAST(a)
+-
+-#define IN_EXPERIMENTAL(a)  IP_EXPERIMENTAL(a)
+-#define IN_BADCLASS(a)      IP_BADCLASS(a)
+-
+-#define IN_LOOPBACKNET      IP_LOOPBACKNET
+-
+-
+-#ifndef INET_ADDRSTRLEN
+-#define INET_ADDRSTRLEN     IP4ADDR_STRLEN_MAX
+-#endif
+-#if LWIP_IPV6
+-#ifndef INET6_ADDRSTRLEN
+-#define INET6_ADDRSTRLEN    IP6ADDR_STRLEN_MAX
+-#endif
+-#endif
+-
+-#if LWIP_IPV4
+-
+-#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
+-#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr)   (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
+-/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */
+-#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr)   ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr))
+-
+-/* directly map this to the lwip internal functions */
+-#define inet_addr(cp)                   ipaddr_addr(cp)
+-#define inet_aton(cp, addr)             ip4addr_aton(cp, (ip4_addr_t*)addr)
+-#define inet_ntoa(addr)                 ip4addr_ntoa((const ip4_addr_t*)&(addr))
+-#define inet_ntoa_r(addr, buf, buflen)  ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen)
+-
+-#endif /* LWIP_IPV4 */
+-
+-#if LWIP_IPV6
 -#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \
 -                                                                 (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \
 -                                                                 (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \
@@ -32,274 +225,1375 @@ Index: lwip/src/include/lwip/inet.h
 -                                                                 (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \
 -                                                                 (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \
 -                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];}
-+#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->s6_addr32[0] = (source_ip6addr)->addr[0]; \
-+                                                                 (target_in6addr)->s6_addr32[1] = (source_ip6addr)->addr[1]; \
-+                                                                 (target_in6addr)->s6_addr32[2] = (source_ip6addr)->addr[2]; \
-+                                                                 (target_in6addr)->s6_addr32[3] = (source_ip6addr)->addr[3];}
-+#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr)   {(target_ip6addr)->addr[0] = (source_in6addr)->s6_addr32[0]; \
-+                                                                 (target_ip6addr)->addr[1] = (source_in6addr)->s6_addr32[1]; \
-+                                                                 (target_ip6addr)->addr[2] = (source_in6addr)->s6_addr32[2]; \
-+                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->s6_addr32[3];}
- /* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
- #define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
- 
-Index: lwip/src/include/lwip/sockets.h
-===================================================================
---- lwip.orig/src/include/lwip/sockets.h
-+++ lwip/src/include/lwip/sockets.h
-@@ -52,6 +52,7 @@
- extern "C" {
- #endif
- 
-+#if 0
- /* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
-    to prevent this code from redefining it. */
- #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
-@@ -107,6 +108,12 @@ struct sockaddr_storage {
- #if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
- typedef u32_t socklen_t;
- #endif
+-/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
+-#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
+-
+-/* directly map this to the lwip internal functions */
+-#define inet6_aton(cp, addr)            ip6addr_aton(cp, (ip6_addr_t*)addr)
+-#define inet6_ntoa(addr)                ip6addr_ntoa((const ip6_addr_t*)&(addr))
+-#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen)
+-
+-#endif /* LWIP_IPV6 */
+-
+-
+-#ifdef __cplusplus
+-}
++#if LWIP_STD_SOCKETS
++#include LWIP_INCLUDE_STD_INET
 +#else
-+#define SIN_ZERO_LEN sizeof (struct sockaddr) - \
-+                           __SOCKADDR_COMMON_SIZE - \
-+                           sizeof (in_port_t) - \
-+                           sizeof (struct in_addr)
-+#endif
- 
- struct lwip_sock;
- 
-@@ -142,6 +149,7 @@ struct lwip_setgetsockopt_data {
- };
- #endif /* !LWIP_TCPIP_CORE_LOCKING */
- 
-+#if 0
- #if !defined(iovec)
- struct iovec {
-   void  *iov_base;
-@@ -442,6 +450,7 @@ struct timeval {
-   long    tv_usec;        /* and microseconds */
- };
- #endif /* LWIP_TIMEVAL_PRIVATE */
-+#endif
- 
- #define lwip_socket_init() /* Compatibility define, no init needed. */
- void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
-Index: lwip/src/include/lwip/ip.h
-===================================================================
---- lwip.orig/src/include/lwip/ip.h
-+++ lwip/src/include/lwip/ip.h
-@@ -91,12 +91,18 @@ struct ip_pcb {
-   IP_PCB;
- };
++#include "lwip/lwip_inet.h"
+ #endif
  
-+#if 0
+ #endif /* LWIP_HDR_INET_H */
+--- a/src/include/lwip/ip.h
++++ b/src/include/lwip/ip.h
+@@ -94,9 +94,16 @@
  /*
   * Option flags per-socket. These are the same like SO_XXX in sockets.h
   */
- #define SOF_REUSEADDR     0x04U  /* allow local address reuse */
- #define SOF_KEEPALIVE     0x08U  /* keep connections alive */
- #define SOF_BROADCAST     0x20U  /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
-+#else
++#if LWIP_SOCKET && LWIP_STD_SOCKETS
++#include "lwip/sockets.h"
 +#define SOF_REUSEADDR     SO_REUSEADDR
 +#define SOF_KEEPALIVE     SO_KEEPALIVE
 +#define SOF_BROADCAST     SO_BROADCAST
++#else
+ #define SOF_REUSEADDR     0x04U  /* allow local address reuse */
+ #define SOF_KEEPALIVE     0x08U  /* keep connections alive */
+ #define SOF_BROADCAST     0x20U  /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
 +#endif
  
  /* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */
  #define SOF_INHERITED   (SOF_REUSEADDR|SOF_KEEPALIVE)
-Index: lwip/src/api/sockets.c
-===================================================================
---- lwip.orig/src/api/sockets.c
-+++ lwip/src/api/sockets.c
-@@ -77,9 +77,19 @@
- #define LWIP_NETCONN 0
- #endif
- 
-+#ifdef BSD
-+#define SET_LEN(sin) \
-+      (sin)->sin_len = sizeof(struct sockaddr_in);
-+#define SET_LEN6(sin6) \
-+      (sin6)->sin6_len = sizeof(struct sockaddr_in6);
+--- /dev/null
++++ b/src/include/lwip/lwip_inet.h
+@@ -0,0 +1,164 @@
++/*
++ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without modification,
++ * are permitted provided that the following conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above copyright notice,
++ *    this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright notice,
++ *    this list of conditions and the following disclaimer in the documentation
++ *    and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
++ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
++ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
++ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
++ * OF SUCH DAMAGE.
++ *
++ * This file is part of the lwIP TCP/IP stack.
++ *
++ * Author: Adam Dunkels <adam@sics.se>
++ *
++ */
++#ifndef LWIP_HDR_PRIV_INET_H
++#define LWIP_HDR_PRIV_INET_H
++
++#include "lwip/opt.h"
++#include "lwip/def.h"
++#include "lwip/ip_addr.h"
++#include "lwip/ip6_addr.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED
++   to prevent this code from redefining it. */
++#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)
++typedef u32_t in_addr_t;
++#endif
++
++struct in_addr {
++  in_addr_t s_addr;
++};
++
++struct in6_addr {
++  union {
++    u32_t u32_addr[4];
++    u8_t  u8_addr[16];
++  } un;
++#define s6_addr  un.u8_addr
++};
++
++/** 255.255.255.255 */
++#define INADDR_NONE         IPADDR_NONE
++/** 127.0.0.1 */
++#define INADDR_LOOPBACK     IPADDR_LOOPBACK
++/** 0.0.0.0 */
++#define INADDR_ANY          IPADDR_ANY
++/** 255.255.255.255 */
++#define INADDR_BROADCAST    IPADDR_BROADCAST
++
++/** This macro can be used to initialize a variable of type struct in6_addr
++    to the IPv6 wildcard address. */
++#define IN6ADDR_ANY_INIT {{{0,0,0,0}}}
++/** This macro can be used to initialize a variable of type struct in6_addr
++    to the IPv6 loopback address. */
++#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}}
++/** This variable is initialized by the system to contain the wildcard IPv6 address. */
++extern const struct in6_addr in6addr_any;
++
++/* Definitions of the bits in an (IPv4) Internet address integer.
++
++   On subnets, host and network parts are found according to
++   the subnet mask, not these masks.  */
++#define IN_CLASSA(a)        IP_CLASSA(a)
++#define IN_CLASSA_NET       IP_CLASSA_NET
++#define IN_CLASSA_NSHIFT    IP_CLASSA_NSHIFT
++#define IN_CLASSA_HOST      IP_CLASSA_HOST
++#define IN_CLASSA_MAX       IP_CLASSA_MAX
++
++#define IN_CLASSB(b)        IP_CLASSB(b)
++#define IN_CLASSB_NET       IP_CLASSB_NET
++#define IN_CLASSB_NSHIFT    IP_CLASSB_NSHIFT
++#define IN_CLASSB_HOST      IP_CLASSB_HOST
++#define IN_CLASSB_MAX       IP_CLASSB_MAX
++
++#define IN_CLASSC(c)        IP_CLASSC(c)
++#define IN_CLASSC_NET       IP_CLASSC_NET
++#define IN_CLASSC_NSHIFT    IP_CLASSC_NSHIFT
++#define IN_CLASSC_HOST      IP_CLASSC_HOST
++#define IN_CLASSC_MAX       IP_CLASSC_MAX
++
++#define IN_CLASSD(d)        IP_CLASSD(d)
++#define IN_CLASSD_NET       IP_CLASSD_NET     /* These ones aren't really */
++#define IN_CLASSD_NSHIFT    IP_CLASSD_NSHIFT  /*   net and host fields, but */
++#define IN_CLASSD_HOST      IP_CLASSD_HOST    /*   routing needn't know. */
++#define IN_CLASSD_MAX       IP_CLASSD_MAX
++
++#define IN_MULTICAST(a)     IP_MULTICAST(a)
++
++#define IN_EXPERIMENTAL(a)  IP_EXPERIMENTAL(a)
++#define IN_BADCLASS(a)      IP_BADCLASS(a)
++
++#define IN_LOOPBACKNET      IP_LOOPBACKNET
++
++
++#ifndef INET_ADDRSTRLEN
++#define INET_ADDRSTRLEN     IP4ADDR_STRLEN_MAX
++#endif
++#if LWIP_IPV6
++#ifndef INET6_ADDRSTRLEN
++#define INET6_ADDRSTRLEN    IP6ADDR_STRLEN_MAX
++#endif
++#endif
++
++#if LWIP_IPV4
++
++#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
++#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr)   (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
++/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */
++#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr)   ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr))
++
++/* directly map this to the lwip internal functions */
++#define inet_addr(cp)                   ipaddr_addr(cp)
++#define inet_aton(cp, addr)             ip4addr_aton(cp, (ip4_addr_t*)addr)
++#define inet_ntoa(addr)                 ip4addr_ntoa((const ip4_addr_t*)&(addr))
++#define inet_ntoa_r(addr, buf, buflen)  ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen)
++
++#endif /* LWIP_IPV4 */
++
++#if LWIP_IPV6
++#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \
++                                                                 (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \
++                                                                 (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \
++                                                                 (target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];}
++#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr)   {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \
++                                                                 (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \
++                                                                 (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \
++                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];}
++/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
++#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
++
++/* directly map this to the lwip internal functions */
++#define inet6_aton(cp, addr)            ip6addr_aton(cp, (ip6_addr_t*)addr)
++#define inet6_ntoa(addr)                ip6addr_ntoa((const ip6_addr_t*)&(addr))
++#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen)
++
++#endif /* LWIP_IPV6 */
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* LWIP_HDR_PRIV_INET_H */
+--- /dev/null
++++ b/src/include/lwip/lwip_sockets.h
+@@ -0,0 +1,567 @@
++/**
++ * @file
++ * Socket API (to be used from non-TCPIP threads)
++ */
++
++/*
++ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without modification,
++ * are permitted provided that the following conditions are met:
++ *
++ * 1. Redistributions of source code must retain the above copyright notice,
++ *    this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright notice,
++ *    this list of conditions and the following disclaimer in the documentation
++ *    and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
++ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
++ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
++ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
++ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
++ * OF SUCH DAMAGE.
++ *
++ * This file is part of the lwIP TCP/IP stack.
++ *
++ * Author: Adam Dunkels <adam@sics.se>
++ *
++ */
++
++
++#ifndef LWIP_HDR_PRIV_SOCKETS_H
++#define LWIP_HDR_PRIV_SOCKETS_H
++
++#include "lwip/opt.h"
++
++#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
++
++#include "lwip/ip_addr.h"
++#include "lwip/err.h"
++#include "lwip/inet.h"
++#include "lwip/errno.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
++   to prevent this code from redefining it. */
++#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
++typedef u8_t sa_family_t;
++#endif
++/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED
++   to prevent this code from redefining it. */
++#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
++typedef u16_t in_port_t;
++#endif
++
++#if LWIP_IPV4
++/* members are in network byte order */
++struct sockaddr_in {
++  u8_t            sin_len;
++  sa_family_t     sin_family;
++  in_port_t       sin_port;
++  struct in_addr  sin_addr;
++#define SIN_ZERO_LEN 8
++  char            sin_zero[SIN_ZERO_LEN];
++};
++#endif /* LWIP_IPV4 */
++
++#if LWIP_IPV6
++struct sockaddr_in6 {
++  u8_t            sin6_len;      /* length of this structure    */
++  sa_family_t     sin6_family;   /* AF_INET6                    */
++  in_port_t       sin6_port;     /* Transport layer port #      */
++  u32_t           sin6_flowinfo; /* IPv6 flow information       */
++  struct in6_addr sin6_addr;     /* IPv6 address                */
++  u32_t           sin6_scope_id; /* Set of interfaces for scope */
++};
++#endif /* LWIP_IPV6 */
++
++struct sockaddr {
++  u8_t        sa_len;
++  sa_family_t sa_family;
++  char        sa_data[14];
++};
++
++struct sockaddr_storage {
++  u8_t        s2_len;
++  sa_family_t ss_family;
++  char        s2_data1[2];
++  u32_t       s2_data2[3];
++#if LWIP_IPV6
++  u32_t       s2_data3[3];
++#endif /* LWIP_IPV6 */
++};
++
++/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED
++   to prevent this code from redefining it. */
++#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
++typedef u32_t socklen_t;
++#endif
++
++struct lwip_sock;
++
++#if !LWIP_TCPIP_CORE_LOCKING
++/** Maximum optlen used by setsockopt/getsockopt */
++#define LWIP_SETGETSOCKOPT_MAXOPTLEN 16
++
++/** This struct is used to pass data to the set/getsockopt_internal
++ * functions running in tcpip_thread context (only a void* is allowed) */
++struct lwip_setgetsockopt_data {
++  /** socket index for which to change options */
++  int s;
++  /** level of the option to process */
++  int level;
++  /** name of the option to process */
++  int optname;
++  /** set: value to set the option to
++    * get: value of the option is stored here */
++#if LWIP_MPU_COMPATIBLE
++  u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN];
 +#else
-+#define SET_LEN(sin)
-+#define SET_LEN6(sin6)
++  union {
++     void *p;
++     const void *pc;
++  } optval;
 +#endif
++  /** size of *optval */
++  socklen_t optlen;
++  /** if an error occurs, it is temporarily stored here */
++  err_t err;
++  /** semaphore to wake up the calling task */
++  void* completed_sem;
++};
++#endif /* !LWIP_TCPIP_CORE_LOCKING */
 +
- #if LWIP_IPV4
- #define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \
--      (sin)->sin_len = sizeof(struct sockaddr_in); \
-+      SET_LEN(sin) \
-       (sin)->sin_family = AF_INET; \
-       (sin)->sin_port = lwip_htons((port)); \
-       inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \
-@@ -91,7 +101,7 @@
- 
- #if LWIP_IPV6
- #define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \
--      (sin6)->sin6_len = sizeof(struct sockaddr_in6); \
-+      SET_LEN6(sin6) \
-       (sin6)->sin6_family = AF_INET6; \
-       (sin6)->sin6_port = lwip_htons((port)); \
-       (sin6)->sin6_flowinfo = 0; \
-@@ -537,9 +547,11 @@ lwip_accept(int s, struct sockaddr *addr
-     LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL);
- 
-     IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port);
-+#ifdef BSD
-     if (*addrlen > tempaddr.sa.sa_len) {
-       *addrlen = tempaddr.sa.sa_len;
-     }
++#if !defined(iovec)
++struct iovec {
++  void  *iov_base;
++  size_t iov_len;
++};
 +#endif
-     MEMCPY(addr, &tempaddr, *addrlen);
- 
-     LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock));
-@@ -878,9 +890,11 @@ lwip_recvfrom(int s, void *mem, size_t l
-         if (from && fromlen)
- #endif /* SOCKETS_DEBUG */
-         {
-+#ifdef BSD
-           if (*fromlen > saddr.sa.sa_len) {
-             *fromlen = saddr.sa.sa_len;
-           }
++
++struct msghdr {
++  void         *msg_name;
++  socklen_t     msg_namelen;
++  struct iovec *msg_iov;
++  int           msg_iovlen;
++  void         *msg_control;
++  socklen_t     msg_controllen;
++  int           msg_flags;
++};
++
++/* Socket protocol types (TCP/UDP/RAW) */
++#define SOCK_STREAM     1
++#define SOCK_DGRAM      2
++#define SOCK_RAW        3
++
++/*
++ * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
++ */
++#define SO_REUSEADDR   0x0004 /* Allow local address reuse */
++#define SO_KEEPALIVE   0x0008 /* keep connections alive */
++#define SO_BROADCAST   0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
++
++
++/*
++ * Additional options, not kept in so_options.
++ */
++#define SO_DEBUG       0x0001 /* Unimplemented: turn on debugging info recording */
++#define SO_ACCEPTCONN  0x0002 /* socket has had listen() */
++#define SO_DONTROUTE   0x0010 /* Unimplemented: just use interface addresses */
++#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
++#define SO_LINGER      0x0080 /* linger on close if data present */
++#define SO_DONTLINGER  ((int)(~SO_LINGER))
++#define SO_OOBINLINE   0x0100 /* Unimplemented: leave received OOB data in line */
++#define SO_REUSEPORT   0x0200 /* Unimplemented: allow local address & port reuse */
++#define SO_SNDBUF      0x1001 /* Unimplemented: send buffer size */
++#define SO_RCVBUF      0x1002 /* receive buffer size */
++#define SO_SNDLOWAT    0x1003 /* Unimplemented: send low-water mark */
++#define SO_RCVLOWAT    0x1004 /* Unimplemented: receive low-water mark */
++#define SO_SNDTIMEO    0x1005 /* send timeout */
++#define SO_RCVTIMEO    0x1006 /* receive timeout */
++#define SO_ERROR       0x1007 /* get error status and clear */
++#define SO_TYPE        0x1008 /* get socket type */
++#define SO_CONTIMEO    0x1009 /* Unimplemented: connect timeout */
++#define SO_NO_CHECK    0x100a /* don't create UDP checksum */
++
++
++/*
++ * Structure used for manipulating linger option.
++ */
++struct linger {
++       int l_onoff;                /* option on/off */
++       int l_linger;               /* linger time in seconds */
++};
++
++/*
++ * Level number for (get/set)sockopt() to apply to socket itself.
++ */
++#define  SOL_SOCKET  0xfff    /* options for socket level */
++
++
++#define AF_UNSPEC       0
++#define AF_INET         2
++#if LWIP_IPV6
++#define AF_INET6        10
++#else /* LWIP_IPV6 */
++#define AF_INET6        AF_UNSPEC
++#endif /* LWIP_IPV6 */
++#define PF_INET         AF_INET
++#define PF_INET6        AF_INET6
++#define PF_UNSPEC       AF_UNSPEC
++
++#define IPPROTO_IP      0
++#define IPPROTO_ICMP    1
++#define IPPROTO_TCP     6
++#define IPPROTO_UDP     17
++#if LWIP_IPV6
++#define IPPROTO_IPV6    41
++#define IPPROTO_ICMPV6  58
++#endif /* LWIP_IPV6 */
++#define IPPROTO_UDPLITE 136
++#define IPPROTO_RAW     255
++
++/* Flags we can use with send and recv. */
++#define MSG_PEEK       0x01    /* Peeks at an incoming message */
++#define MSG_WAITALL    0x02    /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
++#define MSG_OOB        0x04    /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
++#define MSG_DONTWAIT   0x08    /* Nonblocking i/o for this operation only */
++#define MSG_MORE       0x10    /* Sender will send more */
++
++
++/*
++ * Options for level IPPROTO_IP
++ */
++#define IP_TOS             1
++#define IP_TTL             2
++
++#if LWIP_TCP
++/*
++ * Options for level IPPROTO_TCP
++ */
++#define TCP_NODELAY    0x01    /* don't delay send to coalesce packets */
++#define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
++#define TCP_KEEPIDLE   0x03    /* set pcb->keep_idle  - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
++#define TCP_KEEPINTVL  0x04    /* set pcb->keep_intvl - Use seconds for get/setsockopt */
++#define TCP_KEEPCNT    0x05    /* set pcb->keep_cnt   - Use number of probes sent for get/setsockopt */
++#endif /* LWIP_TCP */
++
++#if LWIP_IPV6
++/*
++ * Options for level IPPROTO_IPV6
++ */
++#define IPV6_CHECKSUM       7  /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */
++#define IPV6_V6ONLY         27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */
++#endif /* LWIP_IPV6 */
++
++#if LWIP_UDP && LWIP_UDPLITE
++/*
++ * Options for level IPPROTO_UDPLITE
++ */
++#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
++#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
++#endif /* LWIP_UDP && LWIP_UDPLITE*/
++
++
++#if LWIP_MULTICAST_TX_OPTIONS
++/*
++ * Options and types for UDP multicast traffic handling
++ */
++#define IP_MULTICAST_TTL   5
++#define IP_MULTICAST_IF    6
++#define IP_MULTICAST_LOOP  7
++#endif /* LWIP_MULTICAST_TX_OPTIONS */
++
++#if LWIP_IGMP
++/*
++ * Options and types related to multicast membership
++ */
++#define IP_ADD_MEMBERSHIP  3
++#define IP_DROP_MEMBERSHIP 4
++
++typedef struct ip_mreq {
++    struct in_addr imr_multiaddr; /* IP multicast address of group */
++    struct in_addr imr_interface; /* local IP address of interface */
++} ip_mreq;
++#endif /* LWIP_IGMP */
++
++/*
++ * The Type of Service provides an indication of the abstract
++ * parameters of the quality of service desired.  These parameters are
++ * to be used to guide the selection of the actual service parameters
++ * when transmitting a datagram through a particular network.  Several
++ * networks offer service precedence, which somehow treats high
++ * precedence traffic as more important than other traffic (generally
++ * by accepting only traffic above a certain precedence at time of high
++ * load).  The major choice is a three way tradeoff between low-delay,
++ * high-reliability, and high-throughput.
++ * The use of the Delay, Throughput, and Reliability indications may
++ * increase the cost (in some sense) of the service.  In many networks
++ * better performance for one of these parameters is coupled with worse
++ * performance on another.  Except for very unusual cases at most two
++ * of these three indications should be set.
++ */
++#define IPTOS_TOS_MASK          0x1E
++#define IPTOS_TOS(tos)          ((tos) & IPTOS_TOS_MASK)
++#define IPTOS_LOWDELAY          0x10
++#define IPTOS_THROUGHPUT        0x08
++#define IPTOS_RELIABILITY       0x04
++#define IPTOS_LOWCOST           0x02
++#define IPTOS_MINCOST           IPTOS_LOWCOST
++
++/*
++ * The Network Control precedence designation is intended to be used
++ * within a network only.  The actual use and control of that
++ * designation is up to each network. The Internetwork Control
++ * designation is intended for use by gateway control originators only.
++ * If the actual use of these precedence designations is of concern to
++ * a particular network, it is the responsibility of that network to
++ * control the access to, and use of, those precedence designations.
++ */
++#define IPTOS_PREC_MASK                 0xe0
++#define IPTOS_PREC(tos)                ((tos) & IPTOS_PREC_MASK)
++#define IPTOS_PREC_NETCONTROL           0xe0
++#define IPTOS_PREC_INTERNETCONTROL      0xc0
++#define IPTOS_PREC_CRITIC_ECP           0xa0
++#define IPTOS_PREC_FLASHOVERRIDE        0x80
++#define IPTOS_PREC_FLASH                0x60
++#define IPTOS_PREC_IMMEDIATE            0x40
++#define IPTOS_PREC_PRIORITY             0x20
++#define IPTOS_PREC_ROUTINE              0x00
++
++
++/*
++ * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
++ * lwip_ioctl only supports FIONREAD and FIONBIO, for now
++ *
++ * Ioctl's have the command encoded in the lower word,
++ * and the size of any in or out parameters in the upper
++ * word.  The high 2 bits of the upper word are used
++ * to encode the in/out status of the parameter; for now
++ * we restrict parameters to at most 128 bytes.
++ */
++#if !defined(FIONREAD) || !defined(FIONBIO)
++#define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */
++#define IOC_VOID        0x20000000UL    /* no parameters */
++#define IOC_OUT         0x40000000UL    /* copy out parameters */
++#define IOC_IN          0x80000000UL    /* copy in parameters */
++#define IOC_INOUT       (IOC_IN|IOC_OUT)
++                                        /* 0x20000000 distinguishes new &
++                                           old ioctl's */
++#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
++
++#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
++
++#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
++#endif /* !defined(FIONREAD) || !defined(FIONBIO) */
++
++#ifndef FIONREAD
++#define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */
 +#endif
-           MEMCPY(from, &saddr, *fromlen);
-         }
-       }
-@@ -951,7 +965,9 @@ lwip_send(int s, const void *data, size_
-   }
- 
-   write_flags = NETCONN_COPY |
-+#ifdef MSG_MORE
-     ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
++#ifndef FIONBIO
++#define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
 +#endif
-     ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);
-   written = 0;
-   err = netconn_write_partly(sock->conn, data, size, write_flags, &written);
-@@ -990,7 +1006,9 @@ lwip_sendmsg(int s, const struct msghdr
-   if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {
- #if LWIP_TCP
-     write_flags = NETCONN_COPY |
-+#ifdef MSG_MORE
-     ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |
++
++/* Socket I/O Controls: unimplemented */
++#ifndef SIOCSHIWAT
++#define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */
++#define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */
++#define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */
++#define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */
++#define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */
 +#endif
-     ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);
- 
-     for (i = 0; i < msg->msg_iovlen; i++) {
-@@ -1764,9 +1782,11 @@ lwip_getaddrname(int s, struct sockaddr
-   ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);
-   LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", port));
- 
-+#ifdef BSD
-   if (*namelen > saddr.sa.sa_len) {
-     *namelen = saddr.sa.sa_len;
-   }
++
++/* commands for fnctl */
++#ifndef F_GETFL
++#define F_GETFL 3
 +#endif
-   MEMCPY(name, &saddr, *namelen);
- 
-   sock_set_errno(sock, 0);
-@@ -1994,6 +2014,7 @@ lwip_getsockopt_impl(int s, int level, i
-       break;
- #endif /* LWIP_SO_LINGER */
- #if LWIP_UDP
-+#ifdef SO_NO_CHECK
-     case SO_NO_CHECK:
-       LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP);
- #if LWIP_UDPLITE
-@@ -2004,6 +2025,7 @@ lwip_getsockopt_impl(int s, int level, i
- #endif /* LWIP_UDPLITE */
-       *(int*)optval = (udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_NOCHKSUM) ? 1 : 0;
-       break;
++#ifndef F_SETFL
++#define F_SETFL 4
 +#endif
- #endif /* LWIP_UDP*/
-     default:
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
-@@ -2080,11 +2102,13 @@ lwip_getsockopt_impl(int s, int level, i
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n",
-                   s, (*(int*)optval)?"on":"off") );
-       break;
-+#ifdef TCP_KEEPALIVE
-     case TCP_KEEPALIVE:
-       *(int*)optval = (int)sock->conn->pcb.tcp->keep_idle;
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\n",
-                   s, *(int *)optval));
-       break;
++
++/* File status flags and file access modes for fnctl,
++   these are bits in an int. */
++#ifndef O_NONBLOCK
++#define O_NONBLOCK  1 /* nonblocking I/O */
 +#endif
- 
- #if LWIP_TCP_KEEPALIVE
-     case TCP_KEEPIDLE:
-@@ -2141,6 +2165,7 @@ lwip_getsockopt_impl(int s, int level, i
-       return ENOPROTOOPT;
-     }
-     switch (optname) {
-+#ifdef UDPLITE_SEND_CSCOV
-     case UDPLITE_SEND_CSCOV:
-       *(int*)optval = sock->conn->pcb.udp->chksum_len_tx;
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n",
-@@ -2151,6 +2176,7 @@ lwip_getsockopt_impl(int s, int level, i
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n",
-                   s, (*(int*)optval)) );
-       break;
++#ifndef O_NDELAY
++#define O_NDELAY    1 /* same as O_NONBLOCK, for compatibility */
 +#endif
-     default:
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
-                   s, optname));
-@@ -2359,6 +2385,7 @@ lwip_setsockopt_impl(int s, int level, i
-       break;
- #endif /* LWIP_SO_LINGER */
- #if LWIP_UDP
-+#ifdef SO_NO_CHECK
-     case SO_NO_CHECK:
-       LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);
- #if LWIP_UDPLITE
-@@ -2373,6 +2400,7 @@ lwip_setsockopt_impl(int s, int level, i
-         udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_NOCHKSUM);
-       }
-       break;
++
++#ifndef SHUT_RD
++  #define SHUT_RD   0
++  #define SHUT_WR   1
++  #define SHUT_RDWR 2
 +#endif
- #endif /* LWIP_UDP */
-     default:
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n",
-@@ -2476,11 +2504,13 @@ lwip_setsockopt_impl(int s, int level, i
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n",
-                   s, (*(const int *)optval)?"on":"off") );
-       break;
-+#ifdef TCP_KEEPALIVE
-     case TCP_KEEPALIVE:
-       sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int*)optval);
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n",
-                   s, sock->conn->pcb.tcp->keep_idle));
-       break;
++
++/* FD_SET used for lwip_select */
++#ifndef FD_SET
++#undef  FD_SETSIZE
++/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
++#define FD_SETSIZE    MEMP_NUM_NETCONN
++#define FDSETSAFESET(n, code) do { \
++  if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
++  code; }} while(0)
++#define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
++  (code) : 0)
++#define FD_SET(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |=  (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
++#define FD_CLR(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
++#define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &   (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
++#define FD_ZERO(p)    memset((void*)(p), 0, sizeof(*(p)))
++
++typedef struct fd_set
++{
++  unsigned char fd_bits [(FD_SETSIZE+7)/8];
++} fd_set;
++
++#elif LWIP_SOCKET_OFFSET
++#error LWIP_SOCKET_OFFSET does not work with external FD_SET!
++#elif FD_SETSIZE < MEMP_NUM_NETCONN
++#error "external FD_SETSIZE too small for number of sockets"
++#endif /* FD_SET */
++
++/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
++ * by your system, set this to 0 and include <sys/time.h> in cc.h */
++#ifndef LWIP_TIMEVAL_PRIVATE
++#define LWIP_TIMEVAL_PRIVATE 1
 +#endif
- 
- #if LWIP_TCP_KEEPALIVE
-     case TCP_KEEPIDLE:
-@@ -2541,6 +2571,7 @@ lwip_setsockopt_impl(int s, int level, i
-       return ENOPROTOOPT;
-     }
-     switch (optname) {
-+#ifdef UDPLITE_SEND_CSCOV
-     case UDPLITE_SEND_CSCOV:
-       if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) {
-         /* don't allow illegal values! */
-@@ -2561,6 +2592,7 @@ lwip_setsockopt_impl(int s, int level, i
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n",
-                   s, (*(const int*)optval)) );
-       break;
++
++#if LWIP_TIMEVAL_PRIVATE
++struct timeval {
++  long    tv_sec;         /* seconds */
++  long    tv_usec;        /* and microseconds */
++};
++#endif /* LWIP_TIMEVAL_PRIVATE */
++
++#define lwip_socket_init() /* Compatibility define, no init needed. */
++void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
++void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
++
++#if LWIP_COMPAT_SOCKETS == 2
++/* This helps code parsers/code completion by not having the COMPAT functions as defines */
++#define lwip_accept       accept
++#define lwip_bind         bind
++#define lwip_shutdown     shutdown
++#define lwip_getpeername  getpeername
++#define lwip_getsockname  getsockname
++#define lwip_setsockopt   setsockopt
++#define lwip_getsockopt   getsockopt
++#define lwip_close        closesocket
++#define lwip_connect      connect
++#define lwip_listen       listen
++#define lwip_recv         recv
++#define lwip_recvfrom     recvfrom
++#define lwip_send         send
++#define lwip_sendmsg      sendmsg
++#define lwip_sendto       sendto
++#define lwip_socket       socket
++#define lwip_select       select
++#define lwip_ioctlsocket  ioctl
++
++#if LWIP_POSIX_SOCKETS_IO_NAMES
++#define lwip_read         read
++#define lwip_write        write
++#define lwip_writev       writev
++#undef lwip_close
++#define lwip_close        close
++#define closesocket(s)    close(s)
++#define lwip_fcntl        fcntl
++#define lwip_ioctl        ioctl
++#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
++#endif /* LWIP_COMPAT_SOCKETS == 2 */
++
++#if LWIP_COMPAT_SOCKETS
++#if LWIP_COMPAT_SOCKETS != 2
++/** @ingroup socket */
++#define accept(s,addr,addrlen)                    lwip_accept(s,addr,addrlen)
++/** @ingroup socket */
++#define bind(s,name,namelen)                      lwip_bind(s,name,namelen)
++/** @ingroup socket */
++#define shutdown(s,how)                           lwip_shutdown(s,how)
++/** @ingroup socket */
++#define getpeername(s,name,namelen)               lwip_getpeername(s,name,namelen)
++/** @ingroup socket */
++#define getsockname(s,name,namelen)               lwip_getsockname(s,name,namelen)
++/** @ingroup socket */
++#define setsockopt(s,level,optname,opval,optlen)  lwip_setsockopt(s,level,optname,opval,optlen)
++/** @ingroup socket */
++#define getsockopt(s,level,optname,opval,optlen)  lwip_getsockopt(s,level,optname,opval,optlen)
++/** @ingroup socket */
++#define closesocket(s)                            lwip_close(s)
++/** @ingroup socket */
++#define connect(s,name,namelen)                   lwip_connect(s,name,namelen)
++/** @ingroup socket */
++#define listen(s,backlog)                         lwip_listen(s,backlog)
++/** @ingroup socket */
++#define recv(s,mem,len,flags)                     lwip_recv(s,mem,len,flags)
++/** @ingroup socket */
++#define recvfrom(s,mem,len,flags,from,fromlen)    lwip_recvfrom(s,mem,len,flags,from,fromlen)
++/** @ingroup socket */
++#define send(s,dataptr,size,flags)                lwip_send(s,dataptr,size,flags)
++/** @ingroup socket */
++#define sendmsg(s,message,flags)                  lwip_sendmsg(s,message,flags)
++/** @ingroup socket */
++#define sendto(s,dataptr,size,flags,to,tolen)     lwip_sendto(s,dataptr,size,flags,to,tolen)
++/** @ingroup socket */
++#define socket(domain,type,protocol)              lwip_socket(domain,type,protocol)
++/** @ingroup socket */
++#define select(maxfdp1,readset,writeset,exceptset,timeout)     lwip_select(maxfdp1,readset,writeset,exceptset,timeout)
++/** @ingroup socket */
++#define ioctlsocket(s,cmd,argp)                   lwip_ioctl(s,cmd,argp)
++
++#if LWIP_POSIX_SOCKETS_IO_NAMES
++/** @ingroup socket */
++#define read(s,mem,len)                           lwip_read(s,mem,len)
++/** @ingroup socket */
++#define write(s,dataptr,len)                      lwip_write(s,dataptr,len)
++/** @ingroup socket */
++#define writev(s,iov,iovcnt)                      lwip_writev(s,iov,iovcnt)
++/** @ingroup socket */
++#define close(s)                                  lwip_close(s)
++/** @ingroup socket */
++#define fcntl(s,cmd,val)                          lwip_fcntl(s,cmd,val)
++/** @ingroup socket */
++#define ioctl(s,cmd,argp)                         lwip_ioctl(s,cmd,argp)
++#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
++#endif /* LWIP_COMPAT_SOCKETS != 2 */
++
++#if LWIP_IPV4 && LWIP_IPV6
++/** @ingroup socket */
++#define inet_ntop(af,src,dst,size) \
++    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \
++     : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL))
++/** @ingroup socket */
++#define inet_pton(af,src,dst) \
++    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \
++     : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))
++#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */
++#define inet_ntop(af,src,dst,size) \
++    (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)
++#define inet_pton(af,src,dst) \
++    (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)
++#else /* LWIP_IPV4 && LWIP_IPV6 */
++#define inet_ntop(af,src,dst,size) \
++    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL)
++#define inet_pton(af,src,dst) \
++    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0)
++#endif /* LWIP_IPV4 && LWIP_IPV6 */
++
++#endif /* LWIP_COMPAT_SOCKETS */
++
++#ifdef __cplusplus
++}
 +#endif
-     default:
-       LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n",
-                   s, optname));
-Index: lwip/src/api/netdb.c
-===================================================================
---- lwip.orig/src/api/netdb.c
-+++ lwip/src/api/netdb.c
-@@ -384,7 +384,9 @@ lwip_getaddrinfo(const char *nodename, c
-     /* set up sockaddr */
-     inet_addr_from_ip4addr(&sa4->sin_addr, ip_2_ip4(&addr));
-     sa4->sin_family = AF_INET;
-+#ifdef BSD
-     sa4->sin_len = sizeof(struct sockaddr_in);
++
++#endif /* LWIP_SOCKET */
++
++#endif /* LWIP_HDR_PRIV_SOCKETS_H */
+--- a/src/include/lwip/opt.h
++++ b/src/include/lwip/opt.h
+@@ -1760,6 +1760,15 @@
+ #endif
+ 
+ /**
++ * LWIP_STD_SOCKETS==1: Use system's standard sockets headers.
++ * Enable this option if you use a POSIX operating system that provides its
++ * own sockets headers. (only used if you use sockets.c)
++ */
++#if !defined LWIP_STD_SOCKETS || defined __DOXYGEN__
++#define LWIP_STD_SOCKETS                0
 +#endif
-     sa4->sin_port = lwip_htons((u16_t)port_nr);
-     ai->ai_family = AF_INET;
- #endif /* LWIP_IPV4 */
++
++/**
+  * LWIP_SOCKET_OFFSET==n: Increases the file descriptor number created by LwIP with n.
+  * This can be useful when there are multiple APIs which create file descriptors.
+  * When they all start with a different offset and you won't make them overlap you can
+--- a/src/include/lwip/sockets.h
++++ b/src/include/lwip/sockets.h
+@@ -41,445 +41,17 @@
+ 
+ #include "lwip/opt.h"
+ 
+-#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */
++#if LWIP_STD_SOCKETS
++#include LWIP_INCLUDE_STD_SOCKETS
+ 
+-#include "lwip/ip_addr.h"
+-#include "lwip/err.h"
+-#include "lwip/inet.h"
+-#include "lwip/errno.h"
+-
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-
+-/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED
+-   to prevent this code from redefining it. */
+-#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)
+-typedef u8_t sa_family_t;
+-#endif
+-/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED
+-   to prevent this code from redefining it. */
+-#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)
+-typedef u16_t in_port_t;
+-#endif
+-
+-#if LWIP_IPV4
+-/* members are in network byte order */
+-struct sockaddr_in {
+-  u8_t            sin_len;
+-  sa_family_t     sin_family;
+-  in_port_t       sin_port;
+-  struct in_addr  sin_addr;
+-#define SIN_ZERO_LEN 8
+-  char            sin_zero[SIN_ZERO_LEN];
+-};
+-#endif /* LWIP_IPV4 */
+-
+-#if LWIP_IPV6
+-struct sockaddr_in6 {
+-  u8_t            sin6_len;      /* length of this structure    */
+-  sa_family_t     sin6_family;   /* AF_INET6                    */
+-  in_port_t       sin6_port;     /* Transport layer port #      */
+-  u32_t           sin6_flowinfo; /* IPv6 flow information       */
+-  struct in6_addr sin6_addr;     /* IPv6 address                */
+-  u32_t           sin6_scope_id; /* Set of interfaces for scope */
+-};
+-#endif /* LWIP_IPV6 */
+-
+-struct sockaddr {
+-  u8_t        sa_len;
+-  sa_family_t sa_family;
+-  char        sa_data[14];
+-};
+-
+-struct sockaddr_storage {
+-  u8_t        s2_len;
+-  sa_family_t ss_family;
+-  char        s2_data1[2];
+-  u32_t       s2_data2[3];
+-#if LWIP_IPV6
+-  u32_t       s2_data3[3];
+-#endif /* LWIP_IPV6 */
+-};
+-
+-/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED
+-   to prevent this code from redefining it. */
+-#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)
+-typedef u32_t socklen_t;
+-#endif
+-
+-struct lwip_sock;
+-
+-#if !LWIP_TCPIP_CORE_LOCKING
+-/** Maximum optlen used by setsockopt/getsockopt */
+-#define LWIP_SETGETSOCKOPT_MAXOPTLEN 16
+-
+-/** This struct is used to pass data to the set/getsockopt_internal
+- * functions running in tcpip_thread context (only a void* is allowed) */
+-struct lwip_setgetsockopt_data {
+-  /** socket index for which to change options */
+-  int s;
+-  /** level of the option to process */
+-  int level;
+-  /** name of the option to process */
+-  int optname;
+-  /** set: value to set the option to
+-    * get: value of the option is stored here */
+-#if LWIP_MPU_COMPATIBLE
+-  u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN];
+ #else
+-  union {
+-     void *p;
+-     const void *pc;
+-  } optval;
+-#endif
+-  /** size of *optval */
+-  socklen_t optlen;
+-  /** if an error occurs, it is temporarily stored here */
+-  err_t err;
+-  /** semaphore to wake up the calling task */
+-  void* completed_sem;
+-};
+-#endif /* !LWIP_TCPIP_CORE_LOCKING */
+-
+-#if !defined(iovec)
+-struct iovec {
+-  void  *iov_base;
+-  size_t iov_len;
+-};
++#include "lwip/lwip_sockets.h"
+ #endif
+ 
+-struct msghdr {
+-  void         *msg_name;
+-  socklen_t     msg_namelen;
+-  struct iovec *msg_iov;
+-  int           msg_iovlen;
+-  void         *msg_control;
+-  socklen_t     msg_controllen;
+-  int           msg_flags;
+-};
+-
+-/* Socket protocol types (TCP/UDP/RAW) */
+-#define SOCK_STREAM     1
+-#define SOCK_DGRAM      2
+-#define SOCK_RAW        3
+-
+-/*
+- * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)
+- */
+-#define SO_REUSEADDR   0x0004 /* Allow local address reuse */
+-#define SO_KEEPALIVE   0x0008 /* keep connections alive */
+-#define SO_BROADCAST   0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
+-
+-
+-/*
+- * Additional options, not kept in so_options.
+- */
+-#define SO_DEBUG       0x0001 /* Unimplemented: turn on debugging info recording */
+-#define SO_ACCEPTCONN  0x0002 /* socket has had listen() */
+-#define SO_DONTROUTE   0x0010 /* Unimplemented: just use interface addresses */
+-#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */
+-#define SO_LINGER      0x0080 /* linger on close if data present */
+-#define SO_DONTLINGER  ((int)(~SO_LINGER))
+-#define SO_OOBINLINE   0x0100 /* Unimplemented: leave received OOB data in line */
+-#define SO_REUSEPORT   0x0200 /* Unimplemented: allow local address & port reuse */
+-#define SO_SNDBUF      0x1001 /* Unimplemented: send buffer size */
+-#define SO_RCVBUF      0x1002 /* receive buffer size */
+-#define SO_SNDLOWAT    0x1003 /* Unimplemented: send low-water mark */
+-#define SO_RCVLOWAT    0x1004 /* Unimplemented: receive low-water mark */
+-#define SO_SNDTIMEO    0x1005 /* send timeout */
+-#define SO_RCVTIMEO    0x1006 /* receive timeout */
+-#define SO_ERROR       0x1007 /* get error status and clear */
+-#define SO_TYPE        0x1008 /* get socket type */
+-#define SO_CONTIMEO    0x1009 /* Unimplemented: connect timeout */
+-#define SO_NO_CHECK    0x100a /* don't create UDP checksum */
+-
+-
+-/*
+- * Structure used for manipulating linger option.
+- */
+-struct linger {
+-       int l_onoff;                /* option on/off */
+-       int l_linger;               /* linger time in seconds */
+-};
+-
+-/*
+- * Level number for (get/set)sockopt() to apply to socket itself.
+- */
+-#define  SOL_SOCKET  0xfff    /* options for socket level */
+-
+-
+-#define AF_UNSPEC       0
+-#define AF_INET         2
+-#if LWIP_IPV6
+-#define AF_INET6        10
+-#else /* LWIP_IPV6 */
+-#define AF_INET6        AF_UNSPEC
+-#endif /* LWIP_IPV6 */
+-#define PF_INET         AF_INET
+-#define PF_INET6        AF_INET6
+-#define PF_UNSPEC       AF_UNSPEC
+-
+-#define IPPROTO_IP      0
+-#define IPPROTO_ICMP    1
+-#define IPPROTO_TCP     6
+-#define IPPROTO_UDP     17
+-#if LWIP_IPV6
+-#define IPPROTO_IPV6    41
+-#define IPPROTO_ICMPV6  58
+-#endif /* LWIP_IPV6 */
+-#define IPPROTO_UDPLITE 136
+-#define IPPROTO_RAW     255
+-
+-/* Flags we can use with send and recv. */
+-#define MSG_PEEK       0x01    /* Peeks at an incoming message */
+-#define MSG_WAITALL    0x02    /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */
+-#define MSG_OOB        0x04    /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */
+-#define MSG_DONTWAIT   0x08    /* Nonblocking i/o for this operation only */
+-#define MSG_MORE       0x10    /* Sender will send more */
+-
+-
+-/*
+- * Options for level IPPROTO_IP
+- */
+-#define IP_TOS             1
+-#define IP_TTL             2
+-
+-#if LWIP_TCP
+-/*
+- * Options for level IPPROTO_TCP
+- */
+-#define TCP_NODELAY    0x01    /* don't delay send to coalesce packets */
+-#define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */
+-#define TCP_KEEPIDLE   0x03    /* set pcb->keep_idle  - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */
+-#define TCP_KEEPINTVL  0x04    /* set pcb->keep_intvl - Use seconds for get/setsockopt */
+-#define TCP_KEEPCNT    0x05    /* set pcb->keep_cnt   - Use number of probes sent for get/setsockopt */
+-#endif /* LWIP_TCP */
+-
+-#if LWIP_IPV6
+-/*
+- * Options for level IPPROTO_IPV6
+- */
+-#define IPV6_CHECKSUM       7  /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */
+-#define IPV6_V6ONLY         27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */
+-#endif /* LWIP_IPV6 */
+-
+-#if LWIP_UDP && LWIP_UDPLITE
+-/*
+- * Options for level IPPROTO_UDPLITE
+- */
+-#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
+-#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
+-#endif /* LWIP_UDP && LWIP_UDPLITE*/
+-
+-
+-#if LWIP_MULTICAST_TX_OPTIONS
+-/*
+- * Options and types for UDP multicast traffic handling
+- */
+-#define IP_MULTICAST_TTL   5
+-#define IP_MULTICAST_IF    6
+-#define IP_MULTICAST_LOOP  7
+-#endif /* LWIP_MULTICAST_TX_OPTIONS */
+-
+-#if LWIP_IGMP
+-/*
+- * Options and types related to multicast membership
+- */
+-#define IP_ADD_MEMBERSHIP  3
+-#define IP_DROP_MEMBERSHIP 4
+-
+-typedef struct ip_mreq {
+-    struct in_addr imr_multiaddr; /* IP multicast address of group */
+-    struct in_addr imr_interface; /* local IP address of interface */
+-} ip_mreq;
+-#endif /* LWIP_IGMP */
+-
+-/*
+- * The Type of Service provides an indication of the abstract
+- * parameters of the quality of service desired.  These parameters are
+- * to be used to guide the selection of the actual service parameters
+- * when transmitting a datagram through a particular network.  Several
+- * networks offer service precedence, which somehow treats high
+- * precedence traffic as more important than other traffic (generally
+- * by accepting only traffic above a certain precedence at time of high
+- * load).  The major choice is a three way tradeoff between low-delay,
+- * high-reliability, and high-throughput.
+- * The use of the Delay, Throughput, and Reliability indications may
+- * increase the cost (in some sense) of the service.  In many networks
+- * better performance for one of these parameters is coupled with worse
+- * performance on another.  Except for very unusual cases at most two
+- * of these three indications should be set.
+- */
+-#define IPTOS_TOS_MASK          0x1E
+-#define IPTOS_TOS(tos)          ((tos) & IPTOS_TOS_MASK)
+-#define IPTOS_LOWDELAY          0x10
+-#define IPTOS_THROUGHPUT        0x08
+-#define IPTOS_RELIABILITY       0x04
+-#define IPTOS_LOWCOST           0x02
+-#define IPTOS_MINCOST           IPTOS_LOWCOST
+-
+-/*
+- * The Network Control precedence designation is intended to be used
+- * within a network only.  The actual use and control of that
+- * designation is up to each network. The Internetwork Control
+- * designation is intended for use by gateway control originators only.
+- * If the actual use of these precedence designations is of concern to
+- * a particular network, it is the responsibility of that network to
+- * control the access to, and use of, those precedence designations.
+- */
+-#define IPTOS_PREC_MASK                 0xe0
+-#define IPTOS_PREC(tos)                ((tos) & IPTOS_PREC_MASK)
+-#define IPTOS_PREC_NETCONTROL           0xe0
+-#define IPTOS_PREC_INTERNETCONTROL      0xc0
+-#define IPTOS_PREC_CRITIC_ECP           0xa0
+-#define IPTOS_PREC_FLASHOVERRIDE        0x80
+-#define IPTOS_PREC_FLASH                0x60
+-#define IPTOS_PREC_IMMEDIATE            0x40
+-#define IPTOS_PREC_PRIORITY             0x20
+-#define IPTOS_PREC_ROUTINE              0x00
+-
+-
+-/*
+- * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.
+- * lwip_ioctl only supports FIONREAD and FIONBIO, for now
+- *
+- * Ioctl's have the command encoded in the lower word,
+- * and the size of any in or out parameters in the upper
+- * word.  The high 2 bits of the upper word are used
+- * to encode the in/out status of the parameter; for now
+- * we restrict parameters to at most 128 bytes.
+- */
+-#if !defined(FIONREAD) || !defined(FIONBIO)
+-#define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */
+-#define IOC_VOID        0x20000000UL    /* no parameters */
+-#define IOC_OUT         0x40000000UL    /* copy out parameters */
+-#define IOC_IN          0x80000000UL    /* copy in parameters */
+-#define IOC_INOUT       (IOC_IN|IOC_OUT)
+-                                        /* 0x20000000 distinguishes new &
+-                                           old ioctl's */
+-#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))
+-
+-#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+-
+-#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+-#endif /* !defined(FIONREAD) || !defined(FIONBIO) */
+-
+-#ifndef FIONREAD
+-#define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */
+-#endif
+-#ifndef FIONBIO
+-#define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
+-#endif
+-
+-/* Socket I/O Controls: unimplemented */
+-#ifndef SIOCSHIWAT
+-#define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */
+-#define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */
+-#define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */
+-#define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */
+-#define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */
+-#endif
+-
+-/* commands for fnctl */
+-#ifndef F_GETFL
+-#define F_GETFL 3
+-#endif
+-#ifndef F_SETFL
+-#define F_SETFL 4
+-#endif
+-
+-/* File status flags and file access modes for fnctl,
+-   these are bits in an int. */
+-#ifndef O_NONBLOCK
+-#define O_NONBLOCK  1 /* nonblocking I/O */
+-#endif
+-#ifndef O_NDELAY
+-#define O_NDELAY    1 /* same as O_NONBLOCK, for compatibility */
+-#endif
+-
+-#ifndef SHUT_RD
+-  #define SHUT_RD   0
+-  #define SHUT_WR   1
+-  #define SHUT_RDWR 2
+-#endif
+-
+-/* FD_SET used for lwip_select */
+-#ifndef FD_SET
+-#undef  FD_SETSIZE
+-/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */
+-#define FD_SETSIZE    MEMP_NUM_NETCONN
+-#define FDSETSAFESET(n, code) do { \
+-  if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \
+-  code; }} while(0)
+-#define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\
+-  (code) : 0)
+-#define FD_SET(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |=  (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
+-#define FD_CLR(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
+-#define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &   (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))
+-#define FD_ZERO(p)    memset((void*)(p), 0, sizeof(*(p)))
+-
+-typedef struct fd_set
+-{
+-  unsigned char fd_bits [(FD_SETSIZE+7)/8];
+-} fd_set;
+-
+-#elif LWIP_SOCKET_OFFSET
+-#error LWIP_SOCKET_OFFSET does not work with external FD_SET!
+-#elif FD_SETSIZE < MEMP_NUM_NETCONN
+-#error "external FD_SETSIZE too small for number of sockets"
+-#endif /* FD_SET */
+-
+-/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided
+- * by your system, set this to 0 and include <sys/time.h> in cc.h */
+-#ifndef LWIP_TIMEVAL_PRIVATE
+-#define LWIP_TIMEVAL_PRIVATE 1
++#ifdef __cplusplus
++extern "C" {
+ #endif
+ 
+-#if LWIP_TIMEVAL_PRIVATE
+-struct timeval {
+-  long    tv_sec;         /* seconds */
+-  long    tv_usec;        /* and microseconds */
+-};
+-#endif /* LWIP_TIMEVAL_PRIVATE */
+-
+-#define lwip_socket_init() /* Compatibility define, no init needed. */
+-void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
+-void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
+-
+-#if LWIP_COMPAT_SOCKETS == 2
+-/* This helps code parsers/code completion by not having the COMPAT functions as defines */
+-#define lwip_accept       accept
+-#define lwip_bind         bind
+-#define lwip_shutdown     shutdown
+-#define lwip_getpeername  getpeername
+-#define lwip_getsockname  getsockname
+-#define lwip_setsockopt   setsockopt
+-#define lwip_getsockopt   getsockopt
+-#define lwip_close        closesocket
+-#define lwip_connect      connect
+-#define lwip_listen       listen
+-#define lwip_recv         recv
+-#define lwip_recvfrom     recvfrom
+-#define lwip_send         send
+-#define lwip_sendmsg      sendmsg
+-#define lwip_sendto       sendto
+-#define lwip_socket       socket
+-#define lwip_select       select
+-#define lwip_ioctlsocket  ioctl
+-
+-#if LWIP_POSIX_SOCKETS_IO_NAMES
+-#define lwip_read         read
+-#define lwip_write        write
+-#define lwip_writev       writev
+-#undef lwip_close
+-#define lwip_close        close
+-#define closesocket(s)    close(s)
+-#define lwip_fcntl        fcntl
+-#define lwip_ioctl        ioctl
+-#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
+-#endif /* LWIP_COMPAT_SOCKETS == 2 */
+-
+ int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
+ int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);
+ int lwip_shutdown(int s, int how);
+@@ -506,88 +78,16 @@
+ int lwip_ioctl(int s, long cmd, void *argp);
+ int lwip_fcntl(int s, int cmd, int val);
+ 
+-#if LWIP_COMPAT_SOCKETS
+-#if LWIP_COMPAT_SOCKETS != 2
+-/** @ingroup socket */
+-#define accept(s,addr,addrlen)                    lwip_accept(s,addr,addrlen)
+-/** @ingroup socket */
+-#define bind(s,name,namelen)                      lwip_bind(s,name,namelen)
+-/** @ingroup socket */
+-#define shutdown(s,how)                           lwip_shutdown(s,how)
+-/** @ingroup socket */
+-#define getpeername(s,name,namelen)               lwip_getpeername(s,name,namelen)
+-/** @ingroup socket */
+-#define getsockname(s,name,namelen)               lwip_getsockname(s,name,namelen)
+-/** @ingroup socket */
+-#define setsockopt(s,level,optname,opval,optlen)  lwip_setsockopt(s,level,optname,opval,optlen)
+-/** @ingroup socket */
+-#define getsockopt(s,level,optname,opval,optlen)  lwip_getsockopt(s,level,optname,opval,optlen)
+-/** @ingroup socket */
+-#define closesocket(s)                            lwip_close(s)
+-/** @ingroup socket */
+-#define connect(s,name,namelen)                   lwip_connect(s,name,namelen)
+-/** @ingroup socket */
+-#define listen(s,backlog)                         lwip_listen(s,backlog)
+-/** @ingroup socket */
+-#define recv(s,mem,len,flags)                     lwip_recv(s,mem,len,flags)
+-/** @ingroup socket */
+-#define recvfrom(s,mem,len,flags,from,fromlen)    lwip_recvfrom(s,mem,len,flags,from,fromlen)
+-/** @ingroup socket */
+-#define send(s,dataptr,size,flags)                lwip_send(s,dataptr,size,flags)
+-/** @ingroup socket */
+-#define sendmsg(s,message,flags)                  lwip_sendmsg(s,message,flags)
+-/** @ingroup socket */
+-#define sendto(s,dataptr,size,flags,to,tolen)     lwip_sendto(s,dataptr,size,flags,to,tolen)
+-/** @ingroup socket */
+-#define socket(domain,type,protocol)              lwip_socket(domain,type,protocol)
+-/** @ingroup socket */
+-#define select(maxfdp1,readset,writeset,exceptset,timeout)     lwip_select(maxfdp1,readset,writeset,exceptset,timeout)
+-/** @ingroup socket */
+-#define ioctlsocket(s,cmd,argp)                   lwip_ioctl(s,cmd,argp)
+-
+-#if LWIP_POSIX_SOCKETS_IO_NAMES
+-/** @ingroup socket */
+-#define read(s,mem,len)                           lwip_read(s,mem,len)
+-/** @ingroup socket */
+-#define write(s,dataptr,len)                      lwip_write(s,dataptr,len)
+-/** @ingroup socket */
+-#define writev(s,iov,iovcnt)                      lwip_writev(s,iov,iovcnt)
+-/** @ingroup socket */
+-#define close(s)                                  lwip_close(s)
+-/** @ingroup socket */
+-#define fcntl(s,cmd,val)                          lwip_fcntl(s,cmd,val)
+-/** @ingroup socket */
+-#define ioctl(s,cmd,argp)                         lwip_ioctl(s,cmd,argp)
+-#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */
+-#endif /* LWIP_COMPAT_SOCKETS != 2 */
+-
+-#if LWIP_IPV4 && LWIP_IPV6
+-/** @ingroup socket */
+-#define inet_ntop(af,src,dst,size) \
+-    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \
+-     : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL))
+-/** @ingroup socket */
+-#define inet_pton(af,src,dst) \
+-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \
+-     : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))
+-#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */
+-#define inet_ntop(af,src,dst,size) \
+-    (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)
+-#define inet_pton(af,src,dst) \
+-    (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)
+-#else /* LWIP_IPV4 && LWIP_IPV6 */
+-#define inet_ntop(af,src,dst,size) \
+-    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL)
+-#define inet_pton(af,src,dst) \
+-    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0)
+-#endif /* LWIP_IPV4 && LWIP_IPV6 */
+-
+-#endif /* LWIP_COMPAT_SOCKETS */
++#if LWIP_UDP && LWIP_UDPLITE
++/*
++ * Options for level IPPROTO_UDPLITE
++ */
++#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
++#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
++#endif /* LWIP_UDP && LWIP_UDPLITE*/
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+-#endif /* LWIP_SOCKET */
+-
+ #endif /* LWIP_HDR_SOCKETS_H */
+--- a/port/include/lwipopts.h
++++ b/port/include/lwipopts.h
+@@ -26,6 +26,11 @@
+ /* Don't rename Sockets API functions */
+ #define LWIP_COMPAT_SOCKETS   0
+ 
++/* Use Glibc's sockets headers */
++#define LWIP_STD_SOCKETS  1
++#define LWIP_INCLUDE_STD_SOCKETS  "posix/socket.h"
++#define LWIP_INCLUDE_STD_INET     "posix/inet.h"
++
+ /* Use Glibc malloc()/free() */
+ #define MEM_LIBC_MALLOC   1
+ #define MEMP_MEM_MALLOC   1
+--- a/port/include/arch/cc.h
++++ b/port/include/arch/cc.h
+@@ -40,6 +40,12 @@
+ /* Use our own ioctls */
+ #include <sys/ioctl.h>
+ 
++/* Use our own <sys/socket.h> */
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <netinet/tcp.h>
++#include <netinet/udp.h>
++
+ /* Use our own htons() and pals */
+ #define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS 1
+ 
-- 
2.14.0


Reply to: