[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: