summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKinsey Moore <kinsey.moore@oarcorp.com>2022-08-04 14:09:31 -0500
committerJoel Sherrill <joel@rtems.org>2022-08-25 13:37:09 -0500
commit19fb17aa5abf2959146052ffc26c09c7d9525b76 (patch)
treebeadc2a3123dbb353c2d5e239e1977c61e96d49b
parentlwip.py: Remove usage of YAML (diff)
downloadrtems-lwip-19fb17aa5abf2959146052ffc26c09c7d9525b76.tar.bz2
rtemslwip: Add functions for BSD compatibility
Add wrappers where possible and new functionality required to run code developed for operation on *BSD. This also simplifies the code that utilizes rtems lwip locking and makes it more consistent.
-rw-r--r--lwip.py4
-rw-r--r--rtemslwip/bsd_compat/ifaddrs.c105
-rw-r--r--rtemslwip/bsd_compat/netdb.c115
-rw-r--r--rtemslwip/bsd_compat/rtems-kernel-program.c89
-rw-r--r--rtemslwip/bsd_compat_include/arpa/nameser.h0
-rw-r--r--rtemslwip/bsd_compat_include/bsd_compat.h36
-rw-r--r--rtemslwip/bsd_compat_include/ifaddrs.h41
-rw-r--r--rtemslwip/bsd_compat_include/machine/rtems-bsd-kernel-space.h0
-rw-r--r--rtemslwip/bsd_compat_include/machine/rtems-bsd-thread.h33
-rw-r--r--rtemslwip/bsd_compat_include/machine/rtems-bsd-user-space.h0
-rw-r--r--rtemslwip/bsd_compat_include/net/if_var.h0
-rw-r--r--rtemslwip/bsd_compat_include/net/route.h38
-rw-r--r--rtemslwip/bsd_compat_include/netinet/in_systm.h0
-rw-r--r--rtemslwip/bsd_compat_include/netinet/in_var.h0
-rw-r--r--rtemslwip/bsd_compat_include/netinet/ip.h0
-rw-r--r--rtemslwip/bsd_compat_include/resolv.h32
-rw-r--r--rtemslwip/bsd_compat_include/sys/kernel.h0
-rw-r--r--rtemslwip/bsd_compat_include/sysexits.h0
-rw-r--r--rtemslwip/common/network_compat.c57
-rw-r--r--rtemslwip/common/rtems_lwip_io.c836
-rw-r--r--rtemslwip/common/rtems_lwip_sysdefs.c185
-rw-r--r--rtemslwip/common/syslog.c6
-rw-r--r--rtemslwip/include/rtems_lwip_int.h92
-rw-r--r--rtemslwip/zynqmp/lwipopts.h2
24 files changed, 844 insertions, 827 deletions
diff --git a/lwip.py b/lwip.py
index e63f4e6..251f11f 100644
--- a/lwip.py
+++ b/lwip.py
@@ -75,8 +75,8 @@ def build(bld):
source_files.append('./uLan/ports/os/rtems/arch/sys_arch.c')
source_files.append('./rtemslwip/common/syslog.c')
source_files.append('./rtemslwip/common/rtems_lwip_io.c')
- source_files.append('./rtemslwip/common/rtems_lwip_sysdefs.c')
-
+ source_files.append('./rtemslwip/common/network_compat.c')
+
def walk_sources(path):
sources = []
for root, dirs, files in os.walk(path):
diff --git a/rtemslwip/bsd_compat/ifaddrs.c b/rtemslwip/bsd_compat/ifaddrs.c
new file mode 100644
index 0000000..dc6b7f2
--- /dev/null
+++ b/rtemslwip/bsd_compat/ifaddrs.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#include <lwip/netif.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#include <netinet/in.h>
+static struct ifaddrs *create_ifaddr_from_netif(struct netif *netif)
+{
+ struct ifaddrs *ifaddr = malloc(sizeof(struct ifaddrs));
+ if ( ifaddr == NULL ) {
+ return NULL;
+ }
+ ifaddr->ifa_next = NULL;
+ ifaddr->ifa_name = netif->name;
+
+ ifaddr->ifa_flags = 0;
+ if ( netif->flags & NETIF_FLAG_UP ) {
+ ifaddr->ifa_flags |= IFF_RUNNING;
+ }
+ if ( netif->flags & NETIF_FLAG_LINK_UP ) {
+ ifaddr->ifa_flags |= IFF_UP;
+ }
+ if ( netif->flags & NETIF_FLAG_BROADCAST ) {
+ ifaddr->ifa_flags |= IFF_BROADCAST;
+ }
+
+ ifaddr->ifa_addr = malloc(sizeof(struct sockaddr));
+ ifaddr->ifa_netmask = malloc(sizeof(struct sockaddr));
+ ifaddr->ifa_dstaddr = malloc(sizeof(struct sockaddr));
+ if ( ifaddr->ifa_addr == NULL
+ || ifaddr->ifa_netmask == NULL
+ || ifaddr->ifa_dstaddr == NULL ) {
+ freeifaddrs(ifaddr);
+ return NULL;
+ }
+
+ ifaddr->ifa_addr->sa_family = AF_INET;
+ ifaddr->ifa_netmask->sa_family = AF_INET;
+ ifaddr->ifa_dstaddr->sa_family = AF_INET;
+#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
+ inet_addr_from_ip4addr(&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr, &netif->ip_addr.u_addr.ip4);
+ inet_addr_from_ip4addr(&((struct sockaddr_in *)ifaddr->ifa_netmask)->sin_addr, &netif->netmask.u_addr.ip4);
+ ((struct sockaddr_in *)ifaddr->ifa_netmask)->sin_addr.s_addr = netif->ip_addr.u_addr.ip4.addr & netif->netmask.u_addr.ip4.addr;
+ return ifaddr;
+}
+
+int getifaddrs(struct ifaddrs **ifaddrs)
+{
+ struct netif *netif;
+ *ifaddrs = NULL;
+
+ LWIP_ASSERT_CORE_LOCKED();
+
+ NETIF_FOREACH(netif) {
+ /* create ifaddr from netif */
+ struct ifaddrs *ifaddr = create_ifaddr_from_netif(netif);
+ if ( ifaddr == NULL ) {
+ freeifaddrs(*ifaddrs);
+ *ifaddrs = NULL;
+ errno = ENOMEM;
+ return -1;
+ }
+ ifaddr->ifa_next = *ifaddrs;
+ *ifaddrs = ifaddr;
+ }
+
+ return 0;
+}
+
+void freeifaddrs(struct ifaddrs *ifaddrs)
+{
+ struct ifaddrs *ifaddr;
+ while ( ifaddrs != NULL ) {
+ ifaddr = ifaddrs;
+ ifaddrs = ifaddrs->ifa_next;
+ free(ifaddr->ifa_addr);
+ free(ifaddr->ifa_netmask);
+ free(ifaddr->ifa_dstaddr);
+ free(ifaddr);
+ }
+}
diff --git a/rtemslwip/bsd_compat/netdb.c b/rtemslwip/bsd_compat/netdb.c
new file mode 100644
index 0000000..af6ba6f
--- /dev/null
+++ b/rtemslwip/bsd_compat/netdb.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#include <lwip/netdb.h>
+#include <stdio.h>
+
+static uint16_t getserviceport(const char *target_service) {
+ FILE* file;
+ char service[16];
+ char protocol[16];
+ uint16_t target_port = 0, port;
+ int scan_result;
+
+ if ( target_service == NULL ) {
+ return target_port;
+ }
+
+ file = fopen(_PATH_SERVICES, "r");
+ if ( file == NULL ) {
+ return target_port;
+ }
+
+ while ( 1 ) {
+ scan_result = fscanf(file, "%15s%hu/%15s%*s%*[^\n]", service, &port, protocol);
+
+ /* Check for end of file */
+ if (scan_result == EOF) {
+ break;
+ }
+
+ /* Check for bad line */
+ if (scan_result < 3) {
+ continue;
+ }
+
+ if ( strcmp(target_service, service) == 0 ) {
+ target_port = port;
+ break;
+ }
+ }
+
+ fclose(file);
+ return target_port;
+}
+
+#undef getaddrinfo
+int getaddrinfo(
+ const char *nodename,
+ const char *servname,
+ const struct addrinfo *hints,
+ struct addrinfo **res)
+{
+ char aport[16];
+ itoa(getserviceport(servname), aport, 10);
+ return lwip_getaddrinfo(nodename, aport, hints, res);
+}
+
+#undef freeaddrinfo
+void freeaddrinfo(struct addrinfo *a1)
+{
+ lwip_freeaddrinfo(a1);
+}
+
+const char *gai_strerror(int err)
+{
+ switch ( err ) {
+ case EAI_OVERFLOW: return "EAI_OVERFLOW";
+ case EAI_SOCKTYPE: return "EAI_SOCKTYPE";
+ case EAI_SYSTEM: return "EAI_SYSTEM";
+ case EAI_BADHINTS: return "EAI_BADHINTS";
+ case EAI_PROTOCOL: return "EAI_PROTOCOL";
+ case EAI_NONAME: return "EAI_NONAME";
+ case EAI_SERVICE: return "EAI_SERVICE";
+ case EAI_FAIL: return "EAI_FAIL";
+ case EAI_MEMORY: return "EAI_MEMORY";
+ case EAI_FAMILY: return "EAI_FAMILY";
+ default: return "UNKNOWN EAI";
+ }
+}
+
+#include <lwip/if_api.h>
+
+#undef if_nametoindex
+unsigned int if_nametoindex(const char *ifname)
+{
+ return lwip_if_nametoindex(ifname);
+}
+
+int res_init()
+{
+ return 0;
+}
diff --git a/rtemslwip/bsd_compat/rtems-kernel-program.c b/rtemslwip/bsd_compat/rtems-kernel-program.c
new file mode 100644
index 0000000..ae80e51
--- /dev/null
+++ b/rtemslwip/bsd_compat/rtems-kernel-program.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#include <machine/rtems-bsd-kernel-space.h>
+#include <machine/rtems-bsd-thread.h>
+
+#include <sys/types.h>
+#include <sys/kernel.h>
+
+#undef printf
+#define RTEMS_BSD_PROGRAM_NO_STRDUP_WRAP
+#define RTEMS_BSD_PROGRAM_NO_STRNDUP_WRAP
+#include <machine/rtems-bsd-program.h>
+
+#include <rtems/extension.h>
+#include <rtems/score/percpu.h>
+#include <rtems/score/thread.h>
+#include <rtems/sysinit.h>
+
+static size_t rtems_bsd_extension_index;
+
+static const rtems_extensions_table rtems_bsd_extensions = {};
+
+/*
+ * This must only be run after the system has become multithreading such as in
+ * Init(). This must not be run as part of normal RTEMS initialization as part
+ * of a SYSINIT call.
+ */
+void rtems_bsd_compat_initialize(void)
+{
+ rtems_id ext_id;
+ rtems_status_code sc;
+
+ sc = rtems_extension_create(
+ BSD_TASK_NAME,
+ &rtems_bsd_extensions,
+ &ext_id
+ );
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf("%s: cannot create extension\n", __func__);
+ rtems_task_suspend(RTEMS_SELF);
+ rtems_fatal_error_occurred(0xdeadbeef);
+ }
+
+ rtems_bsd_extension_index = rtems_object_id_get_index(ext_id);
+}
+
+static struct rtems_bsd_program_control **
+rtems_bsd_get_bsd_extension_ptr(void)
+{
+ Thread_Control *executing = _Thread_Get_executing();
+ return ( struct rtems_bsd_program_control ** )&executing->extensions[rtems_bsd_extension_index];
+}
+
+struct rtems_bsd_program_control *
+rtems_bsd_program_get_control_or_null(void)
+{
+ return *rtems_bsd_get_bsd_extension_ptr();
+}
+
+int
+rtems_bsd_program_set_control(struct rtems_bsd_program_control *prog_ctrl)
+{
+ *rtems_bsd_get_bsd_extension_ptr() = prog_ctrl;
+ return 0;
+}
diff --git a/rtemslwip/bsd_compat_include/arpa/nameser.h b/rtemslwip/bsd_compat_include/arpa/nameser.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/arpa/nameser.h
diff --git a/rtemslwip/bsd_compat_include/bsd_compat.h b/rtemslwip/bsd_compat_include/bsd_compat.h
new file mode 100644
index 0000000..f6691d2
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/bsd_compat.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#ifndef _RTEMSLWIP_BSD_COMPAT_H
+#define _RTEMSLWIP_BSD_COMPAT_H
+
+/*
+ * Initializes the BSD compatibility layer required for using BSD functionality
+ * under lwIP. Must be called from Init().
+ */
+void rtems_bsd_compat_initialize(void);
+
+#endif
diff --git a/rtemslwip/bsd_compat_include/ifaddrs.h b/rtemslwip/bsd_compat_include/ifaddrs.h
new file mode 100644
index 0000000..f1be700
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/ifaddrs.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#ifndef _RTEMSLWIP_IFADDRS_H
+#define _RTEMSLWIP_IFADDRS_H
+struct ifaddrs {
+ struct ifaddrs *ifa_next;
+ char *ifa_name;
+ unsigned int ifa_flags;
+ struct sockaddr *ifa_addr;
+ struct sockaddr *ifa_netmask;
+ struct sockaddr *ifa_dstaddr;
+#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
+};
+
+int getifaddrs(struct ifaddrs **);
+void freeifaddrs(struct ifaddrs *);
+#endif
diff --git a/rtemslwip/bsd_compat_include/machine/rtems-bsd-kernel-space.h b/rtemslwip/bsd_compat_include/machine/rtems-bsd-kernel-space.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/machine/rtems-bsd-kernel-space.h
diff --git a/rtemslwip/bsd_compat_include/machine/rtems-bsd-thread.h b/rtemslwip/bsd_compat_include/machine/rtems-bsd-thread.h
new file mode 100644
index 0000000..7408d1c
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/machine/rtems-bsd-thread.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#ifndef _RTEMSLWIP_RTEMS_BSD_THREAD_H
+#define _RTEMSLWIP_RTEMS_BSD_THREAD_H
+#include <rtems.h>
+#include <rtems/score/thread.h>
+
+#define BSD_TASK_NAME rtems_build_name('_', 'B', 'S', 'D')
+#endif
diff --git a/rtemslwip/bsd_compat_include/machine/rtems-bsd-user-space.h b/rtemslwip/bsd_compat_include/machine/rtems-bsd-user-space.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/machine/rtems-bsd-user-space.h
diff --git a/rtemslwip/bsd_compat_include/net/if_var.h b/rtemslwip/bsd_compat_include/net/if_var.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/net/if_var.h
diff --git a/rtemslwip/bsd_compat_include/net/route.h b/rtemslwip/bsd_compat_include/net/route.h
new file mode 100644
index 0000000..9948aef
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/net/route.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#ifndef _RTEMSLWIP_ROUTE_H
+#define _RTEMSLWIP_ROUTE_H
+struct rt_metrics {};
+
+struct rt_msghdr {
+ uint16_t rtm_msglen;
+ uint8_t rtm_version;
+ uint8_t rtm_type;
+};
+
+#define RTM_VERSION 5
+#endif
diff --git a/rtemslwip/bsd_compat_include/netinet/in_systm.h b/rtemslwip/bsd_compat_include/netinet/in_systm.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/netinet/in_systm.h
diff --git a/rtemslwip/bsd_compat_include/netinet/in_var.h b/rtemslwip/bsd_compat_include/netinet/in_var.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/netinet/in_var.h
diff --git a/rtemslwip/bsd_compat_include/netinet/ip.h b/rtemslwip/bsd_compat_include/netinet/ip.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/netinet/ip.h
diff --git a/rtemslwip/bsd_compat_include/resolv.h b/rtemslwip/bsd_compat_include/resolv.h
new file mode 100644
index 0000000..ef729fa
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/resolv.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#ifndef _RTEMSLWIP_RESOLV_H
+#define _RTEMSLWIP_RESOLV_H
+
+int res_init( void );
+
+#endif
diff --git a/rtemslwip/bsd_compat_include/sys/kernel.h b/rtemslwip/bsd_compat_include/sys/kernel.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/sys/kernel.h
diff --git a/rtemslwip/bsd_compat_include/sysexits.h b/rtemslwip/bsd_compat_include/sysexits.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/rtemslwip/bsd_compat_include/sysexits.h
diff --git a/rtemslwip/common/network_compat.c b/rtemslwip/common/network_compat.c
new file mode 100644
index 0000000..e13c56a
--- /dev/null
+++ b/rtemslwip/common/network_compat.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2022 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+ */
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <lwip/ip4_addr.h>
+#include <lwip/ip6_addr.h>
+
+in_addr_t inet_addr(const char *cp)
+{
+ return ipaddr_addr(cp);
+}
+
+int inet_aton(const char *cp, struct in_addr *addr)
+{
+ return ip4addr_aton(cp, (ip4_addr_t*)addr);
+}
+
+char *inet_ntoa(struct in_addr addr)
+{
+ return ip4addr_ntoa((const ip4_addr_t*)&(addr));
+}
+
+char *inet_ntoa_r(struct in_addr addr, char *buf, socklen_t buflen)
+{
+ return ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen);
+}
+
+#undef htons
+uint16_t htons(uint16_t x)
+{
+ return lwip_htons(x);
+}
diff --git a/rtemslwip/common/rtems_lwip_io.c b/rtemslwip/common/rtems_lwip_io.c
index 8aa28b5..ee34774 100644
--- a/rtemslwip/common/rtems_lwip_io.c
+++ b/rtemslwip/common/rtems_lwip_io.c
@@ -77,8 +77,6 @@
#include "lwip/sockets.h"
#include "lwip/sys.h"
-#include "rtems_lwip_int.h"
-
static const rtems_filesystem_file_handlers_r rtems_lwip_socket_handlers;
static rtems_recursive_mutex rtems_lwip_mutex =
@@ -173,45 +171,106 @@ int socket(
int fd;
int lwipfd;
- if ( domain == rtems_lwip_sysdefs_PF_UNSPEC ) {
- domain = PF_UNSPEC;
- } else if ( domain == rtems_lwip_sysdefs_PF_INET ) {
- domain = PF_INET;
- } else if ( domain == rtems_lwip_sysdefs_PF_INET6 ) {
- domain = PF_INET6;
- } else {
- errno = EINVAL;
+ rtems_lwip_semaphore_obtain();
+
+ lwipfd = lwip_socket( domain, type, 0 );
+ if ( lwipfd < 0 ) {
return -1;
}
- if ( type == rtems_lwip_sysdefs_SOCK_STREAM ) {
- type = SOCK_STREAM;
- } else if ( type == rtems_lwip_sysdefs_SOCK_DGRAM ) {
- type = SOCK_DGRAM;
- } else {
- errno = EINVAL;
+ fd = rtems_lwip_make_sysfd_from_lwipfd( lwipfd );
- return -1;
+ if ( fd < 0 ) {
+ lwip_close( lwipfd );
}
- rtems_lwip_semaphore_obtain();
+ rtems_lwip_semaphore_release();
- lwipfd = lwip_socket( domain, type, 0 );
+ return fd;
+}
- if ( lwipfd < 0 ) {
- fd = -1;
- } else {
- fd = rtems_lwip_make_sysfd_from_lwipfd( lwipfd );
+static int setup_socketpair(int listener, int *socket_vector)
+{
+ union {
+ struct sockaddr addr;
+ struct sockaddr_in inaddr;
+ } a;
+ int reuse = 1;
+ socklen_t addrlen = sizeof(a.inaddr);
+
+ memset(&a, 0, sizeof(a));
+ a.inaddr.sin_family = AF_INET;
+ a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ a.inaddr.sin_port = 0;
+
+ if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
+ (char*) &reuse, (socklen_t) sizeof(reuse)) == -1) {
+ return 1;
+ }
- if ( fd < 0 ) {
- lwip_close( lwipfd );
- }
+ if (bind(listener, &a.addr, sizeof(a.inaddr)) == -1) {
+ return 1;
}
- rtems_lwip_semaphore_release();
+ memset(&a, 0, sizeof(a));
+ if (getsockname(listener, &a.addr, &addrlen) == -1) {
+ return 1;
+ }
- return fd;
+ a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ a.inaddr.sin_family = AF_INET;
+
+ if (listen(listener, 1) == -1) {
+ return 1;
+ }
+
+ socket_vector[0] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (socket_vector[0] == -1) {
+ return 1;
+ }
+
+ if (connect(socket_vector[0], &a.addr, sizeof(a.inaddr)) == -1) {
+ return 1;
+ }
+
+ socket_vector[1] = accept(listener, NULL, NULL);
+ if (socket_vector[1] == -1) {
+ return 1;
+ }
+
+ close(listener);
+ return 0;
+}
+
+/* Fake socketpair() support with a loopback TCP socket */
+int
+socketpair(int domain, int type, int protocol, int *socket_vector)
+{
+ int listener;
+ int saved_errno;
+
+ if (socket_vector == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+ socket_vector[0] = socket_vector[1] = -1;
+
+ listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (listener == -1)
+ return -1;
+
+ if (setup_socketpair(listener, socket_vector) == 0) {
+ return 0;
+ }
+
+ saved_errno = errno;
+ close(listener);
+ close(socket_vector[0]);
+ close(socket_vector[1]);
+ errno = saved_errno;
+ socket_vector[0] = socket_vector[1] = -1;
+ return -1;
}
int bind(
@@ -220,59 +279,17 @@ int bind(
socklen_t namelen
)
{
- int ret = -1;
int lwipfd;
- int family;
- struct sockaddr *lwipname;
- socklen_t lwipnamelen;
- struct sockaddr_in so_in;
-
- #if LWIP_IPV6
- struct sockaddr_in6 so_in6;
- #endif
-
- family = rtems_lwip_sysdefs_sockaddr_get_family( name );
-
- if ( ( family == rtems_lwip_sysdefs_AF_INET ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in_size ) ) {
- so_in.sin_len = sizeof( so_in );
- so_in.sin_family = PF_INET;
- so_in.sin_port = rtems_lwip_sysdefs_sockaddr_in_get_sin_port( name );
- so_in.sin_addr.s_addr =
- rtems_lwip_sysdefs_sockaddr_in_get_sin_addr( name );
- lwipname = (struct sockaddr *) &so_in;
- lwipnamelen = so_in.sin_len;
- #if LWIP_IPV6
- } else if ( ( family == rtems_lwip_sysdefs_AF_INET6 ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in6_size ) ) {
- so_in6.sin6_len = sizeof( so_in6 );
- so_in6.sin6_family = PF_INET6;
- so_in6.sin6_port = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_port( name );
- memcpy( &so_in6.sin6_addr,
- rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr_const( name ),
- sizeof( so_in6.sin6_addr ) );
- so_in6.sin6_flowinfo = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_flowinfo(
- name );
- so_in6.sin6_scope_id = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_scope_id(
- name );
- lwipname = (struct sockaddr *) &so_in6;
- lwipnamelen = so_in6.sin6_len;
- #endif
- } else {
- errno = EINVAL;
-
- return -1;
- }
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- ret = lwip_bind( lwipfd, lwipname, lwipnamelen );
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_bind( lwipfd, name, namelen );
}
int connect(
@@ -281,59 +298,17 @@ int connect(
socklen_t namelen
)
{
- int ret = -1;
int lwipfd;
- int family;
- struct sockaddr *lwipname;
- socklen_t lwipnamelen;
- struct sockaddr_in so_in;
-
- #if LWIP_IPV6
- struct sockaddr_in6 so_in6;
- #endif
-
- family = rtems_lwip_sysdefs_sockaddr_get_family( name );
-
- if ( ( family == rtems_lwip_sysdefs_AF_INET ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in_size ) ) {
- so_in.sin_len = sizeof( so_in );
- so_in.sin_family = AF_INET;
- so_in.sin_port = rtems_lwip_sysdefs_sockaddr_in_get_sin_port( name );
- so_in.sin_addr.s_addr =
- rtems_lwip_sysdefs_sockaddr_in_get_sin_addr( name );
- lwipname = (struct sockaddr *) &so_in;
- lwipnamelen = so_in.sin_len;
- #if LWIP_IPV6
- } else if ( ( family == rtems_lwip_sysdefs_AF_INET6 ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in6_size ) ) {
- so_in6.sin6_len = sizeof( so_in6 );
- so_in6.sin6_family = AF_INET6;
- so_in6.sin6_port = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_port( name );
- memcpy( &so_in6.sin6_addr,
- rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr_const( name ),
- sizeof( so_in6.sin6_addr ) );
- so_in6.sin6_flowinfo = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_flowinfo(
- name );
- so_in6.sin6_scope_id = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_scope_id(
- name );
- lwipname = (struct sockaddr *) &so_in6;
- lwipnamelen = so_in6.sin6_len;
- #endif
- } else {
- errno = EINVAL;
-
- return -1;
- }
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- ret = lwip_connect( lwipfd, lwipname, lwipnamelen );
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_connect( lwipfd, name, namelen );
}
int listen(
@@ -341,18 +316,17 @@ int listen(
int backlog
)
{
- int ret = -1;
int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- ret = lwip_listen( lwipfd, backlog );
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_listen( lwipfd, backlog );
}
int accept(
@@ -363,72 +337,25 @@ int accept(
{
int ret = -1;
int lwipfd;
- struct sockaddr *lwipname = name;
- socklen_t lwipnamelen = *namelen;
- struct sockaddr_in so_in;
-
- #if LWIP_IPV6
- struct sockaddr_in6 so_in6;
- #endif
rtems_lwip_semaphore_obtain();
-
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
-
- rtems_lwip_semaphore_release();
- lwipfd = lwip_accept( lwipfd, lwipname, &lwipnamelen );
- rtems_lwip_semaphore_obtain();
- }
-
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
rtems_lwip_semaphore_release();
- if ( lwipfd < 0 )
- return lwipfd;
-
- if ( lwipname->sa_family == AF_INET ) {
- memcpy( &so_in, lwipname, sizeof( so_in ) );
- rtems_lwip_sysdefs_sockaddr_set_len( name,
- rtems_lwip_sysdefs_sockaddr_in_size );
- rtems_lwip_sysdefs_sockaddr_set_family( name, rtems_lwip_sysdefs_AF_INET );
- rtems_lwip_sysdefs_sockaddr_in_set_sin_port( name, so_in.sin_port );
- rtems_lwip_sysdefs_sockaddr_in_set_sin_addr( name, so_in.sin_addr.s_addr );
- #if LWIP_IPV6
- } else if ( lwipname->sa_family == AF_INET6 ) {
- memcpy( &so_in6, lwipname, sizeof( so_in6 ) );
- rtems_lwip_sysdefs_sockaddr_set_len( name,
- rtems_lwip_sysdefs_sockaddr_in6_size );
- rtems_lwip_sysdefs_sockaddr_set_family( name,
- rtems_lwip_sysdefs_AF_INET6 );
-
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_port( name, so_in6.sin6_port );
- memcpy( rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr( name ),
- &so_in6.sin6_addr,
- sizeof( so_in6.sin6_addr ) );
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_flowinfo( name,
- so_in6.sin6_flowinfo );
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_scope_id( name,
- so_in6.sin6_scope_id );
- #endif
- } else {
- lwip_close( lwipfd );
- errno = EINVAL;
-
+ if ( lwipfd < 0 ) {
return -1;
}
+ lwipfd = lwip_accept( lwipfd, name, namelen );
+
rtems_lwip_semaphore_obtain();
ret = rtems_lwip_make_sysfd_from_lwipfd( lwipfd );
+ rtems_lwip_semaphore_release();
if ( ret < 0 ) {
- rtems_lwip_semaphore_release();
lwip_close( lwipfd );
- rtems_lwip_semaphore_obtain();
}
- rtems_lwip_semaphore_release();
-
- *namelen = rtems_lwip_sysdefs_sockaddr_get_len( name );
-
return ret;
}
@@ -441,20 +368,17 @@ int shutdown(
int how
)
{
- int ret = -1;
int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- rtems_lwip_semaphore_release();
- ret = lwip_shutdown( lwipfd, how );
- rtems_lwip_semaphore_obtain();
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_shutdown( lwipfd, how );
}
ssize_t recv(
@@ -464,20 +388,17 @@ ssize_t recv(
int flags
)
{
- int ret = -1;
int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- rtems_lwip_semaphore_release();
- ret = lwip_recv( lwipfd, buf, len, flags );
- rtems_lwip_semaphore_obtain();
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_recv( lwipfd, buf, len, flags );
}
ssize_t send(
@@ -487,20 +408,17 @@ ssize_t send(
int flags
)
{
- int ret = -1;
int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- rtems_lwip_semaphore_release();
- ret = lwip_send( lwipfd, buf, len, flags );
- rtems_lwip_semaphore_obtain();
+ if ( lwipfd < 0 ) {
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_send( lwipfd, buf, len, flags );
}
ssize_t recvfrom(
@@ -512,75 +430,20 @@ ssize_t recvfrom(
socklen_t *namelen
)
{
- int ret = -1;
int lwipfd;
- struct sockaddr *lwipname = name;
- socklen_t lwipnamelen = *namelen;
- struct sockaddr_in so_in;
-
- #if LWIP_IPV6
- struct sockaddr_in6 so_in6;
- #endif
if ( name == NULL )
return recv( s, buf, len, flags );
rtems_lwip_semaphore_obtain();
-
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- rtems_lwip_semaphore_release();
- lwipfd = lwip_recvfrom( lwipfd, buf, len, flags, lwipname, &lwipnamelen );
- rtems_lwip_semaphore_obtain();
- }
-
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
rtems_lwip_semaphore_release();
- if ( lwipfd < 0 )
- return lwipfd;
-
- if ( lwipname->sa_family == AF_INET ) {
- memcpy( &so_in, lwipname, sizeof( so_in ) );
- rtems_lwip_sysdefs_sockaddr_set_len( name,
- rtems_lwip_sysdefs_sockaddr_in_size );
- rtems_lwip_sysdefs_sockaddr_set_family( name, rtems_lwip_sysdefs_AF_INET );
- rtems_lwip_sysdefs_sockaddr_in_set_sin_port( name, so_in.sin_port );
- rtems_lwip_sysdefs_sockaddr_in_set_sin_addr( name, so_in.sin_addr.s_addr );
- #if LWIP_IPV6
- } else if ( lwipname->sa_family == AF_INET6 ) {
- memcpy( &so_in6, lwipname, sizeof( so_in6 ) );
- rtems_lwip_sysdefs_sockaddr_set_len( name,
- rtems_lwip_sysdefs_sockaddr_in6_size );
- rtems_lwip_sysdefs_sockaddr_set_family( name,
- rtems_lwip_sysdefs_AF_INET6 );
-
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_port( name, so_in6.sin6_port );
- memcpy( rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr( name ),
- &so_in6.sin6_addr,
- sizeof( so_in6.sin6_addr ) );
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_flowinfo( name,
- so_in6.sin6_flowinfo );
- rtems_lwip_sysdefs_sockaddr_in6_set_sin6_scope_id( name,
- so_in6.sin6_scope_id );
- #endif
- } else {
- lwip_close( lwipfd );
- errno = EINVAL;
-
+ if ( lwipfd < 0 ) {
return -1;
}
- rtems_lwip_semaphore_obtain();
- ret = rtems_lwip_make_sysfd_from_lwipfd( lwipfd );
-
- if ( ret < 0 ) {
- lwip_close( lwipfd );
- }
-
- rtems_lwip_semaphore_release();
-
- *namelen = rtems_lwip_sysdefs_sockaddr_get_len( name );
-
- return ret;
+ return lwip_recvfrom( lwipfd, buf, len, flags, name, namelen );
}
ssize_t sendto(
@@ -592,61 +455,118 @@ ssize_t sendto(
socklen_t namelen
)
{
- int ret = -1;
int lwipfd;
- int family;
- struct sockaddr *lwipname;
- socklen_t lwipnamelen;
- struct sockaddr_in so_in;
-
- #if LWIP_IPV6
- struct sockaddr_in6 so_in6;
- #endif
if ( name == NULL )
return send( s, buf, len, flags );
- family = rtems_lwip_sysdefs_sockaddr_get_family( name );
-
- if ( ( family == rtems_lwip_sysdefs_AF_INET ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in_size ) ) {
- so_in.sin_len = sizeof( so_in );
- so_in.sin_family = AF_INET;
- so_in.sin_port = rtems_lwip_sysdefs_sockaddr_in_get_sin_port( name );
- so_in.sin_addr.s_addr =
- rtems_lwip_sysdefs_sockaddr_in_get_sin_addr( name );
- lwipname = (struct sockaddr *) &so_in;
- lwipnamelen = so_in.sin_len;
- #if LWIP_IPV6
- } else if ( ( family == rtems_lwip_sysdefs_AF_INET6 ) &&
- ( namelen >= rtems_lwip_sysdefs_sockaddr_in6_size ) ) {
- so_in6.sin6_len = sizeof( so_in6 );
- so_in6.sin6_family = AF_INET6;
- so_in6.sin6_port = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_port( name );
- memcpy( &so_in6.sin6_addr,
- rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr_const( name ),
- sizeof( so_in6.sin6_addr ) );
- so_in6.sin6_flowinfo = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_flowinfo(
- name );
- so_in6.sin6_scope_id = rtems_lwip_sysdefs_sockaddr_in6_get_sin6_scope_id(
- name );
- lwipname = (struct sockaddr *) &so_in6;
- lwipnamelen = so_in6.sin6_len;
- #endif
- } else {
- errno = EINVAL;
+ rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
+ if ( lwipfd < 0 ) {
return -1;
}
+ return lwip_sendto( lwipfd, buf, len, flags, name, namelen );
+}
+
+static int fdset_sysfd_to_lwipfd( int maxfdp1, fd_set *orig_set, fd_set *mapped_set )
+{
+ int new_max = 0;
+ FD_ZERO( mapped_set );
+
+ if ( orig_set == NULL ) {
+ return new_max;
+ }
+
+ for ( int sysfd = 0; sysfd < maxfdp1; sysfd++ ) {
+ int lwipfd;
+
+ if ( FD_ISSET( sysfd, orig_set ) == 0 ) {
+ continue;
+ }
+
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( sysfd );
+ if ( lwipfd < 0 ) {
+ return -1;
+ }
+
+ if ( lwipfd > (new_max - 1) ) {
+ new_max = lwipfd + 1;
+ }
+
+ FD_SET( lwipfd, mapped_set );
+ }
+ return new_max;
+}
+
+static void fdset_lwipfd_to_sysfd( int maxfdp1, fd_set *orig_set, fd_set *mapped_set )
+{
+ fd_set new_orig_set;
+
+ FD_ZERO( &new_orig_set );
+
+ if ( orig_set == NULL ) {
+ return;
+ }
+
+ for ( int sysfd = 0; sysfd < maxfdp1; sysfd++ ) {
+ int lwipfd;
+
+ if ( FD_ISSET( sysfd, orig_set ) == 0 ) {
+ continue;
+ }
+
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( sysfd );
+
+ if ( FD_ISSET( lwipfd, mapped_set ) == 0 ) {
+ continue;
+ }
+
+ FD_SET( sysfd, &new_orig_set );
+ }
+
+ *orig_set = new_orig_set;
+}
+
+int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
+ struct timeval *timeout)
+{
+ int rmaxp1;
+ int wmaxp1;
+ int emaxp1;
+ int newmaxfdp1;
+ int ret;
+ fd_set newread, newwrite, newexcept;
+
+ /* Save original FD sets, */
+
rtems_lwip_semaphore_obtain();
+ rmaxp1 = fdset_sysfd_to_lwipfd( maxfdp1, readset, &newread );
+ wmaxp1 = fdset_sysfd_to_lwipfd( maxfdp1, writeset, &newwrite );
+ emaxp1 = fdset_sysfd_to_lwipfd( maxfdp1, exceptset, &newexcept );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) >= 0 ) {
- rtems_lwip_semaphore_release();
- ret = lwip_sendto( lwipfd, buf, len, flags, lwipname, lwipnamelen );
- rtems_lwip_semaphore_obtain();
+ if ( rmaxp1 < 0 || wmaxp1 < 0 || emaxp1 < 0 ) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ newmaxfdp1 = rmaxp1;
+ if ( wmaxp1 > newmaxfdp1 ) {
+ newmaxfdp1 = wmaxp1;
+ }
+ if ( emaxp1 > newmaxfdp1 ) {
+ newmaxfdp1 = emaxp1;
}
+ ret = lwip_select( newmaxfdp1, &newread, &newwrite, &newexcept, timeout );
+
+ rtems_lwip_semaphore_obtain();
+ fdset_lwipfd_to_sysfd( maxfdp1, readset, &newread );
+ fdset_lwipfd_to_sysfd( maxfdp1, writeset, &newwrite );
+ fdset_lwipfd_to_sysfd( maxfdp1, exceptset, &newexcept );
rtems_lwip_semaphore_release();
return ret;
@@ -750,6 +670,8 @@ ssize_t sendmsg(
return ( ret );
}
+#endif
+
/*
* All `receive' operations end up calling this routine.
*/
@@ -759,113 +681,19 @@ ssize_t recvmsg(
int flags
)
{
- int ret = -1;
- int error;
- struct uio auio;
- struct iovec *iov;
- int lwipfd;
- struct mbuf *from = NULL, *control = NULL;
- int i;
- int len;
+ int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( so = rtems_lwip_sysfd_to_lwipfd( s ) ) == NULL ) {
- rtems_lwip_semaphore_release();
-
+ if ( lwipfd < 0 ) {
return -1;
}
- auio.uio_iov = mp->msg_iov;
- auio.uio_iovcnt = mp->msg_iovlen;
- auio.uio_segflg = UIO_USERSPACE;
- auio.uio_rw = UIO_READ;
- auio.uio_offset = 0;
- auio.uio_resid = 0;
- iov = mp->msg_iov;
-
- for ( i = 0; i < mp->msg_iovlen; i++, iov++ ) {
- if ( ( auio.uio_resid += iov->iov_len ) < 0 ) {
- errno = EINVAL;
- rtems_lwip_semaphore_release();
-
- return -1;
- }
- }
-
- len = auio.uio_resid;
- mp->msg_flags = flags;
- error = soreceive( so, &from, &auio, (struct mbuf **) NULL,
- mp->msg_control ? &control : (struct mbuf **) NULL,
- &mp->msg_flags );
-
- if ( error ) {
- if ( auio.uio_resid != len && ( error == EINTR || error == EWOULDBLOCK ) )
- error = 0;
- }
-
- if ( error ) {
- errno = error;
- } else {
- ret = len - auio.uio_resid;
-
- if ( mp->msg_name ) {
- len = mp->msg_namelen;
-
- if ( ( len <= 0 ) || ( from == NULL ) ) {
- len = 0;
- } else {
- if ( len > from->m_len )
- len = from->m_len;
-
- memcpy( mp->msg_name, mtod( from, caddr_t ), len );
- }
-
- mp->msg_namelen = len;
- }
-
- if ( mp->msg_control ) {
- struct mbuf *m;
- void *ctlbuf;
-
- len = mp->msg_controllen;
- m = control;
- mp->msg_controllen = 0;
- ctlbuf = mp->msg_control;
-
- while ( m && ( len > 0 ) ) {
- unsigned int tocopy;
-
- if ( len >= m->m_len )
- tocopy = m->m_len;
- else {
- mp->msg_flags |= MSG_CTRUNC;
- tocopy = len;
- }
-
- memcpy( ctlbuf, mtod( m, caddr_t ), tocopy );
- ctlbuf += tocopy;
- len -= tocopy;
- m = m->m_next;
- }
-
- mp->msg_controllen = ctlbuf - mp->msg_control;
- }
- }
-
- if ( from )
- m_freem( from );
-
- if ( control )
- m_freem( control );
-
- rtems_lwip_semaphore_release();
-
- return ( ret );
+ return lwip_recvmsg( lwipfd, mp, flags );
}
-#endif
-
int setsockopt(
int s,
int level,
@@ -874,54 +702,19 @@ int setsockopt(
socklen_t len
)
{
-
-#if 0
- int lwipfd;
- struct mbuf *m = NULL;
- int error;
+ int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( so = rtems_lwip_sysfd_to_lwipfd( s ) ) == NULL ) {
- rtems_lwip_semaphore_release();
-
- return -1;
- }
-
- if ( len > MLEN ) {
- errno = EINVAL;
- rtems_lwip_semaphore_release();
-
- return -1;
- }
-
- if ( val ) {
- error = sockargstombuf( &m, val, len, MT_SOOPTS );
-
- if ( error ) {
- errno = error;
- rtems_lwip_semaphore_release();
-
- return -1;
- }
- }
-
- error = sosetopt( so, level, name, m );
-
- if ( error ) {
- errno = error;
- rtems_lwip_semaphore_release();
-
+ if ( lwipfd < 0 ) {
return -1;
}
- rtems_lwip_semaphore_release();
-#endif
- return 0;
+ return lwip_setsockopt( lwipfd, level, name, val, len );
}
-#if 0
-
int getsockopt(
int s,
int level,
@@ -930,61 +723,21 @@ int getsockopt(
socklen_t *avalsize
)
{
- int lwipfd;
- struct mbuf *m = NULL, *m0;
- char *val = aval;
- int i, op, valsize;
- int error;
+ int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( so = rtems_lwip_sysfd_to_lwipfd( s ) ) == NULL ) {
- rtems_lwip_semaphore_release();
-
- return -1;
- }
-
- if ( val )
- valsize = *avalsize;
- else
- valsize = 0;
-
- if ( ( ( error =
- sogetopt( so, level, name,
- &m ) ) == 0 ) && val && valsize && m ) {
- op = 0;
-
- while ( m && op < valsize ) {
- i = valsize - op;
-
- if ( i > m->m_len )
- i = m->m_len;
-
- memcpy( val, mtod( m, caddr_t ), i );
- op += i;
- val += i;
- m0 = m;
- MFREE( m0, m );
- }
-
- *avalsize = op;
- }
-
- if ( m != NULL )
- (void) m_free( m );
-
- if ( error ) {
- errno = error;
- rtems_lwip_semaphore_release();
-
+ if ( lwipfd < 0 ) {
return -1;
}
- rtems_lwip_semaphore_release();
-
- return 0;
+ return lwip_getsockopt( lwipfd, level, name, aval, avalsize );
}
+#if 0
+
static int getpeersockname(
int s,
struct sockaddr *name,
@@ -1047,35 +800,40 @@ int getpeername(
socklen_t *namelen
)
{
- int lwipfd;
- int error;
+ int lwipfd;
rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
- if ( ( lwipfd = rtems_lwip_sysfd_to_lwipfd( s ) ) < 0 ) {
- rtems_lwip_semaphore_release();
-
+ if ( lwipfd < 0 ) {
return -1;
}
- error = lwip_getpeername(lwipfd, name, namelen);
-
- rtems_lwip_semaphore_release();
-
- return error;
+ return lwip_getpeername(lwipfd, name, namelen);
}
-#if 0
-
int getsockname(
int s,
struct sockaddr *name,
socklen_t *namelen
)
{
- return getpeersockname( s, name, namelen, 0 );
+ int lwipfd;
+
+ rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_sysfd_to_lwipfd( s );
+ rtems_lwip_semaphore_release();
+
+ if ( lwipfd < 0 ) {
+ return -1;
+ }
+
+ return lwip_getsockname( lwipfd, name, namelen );
}
+#if 0
+
int sysctl(
const int *name,
u_int namelen,
@@ -1115,22 +873,16 @@ int sysctl(
static int rtems_lwip_close( rtems_libio_t *iop )
{
int lwipfd;
- int ret;
rtems_lwip_semaphore_obtain();
lwipfd = rtems_lwip_iop_to_lwipfd( iop );
+ rtems_lwip_semaphore_release();
if ( lwipfd < 0 ) {
- ret = -1;
- } else {
- rtems_lwip_semaphore_release();
- ret = lwip_close( lwipfd );
- rtems_lwip_semaphore_obtain();
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_close( lwipfd );
}
static ssize_t rtems_lwip_read(
@@ -1140,22 +892,16 @@ static ssize_t rtems_lwip_read(
)
{
int lwipfd;
- int ret;
rtems_lwip_semaphore_obtain();
lwipfd = rtems_lwip_iop_to_lwipfd( iop );
+ rtems_lwip_semaphore_release();
if ( lwipfd < 0 ) {
- ret = -1;
- } else {
- rtems_lwip_semaphore_release();
- ret = lwip_read( lwipfd, buffer, count );
- rtems_lwip_semaphore_obtain();
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_read( lwipfd, buffer, count );
}
static ssize_t rtems_lwip_write(
@@ -1165,22 +911,16 @@ static ssize_t rtems_lwip_write(
)
{
int lwipfd;
- int ret;
rtems_lwip_semaphore_obtain();
lwipfd = rtems_lwip_iop_to_lwipfd( iop );
+ rtems_lwip_semaphore_release();
if ( lwipfd < 0 ) {
- ret = -1;
- } else {
- rtems_lwip_semaphore_release();
- ret = lwip_write( lwipfd, buffer, count );
- rtems_lwip_semaphore_obtain();
+ return -1;
}
- rtems_lwip_semaphore_release();
-
- return ret;
+ return lwip_write( lwipfd, buffer, count );
}
int so_ioctl(
@@ -1262,30 +1002,25 @@ static int rtems_lwip_fcntl(
int cmd
)
{
-#if 0
int lwipfd;
- if ( cmd == F_SETFL ) {
- rtems_lwip_semaphore_obtain();
-
- if ( ( so = iop->data1 ) == NULL ) {
- rtems_lwip_semaphore_release();
-
- return EBADF;
- }
-
- if ( rtems_libio_iop_is_no_delay( iop ) )
- so->so_state |= SS_NBIO;
- else
- so->so_state &= ~SS_NBIO;
+ rtems_lwip_semaphore_obtain();
+ lwipfd = rtems_lwip_iop_to_lwipfd( iop );
+ rtems_lwip_semaphore_release();
- rtems_lwip_semaphore_release();
+ if ( lwipfd < 0 ) {
+ return -1;
}
- return 0;
-#endif
+ /*
+ * Returning non-zero here for F_GETFL results in the call failing instead of
+ * passing back the value retrieved in the libio layer.
+ */
+ if (cmd == F_GETFL) {
+ return 0;
+ }
- return -1;
+ return lwip_fcntl( lwipfd, cmd, O_NONBLOCK );
}
static int rtems_lwip_fstat(
@@ -1321,3 +1056,8 @@ const char *
inet_ntop(int af, const void *src, char *dst, socklen_t size){
return lwip_inet_ntop(af, src, dst, size);
}
+
+int inet_pton(int af, const char *src, void *dst)
+{
+ return lwip_inet_pton(af, src, dst);
+}
diff --git a/rtemslwip/common/rtems_lwip_sysdefs.c b/rtemslwip/common/rtems_lwip_sysdefs.c
deleted file mode 100644
index 3877811..0000000
--- a/rtemslwip/common/rtems_lwip_sysdefs.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *
- * RTEMS Project (https://www.rtems.org/)
- *
- * Copyright (c) 2021 Vijay Kumar Banerjee <vijay@rtems.org>.
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 COPYRIGHT
- * OWNER OR CONTRIBUTORS 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.
- */
-
-#include <stdint.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#include "rtems_lwip_int.h"
-
-int rtems_lwip_sysdefs_AF_UNSPEC = AF_UNSPEC;
-int rtems_lwip_sysdefs_AF_UNIX = AF_UNIX;
-int rtems_lwip_sysdefs_AF_INET = AF_INET;
-int rtems_lwip_sysdefs_AF_INET6 = AF_INET6;
-int rtems_lwip_sysdefs_PF_UNSPEC = PF_UNSPEC;
-int rtems_lwip_sysdefs_PF_UNIX = PF_UNIX;
-int rtems_lwip_sysdefs_PF_INET = PF_INET;
-int rtems_lwip_sysdefs_PF_INET6 = PF_INET6;
-int rtems_lwip_sysdefs_SOCK_STREAM = SOCK_STREAM;
-int rtems_lwip_sysdefs_SOCK_DGRAM = SOCK_DGRAM;
-int rtems_lwip_sysdefs_SOCK_RAW = SOCK_RAW;
-int rtems_lwip_sysdefs_sockaddr_in_size = sizeof( struct sockaddr_in );
-int rtems_lwip_sysdefs_sockaddr_in6_size = sizeof( struct sockaddr_in6 );
-
-int rtems_lwip_sysdefs_sockaddr_get_len( const void *sockaddr )
-{
- const struct sockaddr *so = sockaddr;
-
- return so->sa_len;
-}
-
-int rtems_lwip_sysdefs_sockaddr_get_family( const void *sockaddr )
-{
- const struct sockaddr *so = sockaddr;
-
- return so->sa_family;
-}
-
-uint16_t rtems_lwip_sysdefs_sockaddr_in_get_sin_port( const void *sockaddr )
-{
- const struct sockaddr_in *so = sockaddr;
-
- return so->sin_port;
-}
-
-uint32_t rtems_lwip_sysdefs_sockaddr_in_get_sin_addr( const void *sockaddr )
-{
- const struct sockaddr_in *so = sockaddr;
-
- return so->sin_addr.s_addr;
-}
-
-uint16_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_port( const void *sockaddr )
-{
- const struct sockaddr_in6 *so = sockaddr;
-
- return so->sin6_port;
-}
-
-const uint8_t *rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr_const(
- const void *sockaddr )
-{
- const struct sockaddr_in6 *so = sockaddr;
-
- return (uint8_t *) &so->sin6_addr;
-}
-
-uint8_t *rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr(
- void *sockaddr )
-{
- struct sockaddr_in6 *so = sockaddr;
-
- return (uint8_t *) &so->sin6_addr;
-}
-
-uint32_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_flowinfo(
- const void *sockaddr )
-{
- const struct sockaddr_in6 *so = sockaddr;
-
- return so->sin6_flowinfo;
-}
-
-uint32_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_scope_id(
- const void *sockaddr )
-{
- const struct sockaddr_in6 *so = sockaddr;
-
- return so->sin6_scope_id;
-}
-
-void rtems_lwip_sysdefs_sockaddr_set_len(
- void *sockaddr,
- int len
-)
-{
- struct sockaddr *so = sockaddr;
-
- so->sa_len = len;
-}
-
-void rtems_lwip_sysdefs_sockaddr_set_family(
- void *sockaddr,
- int family
-)
-{
- struct sockaddr *so = sockaddr;
-
- so->sa_family = family;
-}
-
-void rtems_lwip_sysdefs_sockaddr_in_set_sin_port(
- void *sockaddr,
- uint16_t port
-)
-{
- struct sockaddr_in *so = sockaddr;
-
- so->sin_port = port;
-}
-
-void rtems_lwip_sysdefs_sockaddr_in_set_sin_addr(
- void *sockaddr,
- uint32_t addr
-)
-{
- struct sockaddr_in *so = sockaddr;
-
- so->sin_addr.s_addr = addr;
-}
-
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_port(
- void *sockaddr,
- uint16_t port
-)
-{
- struct sockaddr_in6 *so = sockaddr;
-
- so->sin6_port = port;
-}
-
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_flowinfo(
- void *sockaddr,
- uint32_t flowinfo
-)
-{
- struct sockaddr_in6 *so = sockaddr;
-
- so->sin6_flowinfo = flowinfo;
-}
-
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_scope_id(
- void *sockaddr,
- uint32_t scope_id
-)
-{
- struct sockaddr_in6 *so = sockaddr;
-
- so->sin6_scope_id = scope_id;
-}
diff --git a/rtemslwip/common/syslog.c b/rtemslwip/common/syslog.c
index 4da911e..658b4da 100644
--- a/rtemslwip/common/syslog.c
+++ b/rtemslwip/common/syslog.c
@@ -90,3 +90,9 @@ setlogmask (int pmask)
LogMask = pmask;
return (omask);
}
+
+void
+openlog(const char *ident, int option, int facility)
+{
+ /* Do nothing */
+}
diff --git a/rtemslwip/include/rtems_lwip_int.h b/rtemslwip/include/rtems_lwip_int.h
deleted file mode 100644
index 9d3d548..0000000
--- a/rtemslwip/include/rtems_lwip_int.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * RTEMS Project (https://www.rtems.org/)
- *
- * Copyright (c) 2021 Vijay Kumar Banerjee <vijay@rtems.org>.
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "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 COPYRIGHT
- * OWNER OR CONTRIBUTORS 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.
- */
-
-#ifndef RTEMS_LWIP_INT_H
-#define RTEMS_LWIP_INT_H
-
-#include <stdint.h>
-
-extern int rtems_lwip_sysdefs_AF_UNSPEC;
-extern int rtems_lwip_sysdefs_AF_UNIX;
-extern int rtems_lwip_sysdefs_AF_INET;
-extern int rtems_lwip_sysdefs_AF_INET6;
-extern int rtems_lwip_sysdefs_PF_UNSPEC;
-extern int rtems_lwip_sysdefs_PF_UNIX;
-extern int rtems_lwip_sysdefs_PF_INET;
-extern int rtems_lwip_sysdefs_PF_INET6;
-extern int rtems_lwip_sysdefs_SOCK_STREAM;
-extern int rtems_lwip_sysdefs_SOCK_DGRAM;
-extern int rtems_lwip_sysdefs_SOCK_RAW;
-extern int rtems_lwip_sysdefs_sockaddr_in_size;
-extern int rtems_lwip_sysdefs_sockaddr_in6_size;
-
-int rtems_lwip_sysdefs_sockaddr_get_len( const void *sockaddr );
-int rtems_lwip_sysdefs_sockaddr_get_family( const void *sockaddr );
-uint16_t rtems_lwip_sysdefs_sockaddr_in_get_sin_port( const void *sockaddr );
-uint32_t rtems_lwip_sysdefs_sockaddr_in_get_sin_addr( const void *sockaddr );
-uint16_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_port( const void *sockaddr );
-const uint8_t *rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr_const(
- const void *sockaddr );
-uint8_t *rtems_lwip_sysdefs_sockaddr_in6_get_sin6_addr_ptr(
- void *sockaddr );
-uint32_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_flowinfo(
- const void *sockaddr );
-uint32_t rtems_lwip_sysdefs_sockaddr_in6_get_sin6_scope_id(
- const void *sockaddr );
-
-void rtems_lwip_sysdefs_sockaddr_set_len(
- void *sockaddr,
- int len
-);
-void rtems_lwip_sysdefs_sockaddr_set_family(
- void *sockaddr,
- int family
-);
-void rtems_lwip_sysdefs_sockaddr_in_set_sin_port(
- void *sockaddr,
- uint16_t port
-);
-void rtems_lwip_sysdefs_sockaddr_in_set_sin_addr(
- void *sockaddr,
- uint32_t addr
-);
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_port(
- void *sockaddr,
- uint16_t port
-);
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_flowinfo(
- void *sockaddr,
- uint32_t flowinfo
-);
-void rtems_lwip_sysdefs_sockaddr_in6_set_sin6_scope_id(
- void *sockaddr,
- uint32_t scope_id
-);
-
-#endif /*RTEMS_LWIP_INT_H*/
diff --git a/rtemslwip/zynqmp/lwipopts.h b/rtemslwip/zynqmp/lwipopts.h
index a939ea2..2d358a3 100644
--- a/rtemslwip/zynqmp/lwipopts.h
+++ b/rtemslwip/zynqmp/lwipopts.h
@@ -36,6 +36,8 @@
#define LWIP_ARP 1
#define LWIP_NETIF_API 1
+/* Required for socketpair implementation */
+#define LWIP_NETIF_LOOPBACK 1
#define LWIP_IPV6 1
#define LWIP_IPV4 1
#define LWIP_TIMEVAL_PRIVATE 0