summaryrefslogtreecommitdiff
path: root/contrib/ports/win32
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ports/win32')
-rw-r--r--contrib/ports/win32/Common.mk51
-rw-r--r--contrib/ports/win32/Filelists.cmake46
-rw-r--r--contrib/ports/win32/check/check_stdint.h1
-rw-r--r--contrib/ports/win32/check/config.h29
-rw-r--r--contrib/ports/win32/check/stdbool.h9
-rw-r--r--contrib/ports/win32/check/sys/time.h12
-rw-r--r--contrib/ports/win32/check/time.c66
-rw-r--r--contrib/ports/win32/check/unistd.h7
-rw-r--r--contrib/ports/win32/example_app/CMakeLists.txt27
-rw-r--r--contrib/ports/win32/example_app/Makefile55
-rw-r--r--contrib/ports/win32/example_app/default_netif.c80
-rw-r--r--contrib/ports/win32/include/arch/bpstruct.h1
-rw-r--r--contrib/ports/win32/include/arch/cc.h115
-rw-r--r--contrib/ports/win32/include/arch/epstruct.h1
-rw-r--r--contrib/ports/win32/include/arch/perf.h40
-rw-r--r--contrib/ports/win32/include/arch/sys_arch.h91
-rw-r--r--contrib/ports/win32/msvc/build_coverity.cmd26
-rw-r--r--contrib/ports/win32/msvc/libcheck.vcxproj102
-rw-r--r--contrib/ports/win32/msvc/libcheck.vcxproj.filters96
-rw-r--r--contrib/ports/win32/msvc/lwIP.vcxproj593
-rw-r--r--contrib/ports/win32/msvc/lwIP.vcxproj.filters1075
-rw-r--r--contrib/ports/win32/msvc/lwIP_Test.sln37
-rw-r--r--contrib/ports/win32/msvc/lwIP_Test.vcxproj209
-rw-r--r--contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters252
-rw-r--r--contrib/ports/win32/msvc/lwIP_pcapif.vcxproj113
-rw-r--r--contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters28
-rw-r--r--contrib/ports/win32/msvc/lwIP_unittests.sln31
-rw-r--r--contrib/ports/win32/msvc/lwip_unittests.vcxproj145
-rw-r--r--contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters168
-rw-r--r--contrib/ports/win32/msvc/makefsdata.vcxproj101
-rw-r--r--contrib/ports/win32/msvc/makefsdata.vcxproj.filters14
-rw-r--r--contrib/ports/win32/pcapif.c1124
-rw-r--r--contrib/ports/win32/pcapif.h32
-rw-r--r--contrib/ports/win32/pcapif_helper.c172
-rw-r--r--contrib/ports/win32/pcapif_helper.h31
-rw-r--r--contrib/ports/win32/readme.txt26
-rw-r--r--contrib/ports/win32/sio.c304
-rw-r--r--contrib/ports/win32/sys_arch.c782
38 files changed, 6092 insertions, 0 deletions
diff --git a/contrib/ports/win32/Common.mk b/contrib/ports/win32/Common.mk
new file mode 100644
index 00000000000..2260162181b
--- /dev/null
+++ b/contrib/ports/win32/Common.mk
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2001, 2002 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>
+#
+
+CC=gcc
+
+# Architecture specific files.
+LWIPARCH?=$(CONTRIBDIR)/ports/win32
+SYSARCH?=$(LWIPARCH)/sys_arch.c
+ARCHFILES=$(SYSARCH) $(LWIPARCH)/pcapif.c \
+ $(LWIPARCH)/pcapif_helper.c $(LWIPARCH)/sio.c
+
+WIN32_COMMON_MK_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+include $(WIN32_COMMON_MK_DIR)/../Common.allports.mk
+
+PCAPDIR=$(PCAP_DIR)/Include
+LDFLAGS+=-L$(PCAP_DIR)/lib -lwpcap -lpacket
+# -Wno-format: GCC complains about non-standard 64 bit modifier needed for MSVC runtime
+CFLAGS+=-I$(PCAPDIR) -Wno-format
+
+pcapif.o:
+ $(CC) $(CFLAGS) -Wno-error -Wno-redundant-decls -c $(<:.o=.c)
+pcapif_helper.o:
+ $(CC) $(CFLAGS) -std=c99 -Wno-redundant-decls -c $(<:.o=.c)
diff --git a/contrib/ports/win32/Filelists.cmake b/contrib/ports/win32/Filelists.cmake
new file mode 100644
index 00000000000..36e02a56b02
--- /dev/null
+++ b/contrib/ports/win32/Filelists.cmake
@@ -0,0 +1,46 @@
+# This file is indended to be included in end-user CMakeLists.txt
+# include(/path/to/Filelists.cmake)
+# It assumes the variable LWIP_CONTRIB_DIR is defined pointing to the
+# root path of lwIP/contrib sources.
+#
+# This file is NOT designed (on purpose) to be used as cmake
+# subdir via add_subdirectory()
+# The intention is to provide greater flexibility to users to
+# create their own targets using the *_SRCS variables.
+
+if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
+ include_guard(GLOBAL)
+endif()
+
+set(lwipcontribportwindows_SRCS
+ ${LWIP_CONTRIB_DIR}/ports/win32/sys_arch.c
+ ${LWIP_CONTRIB_DIR}/ports/win32/sio.c
+ ${LWIP_CONTRIB_DIR}/ports/win32/pcapif.c
+ ${LWIP_CONTRIB_DIR}/ports/win32/pcapif_helper.c
+)
+
+# pcapif needs WinPcap developer package: https://www.winpcap.org/devel.htm
+if(NOT DEFINED WPDPACK_DIR)
+ set(WPDPACK_DIR ${LWIP_DIR}/../WpdPack)
+ message(STATUS "WPDPACK_DIR not set - using default location ${WPDPACK_DIR}")
+endif()
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+ if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+ set(WPDPACK_LIB_DIR ${WPDPACK_DIR}/lib/x64)
+ else()
+ set(WPDPACK_LIB_DIR ${WPDPACK_DIR}/lib)
+ endif()
+ set(WPCAP ${WPDPACK_LIB_DIR}/wpcap.lib)
+ set(PACKET ${WPDPACK_LIB_DIR}/packet.lib)
+else()
+ find_library(WPCAP wpcap HINTS ${WPDPACK_DIR}/lib/x64)
+ find_library(PACKET packet HINTS ${WPDPACK_DIR}/lib/x64)
+endif()
+message(STATUS "WPCAP library: ${WPCAP}")
+message(STATUS "PACKET library: ${PACKET}")
+
+add_library(lwipcontribportwindows EXCLUDE_FROM_ALL ${lwipcontribportwindows_SRCS})
+target_include_directories(lwipcontribportwindows PRIVATE ${LWIP_INCLUDE_DIRS} "${WPDPACK_DIR}/include" ${LWIP_MBEDTLS_INCLUDE_DIRS})
+target_compile_options(lwipcontribportwindows PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcontribaddons PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_link_libraries(lwipcontribportwindows PUBLIC ${WPCAP} ${PACKET} ${LWIP_MBEDTLS_LINK_LIBRARIES})
diff --git a/contrib/ports/win32/check/check_stdint.h b/contrib/ports/win32/check/check_stdint.h
new file mode 100644
index 00000000000..c2c100d5fc3
--- /dev/null
+++ b/contrib/ports/win32/check/check_stdint.h
@@ -0,0 +1 @@
+/* deliberateliy empty */
diff --git a/contrib/ports/win32/check/config.h b/contrib/ports/win32/check/config.h
new file mode 100644
index 00000000000..7ed591d1a62
--- /dev/null
+++ b/contrib/ports/win32/check/config.h
@@ -0,0 +1,29 @@
+/* config.h for check-0.11.0 on win32 under MSVC/MinGW */
+
+#ifdef _MSC_VER
+
+typedef unsigned int pid_t;
+typedef unsigned int uint32_t;
+
+typedef int ssize_t;
+
+#define HAVE_DECL_STRDUP 1
+#define HAVE_DECL_FILENO 1
+#define HAVE_DECL_PUTENV 1
+
+#define _CRT_SECURE_NO_WARNINGS
+
+/* disable some warnings */
+#pragma warning (disable: 4090) /* const assigned to non-const */
+#pragma warning (disable: 4996) /* fileno is deprecated */
+
+#endif /* _ MSC_VER */
+
+
+#define LWIP_UNITTESTS_NOFORK
+
+#include <io.h>
+#include <stdint.h>
+
+typedef unsigned int clockid_t;
+typedef unsigned int timer_t;
diff --git a/contrib/ports/win32/check/stdbool.h b/contrib/ports/win32/check/stdbool.h
new file mode 100644
index 00000000000..1f504d91a3a
--- /dev/null
+++ b/contrib/ports/win32/check/stdbool.h
@@ -0,0 +1,9 @@
+#ifndef MY_STDBOOL_H
+#define MY_STDBOOL_H
+
+typedef int bool;
+#define true 1
+#define false 0
+#define __bool_true_false_are_defined 1
+
+#endif
diff --git a/contrib/ports/win32/check/sys/time.h b/contrib/ports/win32/check/sys/time.h
new file mode 100644
index 00000000000..d71d827d16a
--- /dev/null
+++ b/contrib/ports/win32/check/sys/time.h
@@ -0,0 +1,12 @@
+#ifndef LWIP_SYS__TIME_H
+#define LWIP_SYS__TIME_H
+
+#include <stdlib.h> /* time_t */
+
+struct timeval {
+ time_t tv_sec; /* seconds */
+ long tv_usec; /* and microseconds */
+};
+int gettimeofday(struct timeval* tp, void* tzp);
+
+#endif
diff --git a/contrib/ports/win32/check/time.c b/contrib/ports/win32/check/time.c
new file mode 100644
index 00000000000..b5947cd99e4
--- /dev/null
+++ b/contrib/ports/win32/check/time.c
@@ -0,0 +1,66 @@
+#include <time.h>
+
+#include <windows.h>
+#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
+#else
+ #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
+#endif
+
+#include "config.h"
+
+struct timezone
+{
+ int tz_minuteswest; /* minutes W of Greenwich */
+ int tz_dsttime; /* type of dst correction */
+};
+
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ FILETIME ft;
+ unsigned __int64 tmpres = 0;
+ static int tzflag;
+
+ if (NULL != tv) {
+ GetSystemTimeAsFileTime(&ft);
+
+ tmpres |= ft.dwHighDateTime;
+ tmpres <<= 32;
+ tmpres |= ft.dwLowDateTime;
+
+ /*converting file time to unix epoch*/
+ tmpres -= DELTA_EPOCH_IN_MICROSECS;
+ tmpres /= 10; /*convert into microseconds*/
+ tv->tv_sec = (long)(tmpres / 1000000UL);
+ tv->tv_usec = (long)(tmpres % 1000000UL);
+ }
+
+ if (NULL != tz) {
+ if (!tzflag) {
+ _tzset();
+ tzflag++;
+ }
+ tz->tz_minuteswest = _timezone / 60;
+ tz->tz_dsttime = _daylight;
+ }
+
+ return 0;
+}
+
+struct tm *
+localtime_r(const time_t *timer, struct tm *result)
+{
+ struct tm *local_result;
+
+ if (result == NULL) {
+ return NULL;
+ }
+
+ local_result = localtime (timer);
+ if (local_result == NULL) {
+ return NULL;
+ }
+
+ memcpy(result, local_result, sizeof(*result));
+ return result;
+}
diff --git a/contrib/ports/win32/check/unistd.h b/contrib/ports/win32/check/unistd.h
new file mode 100644
index 00000000000..332e6e129b4
--- /dev/null
+++ b/contrib/ports/win32/check/unistd.h
@@ -0,0 +1,7 @@
+#ifndef LWIP_UNISTD_H
+#define LWIP_UNISTD_H
+
+/* include io.h for read() and write() */
+#include <io.h>
+
+#endif
diff --git a/contrib/ports/win32/example_app/CMakeLists.txt b/contrib/ports/win32/example_app/CMakeLists.txt
new file mode 100644
index 00000000000..7dfe55503ae
--- /dev/null
+++ b/contrib/ports/win32/example_app/CMakeLists.txt
@@ -0,0 +1,27 @@
+include(${LWIP_DIR}/contrib/ports/CMakeCommon.cmake)
+
+set (LWIP_INCLUDE_DIRS
+ "${LWIP_DIR}/src/include"
+ "${LWIP_DIR}/contrib/"
+ "${LWIP_DIR}/contrib/ports/win32/include"
+ "${LWIP_DIR}/contrib/examples/example_app"
+)
+
+include(${LWIP_DIR}/src/Filelists.cmake)
+include(${LWIP_DIR}/contrib/Filelists.cmake)
+include(${LWIP_DIR}/contrib/ports/win32/Filelists.cmake)
+
+if(NOT EXISTS ${LWIP_DIR}/contrib/examples/example_app/lwipcfg.h)
+ message(WARNING "${LWIP_DIR}/contrib/examples/example_app is missing lwipcfg.h
+Copy ${LWIP_DIR}/contrib/examples/example_app/lwipcfg.h.example to ${LWIP_DIR}/contrib/examples/example_app/lwipcfg.h and edit appropriately")
+endif()
+add_executable(example_app ${LWIP_DIR}/contrib/examples/example_app/test.c default_netif.c)
+target_include_directories(example_app PRIVATE ${LWIP_INCLUDE_DIRS})
+target_compile_options(example_app PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(example_app PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_link_libraries(example_app ${LWIP_SANITIZER_LIBS} lwipallapps lwipcontribexamples lwipcontribapps lwipcontribaddons lwipcontribportwindows lwipcore lwipmbedtls)
+
+add_executable(makefsdata ${lwipmakefsdata_SRCS})
+target_compile_options(makefsdata PRIVATE ${LWIP_COMPILER_FLAGS})
+target_include_directories(makefsdata PRIVATE ${LWIP_INCLUDE_DIRS})
+target_link_libraries(makefsdata ${LWIP_SANITIZER_LIBS} lwipcore lwipcontribportwindows)
diff --git a/contrib/ports/win32/example_app/Makefile b/contrib/ports/win32/example_app/Makefile
new file mode 100644
index 00000000000..452af7a9577
--- /dev/null
+++ b/contrib/ports/win32/example_app/Makefile
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 2001, 2002 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>
+#
+
+all compile: example_app makefsdata
+.PHONY: all
+
+include ../Common.mk
+
+CFLAGS+=-I$(CONTRIBDIR)/examples/example_app
+
+MAKEFSDATAOBJS=$(notdir $(MAKEFSDATAFILES:.c=.o))
+
+clean:
+ cmd /c del /q *.o $(LWIPLIBCOMMON) $(APPLIB) test.exe *.s .depend* *.map
+
+depend dep: .depend
+
+include .depend
+
+.depend: $(CONTRIBDIR)/examples/example_app/test.c default_netif.c $(LWIPFILES) $(APPFILES) $(MAKEFSDATAFILES)
+ $(CCDEP) $(CFLAGS) -MM $^ > .depend || cmd /c del .depend
+
+example_app: .depend $(LWIPLIBCOMMON) $(APPLIB) default_netif.o test.o
+ $(CC) $(CFLAGS) -o example_app test.o default_netif.o -Wl,--start-group $(APPLIB) $(LWIPLIBCOMMON) -Wl,--end-group $(LDFLAGS) -Xlinker -Map=test.map
+
+makefsdata: .depend $(MAKEFSDATAOBJS)
+ $(CC) $(CFLAGS) -o makefsdata $(MAKEFSDATAOBJS)
diff --git a/contrib/ports/win32/example_app/default_netif.c b/contrib/ports/win32/example_app/default_netif.c
new file mode 100644
index 00000000000..9af2ecca03f
--- /dev/null
+++ b/contrib/ports/win32/example_app/default_netif.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2001-2003 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>
+ *
+ */
+
+#include "lwip/opt.h"
+
+#include "lwip/netif.h"
+#include "lwip/ip_addr.h"
+#include "lwip/sys.h"
+#include "lwip/tcpip.h"
+#include "../pcapif.h"
+#include "examples/example_app/default_netif.h"
+
+static struct netif netif;
+
+#if LWIP_IPV4
+#define NETIF_ADDRS ipaddr, netmask, gw,
+void init_default_netif(const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw)
+#else
+#define NETIF_ADDRS
+void init_default_netif(void)
+#endif
+{
+#if NO_SYS
+ netif_add(&netif, NETIF_ADDRS NULL, pcapif_init, netif_input);
+#else /* NO_SYS */
+ netif_add(&netif, NETIF_ADDRS NULL, pcapif_init, tcpip_input);
+#endif /* NO_SYS */
+ netif_set_default(&netif);
+}
+
+void
+default_netif_poll(void)
+{
+#if !PCAPIF_RX_USE_THREAD
+ /* check for packets and link status*/
+ pcapif_poll(&netif);
+ /* When pcapif_poll comes back, there are not packets, so sleep to
+ prevent 100% CPU load. Don't do this in an embedded system since it
+ increases latency! */
+ sys_msleep(1);
+#else /* !PCAPIF_RX_USE_THREAD */
+ sys_msleep(50);
+#endif /* !PCAPIF_RX_USE_THREAD */
+}
+
+void
+default_netif_shutdown(void)
+{
+ /* release the pcap library... */
+ pcapif_shutdown(&netif);
+}
diff --git a/contrib/ports/win32/include/arch/bpstruct.h b/contrib/ports/win32/include/arch/bpstruct.h
new file mode 100644
index 00000000000..1d81e3f7b89
--- /dev/null
+++ b/contrib/ports/win32/include/arch/bpstruct.h
@@ -0,0 +1 @@
+#pragma pack(push,1)
diff --git a/contrib/ports/win32/include/arch/cc.h b/contrib/ports/win32/include/arch/cc.h
new file mode 100644
index 00000000000..0a0c03219ca
--- /dev/null
+++ b/contrib/ports/win32/include/arch/cc.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2001-2003 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_ARCH_CC_H
+#define LWIP_ARCH_CC_H
+
+#ifdef _MSC_VER
+#pragma warning (disable: 4127) /* conditional expression is constant */
+#pragma warning (disable: 4996) /* 'strncpy' was declared deprecated */
+#pragma warning (disable: 4103) /* structure packing changed by including file */
+#pragma warning (disable: 4820) /* 'x' bytes padding added after data member 'y' */
+#pragma warning (disable: 4711) /* The compiler performed inlining on the given function, although it was not marked for inlining */
+#endif
+
+#ifdef _MSC_VER
+#if _MSC_VER >= 1910
+#include <errno.h> /* use MSVC errno for >= 2017 */
+#else
+#define LWIP_PROVIDE_ERRNO /* provide errno for MSVC pre-2017 */
+#endif
+#else /* _MSC_VER */
+#define LWIP_PROVIDE_ERRNO /* provide errno for non-MSVC */
+#endif /* _MSC_VER */
+
+#ifdef __GNUC__
+#define LWIP_TIMEVAL_PRIVATE 0
+#include <sys/time.h>
+#endif
+
+/* Define platform endianness (might already be defined) */
+#ifndef BYTE_ORDER
+#define BYTE_ORDER LITTLE_ENDIAN
+#endif /* BYTE_ORDER */
+
+typedef int sys_prot_t;
+
+#ifdef _MSC_VER
+/* define _INTPTR for Win32 MSVC stdint.h */
+#define _INTPTR 2
+
+/* Do not use lwIP default definitions for format strings
+ * because these do not work with MSVC 2010 compiler (no inttypes.h)
+ */
+#define LWIP_NO_INTTYPES_H 1
+
+/* Define (sn)printf formatters for these lwIP types */
+#define X8_F "02x"
+#define U16_F "hu"
+#define U32_F "lu"
+#define S32_F "ld"
+#define X32_F "lx"
+
+#define S16_F "hd"
+#define X16_F "hx"
+#define SZT_F "lu"
+#endif /* _MSC_VER */
+
+/* Compiler hints for packing structures */
+#define PACK_STRUCT_USE_INCLUDES
+
+#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
+ LWIP_PLATFORM_DIAG(("Assertion \"%s\" failed at line %d in %s\n", message, __LINE__, __FILE__)); \
+ handler;} } while(0)
+
+#ifdef _MSC_VER
+/* C runtime functions redefined */
+#if _MSC_VER < 1910
+#define snprintf _snprintf
+#endif
+#define strdup _strdup
+#endif
+
+/* Define an example for LWIP_PLATFORM_DIAG: since this uses varargs and the old
+* C standard lwIP targets does not support this in macros, we have extra brackets
+* around the arguments, which are left out in the following macro definition:
+*/
+#if !defined(LWIP_TESTMODE) || !LWIP_TESTMODE
+void lwip_win32_platform_diag(const char *format, ...);
+#define LWIP_PLATFORM_DIAG(x) lwip_win32_platform_diag x
+#endif
+
+extern unsigned int lwip_port_rand(void);
+#define LWIP_RAND() ((uint32_t)lwip_port_rand())
+
+#define PPP_INCLUDE_SETTINGS_HEADER
+
+#endif /* LWIP_ARCH_CC_H */
diff --git a/contrib/ports/win32/include/arch/epstruct.h b/contrib/ports/win32/include/arch/epstruct.h
new file mode 100644
index 00000000000..65898b54bb5
--- /dev/null
+++ b/contrib/ports/win32/include/arch/epstruct.h
@@ -0,0 +1 @@
+#pragma pack(pop)
diff --git a/contrib/ports/win32/include/arch/perf.h b/contrib/ports/win32/include/arch/perf.h
new file mode 100644
index 00000000000..d1150b1d806
--- /dev/null
+++ b/contrib/ports/win32/include/arch/perf.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2001, 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. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+#ifndef LWIP_PERF_H
+#define LWIP_PERF_H
+
+#define PERF_START /* null definition */
+#define PERF_STOP(x) /* null definition */
+
+#endif /* LWIP_PERF_H */
diff --git a/contrib/ports/win32/include/arch/sys_arch.h b/contrib/ports/win32/include/arch/sys_arch.h
new file mode 100644
index 00000000000..ded10284bec
--- /dev/null
+++ b/contrib/ports/win32/include/arch/sys_arch.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2001-2003 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_ARCH_SYS_ARCH_H
+#define LWIP_ARCH_SYS_ARCH_H
+
+/* HANDLE is used for sys_sem_t but we won't include windows.h */
+struct _sys_sem {
+ void *sem;
+};
+typedef struct _sys_sem sys_sem_t;
+#define sys_sem_valid_val(sema) (((sema).sem != NULL) && ((sema).sem != (void*)-1))
+#define sys_sem_valid(sema) (((sema) != NULL) && sys_sem_valid_val(*(sema)))
+#define sys_sem_set_invalid(sema) ((sema)->sem = NULL)
+
+/* HANDLE is used for sys_mutex_t but we won't include windows.h */
+struct _sys_mut {
+ void *mut;
+};
+typedef struct _sys_mut sys_mutex_t;
+#define sys_mutex_valid_val(mutex) (((mutex).mut != NULL) && ((mutex).mut != (void*)-1))
+#define sys_mutex_valid(mutex) (((mutex) != NULL) && sys_mutex_valid_val(*(mutex)))
+#define sys_mutex_set_invalid(mutex) ((mutex)->mut = NULL)
+
+#ifndef MAX_QUEUE_ENTRIES
+#define MAX_QUEUE_ENTRIES 100
+#endif
+struct lwip_mbox {
+ void* sem;
+ void* q_mem[MAX_QUEUE_ENTRIES];
+ u32_t head, tail;
+};
+typedef struct lwip_mbox sys_mbox_t;
+#define SYS_MBOX_NULL NULL
+#define sys_mbox_valid_val(mbox) (((mbox).sem != NULL) && ((mbox).sem != (void*)-1))
+#define sys_mbox_valid(mbox) ((mbox != NULL) && sys_mbox_valid_val(*(mbox)))
+#define sys_mbox_set_invalid(mbox) ((mbox)->sem = NULL)
+
+/* DWORD (thread id) is used for sys_thread_t but we won't include windows.h */
+typedef u32_t sys_thread_t;
+
+sys_sem_t* sys_arch_netconn_sem_get(void);
+void sys_arch_netconn_sem_alloc(void);
+void sys_arch_netconn_sem_free(void);
+#define LWIP_NETCONN_THREAD_SEM_GET() sys_arch_netconn_sem_get()
+#define LWIP_NETCONN_THREAD_SEM_ALLOC() sys_arch_netconn_sem_alloc()
+#define LWIP_NETCONN_THREAD_SEM_FREE() sys_arch_netconn_sem_free()
+
+#define LWIP_EXAMPLE_APP_ABORT() lwip_win32_keypressed()
+int lwip_win32_keypressed(void);
+
+/* Threading options */
+void sys_mark_tcpip_thread(void);
+#define LWIP_MARK_TCPIP_THREAD() sys_mark_tcpip_thread()
+
+#if LWIP_TCPIP_CORE_LOCKING
+void sys_lock_tcpip_core(void);
+#define LOCK_TCPIP_CORE() sys_lock_tcpip_core()
+void sys_unlock_tcpip_core(void);
+#define UNLOCK_TCPIP_CORE() sys_unlock_tcpip_core()
+#endif
+
+#endif /* LWIP_ARCH_SYS_ARCH_H */
diff --git a/contrib/ports/win32/msvc/build_coverity.cmd b/contrib/ports/win32/msvc/build_coverity.cmd
new file mode 100644
index 00000000000..f96cc632844
--- /dev/null
+++ b/contrib/ports/win32/msvc/build_coverity.cmd
@@ -0,0 +1,26 @@
+@echo off
+rem Usage: pass the path to cov-build.exe (with trailing backslash, without the exe) as first parameter
+rem ATTENTION: this deletes the output folder "cov-int" and the output file "cov-int.zip" first!
+
+set devenv="%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"
+if not exist %devenv% set devenv="%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\vcexpress.exe"
+if not exist %devenv% set devenv="%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe"
+if not exist %devenv% set devenv="%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\vcexpress.exe"
+set covbuild=%1cov-build.exe
+set covoutput=cov-int
+set zip7="c:\Program Files\7-Zip\7z.exe"
+
+pushd %~dp0
+
+if exist %covoutput% rd /s /q %covoutput%
+if exist %covoutput%.zip del %covoutput%.zip
+
+%covbuild% --dir %covoutput% %devenv% lwip_test.sln /build Debug || goto error
+
+if exist %zip7% goto dozip
+echo error: 7zip not found at \"%zip7%
+goto error
+:dozip
+%zip7% a %covoutput%.zip %covoutput%
+:error
+popd \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/libcheck.vcxproj b/contrib/ports/win32/msvc/libcheck.vcxproj
new file mode 100644
index 00000000000..c33fdab6130
--- /dev/null
+++ b/contrib/ports/win32/msvc/libcheck.vcxproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{EBB156DC-01BF-47B2-B69C-1A750B6B5F09}</ProjectGuid>
+ <RootNamespace>libcheck</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\check;..\..\..\..\..\check\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_LIB;WIN32;_DEBUG;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\check;..\..\..\..\..\check\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\..\check\lib\libcompat.h" />
+ <ClInclude Include="..\check\config.h" />
+ <ClInclude Include="..\check\unistd.h" />
+ <ClInclude Include="..\check\sys\time.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_error.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_impl.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_list.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_log.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_msg.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_pack.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_print.h" />
+ <ClInclude Include="..\..\..\..\..\check\src\check_str.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\..\check\lib\clock_gettime.c" />
+ <ClCompile Include="..\..\..\..\..\check\lib\libcompat.c" />
+ <ClCompile Include="..\check\time.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_error.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_list.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_log.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_msg.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_pack.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_print.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_run.c" />
+ <ClCompile Include="..\..\..\..\..\check\src\check_str.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/libcheck.vcxproj.filters b/contrib/ports/win32/msvc/libcheck.vcxproj.filters
new file mode 100644
index 00000000000..d8bfdfcec93
--- /dev/null
+++ b/contrib/ports/win32/msvc/libcheck.vcxproj.filters
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Win32">
+ <UniqueIdentifier>{05d172f9-8ca6-4d9c-96e4-2b0480a8222f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Win32\sys">
+ <UniqueIdentifier>{eb9ccf88-7e08-4202-bb4f-5a51443fa480}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src">
+ <UniqueIdentifier>{3f044d95-ab52-45ce-b4ae-27797eb221b2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="libcompat">
+ <UniqueIdentifier>{abb21abe-51c2-45df-bdc9-8e00ce7fe404}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\check\config.h">
+ <Filter>Win32</Filter>
+ </ClInclude>
+ <ClInclude Include="..\check\unistd.h">
+ <Filter>Win32</Filter>
+ </ClInclude>
+ <ClInclude Include="..\check\sys\time.h">
+ <Filter>Win32\sys</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_error.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_impl.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_list.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_log.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_msg.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_pack.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_print.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\src\check_str.h">
+ <Filter>src</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\..\check\lib\libcompat.h">
+ <Filter>libcompat</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\check\time.c">
+ <Filter>Win32</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_error.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_list.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_log.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_msg.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_pack.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_print.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_run.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\src\check_str.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\lib\libcompat.c">
+ <Filter>libcompat</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\..\check\lib\clock_gettime.c">
+ <Filter>libcompat</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP.vcxproj b/contrib/ports/win32/msvc/lwIP.vcxproj
new file mode 100644
index 00000000000..5e7587f1e5b
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP.vcxproj
@@ -0,0 +1,593 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug unittests|Win32">
+ <Configuration>Debug unittests</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release unittests|Win32">
+ <Configuration>Release unittests</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{2CC276FA-B226-49C9-8F82-7FCD5A228E28}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\$(ProjectName)\</OutDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <CustomBuildStep Include="..\..\..\..\doc\contrib.txt">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\doc\FILES">
+ <FileType>Document</FileType>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\doc\rawapi.txt">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\doc\savannah.txt">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\doc\snmp_agent.txt">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\doc\sys_arch.txt">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\src\core\ipv6\README">
+ <FileType>Document</FileType>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\..\..\..\src\netif\FILES">
+ <FileType>Document</FileType>
+ </CustomBuildStep>
+ <CustomBuildStep Include="..\lwipcfg_msvc.h.example">
+ <FileType>Document</FileType>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </CustomBuildStep>
+ <None Include="..\..\..\..\CHANGELOG" />
+ <None Include="..\..\..\..\COPYING" />
+ <None Include="..\..\..\..\doc\contrib.txt" />
+ <None Include="..\..\..\..\doc\doxygen\generate.bat" />
+ <None Include="..\..\..\..\doc\doxygen\generate.sh" />
+ <None Include="..\..\..\..\doc\doxygen\lwip.Doxyfile" />
+ <None Include="..\..\..\..\doc\FILES" />
+ <None Include="..\..\..\..\doc\mdns.txt" />
+ <None Include="..\..\..\..\doc\ppp.txt" />
+ <None Include="..\..\..\..\doc\savannah.txt" />
+ <None Include="..\..\..\..\FILES" />
+ <None Include="..\..\..\..\README" />
+ <None Include="..\..\..\..\UPGRADING" />
+ <None Include="..\..\..\examples\example_app\lwipcfg.h.example">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\doc\NO_SYS_SampleCode.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\api_lib.c" />
+ <ClCompile Include="..\..\..\..\src\api\api_msg.c" />
+ <ClCompile Include="..\..\..\..\src\api\err.c" />
+ <ClCompile Include="..\..\..\..\src\api\if_api.c" />
+ <ClCompile Include="..\..\..\..\src\api\netbuf.c" />
+ <ClCompile Include="..\..\..\..\src\api\netdb.c" />
+ <ClCompile Include="..\..\..\..\src\api\netifapi.c" />
+ <ClCompile Include="..\..\..\..\src\api\sockets.c" />
+ <ClCompile Include="..\..\..\..\src\api\tcpip.c" />
+ <ClCompile Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_mem.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\altcp_proxyconnect.c" />
+ <ClCompile Include="..\..\..\..\src\apps\http\http_client.c" />
+ <ClCompile Include="..\..\..\..\src\apps\lwiperf\lwiperf.c" />
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns_domain.c" />
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns_out.c" />
+ <ClCompile Include="..\..\..\..\src\apps\mqtt\mqtt.c" />
+ <ClCompile Include="..\..\..\..\src\apps\netbiosns\netbiosns.c" />
+ <ClCompile Include="..\..\..\..\src\apps\smtp\smtp.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_snmpv2_framework.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_snmpv2_usm.c" />
+ <ClCompile Include="..\..\..\..\src\apps\sntp\sntp.c" />
+ <ClCompile Include="..\..\..\..\src\apps\tftp\tftp.c" />
+ <ClCompile Include="..\..\..\..\src\core\altcp.c" />
+ <ClCompile Include="..\..\..\..\src\core\altcp_alloc.c" />
+ <ClCompile Include="..\..\..\..\src\core\altcp_tcp.c" />
+ <ClCompile Include="..\..\..\..\src\core\def.c" />
+ <ClCompile Include="..\..\..\..\src\core\dns.c" />
+ <ClCompile Include="..\..\..\..\src\core\inet_chksum.c" />
+ <ClCompile Include="..\..\..\..\src\core\init.c" />
+ <ClCompile Include="..\..\..\..\src\core\mem.c" />
+ <ClCompile Include="..\..\..\..\src\core\memp.c" />
+ <ClCompile Include="..\..\..\..\src\core\netif.c" />
+ <ClCompile Include="..\..\..\..\src\core\pbuf.c" />
+ <ClCompile Include="..\..\..\..\src\core\raw.c" />
+ <ClCompile Include="..\..\..\..\src\core\stats.c" />
+ <ClCompile Include="..\..\..\..\src\core\sys.c" />
+ <ClCompile Include="..\..\..\..\src\core\tcp.c" />
+ <ClCompile Include="..\..\..\..\src\core\tcp_in.c" />
+ <ClCompile Include="..\..\..\..\src\core\tcp_out.c" />
+ <ClCompile Include="..\..\..\..\src\core\udp.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\acd.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\autoip.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\dhcp.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\etharp.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\icmp.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\igmp.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4_addr.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\dhcp6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ethip6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\icmp6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\inet6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6_addr.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6_frag.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\mld6.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv6\nd6.c" />
+ <ClCompile Include="..\..\..\..\src\netif\bridgeif.c" />
+ <ClCompile Include="..\..\..\..\src\netif\bridgeif_fdb.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ethernet.c" />
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6.c" />
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6_ble.c" />
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6_common.c" />
+ <ClCompile Include="..\..\..\..\src\netif\slipif.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\auth.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ccp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap-md5.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap-new.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap_ms.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\demand.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\eap.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ecp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\eui64.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\fsm.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ipcp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ipv6cp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\lcp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\magic.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\mppe.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\multilink.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ppp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppcrypt.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppoe.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppol2tp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppos.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\upap.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\utils.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\vj.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\arc4.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\des.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\md4.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\md5.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\sha1.c" />
+ <ClCompile Include="..\..\..\..\src\apps\http\fs.c" />
+ <ClCompile Include="..\..\..\..\src\apps\http\fsdata.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\httpd.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_asn1.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_core.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_msg.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_netconn.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_pbuf_stream.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_raw.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_scalar.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_table.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_threadsync.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_traps.c" />
+ <ClCompile Include="..\..\..\..\src\core\ip.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmpv3.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_icmp.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_interfaces.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_ip.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_snmp.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_system.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_tcp.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_udp.c" />
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppapi.c" />
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4_frag.c" />
+ <ClCompile Include="..\..\..\..\src\core\timeouts.c" />
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns.c" />
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmpv3_mbedtls.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\..\..\mbedtls\include;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;..\..\..\apps\snmp_private_mib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\zepif.c" />
+ <ClCompile Include="..\sio.c" />
+ <ClCompile Include="..\sys_arch.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug unittests|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release unittests|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\doc\doxygen\main_page.h" />
+ <ClInclude Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_mem.h" />
+ <ClInclude Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_structs.h" />
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_msg.h" />
+ <ClInclude Include="..\..\..\..\src\include\compat\stdc\errno.h" />
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\arpa\inet.h" />
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\netdb.h" />
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\net\if.h" />
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\sys\socket.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp_tcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp_tls.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\altcp_proxyconnect.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\altcp_tls_mbedtls_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\http_client.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\lwiperf.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_domain.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_out.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\netbiosns.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\netbiosns_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\smtp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\smtp_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_snmpv2_framework.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_snmpv2_usm.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\sntp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\sntp_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_client.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_common.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_server.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\errno.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\if_api.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_zone.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\altcp_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\api_msg.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\memp_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\memp_std.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\mem_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\nd6_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\raw_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\sockets_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\tcpip_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\tcp_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\acd.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\api.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\arch.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\autoip.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\debug.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\def.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\dhcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\dhcp6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\dns.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\err.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ethip6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\icmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\icmp6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\igmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\inet.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\inet_chksum.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\init.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4_addr.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_addr.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_frag.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip_addr.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\mem.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\memp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\mld6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\nd6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\netbuf.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\netdb.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\netif.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\netifapi.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\opt.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\pbuf.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dhcp6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\etharp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\iana.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ieee.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\igmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\raw.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\sio.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\snmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\sockets.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\stats.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\sys.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\tcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\tcpip.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\udp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\bridgeif.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\bridgeif_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\etharp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ethernet.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ieee802154.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_ble.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_common.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\slipif.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ccp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap-md5.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap-new.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap_ms.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\eap.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ecp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\eui64.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\fsm.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ipcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ipv6cp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\lcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\magic.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\mppe.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp_impl.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppcrypt.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppdebug.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppoe.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppol2tp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppos.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\upap.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\vj.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\arc4.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\des.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\md4.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\md5.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\sha1.h" />
+ <ClInclude Include="..\..\..\..\src\apps\http\fsdata.h" />
+ <ClInclude Include="..\..\..\..\src\apps\http\httpd_structs.h" />
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_asn1.h" />
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_core_priv.h" />
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_pbuf_stream.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_core.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_mib2.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_scalar.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_table.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_threadsync.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppapi.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\fs.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\httpd.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\httpd_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmpv3.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\etharp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4_frag.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\timeouts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_opts.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\acd.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\autoip.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dhcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dns.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip4.h" />
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmpv3_priv.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ethernet.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\icmp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\icmp6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\mld6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\nd6.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\tcp.h" />
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\udp.h" />
+ <ClInclude Include="..\..\..\..\src\include\netif\zepif.h" />
+ <ClInclude Include="..\..\..\examples\example_app\default_netif.h" />
+ <ClInclude Include="..\..\..\examples\example_app\lwipcfg.h" />
+ <ClInclude Include="..\..\..\examples\example_app\lwipopts.h" />
+ <ClInclude Include="..\..\..\examples\example_app\lwippools.h" />
+ <ClInclude Include="..\..\..\examples\example_app\ppp_settings.h" />
+ <ClInclude Include="..\include\arch\bpstruct.h" />
+ <ClInclude Include="..\include\arch\cc.h" />
+ <ClInclude Include="..\include\arch\epstruct.h" />
+ <ClInclude Include="..\include\arch\perf.h" />
+ <ClInclude Include="..\include\arch\sys_arch.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP.vcxproj.filters b/contrib/ports/win32/msvc/lwIP.vcxproj.filters
new file mode 100644
index 00000000000..bb90c3eb311
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP.vcxproj.filters
@@ -0,0 +1,1075 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="doc">
+ <UniqueIdentifier>{51757ae3-05ca-4e6a-a745-19c9ffc62278}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src">
+ <UniqueIdentifier>{e40d58ed-58be-4618-9664-6df29e27f835}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\api">
+ <UniqueIdentifier>{5752fd8f-90c3-4381-8b6a-86c09a2f9859}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps">
+ <UniqueIdentifier>{48a805a9-e5d2-4eed-b29c-02b57140a03d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\lwiperf">
+ <UniqueIdentifier>{8a8dba58-934c-4292-aa8d-d20e2b801bd4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\netbiosns">
+ <UniqueIdentifier>{20594706-d6e1-4503-bc38-f297892d752a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\snmp">
+ <UniqueIdentifier>{1075aec7-b001-47bd-9846-ed635687e26e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\sntp">
+ <UniqueIdentifier>{9b7b3b39-f3b0-4915-81d9-d66c3443c348}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core">
+ <UniqueIdentifier>{75f75ac5-73a4-4458-bc23-eaed529c37e1}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\ipv4">
+ <UniqueIdentifier>{97772339-4210-4a32-82d0-d25269d3e3d6}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\ipv6">
+ <UniqueIdentifier>{06467ead-0683-44db-bc41-6aa5a82490f0}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include">
+ <UniqueIdentifier>{166a3203-ccc3-4eff-9eaa-1e5648a7fb5b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\lwip">
+ <UniqueIdentifier>{6b889738-b59a-450a-b4dd-0d1986bffca1}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\lwip\apps">
+ <UniqueIdentifier>{c64c0664-acd9-4f2f-8bd7-78250f4b7b4b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\lwip\priv">
+ <UniqueIdentifier>{56e8d041-f1e0-4b02-a173-563190c0eb4a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\netif">
+ <UniqueIdentifier>{dc783ea8-63ed-4de6-b576-a87c318a7ad1}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\netif\ppp">
+ <UniqueIdentifier>{7822191b-1cd0-4ce8-a852-da0474977fc4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\netif\ppp\polarssl">
+ <UniqueIdentifier>{b22a3b7a-d076-44a5-9a16-1e6f49cd5a94}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\netif">
+ <UniqueIdentifier>{0109fdbb-3aed-45fa-a308-493988755364}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\netif\ppp">
+ <UniqueIdentifier>{32a9c4ed-7687-48bb-8b9d-482c2f6c7554}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\netif\ppp\polarssl">
+ <UniqueIdentifier>{c6c4a1a7-dab8-4463-b155-07e7303b54e4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="arch">
+ <UniqueIdentifier>{2e87d0f7-38a3-45f8-870d-f8622c20e9d9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\http">
+ <UniqueIdentifier>{45f6a578-1f4b-4741-9b55-5b5084ecc1d9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\mdns">
+ <UniqueIdentifier>{92215272-cad9-4cf0-a2e1-705f6220e2a9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\lwip\prot">
+ <UniqueIdentifier>{bdd3995a-aa34-4a4e-891e-a13c5373d618}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="doc\doxygen">
+ <UniqueIdentifier>{d0ce6e8b-4b30-498b-a1bb-aecee958df42}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\tftp">
+ <UniqueIdentifier>{6db73869-23f6-48ab-8d92-c8e478e55892}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\mqtt">
+ <UniqueIdentifier>{65542a97-c588-47b3-b1f6-ae51645c736e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\altcp_tls">
+ <UniqueIdentifier>{ffd283f4-44f0-4be2-83a3-8bd55f29e80f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\apps\smtp">
+ <UniqueIdentifier>{d9456888-d299-48ff-8165-ff499e5a0ba3}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat">
+ <UniqueIdentifier>{5aa786e4-df26-432c-b32c-9c4fac00b951}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat\posix">
+ <UniqueIdentifier>{8fb42d78-1e77-4208-b457-44f41c4cc901}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat\posix\sys">
+ <UniqueIdentifier>{81578f11-9d3c-4bc8-a518-6f78f082fe0e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat\posix\net">
+ <UniqueIdentifier>{f8d65087-0cee-46de-8d8c-dca719bf2a4b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat\posix\arpa">
+ <UniqueIdentifier>{91d8473a-deb5-4943-8b63-b43d86c7fa1c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\include\compat\stdc">
+ <UniqueIdentifier>{15855a74-48c6-473c-b4cb-40ec065698d4}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="example_app">
+ <UniqueIdentifier>{2c795490-531d-4a03-b30d-73760b09975a}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\..\CHANGELOG" />
+ <None Include="..\..\..\..\COPYING" />
+ <None Include="..\..\..\..\FILES" />
+ <None Include="..\..\..\..\README" />
+ <None Include="..\..\..\..\UPGRADING" />
+ <None Include="..\..\..\..\doc\contrib.txt">
+ <Filter>doc</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\FILES">
+ <Filter>doc</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\mdns.txt">
+ <Filter>doc</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\ppp.txt">
+ <Filter>doc</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\savannah.txt">
+ <Filter>doc</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\doxygen\generate.bat">
+ <Filter>doc\doxygen</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\doxygen\generate.sh">
+ <Filter>doc\doxygen</Filter>
+ </None>
+ <None Include="..\..\..\..\doc\doxygen\lwip.Doxyfile">
+ <Filter>doc\doxygen</Filter>
+ </None>
+ <None Include="..\..\..\examples\example_app\lwipcfg.h.example">
+ <Filter>example_app</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\src\api\api_lib.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\api_msg.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\err.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\netbuf.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\netdb.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\netifapi.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\sockets.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\tcpip.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\lwiperf\lwiperf.c">
+ <Filter>src\apps\lwiperf</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\netbiosns\netbiosns.c">
+ <Filter>src\apps\netbiosns</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\sntp\sntp.c">
+ <Filter>src\apps\sntp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\def.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\dns.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\inet_chksum.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\init.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\mem.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\memp.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\netif.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\pbuf.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\raw.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\stats.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\sys.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\tcp.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\tcp_in.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\tcp_out.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\udp.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\acd.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\autoip.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\dhcp.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\icmp.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\igmp.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4_addr.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\dhcp6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ethip6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\icmp6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\inet6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6_addr.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\ip6_frag.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\mld6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv6\nd6.c">
+ <Filter>src\core\ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ethernet.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\slipif.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\auth.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ccp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap-md5.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap-new.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\chap_ms.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\demand.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\eap.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ecp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\eui64.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\fsm.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ipcp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ipv6cp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\lcp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\magic.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\mppe.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\multilink.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\ppp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppcrypt.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppoe.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppol2tp.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppos.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\upap.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\utils.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\vj.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\arc4.c">
+ <Filter>src\netif\ppp\polarssl</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\des.c">
+ <Filter>src\netif\ppp\polarssl</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\md4.c">
+ <Filter>src\netif\ppp\polarssl</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\md5.c">
+ <Filter>src\netif\ppp\polarssl</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\polarssl\sha1.c">
+ <Filter>src\netif\ppp\polarssl</Filter>
+ </ClCompile>
+ <ClCompile Include="..\sio.c">
+ <Filter>arch</Filter>
+ </ClCompile>
+ <ClCompile Include="..\sys_arch.c">
+ <Filter>arch</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\httpd.c">
+ <Filter>src\apps\http</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\fsdata.c">
+ <Filter>src\apps\http</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\fs.c">
+ <Filter>src\apps\http</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_asn1.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_core.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_msg.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_netconn.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_pbuf_stream.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_raw.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_scalar.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_table.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_threadsync.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_traps.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ip.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_icmp.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_interfaces.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_ip.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_snmp.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_system.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_tcp.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_mib2_udp.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmpv3.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\ppp\pppapi.c">
+ <Filter>src\netif\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\etharp.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\ipv4\ip4_frag.c">
+ <Filter>src\core\ipv4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\timeouts.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns.c">
+ <Filter>src\apps\mdns</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmpv3_mbedtls.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\doc\NO_SYS_SampleCode.c">
+ <Filter>doc</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\tftp\tftp.c">
+ <Filter>src\apps\tftp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\mqtt\mqtt.c">
+ <Filter>src\apps\mqtt</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\api\if_api.c">
+ <Filter>src\api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\bridgeif.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_snmpv2_framework.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\snmp\snmp_snmpv2_usm.c">
+ <Filter>src\apps\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\altcp.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\altcp_tcp.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls.c">
+ <Filter>src\apps\altcp_tls</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_mem.c">
+ <Filter>src\apps\altcp_tls</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\smtp\smtp.c">
+ <Filter>src\apps\smtp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\bridgeif_fdb.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\http_client.c">
+ <Filter>src\apps\http</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\core\altcp_alloc.c">
+ <Filter>src\core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\http\altcp_proxyconnect.c">
+ <Filter>src\apps\http</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6_ble.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\zepif.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\netif\lowpan6_common.c">
+ <Filter>src\netif</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns_domain.c">
+ <Filter>src\apps\mdns</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\src\apps\mdns\mdns_out.c">
+ <Filter>src\apps\mdns</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\lwiperf.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\netbiosns.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\netbiosns_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\sntp.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\sntp_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\acd.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\api.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\arch.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\autoip.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\debug.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\def.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\dhcp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\dhcp6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\dns.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\err.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ethip6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\icmp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\icmp6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\igmp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\inet.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\inet_chksum.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\init.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4_addr.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_addr.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_frag.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip_addr.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\mem.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\memp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\mld6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\nd6.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\netbuf.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\netdb.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\netif.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\netifapi.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\opt.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\pbuf.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\raw.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\sio.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\snmp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\sockets.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\stats.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\sys.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\tcp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\tcpip.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\udp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\etharp.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ethernet.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_opts.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\slipif.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ccp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap-md5.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap-new.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\chap_ms.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\eap.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ecp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\eui64.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\fsm.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ipcp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ipv6cp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\lcp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\magic.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\mppe.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp_impl.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\ppp_opts.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppcrypt.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppdebug.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppoe.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppol2tp.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppos.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\upap.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\vj.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\arc4.h">
+ <Filter>src\include\netif\ppp\polarssl</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\des.h">
+ <Filter>src\include\netif\ppp\polarssl</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\md4.h">
+ <Filter>src\include\netif\ppp\polarssl</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\md5.h">
+ <Filter>src\include\netif\ppp\polarssl</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\polarssl\sha1.h">
+ <Filter>src\include\netif\ppp\polarssl</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\arch\bpstruct.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\arch\cc.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\arch\epstruct.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\arch\perf.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\arch\sys_arch.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\tcp_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\tcpip_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\memp_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\memp_std.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\api_msg.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\http\httpd_structs.h">
+ <Filter>src\apps\http</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\http\fsdata.h">
+ <Filter>src\apps\http</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_asn1.h">
+ <Filter>src\apps\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_core_priv.h">
+ <Filter>src\apps\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_pbuf_stream.h">
+ <Filter>src\apps\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_core.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_mib2.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_scalar.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_table.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_threadsync.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmp_msg.h">
+ <Filter>src\apps\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ppp\pppapi.h">
+ <Filter>src\include\netif\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\fs.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\httpd.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\httpd_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmpv3.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\etharp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip4_frag.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\timeouts.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\acd.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\autoip.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dhcp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dns.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip4.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\snmp\snmpv3_priv.h">
+ <Filter>src\apps\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ethernet.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\icmp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\icmp6.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ip6.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\mld6.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\nd6.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\tcp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\udp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_priv.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\igmp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\etharp.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\doc\doxygen\main_page.h">
+ <Filter>doc\doxygen</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_client.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_common.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\tftp_server.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\errno.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\nd6_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\if_api.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\ip6_zone.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\sockets_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\bridgeif.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\bridgeif_opts.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp_tcp.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_mem.h">
+ <Filter>src\apps\altcp_tls</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\apps\altcp_tls\altcp_tls_mbedtls_structs.h">
+ <Filter>src\apps\altcp_tls</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\altcp_tls.h">
+ <Filter>src\include\lwip</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\altcp_tls_mbedtls_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_snmpv2_framework.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\snmp_snmpv2_usm.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\smtp.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\smtp_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\altcp_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt_priv.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mqtt_opts.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\sys\socket.h">
+ <Filter>src\include\compat\posix\sys</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\netdb.h">
+ <Filter>src\include\compat\posix</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\net\if.h">
+ <Filter>src\include\compat\posix\net</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\compat\posix\arpa\inet.h">
+ <Filter>src\include\compat\posix\arpa</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\compat\stdc\errno.h">
+ <Filter>src\include\compat\stdc</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\iana.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\ieee.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\raw_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\priv\mem_priv.h">
+ <Filter>src\include\lwip\priv</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\http_client.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\altcp_proxyconnect.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\prot\dhcp6.h">
+ <Filter>src\include\lwip\prot</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_ble.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\ieee802154.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\zepif.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\netif\lowpan6_common.h">
+ <Filter>src\include\netif</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\example_app\default_netif.h">
+ <Filter>example_app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\example_app\lwipcfg.h">
+ <Filter>example_app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\example_app\lwipopts.h">
+ <Filter>example_app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\example_app\lwippools.h">
+ <Filter>example_app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\example_app\ppp_settings.h">
+ <Filter>example_app</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_domain.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\src\include\lwip\apps\mdns_out.h">
+ <Filter>src\include\lwip\apps</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP_Test.sln b/contrib/ports/win32/msvc/lwIP_Test.sln
new file mode 100644
index 00000000000..ce59abd2587
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_Test.sln
@@ -0,0 +1,37 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP_Test", "lwIP_Test.vcxproj", "{8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP pcapif", "lwIP_pcapif.vcxproj", "{6F44E49E-9F21-4144-91EC-53B92AEF62CE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP", "lwIP.vcxproj", "{2CC276FA-B226-49C9-8F82-7FCD5A228E28}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makefsdata", "makefsdata.vcxproj", "{0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Debug|Win32.Build.0 = Debug|Win32
+ {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|Win32.ActiveCfg = Release|Win32
+ {8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}.Release|Win32.Build.0 = Release|Win32
+ {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Debug|Win32.Build.0 = Debug|Win32
+ {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|Win32.ActiveCfg = Release|Win32
+ {6F44E49E-9F21-4144-91EC-53B92AEF62CE}.Release|Win32.Build.0 = Release|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.Build.0 = Debug|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.ActiveCfg = Release|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.Build.0 = Release|Win32
+ {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Debug|Win32.Build.0 = Debug|Win32
+ {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|Win32.ActiveCfg = Release|Win32
+ {0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/ports/win32/msvc/lwIP_Test.vcxproj b/contrib/ports/win32/msvc/lwIP_Test.vcxproj
new file mode 100644
index 00000000000..37d4dab2af4
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_Test.vcxproj
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8CC0CE51-32CF-4585-BFAF-A9343BC5A96D}</ProjectGuid>
+ <RootNamespace>lwIP_test</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\$(Configuration)\$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <TypeLibraryName>.\Release/test.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>Packet.lib;wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>$(PCAP_DIR)\Lib;..\..\..\..\..\winpcap\WpdPack\Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <ProgramDatabaseFile>.\Release/test.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
+ <DelayLoadDLLs>Packet.dll;wpcap.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <TypeLibraryName>.\Debug/test.tlb</TypeLibraryName>
+ <HeaderFileName>
+ </HeaderFileName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CONSOLE;WIN32;_DEBUG;LWIP_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>Packet.lib;wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <AdditionalLibraryDirectories>$(PCAP_DIR)\Lib;..\..\..\..\..\winpcap\WpdPack\Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ <GenerateMapFile>false</GenerateMapFile>
+ <MapFileName>$(TargetDir)$(TargetName).map</MapFileName>
+ <DelayLoadDLLs>Packet.dll;wpcap.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\addons\ipv6_static_routing\ip6_route_table.c" />
+ <ClCompile Include="..\..\..\addons\tcp_isn\tcp_isn.c" />
+ <ClCompile Include="..\..\..\apps\tcpecho_raw\tcpecho_raw.c" />
+ <ClCompile Include="..\..\..\apps\udpecho_raw\udpecho_raw.c" />
+ <ClCompile Include="..\..\..\examples\example_app\test.c" />
+ <ClCompile Include="..\..\..\examples\httpd\cgi_example\cgi_example.c" />
+ <ClCompile Include="..\..\..\examples\httpd\fs_example\fs_example.c" />
+ <ClCompile Include="..\..\..\examples\httpd\genfiles_example\genfiles_example.c" />
+ <ClCompile Include="..\..\..\examples\httpd\https_example\https_example.c" />
+ <ClCompile Include="..\..\..\examples\httpd\post_example\post_example.c" />
+ <ClCompile Include="..\..\..\examples\httpd\ssi_example\ssi_example.c" />
+ <ClCompile Include="..\..\..\examples\lwiperf\lwiperf_example.c" />
+ <ClCompile Include="..\..\..\examples\mdns\mdns_example.c" />
+ <ClCompile Include="..\..\..\examples\mqtt\mqtt_example.c" />
+ <ClCompile Include="..\..\..\examples\ppp\pppos_example.c" />
+ <ClCompile Include="..\..\..\examples\snmp\snmp_example.c" />
+ <ClCompile Include="..\..\..\examples\snmp\snmp_private_mib\lwip_prvmib.c" />
+ <ClCompile Include="..\..\..\examples\snmp\snmp_v3\snmpv3_dummy.c" />
+ <ClCompile Include="..\..\..\examples\sntp\sntp_example.c" />
+ <ClCompile Include="..\..\..\examples\tftp\tftp_example.c" />
+ <ClCompile Include="..\..\..\apps\chargen\chargen.c" />
+ <ClCompile Include="..\..\..\apps\httpserver\httpserver-netconn.c" />
+ <ClCompile Include="..\..\..\apps\netio\netio.c" />
+ <ClCompile Include="..\..\..\apps\ping\ping.c" />
+ <ClCompile Include="..\..\..\apps\rtp\rtp.c" />
+ <ClCompile Include="..\..\..\apps\shell\shell.c" />
+ <ClCompile Include="..\..\..\apps\socket_examples\socket_examples.c" />
+ <ClCompile Include="..\..\..\apps\tcpecho\tcpecho.c" />
+ <ClCompile Include="..\..\..\apps\udpecho\udpecho.c" />
+ <ClCompile Include="..\example_app\default_netif.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\addons\ipv6_static_routing\ip6_route_table.h" />
+ <ClInclude Include="..\..\..\addons\tcp_isn\tcp_isn.h" />
+ <ClInclude Include="..\..\..\apps\chargen\chargen.h" />
+ <ClInclude Include="..\..\..\apps\httpserver\httpserver-netconn.h" />
+ <ClInclude Include="..\..\..\apps\netio\netio.h" />
+ <ClInclude Include="..\..\..\apps\ping\ping.h" />
+ <ClInclude Include="..\..\..\apps\rtp\rtp.h" />
+ <ClInclude Include="..\..\..\apps\shell\shell.h" />
+ <ClInclude Include="..\..\..\apps\socket_examples\socket_examples.h" />
+ <ClInclude Include="..\..\..\apps\tcpecho\tcpecho.h" />
+ <ClInclude Include="..\..\..\apps\tcpecho_raw\tcpecho_raw.h" />
+ <ClInclude Include="..\..\..\apps\udpecho\udpecho.h" />
+ <ClInclude Include="..\..\..\apps\udpecho_raw\udpecho_raw.h" />
+ <ClInclude Include="..\..\..\examples\httpd\cgi_example\cgi_example.h" />
+ <ClInclude Include="..\..\..\examples\httpd\fs_example\fs_example.h" />
+ <ClInclude Include="..\..\..\examples\httpd\genfiles_example\genfiles_example.h" />
+ <ClInclude Include="..\..\..\examples\httpd\https_example\https_example.h" />
+ <ClInclude Include="..\..\..\examples\httpd\ssi_example\ssi_example.h" />
+ <ClInclude Include="..\..\..\examples\lwiperf\lwiperf_example.h" />
+ <ClInclude Include="..\..\..\examples\mdns\mdns_example.h" />
+ <ClInclude Include="..\..\..\examples\mqtt\mqtt_example.h" />
+ <ClInclude Include="..\..\..\examples\ppp\pppos_example.h" />
+ <ClInclude Include="..\..\..\examples\snmp\snmp_example.h" />
+ <ClInclude Include="..\..\..\examples\snmp\snmp_private_mib\private_mib.h" />
+ <ClInclude Include="..\..\..\examples\snmp\snmp_v3\snmpv3_dummy.h" />
+ <ClInclude Include="..\..\..\examples\sntp\sntp_example.h" />
+ <ClInclude Include="..\..\..\examples\tftp\tftp_example.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\addons\ipv6_static_routing\README" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="lwIP.vcxproj">
+ <Project>{2cc276fa-b226-49c9-8f82-7fcd5a228e28}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="lwIP_pcapif.vcxproj">
+ <Project>{6f44e49e-9f21-4144-91ec-53b92aef62ce}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters b/contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters
new file mode 100644
index 00000000000..52f7732ec70
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_Test.vcxproj.filters
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{e858c3d0-1558-4d47-bc6a-9d4a55ce3d3a}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Source Files\apps">
+ <UniqueIdentifier>{0582eefd-a68e-45f8-b93c-f828c4794f30}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\addons">
+ <UniqueIdentifier>{ed0627c2-099a-4da8-af0c-142003828f9f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\addons\tcp_isn">
+ <UniqueIdentifier>{4ffb2268-6fc6-44d7-8e3b-2a3f68b8d5a3}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\addons\ipv6_static_routing">
+ <UniqueIdentifier>{93b36161-88b2-448c-9c45-ac6f27b98290}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples">
+ <UniqueIdentifier>{6456d2d6-61e6-4c99-9f1f-1f225437a642}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd">
+ <UniqueIdentifier>{75bb877e-aa45-4e2e-82fe-946ddadc6a64}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\snmp">
+ <UniqueIdentifier>{78411edf-fe39-4edb-a6bd-2833755e0342}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\fs_example">
+ <UniqueIdentifier>{531dd0cf-ec13-42b7-a3bb-b837382d4ecd}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\ssi_example">
+ <UniqueIdentifier>{d71bdb12-c5ed-4823-99f0-2d537765a2eb}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\snmp\snmp_private_mib">
+ <UniqueIdentifier>{0b9db8c7-f352-4ca6-86c6-1a6c58482c5d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\snmp\snmp_v3">
+ <UniqueIdentifier>{97f0ea5c-16cf-4640-a6b3-ace059ed2388}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\cgi_example">
+ <UniqueIdentifier>{24079d2d-aab1-49f9-b0fa-57910a18b93a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\genfiles_example">
+ <UniqueIdentifier>{d38ed32b-9498-429e-a02c-08332c463725}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\post_example">
+ <UniqueIdentifier>{672a49fd-94ff-4126-8de3-e96c9c32dfb8}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\mdns">
+ <UniqueIdentifier>{e5276e3f-3e2a-4376-aee3-85aafd12c77b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\tftp">
+ <UniqueIdentifier>{f6d95ce0-df4f-4988-8654-624468dd4ecd}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\sntp">
+ <UniqueIdentifier>{a37e5539-232e-4d91-9c10-3d7a851b8c4c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\ppp">
+ <UniqueIdentifier>{a2a65260-5055-4a0d-bd0b-4a3ca3560918}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\lwiperf">
+ <UniqueIdentifier>{aa359e5e-131e-4f20-9e5d-416f9ae76abd}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\mqtt">
+ <UniqueIdentifier>{bd6f1fcc-c88f-4b96-a267-401f6bf9898b}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\examples\httpd\https_example">
+ <UniqueIdentifier>{1098bc59-6867-48a3-afa4-b896510241d1}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\apps\chargen\chargen.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\httpserver\httpserver-netconn.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\netio\netio.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\ping\ping.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\rtp\rtp.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\shell\shell.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\socket_examples\socket_examples.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\tcpecho\tcpecho.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\udpecho\udpecho.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\tcpecho_raw\tcpecho_raw.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\apps\udpecho_raw\udpecho_raw.c">
+ <Filter>Source Files\apps</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\addons\tcp_isn\tcp_isn.c">
+ <Filter>Source Files\addons\tcp_isn</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\addons\ipv6_static_routing\ip6_route_table.c">
+ <Filter>Source Files\addons\ipv6_static_routing</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\fs_example\fs_example.c">
+ <Filter>Source Files\examples\httpd\fs_example</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\ssi_example\ssi_example.c">
+ <Filter>Source Files\examples\httpd\ssi_example</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\snmp\snmp_private_mib\lwip_prvmib.c">
+ <Filter>Source Files\examples\snmp\snmp_private_mib</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\snmp\snmp_v3\snmpv3_dummy.c">
+ <Filter>Source Files\examples\snmp\snmp_v3</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\cgi_example\cgi_example.c">
+ <Filter>Source Files\examples\httpd\cgi_example</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\genfiles_example\genfiles_example.c">
+ <Filter>Source Files\examples\httpd\genfiles_example</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\post_example\post_example.c">
+ <Filter>Source Files\examples\httpd\post_example</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\mdns\mdns_example.c">
+ <Filter>Source Files\examples\mdns</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\tftp\tftp_example.c">
+ <Filter>Source Files\examples\tftp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\snmp\snmp_example.c">
+ <Filter>Source Files\examples\snmp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\sntp\sntp_example.c">
+ <Filter>Source Files\examples\sntp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\ppp\pppos_example.c">
+ <Filter>Source Files\examples\ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\lwiperf\lwiperf_example.c">
+ <Filter>Source Files\examples\lwiperf</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\mqtt\mqtt_example.c">
+ <Filter>Source Files\examples\mqtt</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\example_app\test.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\example_app\default_netif.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\examples\httpd\https_example\https_example.c">
+ <Filter>Source Files\examples\httpd\https_example</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\apps\chargen\chargen.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\httpserver\httpserver-netconn.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\netio\netio.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\ping\ping.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\rtp\rtp.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\shell\shell.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\socket_examples\socket_examples.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\tcpecho\tcpecho.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\udpecho\udpecho.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\tcpecho_raw\tcpecho_raw.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\apps\udpecho_raw\udpecho_raw.h">
+ <Filter>Source Files\apps</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\addons\tcp_isn\tcp_isn.h">
+ <Filter>Source Files\addons\tcp_isn</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\addons\ipv6_static_routing\ip6_route_table.h">
+ <Filter>Source Files\addons\ipv6_static_routing</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\httpd\fs_example\fs_example.h">
+ <Filter>Source Files\examples\httpd\fs_example</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\httpd\ssi_example\ssi_example.h">
+ <Filter>Source Files\examples\httpd\ssi_example</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\snmp\snmp_private_mib\private_mib.h">
+ <Filter>Source Files\examples\snmp\snmp_private_mib</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\snmp\snmp_v3\snmpv3_dummy.h">
+ <Filter>Source Files\examples\snmp\snmp_v3</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\httpd\cgi_example\cgi_example.h">
+ <Filter>Source Files\examples\httpd\cgi_example</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\httpd\genfiles_example\genfiles_example.h">
+ <Filter>Source Files\examples\httpd\genfiles_example</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\mdns\mdns_example.h">
+ <Filter>Source Files\examples\mdns</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\tftp\tftp_example.h">
+ <Filter>Source Files\examples\tftp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\snmp\snmp_example.h">
+ <Filter>Source Files\examples\snmp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\sntp\sntp_example.h">
+ <Filter>Source Files\examples\sntp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\ppp\pppos_example.h">
+ <Filter>Source Files\examples\ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\lwiperf\lwiperf_example.h">
+ <Filter>Source Files\examples\lwiperf</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\mqtt\mqtt_example.h">
+ <Filter>Source Files\examples\mqtt</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\examples\httpd\https_example\https_example.h">
+ <Filter>Source Files\examples\httpd\https_example</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="..\..\..\addons\ipv6_static_routing\README">
+ <Filter>Source Files\addons\ipv6_static_routing</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj
new file mode 100644
index 00000000000..1bfdfb1741a
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectName>lwIP pcapif</ProjectName>
+ <ProjectGuid>{6F44E49E-9F21-4144-91EC-53B92AEF62CE}</ProjectGuid>
+ <RootNamespace>lwIP pcapif</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\$(Configuration)\$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;.\;$(PCAP_DIR)\Include;..\..\..\..\..\winpcap\WpdPack\Include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib />
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;.\;$(PCAP_DIR)\Include;..\..\..\..\..\winpcap\WpdPack\Include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
+ <ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <CompileAs>Default</CompileAs>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x0407</Culture>
+ </ResourceCompile>
+ <Lib>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\pcapif.c" />
+ <ClCompile Include="..\pcapif_helper.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\pcapif.h" />
+ <ClInclude Include="..\pcapif_helper.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="lwIP.vcxproj">
+ <Project>{2cc276fa-b226-49c9-8f82-7fcd5a228e28}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters
new file mode 100644
index 00000000000..f933f17ac89
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_pcapif.vcxproj.filters
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{0d38b8c3-e694-4572-89b8-fc6e825a092d}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{e5ce29d5-319e-4e99-978b-b88e8d6167e4}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\pcapif.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\pcapif_helper.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\pcapif.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\pcapif_helper.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwIP_unittests.sln b/contrib/ports/win32/msvc/lwIP_unittests.sln
new file mode 100644
index 00000000000..2dfefb06445
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwIP_unittests.sln
@@ -0,0 +1,31 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwip_unittests", "lwip_unittests.vcxproj", "{6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lwIP", "lwIP.vcxproj", "{2CC276FA-B226-49C9-8F82-7FCD5A228E28}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcheck", "libcheck.vcxproj", "{EBB156DC-01BF-47B2-B69C-1A750B6B5F09}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Debug|Win32.Build.0 = Debug|Win32
+ {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|Win32.ActiveCfg = Release|Win32
+ {6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}.Release|Win32.Build.0 = Release|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.ActiveCfg = Debug unittests|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Debug|Win32.Build.0 = Debug unittests|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.ActiveCfg = Release unittests|Win32
+ {2CC276FA-B226-49C9-8F82-7FCD5A228E28}.Release|Win32.Build.0 = Release unittests|Win32
+ {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Debug|Win32.Build.0 = Debug|Win32
+ {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|Win32.ActiveCfg = Release|Win32
+ {EBB156DC-01BF-47B2-B69C-1A750B6B5F09}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/ports/win32/msvc/lwip_unittests.vcxproj b/contrib/ports/win32/msvc/lwip_unittests.vcxproj
new file mode 100644
index 00000000000..17577d9a81a
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwip_unittests.vcxproj
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{6CCABAA4-F86F-4119-AFF8-43C9A4A234C2}</ProjectGuid>
+ <RootNamespace>lwip_unittests</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\$(ProjectName)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\check;..\..\..\..\..\check\src;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_LIB;WIN32;_DEBUG;LWIP_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <WarningLevel>Level4</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4820</DisableSpecificWarnings>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\check;..\..\..\..\..\check\src;..\..\..\..\test\unit;..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <WarningLevel>Level4</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\test\unit\api\test_sockets.c" />
+ <ClCompile Include="..\..\..\..\test\unit\arch\sys_arch.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_def.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_dns.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_mem.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_netif.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_pbuf.c" />
+ <ClCompile Include="..\..\..\..\test\unit\core\test_timers.c" />
+ <ClCompile Include="..\..\..\..\test\unit\ip4\test_ip4.c" />
+ <ClCompile Include="..\..\..\..\test\unit\ip6\test_ip6.c" />
+ <ClCompile Include="..\..\..\..\test\unit\mdns\test_mdns.c" />
+ <ClCompile Include="..\..\..\..\test\unit\mqtt\test_mqtt.c" />
+ <ClCompile Include="..\..\..\..\test\unit\ppp\test_pppos.c" />
+ <ClCompile Include="..\..\..\..\test\unit\tcp\tcp_helper.c" />
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp.c" />
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp_oos.c" />
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp_state.c" />
+ <ClCompile Include="..\..\..\..\test\unit\udp\test_udp.c" />
+ <ClCompile Include="..\..\..\..\test\unit\etharp\test_etharp.c" />
+ <ClCompile Include="..\..\..\..\test\unit\dhcp\test_dhcp.c" />
+ <ClCompile Include="..\..\..\..\test\unit\lwip_unittests.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\test\unit\api\test_sockets.h" />
+ <ClInclude Include="..\..\..\..\test\unit\arch\sys_arch.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_def.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_dns.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_mem.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_netif.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_pbuf.h" />
+ <ClInclude Include="..\..\..\..\test\unit\core\test_timers.h" />
+ <ClInclude Include="..\..\..\..\test\unit\ip4\test_ip4.h" />
+ <ClInclude Include="..\..\..\..\test\unit\ip6\test_ip6.h" />
+ <ClInclude Include="..\..\..\..\test\unit\mdns\test_mdns.h" />
+ <ClInclude Include="..\..\..\..\test\unit\mqtt\test_mqtt.h" />
+ <ClInclude Include="..\..\..\..\test\unit\ppp\test_pppos.h" />
+ <ClInclude Include="..\..\..\..\test\unit\tcp\tcp_helper.h" />
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp.h" />
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp_oos.h" />
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp_state.h" />
+ <ClInclude Include="..\..\..\..\test\unit\udp\test_udp.h" />
+ <ClInclude Include="..\..\..\..\test\unit\etharp\test_etharp.h" />
+ <ClInclude Include="..\..\..\..\test\unit\dhcp\test_dhcp.h" />
+ <ClInclude Include="..\..\..\..\test\unit\lwip_check.h" />
+ <ClInclude Include="..\..\..\..\test\unit\lwipopts.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="libcheck.vcxproj">
+ <Project>{ebb156dc-01bf-47b2-b69c-1a750b6b5f09}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ <ProjectReference Include="lwIP.vcxproj">
+ <Project>{2cc276fa-b226-49c9-8f82-7fcd5a228e28}</Project>
+ <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters b/contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters
new file mode 100644
index 00000000000..bbac4e7be3c
--- /dev/null
+++ b/contrib/ports/win32/msvc/lwip_unittests.vcxproj.filters
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="core">
+ <UniqueIdentifier>{e351c538-9f2b-4a01-bf46-3ee8873cbc0f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="tcp">
+ <UniqueIdentifier>{5805c4bc-32c1-49cf-a35e-af58757e2d7a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="udp">
+ <UniqueIdentifier>{173ba4ab-b194-4933-8e02-319044c2a8fa}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="etharp">
+ <UniqueIdentifier>{70c655a7-f40f-4728-b586-33fd9598b355}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="dhcp">
+ <UniqueIdentifier>{a6b60d4e-4b81-44f2-9408-2e45cc769391}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="mdns">
+ <UniqueIdentifier>{d454902e-ce5b-48ae-a690-e6490bdbbf17}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="api">
+ <UniqueIdentifier>{d9501476-6102-4f14-90bd-35322fbd2fb2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="arch">
+ <UniqueIdentifier>{b04f182c-1910-456d-9388-397dfe82dbc9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="mqtt">
+ <UniqueIdentifier>{fd48ae04-ec85-478f-a97c-a7c8384a2d94}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="ip4">
+ <UniqueIdentifier>{fe93fc95-f1af-4a1f-a086-c1771dbf4d79}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="ipv6">
+ <UniqueIdentifier>{924d29be-e5e4-4b25-8bc4-92db91ce4c49}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="ppp">
+ <UniqueIdentifier>{4d24c808-c024-4aba-a214-e5bc276e124d}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_mem.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_pbuf.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\tcp\tcp_helper.c">
+ <Filter>tcp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp.c">
+ <Filter>tcp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp_oos.c">
+ <Filter>tcp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\udp\test_udp.c">
+ <Filter>udp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\etharp\test_etharp.c">
+ <Filter>etharp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\dhcp\test_dhcp.c">
+ <Filter>dhcp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\lwip_unittests.c" />
+ <ClCompile Include="..\..\..\..\test\unit\mdns\test_mdns.c">
+ <Filter>mdns</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\api\test_sockets.c">
+ <Filter>api</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\arch\sys_arch.c">
+ <Filter>arch</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\mqtt\test_mqtt.c">
+ <Filter>mqtt</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\ip4\test_ip4.c">
+ <Filter>ip4</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_def.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_timers.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_netif.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\ip6\test_ip6.c">
+ <Filter>ipv6</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\core\test_dns.c">
+ <Filter>core</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\ppp\test_pppos.c">
+ <Filter>ppp</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\..\test\unit\tcp\test_tcp_state.c">
+ <Filter>tcp</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_mem.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_pbuf.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\tcp\tcp_helper.h">
+ <Filter>tcp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp.h">
+ <Filter>tcp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp_oos.h">
+ <Filter>tcp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\udp\test_udp.h">
+ <Filter>udp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\etharp\test_etharp.h">
+ <Filter>etharp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\dhcp\test_dhcp.h">
+ <Filter>dhcp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\lwip_check.h" />
+ <ClInclude Include="..\..\..\..\test\unit\lwipopts.h" />
+ <ClInclude Include="..\..\..\..\test\unit\mdns\test_mdns.h">
+ <Filter>mdns</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\api\test_sockets.h">
+ <Filter>api</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\arch\sys_arch.h">
+ <Filter>arch</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\mqtt\test_mqtt.h">
+ <Filter>mqtt</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\ip4\test_ip4.h">
+ <Filter>ip4</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_def.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_timers.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_netif.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\ip6\test_ip6.h">
+ <Filter>ipv6</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\core\test_dns.h">
+ <Filter>core</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\ppp\test_pppos.h">
+ <Filter>ppp</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\..\test\unit\tcp\test_tcp_state.h">
+ <Filter>tcp</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/makefsdata.vcxproj b/contrib/ports/win32/msvc/makefsdata.vcxproj
new file mode 100644
index 00000000000..5881642d23f
--- /dev/null
+++ b/contrib/ports/win32/msvc/makefsdata.vcxproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\src\apps\http\makefsdata\makefsdata.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{0BFC0F21-8E84-4E68-A9E1-CE2A09B72F6D}</ProjectGuid>
+ <RootNamespace>makefsdata</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v143</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <AdditionalIncludeDirectories>..\..\..\..\src\include;..\..\..\..\src\include\ipv4;..\..\..\..\src\include\ipv6;..\include;..\..\..\examples\example_app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/msvc/makefsdata.vcxproj.filters b/contrib/ports/win32/msvc/makefsdata.vcxproj.filters
new file mode 100644
index 00000000000..0f0210dc858
--- /dev/null
+++ b/contrib/ports/win32/msvc/makefsdata.vcxproj.filters
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Quelldateien">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\..\src\apps\http\makefsdata\makefsdata.c">
+ <Filter>Quelldateien</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/contrib/ports/win32/pcapif.c b/contrib/ports/win32/pcapif.c
new file mode 100644
index 00000000000..58a42b4efb3
--- /dev/null
+++ b/contrib/ports/win32/pcapif.c
@@ -0,0 +1,1124 @@
+/**
+ * pcapif.c - This file is part of lwIP pcapif
+ *
+ ****************************************************************************
+ *
+ * This file is derived from an example in lwIP with the following license:
+ *
+ * Copyright (c) 2001, 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. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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 the port-dependent configuration */
+#include "lwipcfg.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef _MSC_VER
+#pragma warning( push, 3 )
+#include "pcap.h"
+#pragma warning ( pop )
+#else
+/* e.g. mingw */
+#define _MSC_VER 1500
+#include "pcap.h"
+#undef _MSC_VER
+#endif
+
+#include "lwip/opt.h"
+
+#if LWIP_ETHERNET
+
+#include "pcapif.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "lwip/debug.h"
+
+#include "lwip/def.h"
+#include "lwip/mem.h"
+#include "lwip/pbuf.h"
+#include "lwip/stats.h"
+#include "lwip/sys.h"
+#include "lwip/ip.h"
+#include "lwip/snmp.h"
+#include "lwip/tcpip.h"
+#include "lwip/timeouts.h"
+#include "lwip/ethip6.h"
+
+#include "lwip/etharp.h"
+
+/* For compatibility with old pcap */
+#ifndef PCAP_OPENFLAG_PROMISCUOUS
+#define PCAP_OPENFLAG_PROMISCUOUS 1
+#endif
+
+/** Set this to 0 to receive all multicast ethernet destination addresses */
+#ifndef PCAPIF_FILTER_GROUP_ADDRESSES
+#define PCAPIF_FILTER_GROUP_ADDRESSES 1
+#endif
+
+/** Set this to 1 to receive all frames (also unicast to other addresses)
+ * In this mode, filtering out our own tx packets from loopback receiving
+ * is done via matching rx against recent tx (memcmp).
+ */
+#ifndef PCAPIF_RECEIVE_PROMISCUOUS
+#define PCAPIF_RECEIVE_PROMISCUOUS 0
+#endif
+
+/* Define those to better describe your network interface.
+ For now, we use 'e0', 'e1', 'e2' and so on */
+#define IFNAME0 'e'
+#define IFNAME1 '0'
+
+/** index of the network adapter to use for lwIP */
+#ifndef PACKET_LIB_ADAPTER_NR
+#define PACKET_LIB_ADAPTER_NR 0
+#endif
+
+/** If 1, check link state and report it to lwIP.
+ * If 0, don't check link state (lwIP link state is always UP).
+ */
+#ifndef PCAPIF_HANDLE_LINKSTATE
+#define PCAPIF_HANDLE_LINKSTATE 1
+#endif
+
+/** If 1, use PBUF_REF for RX (for testing purposes mainly).
+ * For this, LWIP_SUPPORT_CUSTOM_PBUF must be enabled.
+ * Also, PBUF_POOL_BUFSIZE must be set high enough to ensure all rx packets
+ * fit into a single pbuf.
+ */
+#ifndef PCAPIF_RX_REF
+#define PCAPIF_RX_REF 0
+#endif
+
+/** This can be used when netif->state is used for something else in your
+ * application (e.g. when wrapping a class around this interface). Just
+ * make sure this define returns the state pointer set by
+ * pcapif_low_level_init() (e.g. by using an offset or a callback).
+ */
+#ifndef PCAPIF_GET_STATE_PTR
+#define PCAPIF_GET_STATE_PTR(netif) ((netif)->state)
+#endif
+
+/** Define this to 1 to allocate readonly pbufs for RX (needs PCAPIF_RX_REF,
+ * only implemented for windows, for now)
+ */
+#ifndef PCAPIF_RX_READONLY
+#define PCAPIF_RX_READONLY 0
+#endif
+
+#if PCAPIF_HANDLE_LINKSTATE
+#include "pcapif_helper.h"
+
+/* Define "PHY" delay when "link up" */
+#ifndef PCAPIF_LINKUP_DELAY
+#define PCAPIF_LINKUP_DELAY 0
+#endif
+
+#define PCAPIF_LINKCHECK_INTERVAL_MS 500
+
+/* link state notification macro */
+#if PCAPIF_LINKUP_DELAY
+#define PCAPIF_NOTIFY_LINKSTATE(netif, linkfunc) sys_timeout(PCAPIF_LINKUP_DELAY, (sys_timeout_handler)linkfunc, netif)
+#else /* PHY_LINKUP_DELAY */
+#define PCAPIF_NOTIFY_LINKSTATE(netif, linkfunc) linkfunc(netif)
+#endif /* PHY_LINKUP_DELAY */
+
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+
+/* Define PCAPIF_RX_LOCK_LWIP and PCAPIF_RX_UNLOCK_LWIP if you need to lock the lwIP core
+ before/after pbuf_alloc() or netif->input() are called on RX. */
+#ifndef PCAPIF_RX_LOCK_LWIP
+#define PCAPIF_RX_LOCK_LWIP()
+#endif
+#ifndef PCAPIF_RX_UNLOCK_LWIP
+#define PCAPIF_RX_UNLOCK_LWIP()
+#endif
+
+#define ETH_MIN_FRAME_LEN 60U
+#define ETH_MAX_FRAME_LEN 1518U
+
+#define ADAPTER_NAME_LEN 128
+#define ADAPTER_DESC_LEN 128
+
+#if PCAPIF_RECEIVE_PROMISCUOUS
+#ifndef PCAPIF_LOOPBACKFILTER_NUM_TX_PACKETS
+#define PCAPIF_LOOPBACKFILTER_NUM_TX_PACKETS 128
+#endif
+struct pcapipf_pending_packet {
+ struct pcapipf_pending_packet *next;
+ u16_t len;
+ u8_t data[ETH_MAX_FRAME_LEN];
+};
+#endif /* PCAPIF_RECEIVE_PROMISCUOUS */
+
+/* Packet Adapter information */
+struct pcapif_private {
+ void *input_fn_arg;
+ pcap_t *adapter;
+ char name[ADAPTER_NAME_LEN];
+ char description[ADAPTER_DESC_LEN];
+ int shutdown_called;
+#if PCAPIF_RX_USE_THREAD
+ volatile int rx_run;
+ volatile int rx_running;
+#endif /* PCAPIF_RX_USE_THREAD */
+#if PCAPIF_HANDLE_LINKSTATE
+ struct pcapifh_linkstate *link_state;
+ enum pcapifh_link_event last_link_event;
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+#if PCAPIF_RECEIVE_PROMISCUOUS
+ struct pcapipf_pending_packet packets[PCAPIF_LOOPBACKFILTER_NUM_TX_PACKETS];
+ struct pcapipf_pending_packet *tx_packets;
+ struct pcapipf_pending_packet *free_packets;
+#endif /* PCAPIF_RECEIVE_PROMISCUOUS */
+};
+
+#if PCAPIF_RECEIVE_PROMISCUOUS
+static void
+pcapif_init_tx_packets(struct pcapif_private *priv)
+{
+ int i;
+ priv->tx_packets = NULL;
+ priv->free_packets = NULL;
+ for (i = 0; i < PCAPIF_LOOPBACKFILTER_NUM_TX_PACKETS; i++) {
+ struct pcapipf_pending_packet *pack = &priv->packets[i];
+ pack->len = 0;
+ pack->next = priv->free_packets;
+ priv->free_packets = pack;
+ }
+}
+
+static void
+pcapif_add_tx_packet(struct pcapif_private *priv, unsigned char *buf, u16_t tot_len)
+{
+ struct pcapipf_pending_packet *tx;
+ struct pcapipf_pending_packet *pack;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ /* get a free packet (locked) */
+ SYS_ARCH_PROTECT(lev);
+ pack = priv->free_packets;
+ if ((pack == NULL) && (priv->tx_packets != NULL)) {
+ /* no free packets, reuse the oldest */
+ pack = priv->tx_packets;
+ priv->tx_packets = pack->next;
+ }
+ LWIP_ASSERT("no free packet", pack != NULL);
+ priv->free_packets = pack->next;
+ pack->next = NULL;
+ SYS_ARCH_UNPROTECT(lev);
+
+ /* set up the packet (unlocked) */
+ pack->len = tot_len;
+ memcpy(pack->data, buf, tot_len);
+
+ /* put the packet on the list (locked) */
+ SYS_ARCH_PROTECT(lev);
+ if (priv->tx_packets != NULL) {
+ for (tx = priv->tx_packets; tx->next != NULL; tx = tx->next);
+ LWIP_ASSERT("bug", tx != NULL);
+ tx->next = pack;
+ } else {
+ priv->tx_packets = pack;
+ }
+ SYS_ARCH_UNPROTECT(lev);
+}
+
+static int
+pcapif_compare_packets(struct pcapipf_pending_packet *pack, const void *packet, int packet_len)
+{
+ if (pack->len == packet_len) {
+ if (!memcmp(pack->data, packet, packet_len)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int
+pcaipf_is_tx_packet(struct netif *netif, const void *packet, int packet_len)
+{
+ struct pcapif_private *priv = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+ struct pcapipf_pending_packet *iter, *last;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ last = priv->tx_packets;
+ if (last == NULL) {
+ /* list is empty */
+ return 0;
+ }
+ /* compare the first packet */
+ if (pcapif_compare_packets(last, packet, packet_len)) {
+ SYS_ARCH_PROTECT(lev);
+ LWIP_ASSERT("list has changed", last == priv->tx_packets);
+ priv->tx_packets = last->next;
+ last->next = priv->free_packets;
+ priv->free_packets = last;
+ last->len = 0;
+ SYS_ARCH_UNPROTECT(lev);
+ return 1;
+ }
+ SYS_ARCH_PROTECT(lev);
+ for (iter = last->next; iter != NULL; last = iter, iter = iter->next) {
+ /* unlock while comparing (this works because we have a clean threading separation
+ of adding and removing items and adding is only done at the end) */
+ SYS_ARCH_UNPROTECT(lev);
+ if (pcapif_compare_packets(iter, packet, packet_len)) {
+ SYS_ARCH_PROTECT(lev);
+ LWIP_ASSERT("last != NULL", last != NULL);
+ last->next = iter->next;
+ iter->next = priv->free_packets;
+ priv->free_packets = iter;
+ last->len = 0;
+ SYS_ARCH_UNPROTECT(lev);
+ return 1;
+ }
+ SYS_ARCH_PROTECT(lev);
+ }
+ SYS_ARCH_UNPROTECT(lev);
+ return 0;
+}
+#else /* PCAPIF_RECEIVE_PROMISCUOUS */
+#define pcapif_init_tx_packets(priv)
+#define pcapif_add_tx_packet(priv, buf, tot_len)
+static int
+pcaipf_is_tx_packet(struct netif *netif, const void *packet, int packet_len)
+{
+ const struct eth_addr *src = (const struct eth_addr *)packet + 1;
+ if (packet_len >= (ETH_HWADDR_LEN * 2)) {
+ /* Don't let feedback packets through (limitation in winpcap?) */
+ if(!memcmp(src, netif->hwaddr, ETH_HWADDR_LEN)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+#endif /* PCAPIF_RECEIVE_PROMISCUOUS */
+
+#if PCAPIF_RX_REF
+struct pcapif_pbuf_custom
+{
+ struct pbuf_custom pc;
+#if PCAPIF_RX_READONLY
+ void *ro_mem;
+#else
+ struct pbuf* p;
+#endif
+};
+#endif /* PCAPIF_RX_REF */
+
+/* Forward declarations. */
+static void pcapif_input(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *packet);
+
+#ifdef PACKET_LIB_GET_ADAPTER_NETADDRESS
+/** Get the index of an adapter by its network address
+ *
+ * @param netaddr network address of the adapter (e.g. 192.168.1.0)
+ * @return index of the adapter or negative on error
+ */
+static int
+get_adapter_index_from_addr(struct in_addr *netaddr, char *guid, size_t guid_len)
+{
+ pcap_if_t *alldevs;
+ pcap_if_t *d;
+ char errbuf[PCAP_ERRBUF_SIZE+1];
+ int index = 0;
+
+ memset(guid, 0, guid_len);
+
+ /* Retrieve the interfaces list */
+ if (pcap_findalldevs(&alldevs, errbuf) == -1) {
+ printf("Error in pcap_findalldevs: %s\n", errbuf);
+ return -1;
+ }
+ /* Scan the list printing every entry */
+ for (d = alldevs; d != NULL; d = d->next, index++) {
+ pcap_addr_t *a;
+ for(a = d->addresses; a != NULL; a = a->next) {
+ if (a->addr->sa_family == AF_INET) {
+ ULONG a_addr = ((struct sockaddr_in *)a->addr)->sin_addr.s_addr;
+ ULONG a_netmask = ((struct sockaddr_in *)a->netmask)->sin_addr.s_addr;
+ ULONG a_netaddr = a_addr & a_netmask;
+ ULONG addr = (*netaddr).s_addr;
+ if (a_netaddr == addr) {
+ int ret = -1;
+ char name[128];
+ char *start, *end;
+ size_t len = strlen(d->name);
+ if(len > 127) {
+ len = 127;
+ }
+ MEMCPY(name, d->name, len);
+ name[len] = 0;
+ start = strstr(name, "{");
+ if (start != NULL) {
+ end = strstr(start, "}");
+ if (end != NULL) {
+ size_t len = end - start + 1;
+ MEMCPY(guid, start, len);
+ ret = index;
+ }
+ }
+ pcap_freealldevs(alldevs);
+ return ret;
+ }
+ }
+ }
+ }
+ printf("Network address not found.\n");
+
+ pcap_freealldevs(alldevs);
+ return -1;
+}
+#endif /* PACKET_LIB_GET_ADAPTER_NETADDRESS */
+
+#if defined(PACKET_LIB_GET_ADAPTER_NETADDRESS) || defined(PACKET_LIB_ADAPTER_GUID)
+/** Get the index of an adapter by its GUID
+ *
+ * @param adapter_guid GUID of the adapter
+ * @return index of the adapter or negative on error
+ */
+static int
+get_adapter_index(const char* adapter_guid)
+{
+ pcap_if_t *alldevs;
+ pcap_if_t *d;
+ char errbuf[PCAP_ERRBUF_SIZE+1];
+ int idx = 0;
+
+ /* Retrieve the interfaces list */
+ if (pcap_findalldevs(&alldevs, errbuf) == -1) {
+ printf("Error in pcap_findalldevs: %s\n", errbuf);
+ return -1;
+ }
+ /* Scan the list and compare name vs. adapter_guid */
+ for (d = alldevs; d != NULL; d = d->next, idx++) {
+ if(strstr(d->name, adapter_guid)) {
+ pcap_freealldevs(alldevs);
+ return idx;
+ }
+ }
+ /* not found, dump all adapters */
+ printf("%d available adapters:\n", idx);
+ for (d = alldevs, idx = 0; d != NULL; d = d->next, idx++) {
+ printf("- %d: %s\n", idx, d->name);
+ }
+ pcap_freealldevs(alldevs);
+ return -1;
+}
+#endif /* defined(PACKET_LIB_GET_ADAPTER_NETADDRESS) || defined(PACKET_LIB_ADAPTER_GUID) */
+
+static pcap_t*
+pcapif_open_adapter(const char* adapter_name, char* errbuf)
+{
+ pcap_t* adapter = pcap_open_live(adapter_name,/* name of the device */
+ 65536, /* portion of the packet to capture */
+ /* 65536 guarantees that the whole packet will be captured on all the link layers */
+ PCAP_OPENFLAG_PROMISCUOUS,/* promiscuous mode */
+#if PCAPIF_RX_USE_THREAD
+ /*-*/1, /* don't wait at all for lower latency */
+#else
+ 1, /* wait 1 ms in ethernetif_poll */
+#endif
+ errbuf); /* error buffer */
+ return adapter;
+}
+
+#if !PCAPIF_RX_USE_THREAD
+static void
+pcap_reopen_adapter(struct pcapif_private *pa)
+{
+ char errbuf[PCAP_ERRBUF_SIZE+1];
+ pcap_if_t *alldevs;
+ if (pa->adapter != NULL) {
+ pcap_close(pa->adapter);
+ pa->adapter = NULL;
+ }
+ if (pcap_findalldevs(&alldevs, errbuf) != -1) {
+ pcap_if_t *d;
+ for (d = alldevs; d != NULL; d = d->next) {
+ if (!strcmp(d->name, pa->name)) {
+ pa->adapter = pcapif_open_adapter(pa->name, errbuf);
+ if (pa->adapter == NULL) {
+ printf("failed to reopen pcap adapter after failure: %s\n", errbuf);
+ }
+ break;
+ }
+ }
+ pcap_freealldevs(alldevs);
+ }
+}
+#endif
+
+/**
+ * Open a network adapter and set it up for packet input
+ *
+ * @param adapter_num the index of the adapter to use
+ * @param arg argument to pass to input
+ * @return an adapter handle on success, NULL on failure
+ */
+static struct pcapif_private*
+pcapif_init_adapter(int adapter_num, void *arg)
+{
+ int i;
+ int number_of_adapters;
+ struct pcapif_private *pa;
+ char errbuf[PCAP_ERRBUF_SIZE+1];
+
+ pcap_if_t *alldevs;
+ pcap_if_t *d;
+ pcap_if_t *used_adapter = NULL;
+
+ pa = (struct pcapif_private *)malloc(sizeof(struct pcapif_private));
+ if (!pa) {
+ printf("Unable to alloc the adapter!\n");
+ return NULL;
+ }
+
+ memset(pa, 0, sizeof(struct pcapif_private));
+ pcapif_init_tx_packets(pa);
+ pa->input_fn_arg = arg;
+
+ /* Retrieve the interfaces list */
+ if (pcap_findalldevs(&alldevs, errbuf) == -1) {
+ free(pa);
+ return NULL; /* no adapters found */
+ }
+ /* get number of adapters and adapter pointer */
+ for (d = alldevs, number_of_adapters = 0; d != NULL; d = d->next, number_of_adapters++) {
+ if (number_of_adapters == adapter_num) {
+ char *desc = d->description;
+ size_t len;
+
+ len = strlen(d->name);
+ LWIP_ASSERT("len < ADAPTER_NAME_LEN", len < ADAPTER_NAME_LEN);
+ strcpy(pa->name, d->name);
+
+ used_adapter = d;
+ /* format vendor description */
+ if (desc != NULL) {
+ len = strlen(desc);
+ if (strstr(desc, " ' on local host") != NULL) {
+ len -= 16;
+ }
+ else if (strstr(desc, "' on local host") != NULL) {
+ len -= 15;
+ }
+ if (strstr(desc, "Network adapter '") == desc) {
+ len -= 17;
+ desc += 17;
+ }
+ len = LWIP_MIN(len, ADAPTER_DESC_LEN-1);
+ while ((desc[len-1] == ' ') || (desc[len-1] == '\t')) {
+ /* don't copy trailing whitespace */
+ len--;
+ }
+ strncpy(pa->description, desc, len);
+ pa->description[len] = 0;
+ } else {
+ strcpy(pa->description, "<no_desc>");
+ }
+ }
+ }
+
+#ifndef PCAPIF_LIB_QUIET
+ /* Scan the list printing every entry */
+ for (d = alldevs, i = 0; d != NULL; d = d->next, i++) {
+ char *desc = d->description;
+ char descBuf[128];
+ size_t len;
+ const char* devname = d->name;
+ if (d->name == NULL) {
+ devname = "<unnamed>";
+ } else {
+ if (strstr(devname, "\\Device\\") == devname) {
+ /* windows: strip the first part */
+ devname += 8;
+ }
+ }
+ printf("%2i: %s\n", i, devname);
+ if (desc != NULL) {
+ /* format vendor description */
+ len = strlen(desc);
+ if (strstr(desc, " ' on local host") != NULL) {
+ len -= 16;
+ }
+ else if (strstr(desc, "' on local host") != NULL) {
+ len -= 15;
+ }
+ if (strstr(desc, "Network adapter '") == desc) {
+ len -= 17;
+ desc += 17;
+ }
+ len = LWIP_MIN(len, 127);
+ while ((desc[len-1] == ' ') || (desc[len-1] == '\t')) {
+ /* don't copy trailing whitespace */
+ len--;
+ }
+ strncpy(descBuf, desc, len);
+ descBuf[len] = 0;
+ printf(" Desc: \"%s\"\n", descBuf);
+ }
+ }
+#endif /* PCAPIF_LIB_QUIET */
+
+ /* invalid adapter index -> check this after printing the adapters */
+ if (adapter_num < 0) {
+ printf("Invalid adapter_num: %d\n", adapter_num);
+ free(pa);
+ pcap_freealldevs(alldevs);
+ return NULL;
+ }
+ /* adapter index out of range */
+ if (adapter_num >= number_of_adapters) {
+ printf("Invalid adapter_num: %d\n", adapter_num);
+ free(pa);
+ pcap_freealldevs(alldevs);
+ return NULL;
+ }
+#ifndef PCAPIF_LIB_QUIET
+ printf("Using adapter_num: %d\n", adapter_num);
+#endif /* PCAPIF_LIB_QUIET */
+ /* set up the selected adapter */
+
+ LWIP_ASSERT("used_adapter != NULL", used_adapter != NULL);
+
+ /* Open the device */
+ pa->adapter = pcapif_open_adapter(used_adapter->name, errbuf);
+ if (pa->adapter == NULL) {
+ printf("\nUnable to open the adapter. %s is not supported by pcap (\"%s\").\n", used_adapter->name, errbuf);
+ /* Free the device list */
+ pcap_freealldevs(alldevs);
+ free(pa);
+ return NULL;
+ }
+ printf("Using adapter: \"%s\"\n", pa->description);
+ pcap_freealldevs(alldevs);
+
+#if PCAPIF_HANDLE_LINKSTATE
+ pa->link_state = pcapifh_linkstate_init(pa->name);
+ pa->last_link_event = PCAPIF_LINKEVENT_UNKNOWN;
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+
+ return pa;
+}
+
+#if PCAPIF_HANDLE_LINKSTATE
+static void
+pcapif_check_linkstate(void *netif_ptr)
+{
+ struct netif *netif = (struct netif*)netif_ptr;
+ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+ enum pcapifh_link_event le;
+
+ le = pcapifh_linkstate_get(pa->link_state);
+
+ if (pa->last_link_event != le) {
+ pa->last_link_event = le;
+ switch (le) {
+ case PCAPIF_LINKEVENT_UP: {
+ PCAPIF_NOTIFY_LINKSTATE(netif, netif_set_link_up);
+ break;
+ }
+ case PCAPIF_LINKEVENT_DOWN: {
+ PCAPIF_NOTIFY_LINKSTATE(netif, netif_set_link_down);
+ break;
+ }
+ case PCAPIF_LINKEVENT_UNKNOWN: /* fall through */
+ default:
+ break;
+ }
+ }
+ sys_timeout(PCAPIF_LINKCHECK_INTERVAL_MS, pcapif_check_linkstate, netif);
+}
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+
+
+/**
+ * Close the adapter (no more packets can be sent or received)
+ *
+ * @param netif netif to shutdown
+ */
+void
+pcapif_shutdown(struct netif *netif)
+{
+ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+ if (pa) {
+#if PCAPIF_RX_USE_THREAD
+ pa->rx_run = 0;
+#endif /* PCAPIF_RX_USE_THREAD */
+ if (pa->adapter) {
+ pcap_breakloop(pa->adapter);
+ pcap_close(pa->adapter);
+ }
+#if PCAPIF_RX_USE_THREAD
+ /* wait for rxthread to end */
+ while(pa->rx_running);
+#endif /* PCAPIF_RX_USE_THREAD */
+#if PCAPIF_HANDLE_LINKSTATE
+ pcapifh_linkstate_close(pa->link_state);
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+ free(pa);
+ }
+}
+
+#if PCAPIF_RX_USE_THREAD
+/** RX running in its own thread */
+static void
+pcapif_input_thread(void *arg)
+{
+ struct netif *netif = (struct netif *)arg;
+ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+ do
+ {
+ struct pcap_pkthdr pkt_header;
+ const u_char *packet = pcap_next(pa->adapter, &pkt_header);
+ if(packet != NULL) {
+ pcapif_input((u_char*)pa, &pkt_header, packet);
+ }
+ } while (pa->rx_run);
+ pa->rx_running = 0;
+}
+#endif /* PCAPIF_RX_USE_THREAD */
+
+/** Low-level initialization: find the correct adapter and initialize it.
+ */
+static void
+pcapif_low_level_init(struct netif *netif)
+{
+ u8_t my_mac_addr[ETH_HWADDR_LEN] = LWIP_MAC_ADDR_BASE;
+ int adapter_num = PACKET_LIB_ADAPTER_NR;
+ struct pcapif_private *pa;
+#ifdef PACKET_LIB_GET_ADAPTER_NETADDRESS
+ ip4_addr_t netaddr;
+#define GUID_LEN 128
+ char guid[GUID_LEN + 1];
+#endif /* PACKET_LIB_GET_ADAPTER_NETADDRESS */
+
+ /* If 'state' is != NULL at this point, we assume it is an 'int' giving
+ the index of the adapter to use (+ 1 because 0==NULL is invalid).
+ This can be used to instantiate multiple PCAP drivers. */
+ if (netif->state != NULL) {
+ adapter_num = (LWIP_PTR_NUMERIC_CAST(int, netif->state)) - 1;
+ if (adapter_num < 0) {
+ printf("ERROR: invalid adapter index \"%d\"!\n", adapter_num);
+ LWIP_ASSERT("ERROR initializing network adapter!", 0);
+ return;
+ }
+ }
+
+#ifdef PACKET_LIB_GET_ADAPTER_NETADDRESS
+ memset(&guid, 0, sizeof(guid));
+ PACKET_LIB_GET_ADAPTER_NETADDRESS(&netaddr);
+ if (get_adapter_index_from_addr((struct in_addr *)&netaddr, guid, GUID_LEN) < 0) {
+ printf("ERROR initializing network adapter, failed to get GUID for network address %s\n", ip4addr_ntoa(&netaddr));
+ LWIP_ASSERT("ERROR initializing network adapter, failed to get GUID for network address!", 0);
+ return;
+ }
+ adapter_num = get_adapter_index(guid);
+ if (adapter_num < 0) {
+ printf("ERROR finding network adapter with GUID \"%s\"!\n", guid);
+ LWIP_ASSERT("ERROR finding network adapter with expected GUID!", 0);
+ return;
+ }
+
+#else /* PACKET_LIB_GET_ADAPTER_NETADDRESS */
+#ifdef PACKET_LIB_ADAPTER_GUID
+ /* get adapter index for guid string */
+ adapter_num = get_adapter_index(PACKET_LIB_ADAPTER_GUID);
+ if (adapter_num < 0) {
+ printf("ERROR finding network adapter with GUID \"%s\"!\n", PACKET_LIB_ADAPTER_GUID);
+ LWIP_ASSERT("ERROR initializing network adapter!", 0);
+ return;
+ }
+#endif /* PACKET_LIB_ADAPTER_GUID */
+#endif /* PACKET_LIB_GET_ADAPTER_NETADDRESS */
+
+ /* Do whatever else is needed to initialize interface. */
+ pa = pcapif_init_adapter(adapter_num, netif);
+ if (pa == NULL) {
+ printf("ERROR initializing network adapter %d!\n", adapter_num);
+ LWIP_ASSERT("ERROR initializing network adapter!", 0);
+ return;
+ }
+ netif->state = pa;
+
+ /* change the MAC address to a unique value
+ so that multiple ethernetifs are supported */
+ /* @todo: this does NOT support multiple processes using this adapter! */
+ my_mac_addr[ETH_HWADDR_LEN - 1] += netif->num;
+ /* Copy MAC addr */
+ SMEMCPY(&netif->hwaddr, my_mac_addr, ETH_HWADDR_LEN);
+
+ /* get the initial link state of the selected interface */
+#if PCAPIF_HANDLE_LINKSTATE
+ pa->last_link_event = pcapifh_linkstate_get(pa->link_state);
+ if (pa->last_link_event == PCAPIF_LINKEVENT_DOWN) {
+ netif_set_link_down(netif);
+ } else {
+ netif_set_link_up(netif);
+ }
+ sys_timeout(PCAPIF_LINKCHECK_INTERVAL_MS, pcapif_check_linkstate, netif);
+#else /* PCAPIF_HANDLE_LINKSTATE */
+ /* just set the link up so that lwIP can transmit */
+ netif_set_link_up(netif);
+#endif /* PCAPIF_HANDLE_LINKSTATE */
+
+#if PCAPIF_RX_USE_THREAD
+ pa->rx_run = 1;
+ pa->rx_running = 1;
+ sys_thread_new("pcapif_rxthread", pcapif_input_thread, netif, 0, 0);
+#endif
+
+ LWIP_DEBUGF(NETIF_DEBUG, ("pcapif: eth_addr %02X%02X%02X%02X%02X%02X\n",netif->hwaddr[0],netif->hwaddr[1],netif->hwaddr[2],netif->hwaddr[3],netif->hwaddr[4],netif->hwaddr[5]));
+}
+
+/** low_level_output():
+ * Transmit a packet. The packet is contained in the pbuf that is passed to
+ * the function. This pbuf might be chained.
+ */
+static err_t
+pcapif_low_level_output(struct netif *netif, struct pbuf *p)
+{
+ struct pbuf *q;
+ unsigned char buffer[ETH_MAX_FRAME_LEN + ETH_PAD_SIZE];
+ unsigned char *buf = buffer;
+ unsigned char *ptr;
+ struct eth_hdr *ethhdr;
+ u16_t tot_len = p->tot_len - ETH_PAD_SIZE;
+ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+
+#if defined(LWIP_DEBUG) && LWIP_NETIF_TX_SINGLE_PBUF && !(LWIP_IPV4 && IP_FRAG) && (LWIP_IPV6 && LWIP_IPV6_FRAG)
+ LWIP_ASSERT("p->next == NULL && p->len == p->tot_len", p->next == NULL && p->len == p->tot_len);
+#endif
+
+ /* initiate transfer */
+ if ((p->len == p->tot_len) && (p->len >= ETH_MIN_FRAME_LEN + ETH_PAD_SIZE)) {
+ /* no pbuf chain, don't have to copy -> faster */
+ buf = &((unsigned char*)p->payload)[ETH_PAD_SIZE];
+ } else {
+ /* pbuf chain, copy into contiguous buffer */
+ if (p->tot_len >= sizeof(buffer)) {
+ LINK_STATS_INC(link.lenerr);
+ LINK_STATS_INC(link.drop);
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ return ERR_BUF;
+ }
+ ptr = buffer;
+ for(q = p; q != NULL; q = q->next) {
+ /* Send the data from the pbuf to the interface, one pbuf at a
+ time. The size of the data in each pbuf is kept in the ->len
+ variable. */
+ /* send data from(q->payload, q->len); */
+ LWIP_DEBUGF(NETIF_DEBUG, ("netif: send ptr %p q->payload %p q->len %i q->next %p\n", ptr, q->payload, (int)q->len, (void*)q->next));
+ if (q == p) {
+ MEMCPY(ptr, &((char*)q->payload)[ETH_PAD_SIZE], q->len - ETH_PAD_SIZE);
+ ptr += q->len - ETH_PAD_SIZE;
+ } else {
+ MEMCPY(ptr, q->payload, q->len);
+ ptr += q->len;
+ }
+ }
+ }
+
+ if (tot_len < ETH_MIN_FRAME_LEN) {
+ /* ensure minimal frame length */
+ memset(&buf[tot_len], 0, ETH_MIN_FRAME_LEN - tot_len);
+ tot_len = ETH_MIN_FRAME_LEN;
+ }
+
+ /* signal that packet should be sent */
+ if (pcap_sendpacket(pa->adapter, buf, tot_len) < 0) {
+ LINK_STATS_INC(link.memerr);
+ LINK_STATS_INC(link.drop);
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ return ERR_BUF;
+ }
+ if (netif_is_link_up(netif)) {
+ pcapif_add_tx_packet(pa, buf, tot_len);
+ }
+
+ LINK_STATS_INC(link.xmit);
+ MIB2_STATS_NETIF_ADD(netif, ifoutoctets, tot_len);
+ ethhdr = (struct eth_hdr *)p->payload;
+ if ((ethhdr->dest.addr[0] & 1) != 0) {
+ /* broadcast or multicast packet*/
+ MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);
+ } else {
+ /* unicast packet */
+ MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
+ }
+ return ERR_OK;
+}
+
+/** low_level_input(): Allocate a pbuf and transfer the bytes of the incoming
+ * packet from the interface into the pbuf.
+ */
+static struct pbuf *
+pcapif_low_level_input(struct netif *netif, const void *packet, int packet_len)
+{
+ struct pbuf *p, *q;
+ int start;
+ int length = packet_len;
+ const struct eth_addr *dest = (const struct eth_addr*)packet;
+ int unicast;
+#if PCAPIF_FILTER_GROUP_ADDRESSES && !PCAPIF_RECEIVE_PROMISCUOUS
+ const u8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+ const u8_t ipv4mcast[] = {0x01, 0x00, 0x5e};
+ const u8_t ipv6mcast[] = {0x33, 0x33};
+#endif /* PCAPIF_FILTER_GROUP_ADDRESSES && !PCAPIF_RECEIVE_PROMISCUOUS */
+
+ if (pcaipf_is_tx_packet(netif, packet, packet_len)) {
+ /* don't update counters here! */
+ return NULL;
+ }
+
+ unicast = ((dest->addr[0] & 0x01) == 0);
+#if !PCAPIF_RECEIVE_PROMISCUOUS
+ /* MAC filter: only let my MAC or non-unicast through (pcap receives loopback traffic, too) */
+ if (memcmp(dest, &netif->hwaddr, ETH_HWADDR_LEN) &&
+#if PCAPIF_FILTER_GROUP_ADDRESSES
+ (memcmp(dest, ipv4mcast, 3) || ((dest->addr[3] & 0x80) != 0)) &&
+ memcmp(dest, ipv6mcast, 2) &&
+ memcmp(dest, bcast, 6)
+#else /* PCAPIF_FILTER_GROUP_ADDRESSES */
+ unicast
+#endif /* PCAPIF_FILTER_GROUP_ADDRESSES */
+ ) {
+ /* don't update counters here! */
+ return NULL;
+ }
+#endif /* !PCAPIF_RECEIVE_PROMISCUOUS */
+
+ /* We allocate a pbuf chain of pbufs from the pool. */
+ p = pbuf_alloc(PBUF_RAW, (u16_t)length + ETH_PAD_SIZE, PBUF_POOL);
+ LWIP_DEBUGF(NETIF_DEBUG, ("netif: recv length %i p->tot_len %i\n", length, (int)p->tot_len));
+
+ if (p != NULL) {
+ /* We iterate over the pbuf chain until we have read the entire
+ packet into the pbuf. */
+ start = 0;
+ for (q = p; q != NULL; q = q->next) {
+ u16_t copy_len = q->len;
+ /* Read enough bytes to fill this pbuf in the chain. The
+ available data in the pbuf is given by the q->len
+ variable. */
+ /* read data into(q->payload, q->len); */
+ LWIP_DEBUGF(NETIF_DEBUG, ("netif: recv start %i length %i q->payload %p q->len %i q->next %p\n", start, length, q->payload, (int)q->len, (void*)q->next));
+ if (q == p) {
+#if ETH_PAD_SIZE
+ LWIP_ASSERT("q->len >= ETH_PAD_SIZE", q->len >= ETH_PAD_SIZE);
+ copy_len -= ETH_PAD_SIZE;
+#endif /* ETH_PAD_SIZE*/
+ MEMCPY(&((char*)q->payload)[ETH_PAD_SIZE], &((const char*)packet)[start], copy_len);
+ } else {
+ MEMCPY(q->payload, &((const char*)packet)[start], copy_len);
+ }
+ start += copy_len;
+ length -= copy_len;
+ if (length <= 0) {
+ break;
+ }
+ }
+ LINK_STATS_INC(link.recv);
+ MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len - ETH_PAD_SIZE);
+ if (unicast) {
+ MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+ } else {
+ MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);
+ }
+ } else {
+ /* drop packet */
+ LINK_STATS_INC(link.memerr);
+ LINK_STATS_INC(link.drop);
+ MIB2_STATS_NETIF_INC(netif, ifindiscards);
+ }
+
+ return p;
+}
+
+#if PCAPIF_RX_REF
+static void
+pcapif_rx_pbuf_free_custom(struct pbuf *p)
+{
+ struct pcapif_pbuf_custom* ppc;
+ LWIP_ASSERT("NULL pointer", p != NULL);
+ ppc = (struct pcapif_pbuf_custom*)p;
+#if PCAPIF_RX_READONLY
+ LWIP_ASSERT("NULL pointer", ppc->ro_mem != NULL);
+ pcapifh_free_readonly_mem(ppc->ro_mem);
+ ppc->ro_mem = NULL;
+#else
+ LWIP_ASSERT("NULL pointer", ppc->p != NULL);
+ pbuf_free(ppc->p);
+ ppc->p = NULL;
+#endif
+ mem_free(p);
+}
+
+static struct pbuf*
+pcapif_rx_ref(struct pbuf* p)
+{
+ struct pcapif_pbuf_custom* ppc;
+ struct pbuf* q;
+ u16_t len;
+ void *payload_mem;
+
+ LWIP_ASSERT("NULL pointer", p != NULL);
+ LWIP_ASSERT("chained pbuf not supported here", p->next == NULL);
+
+ ppc = (struct pcapif_pbuf_custom*)mem_malloc(sizeof(struct pcapif_pbuf_custom));
+ LWIP_ASSERT("out of memory for RX", ppc != NULL);
+ ppc->pc.custom_free_function = pcapif_rx_pbuf_free_custom;
+ len = p->tot_len;
+#if PCAPIF_RX_READONLY
+ payload_mem = pcapifh_alloc_readonly_copy(p->payload, len);
+ LWIP_ASSERT("out of readonly memory for RX", payload_mem != NULL);
+ pbuf_free(p);
+ ppc->ro_mem = payload_mem;
+#else
+ ppc->p = p;
+ payload_mem = p->payload;
+#endif
+
+ q = pbuf_alloced_custom(PBUF_RAW, len, PBUF_REF, &ppc->pc, payload_mem, len);
+ LWIP_ASSERT("pbuf_alloced_custom returned NULL", q != NULL);
+ return q;
+}
+#endif /* PCAPIF_RX_REF */
+
+/** pcapif_input: This function is called when a packet is ready to be read
+ * from the interface. It uses the function low_level_input() that should
+ * handle the actual reception of bytes from the network interface.
+ */
+static void
+pcapif_input(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *packet)
+{
+ struct pcapif_private *pa = (struct pcapif_private*)user;
+ int packet_len = pkt_header->caplen;
+ struct netif *netif = (struct netif *)pa->input_fn_arg;
+ struct pbuf *p;
+
+ PCAPIF_RX_LOCK_LWIP();
+
+ /* move received packet into a new pbuf */
+ p = pcapif_low_level_input(netif, packet, packet_len);
+ /* if no packet could be read, silently ignore this */
+ if (p != NULL) {
+#if PCAPIF_RX_REF
+ p = pcapif_rx_ref(p);
+#endif
+ /* pass all packets to ethernet_input, which decides what packets it supports */
+ if (netif->input(p, netif) != ERR_OK) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
+ pbuf_free(p);
+ }
+ }
+ PCAPIF_RX_UNLOCK_LWIP();
+}
+
+/**
+ * pcapif_init(): initialization function, pass to netif_add().
+ */
+err_t
+pcapif_init(struct netif *netif)
+{
+ static int ethernetif_index;
+
+ int local_index;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ pcapifh_init_npcap();
+
+ SYS_ARCH_PROTECT(lev);
+ local_index = ethernetif_index++;
+ SYS_ARCH_UNPROTECT(lev);
+
+ LWIP_ASSERT("pcapif needs an input callback", netif->input != NULL);
+
+ netif->name[0] = IFNAME0;
+ netif->name[1] = (char)(IFNAME1 + local_index);
+ netif->linkoutput = pcapif_low_level_output;
+#if LWIP_IPV4
+#if LWIP_ARP
+ netif->output = etharp_output;
+#else /* LWIP_ARP */
+ netif->output = NULL; /* not used for PPPoE */
+#endif /* LWIP_ARP */
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ netif->output_ip6 = ethip6_output;
+#endif /* LWIP_IPV6 */
+#if LWIP_NETIF_HOSTNAME
+ /* Initialize interface hostname */
+ netif_set_hostname(netif, "lwip");
+#endif /* LWIP_NETIF_HOSTNAME */
+
+ netif->mtu = 1500;
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP;
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+ netif->flags |= NETIF_FLAG_MLD6;
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+ netif->hwaddr_len = ETH_HWADDR_LEN;
+
+ NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, 100000000);
+
+ /* sets link up or down based on current status */
+ pcapif_low_level_init(netif);
+
+ return ERR_OK;
+}
+
+#if !PCAPIF_RX_USE_THREAD
+void
+pcapif_poll(struct netif *netif)
+{
+ struct pcapif_private *pa = (struct pcapif_private*)PCAPIF_GET_STATE_PTR(netif);
+
+ int ret;
+ do {
+ if (pa->adapter != NULL) {
+ ret = pcap_dispatch(pa->adapter, -1, pcapif_input, (u_char*)pa);
+ } else {
+ ret = -1;
+ }
+ if (ret < 0) {
+ /* error (e.g. adapter removed or resume from standby), try to reopen the adapter */
+ pcap_reopen_adapter(pa);
+ }
+ } while (ret > 0);
+
+}
+#endif /* !PCAPIF_RX_USE_THREAD */
+
+#endif /* LWIP_ETHERNET */
diff --git a/contrib/ports/win32/pcapif.h b/contrib/ports/win32/pcapif.h
new file mode 100644
index 00000000000..8d67ea42fc0
--- /dev/null
+++ b/contrib/ports/win32/pcapif.h
@@ -0,0 +1,32 @@
+#ifndef LWIP_PCAPIF_H
+#define LWIP_PCAPIF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "lwip/err.h"
+
+/** Set to 1 to let rx use an own thread (only for NO_SYS==0).
+ * If set to 0, ethernetif_poll is used to poll for packets.
+ */
+#ifndef PCAPIF_RX_USE_THREAD
+#define PCAPIF_RX_USE_THREAD !NO_SYS
+#endif
+#if PCAPIF_RX_USE_THREAD && NO_SYS
+#error "Can't create a dedicated RX thread with NO_SYS==1"
+#endif
+
+struct netif;
+
+err_t pcapif_init (struct netif *netif);
+void pcapif_shutdown(struct netif *netif);
+#if !PCAPIF_RX_USE_THREAD
+void pcapif_poll (struct netif *netif);
+#endif /* !PCAPIF_RX_USE_THREAD */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_PCAPIF_H */
diff --git a/contrib/ports/win32/pcapif_helper.c b/contrib/ports/win32/pcapif_helper.c
new file mode 100644
index 00000000000..03b92e0db69
--- /dev/null
+++ b/contrib/ports/win32/pcapif_helper.c
@@ -0,0 +1,172 @@
+/**
+ * pcapif_helper.c - This file is part of lwIP pcapif and provides helper functions
+ * for managing the link state.
+ */
+
+#include "pcapif_helper.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "lwip/arch.h"
+
+#ifdef WIN32
+
+#define WIN32_LEAN_AND_MEAN
+
+#ifdef _MSC_VER
+#pragma warning( push, 3 )
+#endif
+#include <windows.h>
+#include <packet32.h>
+#include <ntddndis.h>
+#ifdef _MSC_VER
+#pragma warning ( pop )
+#endif
+
+struct pcapifh_linkstate {
+ LPADAPTER lpAdapter;
+ PPACKET_OID_DATA ppacket_oid_data;
+};
+
+struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name)
+{
+ struct pcapifh_linkstate* state = (struct pcapifh_linkstate*)malloc(sizeof(struct pcapifh_linkstate));
+ if (state != NULL) {
+ memset(state, 0, sizeof(struct pcapifh_linkstate));
+ state->ppacket_oid_data = (PPACKET_OID_DATA)malloc(sizeof(PACKET_OID_DATA) + sizeof(NDIS_MEDIA_STATE));
+ if (state->ppacket_oid_data == NULL) {
+ free(state);
+ state = NULL;
+ } else {
+ state->lpAdapter = PacketOpenAdapter((char*)adapter_name);
+ if ((state->lpAdapter == NULL) || (state->lpAdapter->hFile == INVALID_HANDLE_VALUE)) {
+ /* failed to open adapter */
+ free(state);
+ state = NULL;
+ }
+ }
+ }
+ return state;
+}
+
+enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state)
+{
+ enum pcapifh_link_event ret = PCAPIF_LINKEVENT_UNKNOWN;
+ if (state != NULL) {
+ state->ppacket_oid_data->Oid = OID_GEN_MEDIA_CONNECT_STATUS;
+ state->ppacket_oid_data->Length = sizeof(NDIS_MEDIA_STATE);
+ if (PacketRequest(state->lpAdapter, FALSE, state->ppacket_oid_data)) {
+ NDIS_MEDIA_STATE fNdisMediaState;
+ fNdisMediaState = (*((PNDIS_MEDIA_STATE)(state->ppacket_oid_data->Data)));
+ ret = ((fNdisMediaState == NdisMediaStateConnected) ? PCAPIF_LINKEVENT_UP : PCAPIF_LINKEVENT_DOWN);
+ }
+ }
+ return ret;
+}
+
+void pcapifh_linkstate_close(struct pcapifh_linkstate* state)
+{
+ if (state != NULL) {
+ if (state->lpAdapter != NULL) {
+ PacketCloseAdapter(state->lpAdapter);
+ }
+ if (state->ppacket_oid_data != NULL) {
+ free(state->ppacket_oid_data);
+ }
+ free(state);
+ }
+}
+
+/** Helper function for PCAPIF_RX_READONLY for windows: copy the date to a new
+ * page which is set to READONLY after copying.
+ * This is a helper to simulate hardware that receives to memory that cannot be
+ * written by the CPU.
+ */
+void *
+pcapifh_alloc_readonly_copy(void *data, size_t len)
+{
+ DWORD oldProtect;
+ void *ret;
+ if (len > 4096) {
+ lwip_win32_platform_diag("pcapifh_alloc_readonly_copy: invalid len: %d\n", len);
+ while(1);
+ }
+ ret = VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
+ if (ret == NULL) {
+ lwip_win32_platform_diag("VirtualAlloc failed: %d\n", GetLastError());
+ while(1);
+ }
+ memcpy(ret, data, len);
+ if (!VirtualProtect(ret, len, PAGE_READONLY, &oldProtect)) {
+ lwip_win32_platform_diag("VirtualProtect failed: %d\n", GetLastError());
+ while(1);
+ }
+ return ret;
+}
+
+void
+pcapifh_free_readonly_mem(void *data)
+{
+ if (!VirtualFree(data, 0, MEM_RELEASE)) {
+ lwip_win32_platform_diag("VirtualFree(0x%08x) failed: %d\n", data, GetLastError());
+ while(1);
+ }
+}
+
+/**
+ * Npcap keeps its DLLs in a different directory for compatiblity with winpcap.
+ * Make sure they get found by adding that directory to the DLL search path.
+ */
+void pcapifh_init_npcap(void)
+{
+ char npcap_dir[512];
+ unsigned int len;
+ static char npcap_initialized = 0;
+
+ if (!npcap_initialized)
+ {
+ npcap_initialized = 1;
+
+ len = GetSystemDirectory(npcap_dir, 480);
+ if (!len) {
+ lwip_win32_platform_diag("Error in GetSystemDirectory: %x", GetLastError());
+ return;
+ }
+ strcat_s(npcap_dir, 512, "\\Npcap");
+ if (SetDllDirectory(npcap_dir) == 0) {
+ lwip_win32_platform_diag("Error in SetDllDirectory: %x", GetLastError());
+ return;
+ }
+ }
+}
+
+#else /* WIN32 */
+
+/* @todo: add linux/unix implementation? */
+
+struct pcapifh_linkstate {
+ u8_t empty;
+};
+
+struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name)
+{
+ LWIP_UNUSED_ARG(adapter_name);
+ return NULL;
+}
+
+enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state)
+{
+ LWIP_UNUSED_ARG(state);
+ return PCAPIF_LINKEVENT_UP;
+}
+void pcapifh_linkstate_close(struct pcapifh_linkstate* state)
+{
+ LWIP_UNUSED_ARG(state);
+}
+
+void pcapifh_init_npcap(void)
+{
+}
+
+#endif /* WIN32 */
diff --git a/contrib/ports/win32/pcapif_helper.h b/contrib/ports/win32/pcapif_helper.h
new file mode 100644
index 00000000000..fd1c52778d1
--- /dev/null
+++ b/contrib/ports/win32/pcapif_helper.h
@@ -0,0 +1,31 @@
+#ifndef LWIP_PCAPIF_HELPER_H
+#define LWIP_PCAPIF_HELPER_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct pcapifh_linkstate;
+
+enum pcapifh_link_event {
+ PCAPIF_LINKEVENT_UNKNOWN,
+ PCAPIF_LINKEVENT_UP,
+ PCAPIF_LINKEVENT_DOWN
+};
+
+struct pcapifh_linkstate* pcapifh_linkstate_init(char *adapter_name);
+enum pcapifh_link_event pcapifh_linkstate_get(struct pcapifh_linkstate* state);
+void pcapifh_linkstate_close(struct pcapifh_linkstate* state);
+
+void *pcapifh_alloc_readonly_copy(void *data, size_t len);
+void pcapifh_free_readonly_mem(void *data);
+
+void pcapifh_init_npcap(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_PCAPIF_HELPER_H */
diff --git a/contrib/ports/win32/readme.txt b/contrib/ports/win32/readme.txt
new file mode 100644
index 00000000000..87e09d0e1f7
--- /dev/null
+++ b/contrib/ports/win32/readme.txt
@@ -0,0 +1,26 @@
+lwIP for Win32
+
+This is an example port of lwIP for Win32. It uses WinPCAP to send & receive packets.
+To compile it, use the MSVC projects in the 'msvc' subdir, the CMake files, or the Makefile
+in the 'mingw' subdir.
+
+For all compilers/build systems:
+- you have to set an environment variable PCAP_DIR pointing to the WinPcap Developer's
+ Pack (containing 'include' and 'lib')
+ alternatively, place the WinPcap Developer's pack next to the "lwip" folder:
+ "winpcap\WpdPack"
+
+You also will have to copy the file 'contrib/examples/example_app/lwipcfg.h.example' to
+'contrib/examples/example_app/lwipcfg.h' and modify to suit your needs (WinPcap adapter number,
+IP configuration, applications...).
+
+Included in the contrib\ports\win32 directory is the network interface driver
+using the winpcap library.
+
+lwIP: http://savannah.nongnu.org/projects/lwip/
+WinPCap: https://www.winpcap.org/devel.htm
+Visual C++: http://www.microsoft.com/express/download/
+
+To compile the unittests (msvc\lwIP_unittests.sln), download check (tested with v0.11.0) from
+https://github.com/libcheck/check/releases/
+and place it in a folder "check" next to the "contrib" folder.
diff --git a/contrib/ports/win32/sio.c b/contrib/ports/win32/sio.c
new file mode 100644
index 00000000000..0b64492bbb2
--- /dev/null
+++ b/contrib/ports/win32/sio.c
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2001-2003 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.
+ *
+ */
+
+#include <lwip/opt.h>
+#include <lwip/sys.h>
+#include <lwip/sio.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#ifdef _MSC_VER
+#pragma warning (push, 3)
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning (pop)
+#endif
+#include "lwipcfg.h"
+
+/** When 1, use COM ports, when 0, use named pipes (for simulation). */
+#ifndef SIO_USE_COMPORT
+#define SIO_USE_COMPORT 1
+#endif
+
+/** If SIO_USE_COMPORT==1, use COMx, if 0, use a pipe (default) */
+#if SIO_USE_COMPORT
+#define SIO_DEVICENAME "\\\\.\\COM"
+#else
+#define SIO_DEVICENAME "\\\\.\\pipe\\lwip"
+#endif
+
+#if SIO_USE_COMPORT
+#ifndef SIO_COMPORT_SPEED
+#define SIO_COMPORT_SPEED 115200
+#endif
+#ifndef SIO_COMPORT_BYTESIZE
+#define SIO_COMPORT_BYTESIZE 8
+#endif
+#ifndef SIO_COMPORT_STOPBITS
+#define SIO_COMPORT_STOPBITS 0 /* ONESTOPBIT */
+#endif
+#ifndef SIO_COMPORT_PARITY
+#define SIO_COMPORT_PARITY 0 /* NOPARITY */
+#endif
+#endif /* SIO_USE_COMPORT */
+
+static int sio_abort = 0;
+
+/* \\.\pipe\lwip0 */
+/* pppd /dev/ttyS0 logfile mylog debug nocrtscts local noauth noccp ms-dns 212.27.54.252 192.168.0.4:192.168.0.5
+ */
+
+/**
+ * SIO_DEBUG: Enable debugging for SIO.
+ */
+#ifndef SIO_DEBUG
+#define SIO_DEBUG LWIP_DBG_OFF
+#endif
+
+#if SIO_USE_COMPORT
+/** When using a real COM port, set up the
+ * serial line settings (baudrate etc.)
+ */
+static BOOL
+sio_setup(HANDLE fd)
+{
+ COMMTIMEOUTS cto;
+ DCB dcb;
+
+ /* set up baudrate and other communication settings */
+ memset(&dcb, 0, sizeof(dcb));
+ /* Obtain the DCB structure for the device */
+ if (!GetCommState(fd, &dcb)) {
+ return FALSE;
+ }
+ /* Set the new data */
+ dcb.BaudRate = SIO_COMPORT_SPEED;
+ dcb.ByteSize = SIO_COMPORT_BYTESIZE;
+ dcb.StopBits = 0; /* ONESTOPBIT */
+ dcb.Parity = 0; /* NOPARITY */
+ dcb.fParity = 0; /* parity is not used */
+ /* do not use flow control */
+ /*dcb.fOutxDsrFlow = dcb.fDtrControl = 0;
+ dcb.fOutxCtsFlow = dcb.fRtsControl = 0;
+ dcb.fErrorChar = dcb.fNull = 0;
+ dcb.fInX = dcb.fOutX = 0;
+ dcb.XonChar = dcb.XoffChar = 0;
+ dcb.XonLim = dcb.XoffLim = 100;*/
+
+ /* Set the new DCB structure */
+ if (!SetCommState(fd, &dcb)) {
+ return FALSE;
+ }
+
+ memset(&cto, 0, sizeof(cto));
+ if(!GetCommTimeouts(fd, &cto))
+ {
+ return FALSE;
+ }
+ /* change read timeout, leave write timeout as it is */
+ cto.ReadIntervalTimeout = 1;
+ cto.ReadTotalTimeoutMultiplier = 0;
+ cto.ReadTotalTimeoutConstant = 1; /* 1 ms */
+ if(!SetCommTimeouts(fd, &cto)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+#endif /* SIO_USE_COMPORT */
+
+/**
+ * Opens a serial device for communication.
+ *
+ * @param devnum device number
+ * @return handle to serial device if successful, NULL otherwise
+ */
+sio_fd_t sio_open(u8_t devnum)
+{
+ HANDLE fileHandle = INVALID_HANDLE_VALUE;
+ CHAR fileName[256];
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open(%lu)\n", (DWORD)devnum));
+#if SIO_USE_COMPORT
+ snprintf(fileName, 255, SIO_DEVICENAME"%lu", (DWORD)(devnum));
+#else /* SIO_USE_COMPORT */
+ snprintf(fileName, 255, SIO_DEVICENAME"%lu", (DWORD)(devnum & ~1));
+ if ((devnum & 1) == 0) {
+ fileHandle = CreateNamedPipeA(fileName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_NOWAIT,
+ PIPE_UNLIMITED_INSTANCES, 102400, 102400, 100, NULL);
+ } else
+#endif /* SIO_USE_COMPORT */
+ {
+ fileHandle = CreateFileA(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ }
+ if (fileHandle != INVALID_HANDLE_VALUE) {
+ sio_abort = 0;
+#if !SIO_USE_COMPORT
+ if (devnum & 1) {
+ DWORD mode = PIPE_NOWAIT;
+ if (!SetNamedPipeHandleState(fileHandle, &mode, NULL, NULL)) {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open(%lu): SetNamedPipeHandleState failed. GetLastError() returns %d\n",
+ (DWORD)devnum, GetLastError()));
+ }
+ } else
+#endif /* !SIO_USE_COMPORT */
+ {
+ FlushFileBuffers(fileHandle);
+ }
+#if SIO_USE_COMPORT
+ if(!sio_setup(fileHandle)) {
+ CloseHandle(fileHandle);
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open(%lu): sio_setup failed. GetLastError() returns %lu\n",
+ (DWORD)devnum, GetLastError()));
+ return NULL;
+ }
+#endif /* SIO_USE_COMPORT */
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open: file \"%s\" successfully opened.\n", fileName));
+ printf("sio_open: file \"%s\" (%d) successfully opened: 0x%08x\n", fileName, devnum, LWIP_PTR_NUMERIC_CAST(unsigned int, fileHandle));
+ return (sio_fd_t)(fileHandle);
+ }
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open(%lu) failed. GetLastError() returns %lu\n",
+ (DWORD)devnum, GetLastError()));
+ printf("sio_open(%lu) failed. GetLastError() returns %lu\n",
+ (DWORD)devnum, GetLastError());
+ return NULL;
+}
+
+/**
+ * Sends a single character to the serial device.
+ *
+ * @param c character to send
+ * @param fd serial device handle
+ *
+ * @note This function will block until the character can be sent.
+ */
+void sio_send(u8_t c, sio_fd_t fd)
+{
+ DWORD dwNbBytesWritten = 0;
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_send(%lu)\n", (DWORD)c));
+ while ((!WriteFile((HANDLE)(fd), &c, 1, &dwNbBytesWritten, NULL)) || (dwNbBytesWritten < 1)) {
+ }
+}
+
+/**
+ * Receives a single character from the serial device.
+ *
+ * @param fd serial device handle
+ *
+ * @note This function will block until a character is received.
+ */
+u8_t sio_recv(sio_fd_t fd)
+{
+ DWORD dwNbBytesReadden = 0;
+ u8_t byte = 0;
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_recv()\n"));
+ while ((sio_abort == 0) && ((!ReadFile((HANDLE)(fd), &byte, 1, &dwNbBytesReadden, NULL)) || (dwNbBytesReadden < 1)));
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_recv()=%lu\n", (DWORD)byte));
+ return byte;
+}
+
+/**
+ * Reads from the serial device.
+ *
+ * @param fd serial device handle
+ * @param data pointer to data buffer for receiving
+ * @param len maximum length (in bytes) of data to receive
+ * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
+ *
+ * @note This function will block until data can be received. The blocking
+ * can be cancelled by calling sio_read_abort().
+ */
+u32_t sio_read(sio_fd_t fd, u8_t* data, u32_t len)
+{
+ BOOL ret;
+ DWORD dwNbBytesReadden = 0;
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_read()...\n"));
+ ret = ReadFile((HANDLE)(fd), data, len, &dwNbBytesReadden, NULL);
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_read()=%lu bytes -> %d\n", dwNbBytesReadden, ret));
+ LWIP_UNUSED_ARG(ret);
+ return dwNbBytesReadden;
+}
+
+/**
+ * Tries to read from the serial device. Same as sio_read but returns
+ * immediately if no data is available and never blocks.
+ *
+ * @param fd serial device handle
+ * @param data pointer to data buffer for receiving
+ * @param len maximum length (in bytes) of data to receive
+ * @return number of bytes actually received
+ */
+u32_t sio_tryread(sio_fd_t fd, u8_t* data, u32_t len)
+{
+ /* @todo: implement non-blocking read */
+ BOOL ret;
+ DWORD dwNbBytesReadden = 0;
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_read()...\n"));
+ ret = ReadFile((HANDLE)(fd), data, len, &dwNbBytesReadden, NULL);
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_read()=%lu bytes -> %d\n", dwNbBytesReadden, ret));
+ LWIP_UNUSED_ARG(ret);
+ return dwNbBytesReadden;
+}
+
+/**
+ * Writes to the serial device.
+ *
+ * @param fd serial device handle
+ * @param data pointer to data to send
+ * @param len length (in bytes) of data to send
+ * @return number of bytes actually sent
+ *
+ * @note This function will block until all data can be sent.
+ */
+u32_t sio_write(sio_fd_t fd, const u8_t* data, u32_t len)
+{
+ BOOL ret;
+ DWORD dwNbBytesWritten = 0;
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_write()...\n"));
+ ret = WriteFile((HANDLE)(fd), data, len, &dwNbBytesWritten, NULL);
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_write()=%lu bytes -> %d\n", dwNbBytesWritten, ret));
+ LWIP_UNUSED_ARG(ret);
+ return dwNbBytesWritten;
+}
+
+/**
+ * Aborts a blocking sio_read() call.
+ * @todo: This currently ignores fd and aborts all reads
+ *
+ * @param fd serial device handle
+ */
+void sio_read_abort(sio_fd_t fd)
+{
+ LWIP_UNUSED_ARG(fd);
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_read_abort() !!!!!...\n"));
+ sio_abort = 1;
+ return;
+}
diff --git a/contrib/ports/win32/sys_arch.c b/contrib/ports/win32/sys_arch.c
new file mode 100644
index 00000000000..84f5775edf3
--- /dev/null
+++ b/contrib/ports/win32/sys_arch.c
@@ -0,0 +1,782 @@
+/*
+ * Copyright (c) 2001-2003 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>
+ * Simon Goldschmidt
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h> /* sprintf() for task names */
+
+#ifdef _MSC_VER
+#pragma warning (push, 3)
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning (pop)
+#endif
+#include <time.h>
+
+#include <lwip/opt.h>
+#include <lwip/arch.h>
+#include <lwip/stats.h>
+#include <lwip/debug.h>
+#include <lwip/sys.h>
+#include <lwip/tcpip.h>
+
+/** Set this to 1 to enable assertion checks that SYS_ARCH_PROTECT() is only
+ * called once in a call stack (calling it nested might cause trouble in some
+ * implementations, so let's avoid this in core code as long as we can).
+ */
+#ifndef LWIP_SYS_ARCH_CHECK_NESTED_PROTECT
+#define LWIP_SYS_ARCH_CHECK_NESTED_PROTECT 1
+#endif
+
+/** Set this to 1 to enable assertion checks that SYS_ARCH_PROTECT() is *not*
+ * called before functions potentiolly involving the OS scheduler.
+ *
+ * This scheme is currently broken only for non-core-locking when waking up
+ * threads waiting on a socket via select/poll.
+ */
+#ifndef LWIP_SYS_ARCH_CHECK_SCHEDULING_UNPROTECTED
+#define LWIP_SYS_ARCH_CHECK_SCHEDULING_UNPROTECTED LWIP_TCPIP_CORE_LOCKING
+#endif
+
+#define LWIP_WIN32_SYS_ARCH_ENABLE_PROTECT_COUNTER (LWIP_SYS_ARCH_CHECK_NESTED_PROTECT || LWIP_SYS_ARCH_CHECK_SCHEDULING_UNPROTECTED)
+
+/* These functions are used from NO_SYS also, for precise timer triggering */
+static LARGE_INTEGER freq, sys_start_time;
+#define SYS_INITIALIZED() (freq.QuadPart != 0)
+
+static DWORD netconn_sem_tls_index;
+
+static HCRYPTPROV hcrypt;
+
+static void
+sys_win_rand_init(void)
+{
+ if (!CryptAcquireContext(&hcrypt, NULL, NULL, PROV_RSA_FULL, 0)) {
+ DWORD err = GetLastError();
+ LWIP_PLATFORM_DIAG(("CryptAcquireContext failed with error %d, trying to create NEWKEYSET", (int)err));
+ if(!CryptAcquireContext(&hcrypt, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
+ char errbuf[128];
+ err = GetLastError();
+ snprintf(errbuf, sizeof(errbuf), "CryptAcquireContext failed with error %d", (int)err);
+ LWIP_UNUSED_ARG(err);
+ LWIP_ASSERT(errbuf, 0);
+ }
+ }
+}
+
+unsigned int
+lwip_port_rand(void)
+{
+ u32_t ret;
+ if (CryptGenRandom(hcrypt, sizeof(ret), (BYTE*)&ret)) {
+ return ret;
+ }
+ /* maybe CryptAcquireContext has not been called... */
+ sys_win_rand_init();
+ if (CryptGenRandom(hcrypt, sizeof(ret), (BYTE*)&ret)) {
+ return ret;
+ }
+ LWIP_ASSERT("CryptGenRandom failed", 0);
+ return 0;
+}
+
+static void
+sys_init_timing(void)
+{
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&sys_start_time);
+}
+
+static LONGLONG
+sys_get_ms_longlong(void)
+{
+ LONGLONG ret;
+ LARGE_INTEGER now;
+#if NO_SYS
+ if (!SYS_INITIALIZED()) {
+ sys_init();
+ LWIP_ASSERT("initialization failed", SYS_INITIALIZED());
+ }
+#endif /* NO_SYS */
+ QueryPerformanceCounter(&now);
+ ret = now.QuadPart-sys_start_time.QuadPart;
+ return (u32_t)(((ret)*1000)/freq.QuadPart);
+}
+
+u32_t
+sys_jiffies(void)
+{
+ return (u32_t)sys_get_ms_longlong();
+}
+
+u32_t
+sys_now(void)
+{
+ u32_t now = (u32_t)sys_get_ms_longlong();
+#ifdef LWIP_FUZZ_SYS_NOW
+ now += sys_now_offset;
+#endif
+ return now;
+}
+
+CRITICAL_SECTION critSec;
+#if LWIP_WIN32_SYS_ARCH_ENABLE_PROTECT_COUNTER
+static int protection_depth;
+#endif
+
+static void
+InitSysArchProtect(void)
+{
+ InitializeCriticalSection(&critSec);
+}
+
+sys_prot_t
+sys_arch_protect(void)
+{
+#if NO_SYS
+ if (!SYS_INITIALIZED()) {
+ sys_init();
+ LWIP_ASSERT("initialization failed", SYS_INITIALIZED());
+ }
+#endif
+ EnterCriticalSection(&critSec);
+#if LWIP_SYS_ARCH_CHECK_NESTED_PROTECT
+ LWIP_ASSERT("nested SYS_ARCH_PROTECT", protection_depth == 0);
+#endif
+#if LWIP_WIN32_SYS_ARCH_ENABLE_PROTECT_COUNTER
+ protection_depth++;
+#endif
+ return 0;
+}
+
+void
+sys_arch_unprotect(sys_prot_t pval)
+{
+ LWIP_UNUSED_ARG(pval);
+#if LWIP_SYS_ARCH_CHECK_NESTED_PROTECT
+ LWIP_ASSERT("missing SYS_ARCH_PROTECT", protection_depth == 1);
+#else
+ LWIP_ASSERT("missing SYS_ARCH_PROTECT", protection_depth > 0);
+#endif
+#if LWIP_WIN32_SYS_ARCH_ENABLE_PROTECT_COUNTER
+ protection_depth--;
+#endif
+ LeaveCriticalSection(&critSec);
+}
+
+#if LWIP_SYS_ARCH_CHECK_SCHEDULING_UNPROTECTED
+/** This checks that SYS_ARCH_PROTECT() hasn't been called by protecting
+ * and then checking the level
+ */
+static void
+sys_arch_check_not_protected(void)
+{
+ sys_arch_protect();
+ LWIP_ASSERT("SYS_ARCH_PROTECT before scheduling", protection_depth == 1);
+ sys_arch_unprotect(0);
+}
+#else
+#define sys_arch_check_not_protected()
+#endif
+
+static void
+msvc_sys_init(void)
+{
+ sys_win_rand_init();
+ sys_init_timing();
+ InitSysArchProtect();
+ netconn_sem_tls_index = TlsAlloc();
+ LWIP_ASSERT("TlsAlloc failed", netconn_sem_tls_index != TLS_OUT_OF_INDEXES);
+}
+
+void
+sys_init(void)
+{
+ msvc_sys_init();
+}
+
+#if !NO_SYS
+
+struct threadlist {
+ lwip_thread_fn function;
+ void *arg;
+ DWORD id;
+ struct threadlist *next;
+};
+
+static struct threadlist *lwip_win32_threads = NULL;
+
+err_t
+sys_sem_new(sys_sem_t *sem, u8_t count)
+{
+ HANDLE new_sem = NULL;
+
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+
+ new_sem = CreateSemaphore(0, count, 100000, 0);
+ LWIP_ASSERT("Error creating semaphore", new_sem != NULL);
+ if(new_sem != NULL) {
+ if (SYS_INITIALIZED()) {
+ SYS_ARCH_LOCKED(SYS_STATS_INC_USED(sem));
+ } else {
+ SYS_STATS_INC_USED(sem);
+ }
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT("sys_sem_new() counter overflow", lwip_stats.sys.sem.used != 0);
+#endif /* LWIP_STATS && SYS_STATS*/
+ sem->sem = new_sem;
+ return ERR_OK;
+ }
+
+ /* failed to allocate memory... */
+ if (SYS_INITIALIZED()) {
+ SYS_ARCH_LOCKED(SYS_STATS_INC(sem.err));
+ } else {
+ SYS_STATS_INC(sem.err);
+ }
+ sem->sem = NULL;
+ return ERR_MEM;
+}
+
+void
+sys_sem_free(sys_sem_t *sem)
+{
+ /* parameter check */
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+ LWIP_ASSERT("sem->sem != INVALID_HANDLE_VALUE", sem->sem != INVALID_HANDLE_VALUE);
+ CloseHandle(sem->sem);
+
+ SYS_ARCH_LOCKED(SYS_STATS_DEC(sem.used));
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT("sys_sem_free() closed more than created", lwip_stats.sys.sem.used != (u16_t)-1);
+#endif /* LWIP_STATS && SYS_STATS */
+ sem->sem = NULL;
+}
+
+u32_t
+sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
+{
+ DWORD ret;
+ LONGLONG starttime, endtime;
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+ LWIP_ASSERT("sem->sem != INVALID_HANDLE_VALUE", sem->sem != INVALID_HANDLE_VALUE);
+ if (!timeout) {
+ /* wait infinite */
+ starttime = sys_get_ms_longlong();
+ ret = WaitForSingleObject(sem->sem, INFINITE);
+ LWIP_ASSERT("Error waiting for semaphore", ret == WAIT_OBJECT_0);
+ endtime = sys_get_ms_longlong();
+ /* return the time we waited for the sem */
+ return (u32_t)(endtime - starttime);
+ } else {
+ starttime = sys_get_ms_longlong();
+ ret = WaitForSingleObject(sem->sem, timeout);
+ LWIP_ASSERT("Error waiting for semaphore", (ret == WAIT_OBJECT_0) || (ret == WAIT_TIMEOUT));
+ if (ret == WAIT_OBJECT_0) {
+ endtime = sys_get_ms_longlong();
+ /* return the time we waited for the sem */
+ return (u32_t)(endtime - starttime);
+ } else {
+ /* timeout */
+ return SYS_ARCH_TIMEOUT;
+ }
+ }
+}
+
+void
+sys_sem_signal(sys_sem_t *sem)
+{
+ BOOL ret;
+ sys_arch_check_not_protected();
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+ LWIP_ASSERT("sem->sem != INVALID_HANDLE_VALUE", sem->sem != INVALID_HANDLE_VALUE);
+ ret = ReleaseSemaphore(sem->sem, 1, NULL);
+ LWIP_ASSERT("Error releasing semaphore", ret != 0);
+ LWIP_UNUSED_ARG(ret);
+}
+
+err_t
+sys_mutex_new(sys_mutex_t *mutex)
+{
+ HANDLE new_mut = NULL;
+
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+
+ new_mut = CreateMutex(NULL, FALSE, NULL);
+ LWIP_ASSERT("Error creating mutex", new_mut != NULL);
+ if (new_mut != NULL) {
+ SYS_ARCH_LOCKED(SYS_STATS_INC_USED(mutex));
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT("sys_mutex_new() counter overflow", lwip_stats.sys.mutex.used != 0);
+#endif /* LWIP_STATS && SYS_STATS*/
+ mutex->mut = new_mut;
+ return ERR_OK;
+ }
+
+ /* failed to allocate memory... */
+ SYS_ARCH_LOCKED(SYS_STATS_INC(mutex.err));
+ mutex->mut = NULL;
+ return ERR_MEM;
+}
+
+void
+sys_mutex_free(sys_mutex_t *mutex)
+{
+ /* parameter check */
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+ LWIP_ASSERT("mutex->mut != INVALID_HANDLE_VALUE", mutex->mut != INVALID_HANDLE_VALUE);
+ CloseHandle(mutex->mut);
+
+ SYS_ARCH_LOCKED(SYS_STATS_DEC(mutex.used));
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT("sys_mutex_free() closed more than created", lwip_stats.sys.mutex.used != (u16_t)-1);
+#endif /* LWIP_STATS && SYS_STATS */
+ mutex->mut = NULL;
+}
+
+void sys_mutex_lock(sys_mutex_t *mutex)
+{
+ DWORD ret;
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+ LWIP_ASSERT("mutex->mut != INVALID_HANDLE_VALUE", mutex->mut != INVALID_HANDLE_VALUE);
+ /* wait infinite */
+ ret = WaitForSingleObject(mutex->mut, INFINITE);
+ LWIP_ASSERT("Error waiting for mutex", ret == WAIT_OBJECT_0);
+ LWIP_UNUSED_ARG(ret);
+}
+
+void
+sys_mutex_unlock(sys_mutex_t *mutex)
+{
+ sys_arch_check_not_protected();
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+ LWIP_ASSERT("mutex->mut != INVALID_HANDLE_VALUE", mutex->mut != INVALID_HANDLE_VALUE);
+ /* wait infinite */
+ if (!ReleaseMutex(mutex->mut)) {
+ LWIP_ASSERT("Error releasing mutex", 0);
+ }
+}
+
+
+#ifdef _MSC_VER
+const DWORD MS_VC_EXCEPTION=0x406D1388;
+#pragma pack(push,8)
+typedef struct tagTHREADNAME_INFO
+{
+ DWORD dwType; /* Must be 0x1000. */
+ LPCSTR szName; /* Pointer to name (in user addr space). */
+ DWORD dwThreadID; /* Thread ID (-1=caller thread). */
+ DWORD dwFlags; /* Reserved for future use, must be zero. */
+} THREADNAME_INFO;
+#pragma pack(pop)
+
+static void
+SetThreadName(DWORD dwThreadID, const char* threadName)
+{
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = threadName;
+ info.dwThreadID = dwThreadID;
+ info.dwFlags = 0;
+
+ __try {
+ RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER) {
+ }
+}
+#else /* _MSC_VER */
+static void
+SetThreadName(DWORD dwThreadID, const char* threadName)
+{
+ LWIP_UNUSED_ARG(dwThreadID);
+ LWIP_UNUSED_ARG(threadName);
+}
+#endif /* _MSC_VER */
+
+static DWORD WINAPI
+sys_thread_function(void* arg)
+{
+ struct threadlist* t = (struct threadlist*)arg;
+#if LWIP_NETCONN_SEM_PER_THREAD
+ sys_arch_netconn_sem_alloc();
+#endif
+ t->function(t->arg);
+#if LWIP_NETCONN_SEM_PER_THREAD
+ sys_arch_netconn_sem_free();
+#endif
+ return 0;
+}
+
+sys_thread_t
+sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
+{
+ struct threadlist *new_thread;
+ HANDLE h;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ LWIP_UNUSED_ARG(name);
+ LWIP_UNUSED_ARG(stacksize);
+ LWIP_UNUSED_ARG(prio);
+
+ new_thread = (struct threadlist*)malloc(sizeof(struct threadlist));
+ LWIP_ASSERT("new_thread != NULL", new_thread != NULL);
+ if (new_thread != NULL) {
+ new_thread->function = function;
+ new_thread->arg = arg;
+ SYS_ARCH_PROTECT(lev);
+ new_thread->next = lwip_win32_threads;
+ lwip_win32_threads = new_thread;
+
+ h = CreateThread(0, 0, sys_thread_function, new_thread, 0, &(new_thread->id));
+ LWIP_ASSERT("h != 0", h != 0);
+ LWIP_ASSERT("h != -1", h != INVALID_HANDLE_VALUE);
+ LWIP_UNUSED_ARG(h);
+ SetThreadName(new_thread->id, name);
+
+ SYS_ARCH_UNPROTECT(lev);
+ return new_thread->id;
+ }
+ return 0;
+}
+
+#if !NO_SYS
+#if LWIP_TCPIP_CORE_LOCKING
+
+static DWORD lwip_core_lock_holder_thread_id;
+
+void
+sys_lock_tcpip_core(void)
+{
+ sys_mutex_lock(&lock_tcpip_core);
+ lwip_core_lock_holder_thread_id = GetCurrentThreadId();
+}
+
+void
+sys_unlock_tcpip_core(void)
+{
+ lwip_core_lock_holder_thread_id = 0;
+ sys_mutex_unlock(&lock_tcpip_core);
+}
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+
+static DWORD lwip_tcpip_thread_id;
+
+void
+sys_mark_tcpip_thread(void)
+{
+ lwip_tcpip_thread_id = GetCurrentThreadId();
+}
+
+void
+sys_check_core_locking(void)
+{
+ /* Embedded systems should check we are NOT in an interrupt context here */
+
+ if (lwip_tcpip_thread_id != 0) {
+ DWORD current_thread_id = GetCurrentThreadId();
+
+#if LWIP_TCPIP_CORE_LOCKING
+ LWIP_ASSERT("Function called without core lock", current_thread_id == lwip_core_lock_holder_thread_id);
+#else /* LWIP_TCPIP_CORE_LOCKING */
+ LWIP_ASSERT("Function called from wrong thread", current_thread_id == lwip_tcpip_thread_id);
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+ LWIP_UNUSED_ARG(current_thread_id); /* for LWIP_NOASSERT */
+ }
+}
+#endif /* !NO_SYS */
+
+err_t
+sys_mbox_new(sys_mbox_t *mbox, int size)
+{
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_UNUSED_ARG(size);
+
+ mbox->sem = CreateSemaphore(0, 0, MAX_QUEUE_ENTRIES, 0);
+ LWIP_ASSERT("Error creating semaphore", mbox->sem != NULL);
+ if (mbox->sem == NULL) {
+ SYS_ARCH_LOCKED(SYS_STATS_INC(mbox.err));
+ return ERR_MEM;
+ }
+ memset(&mbox->q_mem, 0, sizeof(u32_t)*MAX_QUEUE_ENTRIES);
+ mbox->head = 0;
+ mbox->tail = 0;
+ SYS_ARCH_LOCKED(SYS_STATS_INC_USED(mbox));
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT("sys_mbox_new() counter overflow", lwip_stats.sys.mbox.used != 0);
+#endif /* LWIP_STATS && SYS_STATS */
+ return ERR_OK;
+}
+
+void
+sys_mbox_free(sys_mbox_t *mbox)
+{
+ /* parameter check */
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->sem != NULL", mbox->sem != NULL);
+ LWIP_ASSERT("mbox->sem != INVALID_HANDLE_VALUE", mbox->sem != INVALID_HANDLE_VALUE);
+
+ CloseHandle(mbox->sem);
+
+ SYS_STATS_DEC(mbox.used);
+#if LWIP_STATS && SYS_STATS
+ LWIP_ASSERT( "sys_mbox_free() ", lwip_stats.sys.mbox.used != (u16_t)-1);
+#endif /* LWIP_STATS && SYS_STATS */
+ mbox->sem = NULL;
+}
+
+void
+sys_mbox_post(sys_mbox_t *q, void *msg)
+{
+ BOOL ret;
+ SYS_ARCH_DECL_PROTECT(lev);
+ sys_arch_check_not_protected();
+
+ /* parameter check */
+ LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+ LWIP_ASSERT("q->sem != NULL", q->sem != NULL);
+ LWIP_ASSERT("q->sem != INVALID_HANDLE_VALUE", q->sem != INVALID_HANDLE_VALUE);
+
+ SYS_ARCH_PROTECT(lev);
+ q->q_mem[q->head] = msg;
+ q->head++;
+ if (q->head >= MAX_QUEUE_ENTRIES) {
+ q->head = 0;
+ }
+ LWIP_ASSERT("mbox is full!", q->head != q->tail);
+ ret = ReleaseSemaphore(q->sem, 1, 0);
+ LWIP_ASSERT("Error releasing sem", ret != 0);
+ LWIP_UNUSED_ARG(ret);
+
+ SYS_ARCH_UNPROTECT(lev);
+}
+
+err_t
+sys_mbox_trypost(sys_mbox_t *q, void *msg)
+{
+ u32_t new_head;
+ BOOL ret;
+ SYS_ARCH_DECL_PROTECT(lev);
+ sys_arch_check_not_protected();
+
+ /* parameter check */
+ LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+ LWIP_ASSERT("q->sem != NULL", q->sem != NULL);
+ LWIP_ASSERT("q->sem != INVALID_HANDLE_VALUE", q->sem != INVALID_HANDLE_VALUE);
+
+ SYS_ARCH_PROTECT(lev);
+
+ new_head = q->head + 1;
+ if (new_head >= MAX_QUEUE_ENTRIES) {
+ new_head = 0;
+ }
+ if (new_head == q->tail) {
+ SYS_ARCH_UNPROTECT(lev);
+ return ERR_MEM;
+ }
+
+ q->q_mem[q->head] = msg;
+ q->head = new_head;
+ LWIP_ASSERT("mbox is full!", q->head != q->tail);
+ ret = ReleaseSemaphore(q->sem, 1, 0);
+ LWIP_ASSERT("Error releasing sem", ret != 0);
+ LWIP_UNUSED_ARG(ret);
+
+ SYS_ARCH_UNPROTECT(lev);
+ return ERR_OK;
+}
+
+err_t
+sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg)
+{
+ return sys_mbox_trypost(q, msg);
+}
+
+u32_t
+sys_arch_mbox_fetch(sys_mbox_t *q, void **msg, u32_t timeout)
+{
+ DWORD ret;
+ LONGLONG starttime, endtime;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ /* parameter check */
+ LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+ LWIP_ASSERT("q->sem != NULL", q->sem != NULL);
+ LWIP_ASSERT("q->sem != INVALID_HANDLE_VALUE", q->sem != INVALID_HANDLE_VALUE);
+
+ if (timeout == 0) {
+ timeout = INFINITE;
+ }
+ starttime = sys_get_ms_longlong();
+ ret = WaitForSingleObject(q->sem, timeout);
+ if (ret == WAIT_OBJECT_0) {
+ SYS_ARCH_PROTECT(lev);
+ if (msg != NULL) {
+ *msg = q->q_mem[q->tail];
+ }
+
+ q->tail++;
+ if (q->tail >= MAX_QUEUE_ENTRIES) {
+ q->tail = 0;
+ }
+ SYS_ARCH_UNPROTECT(lev);
+ endtime = sys_get_ms_longlong();
+ return (u32_t)(endtime - starttime);
+ } else {
+ LWIP_ASSERT("Error waiting for sem", ret == WAIT_TIMEOUT);
+ if (msg != NULL) {
+ *msg = NULL;
+ }
+
+ return SYS_ARCH_TIMEOUT;
+ }
+}
+
+u32_t
+sys_arch_mbox_tryfetch(sys_mbox_t *q, void **msg)
+{
+ DWORD ret;
+ SYS_ARCH_DECL_PROTECT(lev);
+
+ /* parameter check */
+ LWIP_ASSERT("q != SYS_MBOX_NULL", q != SYS_MBOX_NULL);
+ LWIP_ASSERT("q->sem != NULL", q->sem != NULL);
+ LWIP_ASSERT("q->sem != INVALID_HANDLE_VALUE", q->sem != INVALID_HANDLE_VALUE);
+
+ ret = WaitForSingleObject(q->sem, 0);
+ if (ret == WAIT_OBJECT_0) {
+ SYS_ARCH_PROTECT(lev);
+ if (msg != NULL) {
+ *msg = q->q_mem[q->tail];
+ }
+
+ q->tail++;
+ if (q->tail >= MAX_QUEUE_ENTRIES) {
+ q->tail = 0;
+ }
+ SYS_ARCH_UNPROTECT(lev);
+ return 0;
+ } else {
+ LWIP_ASSERT("Error waiting for sem", ret == WAIT_TIMEOUT);
+ if (msg != NULL) {
+ *msg = NULL;
+ }
+
+ return SYS_MBOX_EMPTY;
+ }
+}
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+sys_sem_t*
+sys_arch_netconn_sem_get(void)
+{
+ LPVOID tls_data = TlsGetValue(netconn_sem_tls_index);
+ return (sys_sem_t*)tls_data;
+}
+
+void
+sys_arch_netconn_sem_alloc(void)
+{
+ sys_sem_t *sem;
+ err_t err;
+ BOOL done;
+
+ sem = (sys_sem_t*)malloc(sizeof(sys_sem_t));
+ LWIP_ASSERT("failed to allocate memory for TLS semaphore", sem != NULL);
+ err = sys_sem_new(sem, 0);
+ LWIP_ASSERT("failed to initialise TLS semaphore", err == ERR_OK);
+ done = TlsSetValue(netconn_sem_tls_index, sem);
+ LWIP_UNUSED_ARG(done);
+ LWIP_ASSERT("failed to initialise TLS semaphore storage", done == TRUE);
+}
+
+void
+sys_arch_netconn_sem_free(void)
+{
+ LPVOID tls_data = TlsGetValue(netconn_sem_tls_index);
+ if (tls_data != NULL) {
+ BOOL done;
+ free(tls_data);
+ done = TlsSetValue(netconn_sem_tls_index, NULL);
+ LWIP_UNUSED_ARG(done);
+ LWIP_ASSERT("failed to de-init TLS semaphore storage", done == TRUE);
+ }
+}
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+#endif /* !NO_SYS */
+
+/* get keyboard state to terminate the debug app on any kbhit event using win32 API */
+int
+lwip_win32_keypressed(void)
+{
+ INPUT_RECORD rec;
+ DWORD num = 0;
+ HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
+ BOOL ret = PeekConsoleInput(h, &rec, 1, &num);
+ if (ret && num) {
+ ReadConsoleInput(h, &rec, 1, &num);
+ if (rec.EventType == KEY_EVENT) {
+ if (rec.Event.KeyEvent.bKeyDown) {
+ /* not a special key? */
+ if (rec.Event.KeyEvent.uChar.AsciiChar != 0) {
+ return 1;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+#include <stdarg.h>
+
+/* This is an example implementation for LWIP_PLATFORM_DIAG:
+ * format a string and pass it to your output function.
+ */
+void
+lwip_win32_platform_diag(const char *format, ...)
+{
+ va_list ap;
+ /* get the varargs */
+ va_start(ap, format);
+ /* print via varargs; to use another output function, you could use
+ vsnprintf here */
+ vprintf(format, ap);
+ va_end(ap);
+}