Squashed 'lib/lwip/lwip/' content from commit 0a0452b2c39b
git-subtree-dir: lib/lwip/lwip
git-subtree-split: 0a0452b2c39bdd91e252aef045c115f88f6ca773
diff --git a/contrib/Coverity/coverity.c b/contrib/Coverity/coverity.c
new file mode 100644
index 0000000..99bebae
--- /dev/null
+++ b/contrib/Coverity/coverity.c
@@ -0,0 +1,106 @@
+typedef unsigned char err_t;
+typedef unsigned int u32_t;
+typedef unsigned short u16_t;
+typedef unsigned char u8_t;
+typedef void sys_sem_t;
+typedef void sys_mutex_t;
+typedef size_t mem_size_t;
+typedef size_t memp_t;
+struct pbuf;
+struct netif;
+
+void* mem_malloc(mem_size_t size)
+{
+ __coverity_alloc__(size);
+}
+void mem_free(void* mem)
+{
+ __coverity_free__(mem);
+}
+
+void* memp_malloc(memp_t type)
+{
+ __coverity_alloc_nosize__();
+}
+void memp_free(memp_t type, void* mem)
+{
+ __coverity_free__(mem);
+}
+
+void sys_mutex_lock(sys_mutex_t* mutex)
+{
+ __coverity_exclusive_lock_acquire__(mutex);
+}
+void sys_mutex_unlock(sys_mutex_t* mutex)
+{
+ __coverity_exclusive_lock_release__(mutex);
+}
+
+u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
+{
+ __coverity_recursive_lock_acquire__(sem);
+}
+void sys_sem_signal(sys_sem_t *sem)
+{
+ __coverity_recursive_lock_release__(sem);
+}
+
+err_t ethernet_input(struct pbuf *p, struct netif *inp)
+{
+ __coverity_tainted_string_sink_content__(p);
+}
+err_t tcpip_input(struct pbuf *p, struct netif *inp)
+{
+ __coverity_tainted_string_sink_content__(p);
+}
+err_t ip_input(struct pbuf *p, struct netif *inp)
+{
+ __coverity_tainted_string_sink_content__(p);
+}
+err_t ip4_input(struct pbuf *p, struct netif *inp)
+{
+ __coverity_tainted_string_sink_content__(p);
+}
+err_t ip6_input(struct pbuf *p, struct netif *inp)
+{
+ __coverity_tainted_string_sink_content__(p);
+}
+
+err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)
+{
+ __coverity_tainted_string_argument__(buf);
+ __coverity_tainted_data_argument__(buf);
+}
+err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset)
+{
+ __coverity_tainted_string_argument__(buf);
+ __coverity_tainted_data_argument__(buf);
+}
+err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
+{
+ __coverity_tainted_data_transitive__(p_to, p_from);
+}
+u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset)
+{
+ __coverity_tainted_string_argument__(dataptr);
+ __coverity_tainted_data_argument__(dataptr);
+}
+u8_t pbuf_get_at(struct pbuf* p, u16_t offset)
+{
+ __coverity_tainted_data_return__();
+}
+
+void abort(void)
+{
+ __coverity_panic__();
+}
+
+int check_path(char* path, size_t size)
+{
+ if (size) {
+ __coverity_tainted_data_sanitize__(path);
+ return 1;
+ } else {
+ return 0;
+ }
+}
diff --git a/contrib/Filelists.cmake b/contrib/Filelists.cmake
new file mode 100644
index 0000000..a375dd2
--- /dev/null
+++ b/contrib/Filelists.cmake
@@ -0,0 +1,61 @@
+# 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(lwipcontribexamples_SRCS
+ ${LWIP_CONTRIB_DIR}/examples/httpd/fs_example/fs_example.c
+ ${LWIP_CONTRIB_DIR}/examples/httpd/https_example/https_example.c
+ ${LWIP_CONTRIB_DIR}/examples/httpd/ssi_example/ssi_example.c
+ ${LWIP_CONTRIB_DIR}/examples/lwiperf/lwiperf_example.c
+ ${LWIP_CONTRIB_DIR}/examples/mdns/mdns_example.c
+ ${LWIP_CONTRIB_DIR}/examples/mqtt/mqtt_example.c
+ ${LWIP_CONTRIB_DIR}/examples/ppp/pppos_example.c
+ ${LWIP_CONTRIB_DIR}/examples/snmp/snmp_private_mib/lwip_prvmib.c
+ ${LWIP_CONTRIB_DIR}/examples/snmp/snmp_v3/snmpv3_dummy.c
+ ${LWIP_CONTRIB_DIR}/examples/snmp/snmp_example.c
+ ${LWIP_CONTRIB_DIR}/examples/sntp/sntp_example.c
+ ${LWIP_CONTRIB_DIR}/examples/tftp/tftp_example.c
+)
+add_library(lwipcontribexamples EXCLUDE_FROM_ALL ${lwipcontribexamples_SRCS})
+target_compile_options(lwipcontribexamples PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcontribexamples PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwipcontribexamples PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+
+set(lwipcontribapps_SRCS
+ ${LWIP_CONTRIB_DIR}/apps/httpserver/httpserver-netconn.c
+ ${LWIP_CONTRIB_DIR}/apps/chargen/chargen.c
+ ${LWIP_CONTRIB_DIR}/apps/udpecho/udpecho.c
+ ${LWIP_CONTRIB_DIR}/apps/tcpecho/tcpecho.c
+ ${LWIP_CONTRIB_DIR}/apps/shell/shell.c
+ ${LWIP_CONTRIB_DIR}/apps/udpecho_raw/udpecho_raw.c
+ ${LWIP_CONTRIB_DIR}/apps/tcpecho_raw/tcpecho_raw.c
+ ${LWIP_CONTRIB_DIR}/apps/netio/netio.c
+ ${LWIP_CONTRIB_DIR}/apps/ping/ping.c
+ ${LWIP_CONTRIB_DIR}/apps/socket_examples/socket_examples.c
+ ${LWIP_CONTRIB_DIR}/apps/rtp/rtp.c
+)
+add_library(lwipcontribapps EXCLUDE_FROM_ALL ${lwipcontribapps_SRCS})
+target_compile_options(lwipcontribapps PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcontribapps PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwipcontribapps PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+
+set(lwipcontribaddons_SRCS
+ ${LWIP_CONTRIB_DIR}/addons/tcp_isn/tcp_isn.c
+ ${LWIP_CONTRIB_DIR}/addons/ipv6_static_routing/ip6_route_table.c
+# ${LWIP_CONTRIB_DIR}/addons/netconn/external_resolve/dnssd.c
+# ${LWIP_CONTRIB_DIR}/addons/tcp_md5/tcp_md5.c
+)
+add_library(lwipcontribaddons EXCLUDE_FROM_ALL ${lwipcontribaddons_SRCS})
+target_compile_options(lwipcontribaddons PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcontribaddons PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwipcontribaddons PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
diff --git a/contrib/Filelists.mk b/contrib/Filelists.mk
new file mode 100644
index 0000000..f0fb48b
--- /dev/null
+++ b/contrib/Filelists.mk
@@ -0,0 +1,57 @@
+#
+# 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>
+#
+
+# CONTRIBAPPFILES: Contrib Applications.
+CONTRIBAPPFILES=$(CONTRIBDIR)/apps/httpserver/httpserver-netconn.c \
+ $(CONTRIBDIR)/apps/chargen/chargen.c \
+ $(CONTRIBDIR)/apps/udpecho/udpecho.c \
+ $(CONTRIBDIR)/apps/tcpecho/tcpecho.c \
+ $(CONTRIBDIR)/apps/shell/shell.c \
+ $(CONTRIBDIR)/apps/udpecho_raw/udpecho_raw.c \
+ $(CONTRIBDIR)/apps/tcpecho_raw/tcpecho_raw.c \
+ $(CONTRIBDIR)/apps/netio/netio.c \
+ $(CONTRIBDIR)/apps/ping/ping.c \
+ $(CONTRIBDIR)/apps/socket_examples/socket_examples.c \
+ $(CONTRIBDIR)/apps/rtp/rtp.c \
+ $(CONTRIBDIR)/examples/httpd/fs_example/fs_example.c \
+ $(CONTRIBDIR)/examples/httpd/https_example/https_example.c \
+ $(CONTRIBDIR)/examples/httpd/ssi_example/ssi_example.c \
+ $(CONTRIBDIR)/examples/lwiperf/lwiperf_example.c \
+ $(CONTRIBDIR)/examples/mdns/mdns_example.c \
+ $(CONTRIBDIR)/examples/mqtt/mqtt_example.c \
+ $(CONTRIBDIR)/examples/ppp/pppos_example.c \
+ $(CONTRIBDIR)/examples/snmp/snmp_private_mib/lwip_prvmib.c \
+ $(CONTRIBDIR)/examples/snmp/snmp_v3/snmpv3_dummy.c \
+ $(CONTRIBDIR)/examples/snmp/snmp_example.c \
+ $(CONTRIBDIR)/examples/sntp/sntp_example.c \
+ $(CONTRIBDIR)/examples/tftp/tftp_example.c \
+ $(CONTRIBDIR)/addons/tcp_isn/tcp_isn.c \
+ $(CONTRIBDIR)/addons/ipv6_static_routing/ip6_route_table.c
diff --git a/contrib/addons/dhcp_extra_opts/README b/contrib/addons/dhcp_extra_opts/README
new file mode 100644
index 0000000..81a7ced
--- /dev/null
+++ b/contrib/addons/dhcp_extra_opts/README
@@ -0,0 +1,5 @@
+A simple example of using LWIP_HOOK_DHCP_PARSE/APPEND_OPTION hooks to implement:
+* DHCP_OPTION_MTU (option 26) to update the netif's MTU
+* DHCP_OPTION_CLIENT_ID (option 61) to advertize client's HW id of LWIP_IANA_HWTYPE_ETHERNET type
+
+Please follow the instructions in dhcp_extra_opts.h to add the hooks, definitions in lwipopts.h and enabling the extra options.
diff --git a/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.c b/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.c
new file mode 100644
index 0000000..3e287bf
--- /dev/null
+++ b/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) Espressif Systems (Shanghai) CO LTD
+ * 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 copyright holder 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 <string.h>
+
+#include "lwip/prot/dhcp.h"
+#include "lwip/dhcp.h"
+#include "lwip/netif.h"
+#include "lwip/prot/iana.h"
+
+
+void dhcp_parse_extra_opts(struct dhcp *dhcp, uint8_t state, uint8_t option, uint8_t len, struct pbuf* p, uint16_t offset)
+{
+ LWIP_UNUSED_ARG(dhcp);
+ LWIP_UNUSED_ARG(state);
+ LWIP_UNUSED_ARG(option);
+ LWIP_UNUSED_ARG(len);
+ LWIP_UNUSED_ARG(p);
+ LWIP_UNUSED_ARG(offset);
+#if LWIP_DHCP_ENABLE_MTU_UPDATE
+ if ((option == DHCP_OPTION_MTU) &&
+ (state == DHCP_STATE_REBOOTING || state == DHCP_STATE_REBINDING ||
+ state == DHCP_STATE_RENEWING || state == DHCP_STATE_REQUESTING)) {
+ u32_t mtu = 0;
+ struct netif *netif;
+ LWIP_ERROR("dhcp_parse_extra_opts(): MTU option's len != 2", len == 2, return;);
+ LWIP_ERROR("dhcp_parse_extra_opts(): extracting MTU option failed",
+ pbuf_copy_partial(p, &mtu, 2, offset) == 2, return;);
+ mtu = lwip_htons((u16_t)mtu);
+ NETIF_FOREACH(netif) {
+ /* find the netif related to this dhcp */
+ if (dhcp == netif_dhcp_data(netif)) {
+ if (mtu < netif->mtu) {
+ netif->mtu = mtu;
+ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_parse_extra_opts(): Negotiated netif MTU is %d\n", netif->mtu));
+ }
+ return;
+ }
+ }
+ } /* DHCP_OPTION_MTU */
+#endif /* LWIP_DHCP_ENABLE_MTU_UPDATE */
+}
+
+void dhcp_append_extra_opts(struct netif *netif, uint8_t state, struct dhcp_msg *msg_out, uint16_t *options_out_len)
+{
+ LWIP_UNUSED_ARG(netif);
+ LWIP_UNUSED_ARG(state);
+ LWIP_UNUSED_ARG(msg_out);
+ LWIP_UNUSED_ARG(options_out_len);
+#if LWIP_DHCP_ENABLE_CLIENT_ID
+ if (state == DHCP_STATE_RENEWING || state == DHCP_STATE_REBINDING ||
+ state == DHCP_STATE_REBOOTING || state == DHCP_STATE_OFF ||
+ state == DHCP_STATE_REQUESTING || state == DHCP_STATE_BACKING_OFF || state == DHCP_STATE_SELECTING) {
+ size_t i;
+ u8_t *options = msg_out->options + *options_out_len;
+ LWIP_ERROR("dhcp_append(client_id): options_out_len + 3 + netif->hwaddr_len <= DHCP_OPTIONS_LEN",
+ *options_out_len + 3U + netif->hwaddr_len <= DHCP_OPTIONS_LEN, return;);
+ *options_out_len = *options_out_len + netif->hwaddr_len + 3;
+ *options++ = DHCP_OPTION_CLIENT_ID;
+ *options++ = netif->hwaddr_len + 1; /* option size */
+ *options++ = LWIP_IANA_HWTYPE_ETHERNET;
+ for (i = 0; i < netif->hwaddr_len; i++) {
+ *options++ = netif->hwaddr[i];
+ }
+ }
+#endif /* LWIP_DHCP_ENABLE_CLIENT_ID */
+}
diff --git a/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.h b/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.h
new file mode 100644
index 0000000..959404d
--- /dev/null
+++ b/contrib/addons/dhcp_extra_opts/dhcp_extra_opts.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) Espressif Systems (Shanghai) CO LTD
+ * 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 copyright holder 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
+ *
+ * To use these additional DHCP options, make sure this file is included in LWIP_HOOK_FILENAME
+ * and define these hooks:
+ *
+ * #define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) \
+ * do { LWIP_UNUSED_ARG(msg); \
+ * dhcp_parse_extra_opts(dhcp, state, option, len, pbuf, offset); \
+ * } while(0)
+ *
+ * #define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr) \
+ * dhcp_append_extra_opts(netif, state, msg, options_len_ptr);
+ *
+ * To enable (disable) these option, please set one or both of the below macros to 1 (0)
+ * #define LWIP_DHCP_ENABLE_MTU_UPDATE 1
+ * #define LWIP_DHCP_ENABLE_CLIENT_ID 1
+ */
+
+#ifndef LWIP_HDR_CONTRIB_ADDONS_DHCP_OPTS_H
+#define LWIP_HDR_CONTRIB_ADDONS_DHCP_OPTS_H
+
+/* Add standard integers so the header could be included before lwip */
+#include <stdint.h>
+
+/* Forward declare lwip structs */
+struct dhcp;
+struct pbuf;
+struct dhcp;
+struct netif;
+struct dhcp_msg;
+
+/* Internal hook functions */
+void dhcp_parse_extra_opts(struct dhcp *dhcp, uint8_t state, uint8_t option, uint8_t len, struct pbuf* p, uint16_t offset);
+void dhcp_append_extra_opts(struct netif *netif, uint8_t state, struct dhcp_msg *msg_out, uint16_t *options_out_len);
+
+#endif /* LWIP_HDR_CONTRIB_ADDONS_DHCP_OPTS_H */
diff --git a/contrib/addons/ipv6_static_routing/README b/contrib/addons/ipv6_static_routing/README
new file mode 100644
index 0000000..0c3b06c
--- /dev/null
+++ b/contrib/addons/ipv6_static_routing/README
@@ -0,0 +1,43 @@
+A simple routing table implementation for addition, deletion and lookup of IPv6 routes.
+
+APIs are:
+1) s8_t ip6_add_route_entry(struct ip6_prefix *ip6_prefix,
+ struct netif *netif,
+ ip6_addr_t *gateway,
+ s8_t *index);
+
+2) err_t ip6_remove_route_entry(struct ip6_prefix *ip6_prefix);
+
+3) s8_t ip6_find_route_entry(ip6_addr_t *ip6_dest_addr);
+
+4) struct netif *ip6_static_route(ip6_addr_t *src, ip6_addr_t *dest);
+
+5) ip6_addr_t *ip6_get_gateway(struct netif *netif, ip6_addr_t *dest);
+
+6) struct ip6_route_entry *ip6_get_route_table(void);
+
+For route lookup from the table, The LWIP_HOOK_IP6_ROUTE hook in ip6_route(..) of ip6.c
+could be assigned to the ip6_static_route() API of this implementation to return the
+appropriate netif.
+
+-- The application can add routes using the API ip6_add_route_entry(..).
+ This API adds the ip6 prefix route into the static route table while
+ keeping all entries sorted in decreasing order of prefix length.
+ Subsequently, a linear search down the list can be performed to retrieve a
+ matching route entry for a Longest Prefix Match.
+ The prefix length is expected to be at an 8-bit boundary. While this is
+ a limitation, it would serve most practical purposes.
+
+-- The application can remove routes using the API ip6_remove_route_entry(..).
+
+-- The application can find a route entry for a specific address using the
+ ip6_find_route_entry() function which returns the index of the found entry.
+ This is used internally by the route lookup function ip6_static_route() API.
+
+-- To fetch the gateway IPv6 address for a specific destination IPv6
+ address and target netif, the application can call ip6_get_gateway(..).
+ This API could be assigned to the LWIP_HOOK_ND6_GET_GW() if a gateway has
+ been added as part of the ip6_add_route_entry().
+
+-- To fetch a pointer to the head of the table, the application can call
+ ip6_get_route_table().
diff --git a/contrib/addons/ipv6_static_routing/ip6_route_table.c b/contrib/addons/ipv6_static_routing/ip6_route_table.c
new file mode 100644
index 0000000..a92dd33
--- /dev/null
+++ b/contrib/addons/ipv6_static_routing/ip6_route_table.c
@@ -0,0 +1,248 @@
+/**
+ * @file
+ * IPv6 static route table.
+ */
+
+/*
+ * Copyright (c) 2015 Nest Labs, Inc.
+ * 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.
+ *
+ * Author: Pradip De <pradipd@google.com>
+ *
+ *
+ * Please coordinate changes and requests with Pradip De
+ * <pradipd@google.com>
+ */
+
+#include "lwip/opt.h"
+
+#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
+
+#include "ip6_route_table.h"
+#include "lwip/def.h"
+#include "lwip/mem.h"
+#include "lwip/netif.h"
+#include "lwip/ip6.h"
+#include "lwip/ip6_addr.h"
+#include "lwip/nd6.h"
+#include "lwip/debug.h"
+#include "lwip/stats.h"
+
+#include "string.h"
+
+static struct ip6_route_entry static_route_table[LWIP_IPV6_NUM_ROUTE_ENTRIES];
+
+/**
+ * Add the ip6 prefix route and target netif into the static route table while
+ * keeping all entries sorted in decreasing order of prefix length.
+ * 1. Search from the last entry up to find the correct slot to insert while
+ * moving entries one position down to create room.
+ * 2. Insert into empty slot created.
+ *
+ * Subsequently, a linear search down the list can be performed to retrieve a
+ * matching route entry for a Longest Prefix Match.
+ *
+ * @param ip6_prefix the route prefix entry to add.
+ * @param netif pointer to target netif.
+ * @param gateway the gateway address to use to send through. Has to be link local.
+ * @param idx return value argument of index where route entry was added in table.
+ * @return ERR_OK if addition was successful.
+ * ERR_MEM if table is already full.
+ * ERR_ARG if passed argument is bad or route already exists in table.
+ */
+err_t
+ip6_add_route_entry(const struct ip6_prefix *ip6_prefix, struct netif *netif, const ip6_addr_t *gateway, s8_t *idx)
+{
+ s8_t i = -1;
+ err_t retval = ERR_OK;
+
+ if (!ip6_prefix_valid(ip6_prefix->prefix_len) || (netif == NULL)) {
+ retval = ERR_ARG;
+ goto exit;
+ }
+
+ /* Check if an entry already exists with matching prefix; If so, replace it. */
+ for (i = 0; i < LWIP_IPV6_NUM_ROUTE_ENTRIES; i++) {
+ if ((ip6_prefix->prefix_len == static_route_table[i].prefix.prefix_len) &&
+ memcmp(&ip6_prefix->addr, &static_route_table[i].prefix.addr,
+ ip6_prefix->prefix_len / 8) == 0) {
+ /* Prefix matches; replace the netif with the one being added. */
+ goto insert;
+ }
+ }
+
+ /* Check if the table is full */
+ if (static_route_table[LWIP_IPV6_NUM_ROUTE_ENTRIES - 1].netif != NULL) {
+ retval = ERR_MEM;
+ goto exit;
+ }
+
+ /* Shift all entries down the table until slot is found */
+ for (i = LWIP_IPV6_NUM_ROUTE_ENTRIES - 1;
+ i > 0 && (ip6_prefix->prefix_len > static_route_table[i - 1].prefix.prefix_len); i--) {
+ SMEMCPY(&static_route_table[i], &static_route_table[i - 1], sizeof(struct ip6_route_entry));
+ }
+
+insert:
+ /* Insert into the slot selected */
+ SMEMCPY(&static_route_table[i].prefix, ip6_prefix, sizeof(struct ip6_prefix));
+ static_route_table[i].netif = netif;
+
+ /* Add gateway to route table */
+ static_route_table[i].gateway = gateway;
+
+ if (idx != NULL) {
+ *idx = i;
+ }
+
+exit:
+ return retval;
+}
+
+/**
+ * Removes the route entry from the static route table.
+ *
+ * @param ip6_prefix the route prefix entry to delete.
+ */
+void
+ip6_remove_route_entry(const struct ip6_prefix *ip6_prefix)
+{
+ int i, pos = -1;
+
+ for (i = 0; i < LWIP_IPV6_NUM_ROUTE_ENTRIES; i++) {
+ /* compare prefix to find position to delete */
+ if (ip6_prefix->prefix_len == static_route_table[i].prefix.prefix_len &&
+ memcmp(&ip6_prefix->addr, &static_route_table[i].prefix.addr,
+ ip6_prefix->prefix_len / 8) == 0) {
+ pos = i;
+ break;
+ }
+ }
+
+ if (pos >= 0) {
+ /* Shift everything beyond pos one slot up */
+ for (i = pos; i < LWIP_IPV6_NUM_ROUTE_ENTRIES - 1; i++) {
+ SMEMCPY(&static_route_table[i], &static_route_table[i+1], sizeof(struct ip6_route_entry));
+ if (static_route_table[i].netif == NULL) {
+ break;
+ }
+ }
+ /* Zero the remaining entries */
+ for (; i < LWIP_IPV6_NUM_ROUTE_ENTRIES; i++) {
+ ip6_addr_set_zero((&static_route_table[i].prefix.addr));
+ static_route_table[i].netif = NULL;
+ }
+ }
+}
+
+/**
+ * Finds the appropriate route entry in the static route table corresponding to the given
+ * destination IPv6 address. Since the entries in the route table are kept sorted in decreasing
+ * order of prefix length, a linear search down the list is performed to retrieve a matching
+ * index.
+ *
+ * @param ip6_dest_addr the destination address to match
+ * @return the idx of the found route entry; -1 if not found.
+ */
+s8_t
+ip6_find_route_entry(const ip6_addr_t *ip6_dest_addr)
+{
+ s8_t i, idx = -1;
+
+ /* Search prefix in the sorted(decreasing order of prefix length) list */
+ for(i = 0; i < LWIP_IPV6_NUM_ROUTE_ENTRIES; i++) {
+ if (memcmp(ip6_dest_addr, &static_route_table[i].prefix.addr,
+ static_route_table[i].prefix.prefix_len / 8) == 0) {
+ idx = i;
+ break;
+ }
+ }
+
+ return idx;
+}
+
+/**
+ * Finds the appropriate network interface for a given IPv6 address from a routing table with
+ * static IPv6 routes.
+ *
+ * @param src the source IPv6 address, if known
+ * @param dest the destination IPv6 address for which to find the route
+ * @return the netif on which to send to reach dest
+ */
+struct netif *
+ip6_static_route(const ip6_addr_t *src, const ip6_addr_t *dest)
+{
+ int i;
+
+ LWIP_UNUSED_ARG(src);
+
+ /* Perform table lookup */
+ i = ip6_find_route_entry(dest);
+
+ if (i >= 0) {
+ return static_route_table[i].netif;
+ } else {
+ return NULL;
+ }
+}
+
+/**
+ * Finds the gateway IP6 address for a given destination IPv6 address and target netif
+ * from a routing table with static IPv6 routes.
+ *
+ * @param netif the netif used for sending
+ * @param dest the destination IPv6 address
+ * @return the ip6 address of the gateway to forward packet to
+ */
+const ip6_addr_t *
+ip6_get_gateway(struct netif *netif, const ip6_addr_t *dest)
+{
+ const ip6_addr_t *ret_gw = NULL;
+ const int i = ip6_find_route_entry(dest);
+
+ LWIP_UNUSED_ARG(netif);
+
+ if (i >= 0) {
+ if (static_route_table[i].gateway != NULL) {
+ ret_gw = static_route_table[i].gateway;
+ }
+ }
+
+ return ret_gw;
+}
+
+/**
+ * Returns the top of the route table.
+ * This should be used for debug printing only.
+ *
+ * @return the top of the route table.
+ */
+const struct ip6_route_entry *
+ip6_get_route_table(void)
+{
+ return static_route_table;
+}
+
+#endif /* LWIP_IPV6 */
diff --git a/contrib/addons/ipv6_static_routing/ip6_route_table.h b/contrib/addons/ipv6_static_routing/ip6_route_table.h
new file mode 100644
index 0000000..478328e
--- /dev/null
+++ b/contrib/addons/ipv6_static_routing/ip6_route_table.h
@@ -0,0 +1,94 @@
+/**
+ * @file
+ *
+ * IPv6 static route table.
+ */
+
+/*
+ * Copyright (c) 2015 Nest Labs, Inc.
+ * 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.
+ *
+ * Author: Pradip De <pradipd@google.com>
+ *
+ *
+ * Please coordinate changes and requests with Pradip De
+ * <pradipd@google.com>
+ */
+
+#ifndef __LWIP_IP6_ROUTE_TABLE_H__
+#define __LWIP_IP6_ROUTE_TABLE_H__
+
+#include "lwip/opt.h"
+
+#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/ip6_addr.h"
+#include "lwip/err.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct netif;
+
+/**
+ * LWIP_IPV6_NUM_ROUTES: Number of IPV6 routes that can be kept in the static route table.
+ */
+#ifndef LWIP_IPV6_NUM_ROUTE_ENTRIES
+#define LWIP_IPV6_NUM_ROUTE_ENTRIES (8)
+#endif
+
+#define IP6_MAX_PREFIX_LEN (128)
+#define IP6_PREFIX_ALLOWED_GRANULARITY (8)
+/* Prefix length cannot be greater than 128 bits and needs to be at a byte boundary */
+#define ip6_prefix_valid(prefix_len) (((prefix_len) <= IP6_MAX_PREFIX_LEN) && \
+ (((prefix_len) % IP6_PREFIX_ALLOWED_GRANULARITY) == 0))
+
+struct ip6_prefix {
+ ip6_addr_t addr;
+ u8_t prefix_len; /* prefix length in bits at byte boundaries */
+};
+
+struct ip6_route_entry {
+ struct ip6_prefix prefix;
+ struct netif *netif;
+ const ip6_addr_t *gateway;
+};
+
+err_t ip6_add_route_entry(const struct ip6_prefix *ip6_prefix, struct netif *netif,
+ const ip6_addr_t *gateway, s8_t *idx);
+void ip6_remove_route_entry(const struct ip6_prefix *ip6_prefix);
+s8_t ip6_find_route_entry(const ip6_addr_t *ip6_dest_addr);
+struct netif *ip6_static_route(const ip6_addr_t *src, const ip6_addr_t *dest);
+const ip6_addr_t *ip6_get_gateway(struct netif *netif, const ip6_addr_t *dest);
+const struct ip6_route_entry *ip6_get_route_table(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_IPV6 */
+
+#endif /* __LWIP_IP6_ROUTE_TABLE_H__ */
diff --git a/contrib/addons/netconn/external_resolve/dnssd.c b/contrib/addons/netconn/external_resolve/dnssd.c
new file mode 100644
index 0000000..d26743b
--- /dev/null
+++ b/contrib/addons/netconn/external_resolve/dnssd.c
@@ -0,0 +1,164 @@
+/**
+ * @file
+ * DNS-SD APIs used by LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
+ *
+ * This implementation assumes the DNS-SD API implementation (most likely provided by
+ * mDNSResponder) is implemented in the same process space as LwIP and can directly
+ * invoke the callback for DNSServiceGetAddrInfo. This is the typical deployment in
+ * an embedded environment where as a traditional OS requires pumping the callback results
+ * through an IPC mechanism (see DNSServiceRefSockFD/DNSServiceProcessResult)
+ *
+ * @defgroup dnssd DNS-SD
+ * @ingroup dns
+ */
+
+/*
+ * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. <joel.cunningham@garmin.com>
+ * 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: Joel Cunningham <joel.cunningham@me.com>
+ *
+ */
+#include "lwip/opt.h"
+
+#include "lwip/err.h"
+#include "lwip/inet.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+
+#include "dnssd.h"
+
+/* External headers */
+#include <string.h>
+#include <dns_sd.h>
+
+/* This timeout should allow for multiple queries.
+mDNSResponder has the following query timeline:
+ Query 1: time = 0s
+ Query 2: time = 1s
+ Query 3: time = 4s
+*/
+#define GETADDR_TIMEOUT_MS 5000
+#define LOCAL_DOMAIN ".local"
+
+/* Only consume .local hosts */
+#ifndef CONSUME_LOCAL_ONLY
+#define CONSUME_LOCAL_ONLY 1
+#endif
+
+struct addr_clbk_msg {
+ sys_sem_t sem;
+ struct sockaddr_storage addr;
+ err_t err;
+};
+
+static void addr_info_callback(DNSServiceRef ref, DNSServiceFlags flags, u32_t interface_index,
+ DNSServiceErrorType error_code, char const* hostname,
+ const struct sockaddr* address, u32_t ttl, void* context);
+
+int
+lwip_dnssd_gethostbyname(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err)
+{
+ DNSServiceErrorType result;
+ DNSServiceRef ref;
+ struct addr_clbk_msg msg;
+ char *p;
+
+ /* @todo: use with IPv6 */
+ LWIP_UNUSED_ARG(addrtype);
+
+#if CONSUME_LOCAL_ONLY
+ /* check if this is a .local host. If it is, then we consume the query */
+ p = strstr(name, LOCAL_DOMAIN);
+ if (p == NULL) {
+ return 0; /* not consumed */
+ }
+ p += (sizeof(LOCAL_DOMAIN) - 1);
+ /* check to make sure .local isn't a substring (only allow .local\0 or .local.\0) */
+ if ((*p != '.' && *p != '\0') ||
+ (*p == '.' && *(p + 1) != '\0')) {
+ return 0; /* not consumed */
+ }
+#endif /* CONSUME_LOCAL_ONLY */
+
+ msg.err = sys_sem_new(&msg.sem, 0);
+ if (msg.err != ERR_OK) {
+ goto query_done;
+ }
+
+ msg.err = ERR_TIMEOUT;
+ result = DNSServiceGetAddrInfo(&ref, 0, 0, kDNSServiceProtocol_IPv4, name, addr_info_callback, &msg);
+ if (result == kDNSServiceErr_NoError) {
+ sys_arch_sem_wait(&msg.sem, GETADDR_TIMEOUT_MS);
+ DNSServiceRefDeallocate(ref);
+
+ /* We got a response */
+ if (msg.err == ERR_OK) {
+ struct sockaddr_in* addr_in = (struct sockaddr_in *)&msg.addr;
+ if (addr_in->sin_family == AF_INET) {
+ inet_addr_to_ip4addr(ip_2_ip4(addr), &addr_in->sin_addr);
+ } else {
+ /* @todo add IPv6 support */
+ msg.err = ERR_VAL;
+ }
+ }
+ }
+ sys_sem_free(&msg.sem);
+
+/* Query has been consumed and is finished */
+query_done:
+*err = msg.err;
+return 1;
+}
+
+static void
+addr_info_callback(DNSServiceRef ref, DNSServiceFlags flags, u32_t interface_index,
+ DNSServiceErrorType error_code, char const* hostname,
+ const struct sockaddr* address, u32_t ttl, void* context)
+{
+ struct addr_clbk_msg* msg = (struct addr_clbk_msg*)context;
+ struct sockaddr_in* addr_in = (struct sockaddr_in *)address;
+
+ LWIP_UNUSED_ARG(ref);
+ LWIP_UNUSED_ARG(flags);
+ LWIP_UNUSED_ARG(interface_index);
+ LWIP_UNUSED_ARG(hostname);
+ LWIP_UNUSED_ARG(ttl);
+ LWIP_UNUSED_ARG(context);
+
+ if ((error_code == kDNSServiceErr_NoError) &&
+ (addr_in->sin_family == AF_INET)) {
+ MEMCPY(&msg->addr, addr_in, sizeof(*addr_in));
+ msg->err = ERR_OK;
+ }
+ else {
+ /* @todo add IPv6 support */
+ msg->err = ERR_VAL;
+ }
+
+ sys_sem_signal(&msg->sem);
+} /* addr_info_callback() */
diff --git a/contrib/addons/netconn/external_resolve/dnssd.h b/contrib/addons/netconn/external_resolve/dnssd.h
new file mode 100644
index 0000000..e2d71d9
--- /dev/null
+++ b/contrib/addons/netconn/external_resolve/dnssd.h
@@ -0,0 +1,50 @@
+/**
+ * @file
+ * DNS-SD APIs used by LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE
+ *
+ * @defgroup dnssd DNS-SD
+ * @ingroup dns
+ */
+
+/*
+ * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. <joel.cunningham@garmin.com>
+ * 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: Joel Cunningham <joel.cunningham@me.com>
+ *
+ */
+#include "lwip/opt.h"
+
+#ifndef LWIP_HDR_DNSSD_H
+#define LWIP_HDR_DNSSD_H
+
+#include "lwip/err.h"
+#include "lwip/ip_addr.h"
+
+int lwip_dnssd_gethostbyname(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err);
+
+#endif /* LWIP_HDR_DNSSD_H */
diff --git a/contrib/addons/tcp_isn/tcp_isn.c b/contrib/addons/tcp_isn/tcp_isn.c
new file mode 100644
index 0000000..c161499
--- /dev/null
+++ b/contrib/addons/tcp_isn/tcp_isn.c
@@ -0,0 +1,182 @@
+/**
+ * @file
+ *
+ * Reference implementation of the TCP ISN algorithm standardized in RFC 6528.
+ * Produce TCP Initial Sequence Numbers by combining an MD5-generated hash
+ * based on the new TCP connection's identity and a stable secret, with the
+ * current time at 4-microsecond granularity.
+ *
+ * Specifically, the implementation uses MD5 to compute a hash of the input
+ * buffer, which contains both the four-tuple of the new TCP connection (local
+ * and remote IP address and port), as well as a 16-byte secret to make the
+ * results unpredictable to external parties. The secret must be given at
+ * initialization time and should ideally remain the same across system
+ * reboots. To be sure: the spoofing-resistance of the resulting ISN depends
+ * mainly on the strength of the supplied secret!
+ *
+ * The implementation takes 32 bits from the computed hash, and adds to it the
+ * current time, in 4-microsecond units. The current time is computed from a
+ * boot time given at initialization, and the current uptime as provided by
+ * sys_now(). Thus, it assumes that sys_now() returns a time value that is
+ * relative to the boot time, i.e., that it starts at 0 at system boot, and
+ * only ever increases monotonically.
+ *
+ * For efficiency reasons, a single MD5 input buffer is used, and partially
+ * filled in at initialization time. Specifically, of this 64-byte buffer, the
+ * first 36 bytes are used for the four-way TCP tuple data, followed by the
+ * 16-byte secret, followed by 12-byte zero padding. The 64-byte size of the
+ * buffer should achieve the best performance for the actual MD5 computation.
+ *
+ * Basic usage:
+ *
+ * 1. in your lwipopts.h, add the following lines:
+ *
+ * #include <lwip/arch.h>
+ * struct ip_addr;
+ * u32_t lwip_hook_tcp_isn(const struct ip_addr *local_ip, u16_t local_port,
+ * const struct ip_addr *remote_ip, u16_t remote_port);
+ * "#define LWIP_HOOK_TCP_ISN lwip_hook_tcp_isn";
+ *
+ * 2. from your own code, call lwip_init_tcp_isn() at initialization time, with
+ * appropriate parameters.
+ */
+
+/*
+ * Copyright (c) 2016 The MINIX 3 Project.
+ * 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.
+ *
+ * Author: David van Moolenbroek <david@minix3.org>
+ */
+
+#include "tcp_isn.h"
+#include "lwip/ip_addr.h"
+#include "lwip/sys.h"
+#include <string.h>
+
+#ifdef LWIP_HOOK_TCP_ISN
+
+/* pull in md5 of ppp? */
+#include "netif/ppp/ppp_opts.h"
+#if !PPP_SUPPORT || (!LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS)
+#undef LWIP_INCLUDED_POLARSSL_MD5
+#define LWIP_INCLUDED_POLARSSL_MD5 1
+#include "netif/ppp/polarssl/md5.h"
+#endif
+
+static u8_t input[64];
+static u32_t base_time;
+
+/**
+ * Initialize the TCP ISN module, with the boot time and a secret.
+ *
+ * @param boot_time Wall clock boot time of the system, in seconds.
+ * @param secret_16_bytes A 16-byte secret used to randomize the TCP ISNs.
+ */
+void
+lwip_init_tcp_isn(u32_t boot_time, const u8_t *secret_16_bytes)
+{
+ /* Initialize the input buffer with the secret and trailing zeroes. */
+ memset(input, 0, sizeof(input));
+
+ MEMCPY(&input[36], secret_16_bytes, 16);
+
+ /* Save the boot time in 4-us units. Overflow is no problem here. */
+ base_time = boot_time * 250000;
+}
+
+/**
+ * Hook to generate an Initial Sequence Number (ISN) for a new TCP connection.
+ *
+ * @param local_ip The local IP address.
+ * @param local_port The local port number, in host-byte order.
+ * @param remote_ip The remote IP address.
+ * @param remote_port The remote port number, in host-byte order.
+ * @return The ISN to use for the new TCP connection.
+ */
+u32_t
+lwip_hook_tcp_isn(const ip_addr_t *local_ip, u16_t local_port,
+ const ip_addr_t *remote_ip, u16_t remote_port)
+{
+ md5_context ctx;
+ u8_t output[16];
+ u32_t isn;
+
+#if LWIP_IPV4 && LWIP_IPV6
+ if (IP_IS_V6(local_ip))
+#endif /* LWIP_IPV4 && LWIP_IPV6 */
+#if LWIP_IPV6
+ {
+ const ip6_addr_t *local_ip6, *remote_ip6;
+
+ local_ip6 = ip_2_ip6(local_ip);
+ remote_ip6 = ip_2_ip6(remote_ip);
+
+ SMEMCPY(&input[0], &local_ip6->addr, 16);
+ SMEMCPY(&input[16], &remote_ip6->addr, 16);
+ }
+#endif /* LWIP_IPV6 */
+#if LWIP_IPV4 && LWIP_IPV6
+ else
+#endif /* LWIP_IPV4 && LWIP_IPV6 */
+#if LWIP_IPV4
+ {
+ const ip4_addr_t *local_ip4, *remote_ip4;
+
+ local_ip4 = ip_2_ip4(local_ip);
+ remote_ip4 = ip_2_ip4(remote_ip);
+
+ /* Represent IPv4 addresses as IPv4-mapped IPv6 addresses, to ensure that
+ * the IPv4 and IPv6 address spaces are completely disjoint. */
+ memset(&input[0], 0, 10);
+ input[10] = 0xff;
+ input[11] = 0xff;
+ SMEMCPY(&input[12], &local_ip4->addr, 4);
+ memset(&input[16], 0, 10);
+ input[26] = 0xff;
+ input[27] = 0xff;
+ SMEMCPY(&input[28], &remote_ip4->addr, 4);
+ }
+#endif /* LWIP_IPV4 */
+
+ input[32] = (u8_t)(local_port >> 8);
+ input[33] = (u8_t)(local_port & 0xff);
+ input[34] = (u8_t)(remote_port >> 8);
+ input[35] = (u8_t)(remote_port & 0xff);
+
+ /* The secret and padding are already filled in. */
+
+ /* Generate the hash, using MD5. */
+ md5_starts(&ctx);
+ md5_update(&ctx, input, sizeof(input));
+ md5_finish(&ctx, output);
+
+ /* Arbitrarily take the first 32 bits from the generated hash. */
+ MEMCPY(&isn, output, sizeof(isn));
+
+ /* Add the current time in 4-microsecond units. */
+ return isn + base_time + sys_now() * 250;
+}
+
+#endif /* LWIP_HOOK_TCP_ISN */
diff --git a/contrib/addons/tcp_isn/tcp_isn.h b/contrib/addons/tcp_isn/tcp_isn.h
new file mode 100644
index 0000000..ebaeca2
--- /dev/null
+++ b/contrib/addons/tcp_isn/tcp_isn.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2016 The MINIX 3 Project.
+ * 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.
+ *
+ * Author: David van Moolenbroek <david@minix3.org>
+ */
+
+#ifndef LWIP_HDR_CONTRIB_ADDONS_TCP_ISN_H
+#define LWIP_HDR_CONTRIB_ADDONS_TCP_ISN_H
+
+#include "lwip/opt.h"
+#include "lwip/ip_addr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void lwip_init_tcp_isn(u32_t boot_time, const u8_t *secret_16_bytes);
+u32_t lwip_hook_tcp_isn(const ip_addr_t *local_ip, u16_t local_port,
+ const ip_addr_t *remote_ip, u16_t remote_port);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_CONTRIB_ADDONS_TCP_ISN_H */
diff --git a/contrib/addons/tcp_md5/README b/contrib/addons/tcp_md5/README
new file mode 100644
index 0000000..a6408ca
--- /dev/null
+++ b/contrib/addons/tcp_md5/README
@@ -0,0 +1,27 @@
+This folder provides an example implementation of how to add custom tcp header
+options and custom socket options.
+
+It does this by implementing the (seldom used) tcp md5 signature.
+
+To enable it, add an LWIP_HOOK_FILENAME hook file, include tcp_md5.h in it and
+define these hooks:
+
+ #define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p) tcp_md5_check_inpacket(pcb, hdr, optlen, opt1len, opt2, p)
+ #define LWIP_HOOK_TCP_OPT_LENGTH_SEGMENT(pcb, internal_len) tcp_md5_get_additional_option_length(pcb, internal_len)
+ #define LWIP_HOOK_TCP_ADD_TX_OPTIONS(p, hdr, pcb, opts) tcp_md5_add_tx_options(p, hdr, pcb, opts)
+ #define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) tcp_md5_setsockopt_hook(sock, level, optname, optval, optlen, err)
+
+Then, in your sockets application, enable md5 signature on a socket like this:
+
+ struct tcp_md5sig md5;
+ struct sockaddr_storage addr_remote; /* Initialize this to remote address and port */
+ memcpy(&md5.tcpm_addr, &addr_remote, sizeof(addr_remote));
+ strcpy(md5.tcpm_key, key); /* this is the md5 key per connection */
+ md5.tcpm_keylen = strlen(key);
+ if ((ret = setsockopt(sockfd, IPPROTO_TCP, TCP_MD5SIG, &md5, sizeof(md5))) < 0) {
+ perror("setsockopt TCP_MD5SIG");
+ return;
+ }
+
+After that, your connection (client) or all incoming connections (server) require
+tcp md5 signatures.
diff --git a/contrib/addons/tcp_md5/tcp_md5.c b/contrib/addons/tcp_md5/tcp_md5.c
new file mode 100644
index 0000000..e7815d8
--- /dev/null
+++ b/contrib/addons/tcp_md5/tcp_md5.c
@@ -0,0 +1,534 @@
+/**
+ * @file: An implementation of TCP MD5 signatures by using various hooks in
+ * lwIP to implement custom tcp options and custom socket options.
+ */
+
+/*
+ * Copyright (c) 2018 Simon Goldschmidt
+ * 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.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ */
+
+#include "tcp_md5.h"
+#include "lwip/ip_addr.h"
+#include "lwip/sys.h"
+#include "lwip/prot/tcp.h"
+#include "lwip/priv/tcp_priv.h"
+#include "lwip/sockets.h"
+#include "lwip/priv/sockets_priv.h"
+#include "lwip/api.h"
+#include <string.h>
+
+/* pull in md5 of ppp? */
+#include "netif/ppp/ppp_opts.h"
+#if !PPP_SUPPORT || (!LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS)
+#undef LWIP_INCLUDED_POLARSSL_MD5
+#define LWIP_INCLUDED_POLARSSL_MD5 1
+#include "netif/ppp/polarssl/md5.h"
+#endif
+
+#if !LWIP_TCP_PCB_NUM_EXT_ARGS
+#error tcp_md5 needs LWIP_TCP_PCB_NUM_EXT_ARGS
+#endif
+
+#define LWIP_TCP_OPT_MD5 19 /* number of the md5 option */
+#define LWIP_TCP_OPT_LEN_MD5 18 /* length of the md5 option */
+#define LWIP_TCP_OPT_LEN_MD5_OUT 20 /* 18 + alignment */
+
+#define LWIP_TCP_MD5_DIGEST_LEN 16
+
+/* This keeps the md5 state internally */
+struct tcp_md5_conn_info {
+ struct tcp_md5_conn_info *next;
+ ip_addr_t remote_addr;
+ u16_t remote_port;
+ u8_t key[TCP_MD5SIG_MAXKEYLEN];
+ u16_t key_len;
+};
+
+/* Callback function prototypes: */
+static void tcp_md5_extarg_destroy(u8_t id, void *data);
+static err_t tcp_md5_extarg_passive_open(u8_t id, struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb);
+/* Define our tcp ext arg callback structure: */
+const struct tcp_ext_arg_callbacks tcp_md5_ext_arg_callbacks = {
+ tcp_md5_extarg_destroy,
+ tcp_md5_extarg_passive_open
+};
+
+static u8_t tcp_md5_extarg_id = LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID;
+static u8_t tcp_md5_opts_buf[40];
+
+/** Initialize this module (allocates a tcp ext arg id) */
+void
+tcp_md5_init(void)
+{
+ tcp_md5_extarg_id = tcp_ext_arg_alloc_id();
+}
+
+/* Create a conn-info structure that holds the md5 state per connection */
+static struct tcp_md5_conn_info *
+tcp_md5_conn_info_alloc(void)
+{
+ return (struct tcp_md5_conn_info *)mem_malloc(sizeof(struct tcp_md5_conn_info));
+}
+
+/* Frees a conn-info structure that holds the md5 state per connection */
+static void
+tcp_md5_conn_info_free(struct tcp_md5_conn_info *info)
+{
+ mem_free(info);
+}
+
+/* A pcb is about to be destroyed. Free its extdata */
+static void
+tcp_md5_extarg_destroy(u8_t id, void *data)
+{
+ struct tcp_md5_conn_info *iter;
+
+ LWIP_ASSERT("tcp_md5_extarg_id != LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID",
+ tcp_md5_extarg_id != LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID);
+ LWIP_ASSERT("id == tcp_md5_extarg_id", id == tcp_md5_extarg_id);
+ LWIP_UNUSED_ARG(id);
+
+ iter = (struct tcp_md5_conn_info *)data;
+ while (iter != NULL) {
+ struct tcp_md5_conn_info *info = iter;
+ iter = iter->next;
+ tcp_md5_conn_info_free(info);
+ }
+}
+
+/* Try to find an md5 connection info for the specified remote connection */
+static struct tcp_md5_conn_info *
+tcp_md5_get_info(const struct tcp_pcb *pcb, const ip_addr_t *remote_ip, u16_t remote_port)
+{
+ if (pcb != NULL) {
+ struct tcp_md5_conn_info *info = (struct tcp_md5_conn_info *)tcp_ext_arg_get(pcb, tcp_md5_extarg_id);
+ while (info != NULL) {
+ if (ip_addr_eq(&info->remote_addr, remote_ip)) {
+ if (info->remote_port == remote_port) {
+ return info;
+ }
+ }
+ info = info->next;
+ }
+ }
+ return NULL;
+}
+
+/* Passive open: copy md5 connection info from listen pcb to connection pcb
+ * or return error (connection will be closed)
+ */
+static err_t
+tcp_md5_extarg_passive_open(u8_t id, struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb)
+{
+ struct tcp_md5_conn_info *iter;
+
+ LWIP_ASSERT("lpcb != NULL", lpcb != NULL);
+ LWIP_ASSERT("cpcb != NULL", cpcb != NULL);
+ LWIP_ASSERT("tcp_md5_extarg_id != LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID",
+ tcp_md5_extarg_id != LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID);
+ LWIP_ASSERT("id == tcp_md5_extarg_id", id == tcp_md5_extarg_id);
+ LWIP_UNUSED_ARG(id);
+
+ iter = (struct tcp_md5_conn_info *)tcp_ext_arg_get((struct tcp_pcb *)lpcb, id);
+ while (iter != NULL) {
+ if (iter->remote_port == cpcb->remote_port) {
+ if (ip_addr_eq(&iter->remote_addr, &cpcb->remote_ip)) {
+ struct tcp_md5_conn_info *info = tcp_md5_conn_info_alloc();
+ if (info != NULL) {
+ memcpy(info, iter, sizeof(struct tcp_md5_conn_info));
+ tcp_ext_arg_set(cpcb, id, info);
+ tcp_ext_arg_set_callbacks(cpcb, id, &tcp_md5_ext_arg_callbacks);
+ return ERR_OK;
+ } else {
+ return ERR_MEM;
+ }
+ }
+ }
+ iter = iter->next;
+ }
+ /* remote connection not found */
+ return ERR_VAL;
+}
+
+/* Parse tcp header options and return 1 if an md5 signature option was found */
+static int
+tcp_md5_parseopt(const u8_t *opts, u16_t optlen, u8_t *md5_digest_out)
+{
+ u8_t data;
+ u16_t optidx;
+
+ /* Parse the TCP MSS option, if present. */
+ if (optlen != 0) {
+ for (optidx = 0; optidx < optlen; ) {
+ u8_t opt = opts[optidx++];
+ switch (opt) {
+ case LWIP_TCP_OPT_EOL:
+ /* End of options. */
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n"));
+ return 0;
+ case LWIP_TCP_OPT_NOP:
+ /* NOP option. */
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n"));
+ break;
+ case LWIP_TCP_OPT_MD5:
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MD5\n"));
+ if (opts[optidx++] != LWIP_TCP_OPT_LEN_MD5 || (optidx - 2 + LWIP_TCP_OPT_LEN_MD5) > optlen) {
+ /* Bad length */
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+ return 0;
+ }
+ /* An MD5 option with the right option length. */
+ memcpy(md5_digest_out, &opts[optidx], LWIP_TCP_MD5_DIGEST_LEN);
+ /* no need to process the options further */
+ return 1;
+ break;
+ default:
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n"));
+ data = opts[optidx++];
+ if (data < 2) {
+ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n"));
+ /* If the length field is zero, the options are malformed
+ and we don't process them further. */
+ return 0;
+ }
+ /* All other options have a length field, so that we easily
+ can skip past them. */
+ optidx += data - 2;
+ }
+ }
+ }
+ return 0;
+}
+
+/* Get tcp options into contiguous memory. May be required if input pbufs
+ * are chained.
+ */
+static const u8_t*
+tcp_md5_options_singlebuf(struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2)
+{
+ const u8_t *opts;
+ LWIP_ASSERT("hdr != NULL", hdr != NULL);
+ LWIP_ASSERT("optlen >= opt1len", optlen >= opt1len);
+ opts = (const u8_t *)hdr + TCP_HLEN;
+ if (optlen == opt1len) {
+ /* arleady in one piece */
+ return opts;
+ }
+ if (optlen > sizeof(tcp_md5_opts_buf)) {
+ /* options too long */
+ return NULL;
+ }
+ LWIP_ASSERT("opt2 != NULL", opt2 != NULL);
+ /* copy first part */
+ memcpy(tcp_md5_opts_buf, opts, opt1len);
+ /* copy second part */
+ memcpy(&tcp_md5_opts_buf[opt1len], opt2, optlen - opt1len);
+ return tcp_md5_opts_buf;
+}
+
+/* Create the md5 digest for a given segment */
+static int
+tcp_md5_create_digest(const ip_addr_t *ip_src, const ip_addr_t *ip_dst, const struct tcp_hdr *hdr,
+ const u8_t *key, size_t key_len, u8_t *digest_out, struct pbuf *p)
+{
+ md5_context ctx;
+ u8_t tmp8;
+ u16_t tmp16;
+ const size_t addr_len = IP_ADDR_RAW_SIZE(*ip_src);
+
+ if (p != NULL) {
+ LWIP_ASSERT("pbuf must not point to tcp header here!", (const void *)hdr != p->payload);
+ }
+
+ /* Generate the hash, using MD5. */
+ md5_starts(&ctx);
+ /* 1. the TCP pseudo-header (in the order: source IP address,
+ destination IP address, zero-padded protocol number, and
+ segment length) */
+ md5_update(&ctx, (const unsigned char*)ip_src, addr_len);
+ md5_update(&ctx, (const unsigned char*)ip_dst, addr_len);
+ tmp8 = 0; /* zero-padded */
+ md5_update(&ctx, &tmp8, 1);
+ tmp8 = IP_PROTO_TCP;
+ md5_update(&ctx, &tmp8, 1);
+ tmp16 = lwip_htons(TCPH_HDRLEN_BYTES(hdr) + (p ? p->tot_len : 0));
+ md5_update(&ctx, (const unsigned char*)&tmp16, 2);
+ /* 2. the TCP header, excluding options, and assuming a checksum of
+ zero */
+ md5_update(&ctx, (const unsigned char*)hdr, sizeof(struct tcp_hdr));
+ /* 3. the TCP segment data (if any) */
+ if ((p != NULL) && (p->tot_len != 0)) {
+ struct pbuf *q;
+ for (q = p; q != NULL; q = q->next) {
+ md5_update(&ctx, (const unsigned char*)q->payload, q->len);
+ }
+ }
+ /* 4. an independently-specified key or password, known to both TCPs
+ and presumably connection-specific */
+ md5_update(&ctx, key, key_len);
+
+ md5_finish(&ctx, digest_out);
+ return 1;
+}
+
+/* Duplicate a tcp header and make sure the fields are in network byte order */
+static void
+tcp_md5_dup_tcphdr(struct tcp_hdr *tcphdr_copy, const struct tcp_hdr *tcphdr_in, int tcphdr_in_is_host_order)
+{
+ memcpy(tcphdr_copy, tcphdr_in, sizeof(struct tcp_hdr));
+ tcphdr_copy->chksum = 0; /* checksum is zero for the pseudo header */
+ if (tcphdr_in_is_host_order) {
+ /* lwIP writes the TCP header values back to the buffer, we need to invert that here: */
+ tcphdr_copy->src = lwip_htons(tcphdr_copy->src);
+ tcphdr_copy->dest = lwip_htons(tcphdr_copy->dest);
+ tcphdr_copy->seqno = lwip_htonl(tcphdr_copy->seqno);
+ tcphdr_copy->ackno = lwip_htonl(tcphdr_copy->ackno);
+ tcphdr_copy->wnd = lwip_htons(tcphdr_copy->wnd);
+ tcphdr_copy->urgp = lwip_htons(tcphdr_copy->urgp);
+ }
+}
+
+/* Check if md5 is enabled on a given pcb */
+static int
+tcp_md5_is_enabled_on_pcb(const struct tcp_pcb *pcb)
+{
+ if (tcp_md5_extarg_id != LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID) {
+ struct tcp_md5_conn_info *info = (struct tcp_md5_conn_info *)tcp_ext_arg_get(pcb, tcp_md5_extarg_id);
+ if (info != NULL) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* Check if md5 is enabled on a given listen pcb */
+static int
+tcp_md5_is_enabled_on_lpcb(const struct tcp_pcb_listen *lpcb)
+{
+ /* same as for connection pcbs */
+ return tcp_md5_is_enabled_on_pcb((const struct tcp_pcb *)lpcb);
+}
+
+/* Hook implementation for LWIP_HOOK_TCP_OPT_LENGTH_SEGMENT */
+u8_t
+tcp_md5_get_additional_option_length(const struct tcp_pcb *pcb, u8_t internal_option_length)
+{
+ if ((pcb != NULL) && tcp_md5_is_enabled_on_pcb(pcb)) {
+ u8_t new_option_length = internal_option_length + LWIP_TCP_OPT_LEN_MD5_OUT;
+ LWIP_ASSERT("overflow", new_option_length > internal_option_length);
+ LWIP_ASSERT("options too long", new_option_length <= TCP_MAX_OPTION_BYTES);
+ return new_option_length;
+ }
+ return internal_option_length;
+}
+
+/* Hook implementation for LWIP_HOOK_TCP_INPACKET_PCB when called for listen pcbs */
+static err_t
+tcp_md5_check_listen(struct tcp_pcb_listen* lpcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2)
+{
+ LWIP_ASSERT("lpcb != NULL", lpcb != NULL);
+
+ if (tcp_md5_is_enabled_on_lpcb(lpcb)) {
+ const u8_t *opts;
+ u8_t digest_received[LWIP_TCP_MD5_DIGEST_LEN];
+ u8_t digest_calculated[LWIP_TCP_MD5_DIGEST_LEN];
+ const struct tcp_md5_conn_info *info = tcp_md5_get_info((struct tcp_pcb *)lpcb, ip_current_src_addr(), hdr->src);
+ if (info != NULL) {
+ opts = tcp_md5_options_singlebuf(hdr, optlen, opt1len, opt2);
+ if (opts != NULL) {
+ if (tcp_md5_parseopt(opts, optlen, digest_received)) {
+ struct tcp_hdr tcphdr_copy;
+ tcp_md5_dup_tcphdr(&tcphdr_copy, hdr, 1);
+ if (tcp_md5_create_digest(ip_current_src_addr(), ip_current_dest_addr(), &tcphdr_copy, info->key, info->key_len, digest_calculated, NULL)) {
+ /* everything set up, compare the digests */
+ if (!memcmp(digest_received, digest_calculated, LWIP_TCP_MD5_DIGEST_LEN)) {
+ /* equal */
+ return ERR_OK;
+ }
+ /* not equal */
+ }
+ }
+ }
+ }
+ /* md5 enabled on this pcb but no match or other error -> fail */
+ return ERR_VAL;
+ }
+ return ERR_OK;
+}
+
+/* Hook implementation for LWIP_HOOK_TCP_INPACKET_PCB */
+err_t
+tcp_md5_check_inpacket(struct tcp_pcb* pcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, struct pbuf *p)
+{
+ LWIP_ASSERT("pcb != NULL", pcb != NULL);
+
+ if (pcb->state == LISTEN) {
+ return tcp_md5_check_listen((struct tcp_pcb_listen *)pcb, hdr, optlen, opt1len, opt2);
+ }
+
+ if (tcp_md5_is_enabled_on_pcb(pcb)) {
+ const struct tcp_md5_conn_info *info = tcp_md5_get_info(pcb, ip_current_src_addr(), hdr->src);
+ if (info != NULL) {
+ const u8_t *opts;
+ u8_t digest_received[LWIP_TCP_MD5_DIGEST_LEN];
+ u8_t digest_calculated[LWIP_TCP_MD5_DIGEST_LEN];
+ opts = tcp_md5_options_singlebuf(hdr, optlen, opt1len, opt2);
+ if (opts != NULL) {
+ if (tcp_md5_parseopt(opts, optlen, digest_received)) {
+ struct tcp_hdr hdr_copy;
+ tcp_md5_dup_tcphdr(&hdr_copy, hdr, 1);
+ if (tcp_md5_create_digest(&pcb->remote_ip, &pcb->local_ip, &hdr_copy, info->key, info->key_len, digest_calculated, p)) {
+ /* everything set up, compare the digests */
+ if (!memcmp(digest_received, digest_calculated, LWIP_TCP_MD5_DIGEST_LEN)) {
+ /* equal */
+ return ERR_OK;
+ }
+ /* not equal */
+ }
+ }
+ }
+ }
+ /* md5 enabled on this pcb but no match or other error -> fail */
+ return ERR_VAL;
+ }
+ return ERR_OK;
+}
+
+/* Hook implementation for LWIP_HOOK_TCP_ADD_TX_OPTIONS */
+u32_t *
+tcp_md5_add_tx_options(struct pbuf *p, struct tcp_hdr *hdr, const struct tcp_pcb *pcb, u32_t *opts)
+{
+ LWIP_ASSERT("p != NULL", p != NULL);
+ LWIP_ASSERT("hdr != NULL", hdr != NULL);
+ LWIP_ASSERT("pcb != NULL", pcb != NULL);
+ LWIP_ASSERT("opts != NULL", opts != NULL);
+
+ if (tcp_md5_is_enabled_on_pcb(pcb)) {
+ u8_t digest_calculated[LWIP_TCP_MD5_DIGEST_LEN];
+ u32_t *opts_ret = opts + 5; /* we use 20 bytes: 2 bytes padding + 18 bytes for this option */
+ u8_t *ptr = (u8_t*)opts;
+
+ const struct tcp_md5_conn_info *info = tcp_md5_get_info(pcb, &pcb->remote_ip, pcb->remote_port);
+ if (info != NULL) {
+ struct tcp_hdr hdr_copy;
+ size_t hdrsize = TCPH_HDRLEN_BYTES(hdr);
+ tcp_md5_dup_tcphdr(&hdr_copy, hdr, 0);
+ /* p->payload points to the tcp header */
+ LWIP_ASSERT("p->payload == hdr", p->payload == hdr);
+ if (!pbuf_remove_header(p, hdrsize)) {
+ u8_t ret;
+ if (!tcp_md5_create_digest(&pcb->local_ip, &pcb->remote_ip, &hdr_copy, info->key, info->key_len, digest_calculated, p)) {
+ info = NULL;
+ }
+ ret = pbuf_add_header_force(p, hdrsize);
+ LWIP_ASSERT("tcp_md5_add_tx_options: pbuf_add_header_force failed", !ret);
+ LWIP_UNUSED_ARG(ret);
+ } else {
+ LWIP_ASSERT("error", 0);
+ }
+ }
+ if (info == NULL) {
+ /* create an invalid signature by zeroing the digest */
+ memset(&digest_calculated, 0, sizeof(digest_calculated));
+ }
+
+ *ptr++ = LWIP_TCP_OPT_NOP;
+ *ptr++ = LWIP_TCP_OPT_NOP;
+ *ptr++ = LWIP_TCP_OPT_MD5;
+ *ptr++ = LWIP_TCP_OPT_LEN_MD5;
+ memcpy(ptr, digest_calculated, LWIP_TCP_MD5_DIGEST_LEN);
+ ptr += LWIP_TCP_MD5_DIGEST_LEN;
+ LWIP_ASSERT("ptr == opts_ret", ptr == (u8_t *)opts_ret);
+ return opts_ret;
+ }
+ return opts;
+}
+
+/* Hook implementation for LWIP_HOOK_SOCKETS_SETSOCKOPT */
+int
+tcp_md5_setsockopt_hook(struct lwip_sock *sock, int level, int optname, const void *optval, socklen_t optlen, int *err)
+{
+ LWIP_ASSERT("sock != NULL", sock != NULL);
+ LWIP_ASSERT("err != NULL", err != NULL);
+
+ if ((level == IPPROTO_TCP) && (optname == TCP_MD5SIG)) {
+ const struct tcp_md5sig *md5 = (const struct tcp_md5sig*)optval;
+ if ((optval == NULL) || (optlen < sizeof(struct tcp_md5sig))) {
+ *err = EINVAL;
+ } else {
+ if (sock->conn && (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) && (sock->conn->pcb.tcp != NULL)) {
+ if (tcp_md5_extarg_id == LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID) {
+ /* not initialized */
+ *err = EINVAL;
+ } else {
+ struct tcp_md5_conn_info *info = tcp_md5_conn_info_alloc();
+ if (info == NULL) {
+ *err = ENOMEM;
+ } else {
+ int addr_valid = 0;
+ /* OK, fill and link this request */
+ memcpy(info->key, md5->tcpm_key, TCP_MD5SIG_MAXKEYLEN);
+ info->key_len = md5->tcpm_keylen;
+ memset(&info->remote_addr, 0, sizeof(info->remote_addr));
+ if (md5->tcpm_addr.ss_family == AF_INET) {
+#if LWIP_IPV4
+ const struct sockaddr_in *sin = (const struct sockaddr_in *)&md5->tcpm_addr;
+ memcpy(&info->remote_addr, &sin->sin_addr, sizeof(sin->sin_addr));
+ IP_SET_TYPE_VAL(info->remote_addr, IPADDR_TYPE_V4);
+ info->remote_port = lwip_htons(sin->sin_port);
+ addr_valid = 1;
+#endif /* LWIP_IPV4 */
+ } else if (md5->tcpm_addr.ss_family == AF_INET6) {
+#if LWIP_IPV6
+ const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)&md5->tcpm_addr;
+ memcpy(&info->remote_addr, &sin6->sin6_addr, sizeof(sin6->sin6_addr));
+ IP_SET_TYPE_VAL(info->remote_addr, IPADDR_TYPE_V6);
+ info->remote_port = lwip_htons(sin6->sin6_port);
+ addr_valid = 1;
+#endif /* LWIP_IPV6 */
+ }
+ if (addr_valid) {
+ /* store it */
+ tcp_ext_arg_set_callbacks(sock->conn->pcb.tcp, tcp_md5_extarg_id, &tcp_md5_ext_arg_callbacks);
+ info->next = (struct tcp_md5_conn_info *)tcp_ext_arg_get(sock->conn->pcb.tcp, tcp_md5_extarg_id);
+ tcp_ext_arg_set(sock->conn->pcb.tcp, tcp_md5_extarg_id, info);
+ } else {
+ *err = EINVAL;
+ tcp_md5_conn_info_free(info);
+ }
+ }
+ }
+ } else {
+ /* not a tcp netconn */
+ *err = EINVAL;
+ }
+ }
+ return 1;
+ }
+ return 0;
+}
diff --git a/contrib/addons/tcp_md5/tcp_md5.h b/contrib/addons/tcp_md5/tcp_md5.h
new file mode 100644
index 0000000..e55740a
--- /dev/null
+++ b/contrib/addons/tcp_md5/tcp_md5.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2018 Simon Goldschmidt
+ * 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.
+ *
+ * Author: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ * To use the hooks in this file, make sure this file is included in LWIP_HOOK_FILENAME
+ * and define these hooks:
+ *
+ * #define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p) tcp_md5_check_inpacket(pcb, hdr, optlen, opt1len, opt2, p)
+ * #define LWIP_HOOK_TCP_OPT_LENGTH_SEGMENT(pcb, internal_len) tcp_md5_get_additional_option_length(pcb, internal_len)
+ * #define LWIP_HOOK_TCP_ADD_TX_OPTIONS(p, hdr, pcb, opts) tcp_md5_add_tx_options(p, hdr, pcb, opts)
+ *
+ * #define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) tcp_md5_setsockopt_hook(sock, level, optname, optval, optlen, err)
+ */
+
+#ifndef LWIP_HDR_CONTRIB_ADDONS_TCP_MD5_H
+#define LWIP_HDR_CONTRIB_ADDONS_TCP_MD5_H
+
+#include "lwip/opt.h"
+#include "lwip/ip_addr.h"
+#include "lwip/err.h"
+
+#include "lwip/priv/sockets_priv.h"
+#include "lwip/priv/tcp_priv.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* setsockopt definitions and structs: */
+
+/* This is the optname (for level = IPPROTO_TCP) */
+#ifndef TCP_MD5SIG
+#define TCP_MD5SIG 14
+#endif
+
+#define TCP_MD5SIG_MAXKEYLEN 80
+
+/* This is the optval type */
+struct tcp_md5sig {
+ struct sockaddr_storage tcpm_addr;
+ u16_t __tcpm_pad1;
+ u16_t tcpm_keylen;
+ u32_t __tcpm_pad2;
+ u8_t tcpm_key[TCP_MD5SIG_MAXKEYLEN];
+};
+
+/* socket setsockopt hook: */
+int tcp_md5_setsockopt_hook(struct lwip_sock *sock, int level, int optname, const void *optval, u32_t optlen, int *err);
+
+/* Internal hook functions */
+void tcp_md5_init(void);
+err_t tcp_md5_check_inpacket(struct tcp_pcb* pcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, struct pbuf *p);
+u8_t tcp_md5_get_additional_option_length(const struct tcp_pcb *pcb, u8_t internal_option_length);
+u32_t *tcp_md5_add_tx_options(struct pbuf *p, struct tcp_hdr *hdr, const struct tcp_pcb *pcb, u32_t *opts);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIP_HDR_CONTRIB_ADDONS_TCP_MD5_H */
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj b/contrib/apps/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj
new file mode 100644
index 0000000..06d5075
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>CCodeGeneration</RootNamespace>
+ <AssemblyName>CCodeGeneration</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="CFile.cs" />
+ <Compile Include="Code.cs" />
+ <Compile Include="CodeContainerBase.cs" />
+ <Compile Include="CodeElement.cs" />
+ <Compile Include="Comment.cs" />
+ <Compile Include="EmptyLine.cs" />
+ <Compile Include="Function.cs" />
+ <Compile Include="CGenerator.cs" />
+ <Compile Include="IfThenElse.cs" />
+ <Compile Include="PlainText.cs" />
+ <Compile Include="Switch.cs" />
+ <Compile Include="PP_If.cs" />
+ <Compile Include="PP_Ifdef.cs" />
+ <Compile Include="PP_Include.cs" />
+ <Compile Include="FunctionDeclaration.cs" />
+ <Compile Include="PP_Macro.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="VariableDeclaration.cs" />
+ <Compile Include="VariablePrototype.cs" />
+ <Compile Include="VariableType.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/CFile.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/CFile.cs
new file mode 100644
index 0000000..6f12274
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/CFile.cs
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace CCodeGeneration
+{
+ public class CFile: CodeContainerBase
+ {
+ public CFile()
+ {
+ base.IncreaseLevel = false;
+ }
+
+ public void Save(CGenerator generator)
+ {
+ if (generator == null)
+ {
+ throw new ArgumentNullException("generator");
+ }
+
+ this.GenerateCode(0, generator);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/CGenerator.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/CGenerator.cs
new file mode 100644
index 0000000..4e8dfbc
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/CGenerator.cs
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.IO;
+
+namespace CCodeGeneration
+{
+ public class CGenerator
+ {
+ public TextWriter OutputStream { get; private set; }
+ public string File { get; private set; }
+ public uint IndentCount { get; private set; }
+ public string IndentChar { get; private set; }
+ public string NewLine { get; private set; }
+
+ public CGenerator(System.IO.TextWriter outputStream, string file, uint indentCount, string indentChar, string newLine)
+ {
+ this.OutputStream = outputStream;
+ this.File = file;
+ this.IndentCount = indentCount;
+ this.IndentChar = indentChar;
+ this.NewLine = newLine;
+ }
+
+ public string FileName
+ {
+ get
+ {
+ if (!String.IsNullOrWhiteSpace(this.File))
+ {
+ return Path.GetFileName(this.File);
+ }
+
+ return null;
+ }
+ }
+
+ public void WriteSequence(string value, uint repetitions)
+ {
+ while (repetitions > 0)
+ {
+ this.OutputStream.Write(value);
+ repetitions--;
+ }
+ }
+
+ public void IndentLine(int level)
+ {
+ while (level > 0)
+ {
+ WriteSequence(this.IndentChar, this.IndentCount);
+ level--;
+ }
+ }
+
+ public void WriteNewLine()
+ {
+ this.OutputStream.Write(this.NewLine);
+ }
+
+ public void WriteMultilineString(string value, int level = 0)
+ {
+ if (String.IsNullOrEmpty(value))
+ {
+ return;
+ }
+
+ // only \n and \r\n are recognized as linebreaks
+ string[] lines = value.Split(new char[] { '\n' }, StringSplitOptions.None);
+
+ for (int l = 0; l < (lines.Length - 1); l++)
+ {
+ if (lines[l].EndsWith("\r"))
+ {
+ this.OutputStream.Write(lines[l].Substring(0, lines[l].Length-1));
+ }
+ else
+ {
+ this.OutputStream.Write(lines[l]);
+ }
+
+ this.WriteNewLine();
+ this.IndentLine(level);
+ }
+
+ this.OutputStream.Write(lines[lines.Length - 1]);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/Code.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/Code.cs
new file mode 100644
index 0000000..4834508
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/Code.cs
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class Code: CodeElement
+ {
+ public string Code_ { get; set; }
+
+ public Code()
+ {
+ }
+
+ public Code(string code)
+ {
+ this.Code_ = code;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ generator.IndentLine(level);
+ generator.WriteMultilineString(this.Code_, level);
+ generator.WriteNewLine();
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs
new file mode 100644
index 0000000..4327d92
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System.Collections.Generic;
+using System;
+
+namespace CCodeGeneration
+{
+ public class CodeContainerBase: CodeElement
+ {
+ private readonly List<CodeElement> declarations = new List<CodeElement>();
+ private readonly List<CodeElement> innerElements = new List<CodeElement>();
+ private bool increaseLevel = true;
+
+ public List<CodeElement> Declarations
+ {
+ get { return this.declarations; }
+ }
+
+ public List<CodeElement> InnerElements
+ {
+ get { return this.innerElements; }
+ }
+
+ protected bool IncreaseLevel
+ {
+ get { return this.increaseLevel; }
+ set { this.increaseLevel = value; }
+ }
+
+ public void AddElements(IList<CodeElement> elements, params CodeElement[] spacerElements)
+ {
+ if (elements != null)
+ {
+ if ((spacerElements == null) || (spacerElements.Length == 0))
+ {
+ this.innerElements.AddRange(elements);
+ }
+ else
+ {
+ bool spacerAdded = false;
+
+ foreach (CodeElement element in elements)
+ {
+ this.innerElements.Add(element);
+ this.innerElements.AddRange(spacerElements);
+ spacerAdded = true;
+ }
+
+ if (spacerAdded)
+ {
+ // remove last spacer again
+ this.innerElements.RemoveRange(this.innerElements.Count - spacerElements.Length, spacerElements.Length);
+ }
+ }
+ }
+ }
+
+ public CodeElement AddElement(CodeElement element)
+ {
+ if (element != null)
+ {
+ this.innerElements.Add(element);
+ }
+
+ return element;
+ }
+
+ public Code AddCode(string code)
+ {
+ return this.AddElement(new Code(code)) as Code;
+ }
+
+ public Code AddCodeFormat(string codeFormat, params object[] args)
+ {
+ return this.AddElement(new Code(String.Format(codeFormat, args))) as Code;
+ }
+
+ public CodeElement AddDeclaration(CodeElement declaration)
+ {
+ if (declaration != null)
+ {
+ this.declarations.Add(declaration);
+ }
+
+ return declaration;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (this.increaseLevel)
+ level++;
+
+ if (this.declarations.Count > 0)
+ {
+ foreach (CodeElement element in this.declarations)
+ {
+ element.GenerateCode(level, generator);
+ }
+
+ EmptyLine.SingleLine.GenerateCode(level, generator);
+ }
+
+ foreach (CodeElement element in this.innerElements)
+ {
+ element.GenerateCode(level, generator);
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeElement.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeElement.cs
new file mode 100644
index 0000000..51cf2d2
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/CodeElement.cs
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class CodeElement
+ {
+ public virtual void GenerateCode(int level, CGenerator generator)
+ {
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/Comment.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/Comment.cs
new file mode 100644
index 0000000..51779be
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/Comment.cs
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class Comment: CodeElement
+ {
+ public const string CommentStart = "/*";
+ public const string CommentEnd = "*/";
+
+ public string Comment_ { get; set; }
+ public bool SingleLine { get; set; }
+
+ public Comment()
+ {
+ }
+
+ public Comment(string comment, bool singleLine = false)
+ {
+ this.Comment_ = comment;
+ this.SingleLine = singleLine;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ generator.IndentLine(level);
+ generator.OutputStream.Write(CommentStart);
+
+ if (!this.SingleLine)
+ {
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.WriteMultilineString(this.Comment_, level);
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ }
+ else
+ {
+ generator.OutputStream.Write(" " + Comment_ + " ");
+ }
+
+ generator.OutputStream.Write(CommentEnd);
+ generator.WriteNewLine();
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/EmptyLine.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/EmptyLine.cs
new file mode 100644
index 0000000..604c947
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/EmptyLine.cs
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class EmptyLine : CodeElement
+ {
+ public static readonly EmptyLine SingleLine = new EmptyLine();
+ public static readonly EmptyLine TwoLines = new EmptyLine(2);
+ public static readonly EmptyLine ThreeLines = new EmptyLine(3);
+
+ public uint Count { get; set; }
+
+ public EmptyLine()
+ {
+ this.Count = 1;
+ }
+
+ public EmptyLine(uint count)
+ {
+ this.Count = count;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ uint c = this.Count;
+
+ while (c > 0)
+ {
+ generator.WriteNewLine();
+ c--;
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/Function.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/Function.cs
new file mode 100644
index 0000000..d81f6e5
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/Function.cs
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+
+namespace CCodeGeneration
+{
+ public class Function: CodeContainerBase
+ {
+ public string Name { get; set; }
+ public bool IsStatic { get; set; }
+
+ private readonly List<VariableType> parameter = new List<VariableType>();
+ private VariableType returnType = VariableType.Void;
+
+ public Function()
+ {
+ }
+
+ public Function(string name, bool isStatic = false)
+ {
+ this.Name = name;
+ this.IsStatic = isStatic;
+ }
+
+ public List<VariableType> Parameter
+ {
+ get { return this.parameter; }
+ }
+
+ public VariableType ReturnType
+ {
+ get { return this.returnType; }
+ set
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException("ReturnValue");
+ }
+ this.returnType = value;
+ }
+ }
+
+ public static Function FromDeclaration(FunctionDeclaration decl)
+ {
+ Function result = new Function(decl.Name, decl.IsStatic);
+ result.ReturnType = decl.ReturnType.Clone() as VariableType;
+
+ foreach (VariableType param in decl.Parameter)
+ {
+ result.parameter.Add(param.Clone() as VariableType);
+ }
+
+ return result;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ generator.IndentLine(level);
+
+ if (this.IsStatic)
+ {
+ generator.OutputStream.Write("static ");
+ }
+
+ this.returnType.GenerateCode(generator);
+ generator.OutputStream.Write(" " + this.Name + "(");
+
+ if (this.Parameter.Count > 0)
+ {
+ for (int i = 0; i < this.parameter.Count; i++)
+ {
+ this.parameter[i].GenerateCode(generator);
+
+ if (i < (this.parameter.Count - 1))
+ {
+ generator.OutputStream.Write(", ");
+ }
+ }
+ }
+ else
+ {
+ generator.OutputStream.Write("void");
+ }
+
+ generator.OutputStream.Write(")");
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ base.GenerateCode(level, generator);
+
+ generator.IndentLine(level);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs
new file mode 100644
index 0000000..3bc4288
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+
+namespace CCodeGeneration
+{
+ public class FunctionDeclaration: CodeElement
+ {
+ public string Name { get; set; }
+ public bool IsStatic { get; set; }
+ public bool IsExtern { get; set; }
+
+ private readonly List<VariableType> parameter = new List<VariableType>();
+ private VariableType returnType = VariableType.Void;
+
+ public FunctionDeclaration()
+ {
+ }
+
+ public FunctionDeclaration(string name, bool isStatic = false, bool isExtern = false)
+ {
+ this.Name = name;
+ this.IsStatic = isStatic;
+ this.IsExtern = isExtern;
+ }
+
+ public List<VariableType> Parameter
+ {
+ get { return this.parameter; }
+ }
+
+ public VariableType ReturnType
+ {
+ get { return this.returnType; }
+ set
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException("ReturnValue");
+ }
+ this.returnType = value;
+ }
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ generator.IndentLine(level);
+
+ if (this.IsExtern)
+ {
+ generator.OutputStream.Write("extern ");
+ }
+
+ if (this.IsStatic)
+ {
+ generator.OutputStream.Write("static ");
+ }
+
+ this.returnType.GenerateCode(generator);
+ generator.OutputStream.Write(" " + this.Name + "(");
+
+ if (this.Parameter.Count > 0)
+ {
+ for (int i = 0; i < this.parameter.Count; i++)
+ {
+ this.parameter[i].GenerateCode(generator);
+
+ if (i < (this.parameter.Count - 1))
+ {
+ generator.OutputStream.Write(", ");
+ }
+ }
+ }
+ else
+ {
+ generator.OutputStream.Write("void");
+ }
+
+ generator.OutputStream.Write(");");
+ generator.WriteNewLine();
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/IfThenElse.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/IfThenElse.cs
new file mode 100644
index 0000000..c471022
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/IfThenElse.cs
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+
+namespace CCodeGeneration
+{
+ public class ElseIf : CodeContainerBase
+ {
+ public string Condition { get; set; }
+
+ public ElseIf()
+ {
+ }
+
+ public ElseIf(string condition)
+ {
+ this.Condition = condition;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Condition))
+ {
+ generator.IndentLine(level);
+ generator.OutputStream.Write(String.Format("else if ({0})", this.Condition));
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ base.GenerateCode(level, generator);
+
+ generator.IndentLine(level);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+ }
+ }
+ }
+
+ public class IfThenElse: CodeContainerBase
+ {
+ public string Condition { get; set; }
+
+ private List<ElseIf> elseIf = new List<ElseIf>();
+ private CodeContainerBase else_ = new CodeContainerBase();
+
+ public IfThenElse()
+ {
+ }
+
+ public IfThenElse(string condition)
+ {
+ this.Condition = condition;
+ }
+
+ public List<ElseIf> ElseIf
+ {
+ get { return this.elseIf; }
+ }
+
+ public CodeContainerBase Else
+ {
+ get { return this.else_; }
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Condition))
+ {
+ generator.IndentLine(level);
+ generator.OutputStream.Write(String.Format("if ({0})", this.Condition));
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ base.GenerateCode(level, generator);
+
+ generator.IndentLine(level);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+
+ foreach (ElseIf elif in this.elseIf)
+ {
+ elif.GenerateCode(level, generator);
+ }
+
+ if (this.else_.InnerElements.Count > 0)
+ {
+ generator.IndentLine(level);
+ generator.OutputStream.Write("else");
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ this.else_.GenerateCode(level, generator);
+
+ generator.IndentLine(level);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+ }
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_If.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_If.cs
new file mode 100644
index 0000000..5568215
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_If.cs
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace CCodeGeneration
+{
+ public class PP_If: CodeContainerBase
+ {
+ public string Condition { get; set; }
+
+ public PP_If()
+ {
+ base.IncreaseLevel = false;
+ }
+
+ public PP_If(string condition)
+ : this()
+ {
+ this.Condition = condition;
+ }
+
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Condition))
+ {
+ generator.OutputStream.Write("#if " + this.Condition);
+ generator.WriteNewLine();
+
+ base.GenerateCode(level, generator);
+
+ generator.OutputStream.Write("#endif /* " + this.Condition + " */");
+ generator.WriteNewLine();
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs
new file mode 100644
index 0000000..fd4f45a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace CCodeGeneration
+{
+ public class PP_Ifdef: CodeContainerBase
+ {
+ public string Macro { get; set; }
+ public bool Inverted { get; set; }
+
+ public PP_Ifdef()
+ {
+ base.IncreaseLevel = false;
+ }
+
+ public PP_Ifdef(string macro, bool inverted = false)
+ : this()
+ {
+ this.Macro = macro;
+ this.Inverted = inverted;
+ }
+
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Macro))
+ {
+ if (this.Inverted)
+ {
+ generator.OutputStream.Write("#ifndef " + this.Macro);
+ }
+ else
+ {
+ generator.OutputStream.Write("#ifdef " + this.Macro);
+ }
+ generator.WriteNewLine();
+
+ base.GenerateCode(level, generator);
+
+ generator.OutputStream.Write("#endif /* " + this.Macro + " */");
+ generator.WriteNewLine();
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Include.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Include.cs
new file mode 100644
index 0000000..0393d27
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Include.cs
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace CCodeGeneration
+{
+ public class PP_Include : CodeElement
+ {
+ public string File { get; set; }
+ public bool IsLocal { get; set; }
+
+ public PP_Include()
+ {
+ this.IsLocal = true;
+ }
+
+ public PP_Include(string file, bool isLocal = true)
+ {
+ this.File = file;
+ this.IsLocal = isLocal;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.File))
+ {
+ // includes are never indented
+ if (this.IsLocal)
+ {
+ generator.OutputStream.Write("#include \"" + this.File + "\"");
+ }
+ else
+ {
+ generator.OutputStream.Write("#include <" + this.File + ">");
+ }
+
+ generator.WriteNewLine();
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Macro.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Macro.cs
new file mode 100644
index 0000000..6f302aa
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/PP_Macro.cs
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class PP_Macro: CodeElement
+ {
+ public string Name { get; set; }
+ public string Value { get; set; }
+
+ public PP_Macro()
+ {
+ }
+
+ public PP_Macro(string name, string value)
+ {
+ this.Name = name;
+ this.Value = value;
+ }
+
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ // macros are not indented at all
+ generator.OutputStream.Write("#define " + this.Name + " ");
+ generator.WriteMultilineString(this.Value);
+ generator.WriteNewLine();
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/PlainText.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/PlainText.cs
new file mode 100644
index 0000000..d5e076f
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/PlainText.cs
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class PlainText : CodeElement
+ {
+ public string Value { get; set; }
+
+ public PlainText(string value)
+ {
+ this.Value = value;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ generator.WriteMultilineString(this.Value);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..4c716ad
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die mit einer Assembly verknüpft sind.
+[assembly: AssemblyTitle("CCodeGeneration")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("CCodeGeneration")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
+// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
+// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("8f07a0fa-86f4-48a0-97c7-f94fc5c3f103")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/Switch.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/Switch.cs
new file mode 100644
index 0000000..9166fb8
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/Switch.cs
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+
+namespace CCodeGeneration
+{
+ public class SwitchCase : CodeContainerBase
+ {
+ public string Value { get; set; }
+
+ public SwitchCase()
+ {
+ }
+
+ public SwitchCase(string value)
+ {
+ this.Value = value;
+ }
+
+ public bool IsDefault
+ {
+ get { return (this.Value.ToLowerInvariant() == "default"); }
+ }
+
+ public static SwitchCase GenerateDefault()
+ {
+ return new SwitchCase("default");
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Value))
+ {
+ generator.IndentLine(level);
+ if (this.IsDefault)
+ {
+ generator.OutputStream.Write("default:");
+ }
+ else
+ {
+ generator.OutputStream.Write(String.Format("case {0}:", this.Value));
+ }
+ generator.WriteNewLine();
+ generator.IndentLine(level + 1);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ base.GenerateCode(level + 1, generator);
+
+ generator.IndentLine(level + 1);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+
+ generator.IndentLine(level + 1);
+ generator.OutputStream.Write("break;");
+ generator.WriteNewLine();
+ }
+ }
+ }
+
+ public class Switch: CodeElement
+ {
+ public string SwitchVar { get; set; }
+
+ private List<SwitchCase> switches = new List<SwitchCase>();
+
+ public Switch()
+ {
+ }
+
+ public Switch(string switchVar)
+ {
+ this.SwitchVar = switchVar;
+ }
+
+ public List<SwitchCase> Switches
+ {
+ get { return this.switches; }
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.SwitchVar))
+ {
+ generator.IndentLine(level);
+ generator.OutputStream.Write(String.Format("switch ({0})", this.SwitchVar));
+ generator.WriteNewLine();
+ generator.IndentLine(level);
+ generator.OutputStream.Write("{");
+ generator.WriteNewLine();
+
+ SwitchCase defaultCase = null; // generate 'default' always as last case
+ foreach (SwitchCase switchCase in this.switches)
+ {
+ if (switchCase.IsDefault)
+ {
+ defaultCase = switchCase;
+ }
+ else
+ {
+ switchCase.GenerateCode(level + 1, generator);
+ }
+ }
+ if (defaultCase != null)
+ {
+ defaultCase.GenerateCode(level + 1, generator);
+ }
+
+ generator.IndentLine(level);
+ generator.OutputStream.Write("}");
+ generator.WriteNewLine();
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs
new file mode 100644
index 0000000..bf2c902
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace CCodeGeneration
+{
+ public class VariableDeclaration : CodeElement
+ {
+ public VariableType Type { get; set; }
+ public string InitialValue { get; set; }
+ public bool IsStatic { get; set; }
+
+ public VariableDeclaration()
+ : base()
+ {
+ }
+
+ public VariableDeclaration(VariableType type, string initialValue = null, bool isStatic = false) :
+ base()
+ {
+ this.Type = type;
+ this.InitialValue = initialValue;
+ this.IsStatic = isStatic;
+ }
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (this.Type != null)
+ {
+ generator.IndentLine(level);
+
+ if (this.IsStatic)
+ {
+ generator.OutputStream.Write("static ");
+ }
+
+ // declare the variable
+ this.Type.GenerateCode(generator);
+
+ if (!String.IsNullOrWhiteSpace(this.InitialValue))
+ {
+ // add initialization value
+ generator.OutputStream.Write(" = ");
+ generator.WriteMultilineString(this.InitialValue, level);
+ }
+
+ generator.OutputStream.Write(";");
+ generator.WriteNewLine();
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs
new file mode 100644
index 0000000..38a4166
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+namespace CCodeGeneration
+{
+ public class VariablePrototype : CodeElement
+ {
+ public VariableType Type { get; set; }
+
+ public VariablePrototype()
+ : base()
+ {
+ }
+
+ public VariablePrototype(VariableType type) :
+ base()
+ {
+ Type = type;
+ }
+
+ public static VariablePrototype FromVariableDeclaration(VariableDeclaration declaration)
+ {
+ return new VariablePrototype(declaration.Type);
+ }
+
+
+ public override void GenerateCode(int level, CGenerator generator)
+ {
+ if (this.Type != null)
+ {
+ generator.IndentLine(level);
+
+ generator.OutputStream.Write("extern ");
+
+ // declare the variable
+ this.Type.GenerateCode(generator);
+
+ generator.OutputStream.Write(";");
+ generator.WriteNewLine();
+ }
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableType.cs b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableType.cs
new file mode 100644
index 0000000..313abbe
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/CCodeGeneration/VariableType.cs
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+
+namespace CCodeGeneration
+{
+ public enum ConstType
+ {
+ None,
+ Value,
+ Indirection,
+ Both
+ }
+
+ public class VariableType : ICloneable
+ {
+ public const string VoidString = "void";
+ public static readonly VariableType Void = new VariableType(null, "void");
+
+ public string Name { get; set; }
+ public string Type { get; set; }
+ public string Indirection { get; set; }
+ public ConstType Const { get; set; }
+ public string ArraySpecifier { get; set; }
+
+ public VariableType()
+ {
+ }
+
+ public VariableType(string name, string type, string indirection = null, ConstType const_ = ConstType.None, string arraySpecifier = null)
+ {
+ this.Name = name;
+ this.Type = type;
+ this.Indirection = indirection;
+ this.Const = const_;
+ this.ArraySpecifier = arraySpecifier;
+ }
+
+ public void GenerateCode(CGenerator generator)
+ {
+ if (!String.IsNullOrWhiteSpace(this.Type))
+ {
+ generator.OutputStream.Write(this.ToString().Trim());
+ }
+ }
+
+ public override string ToString()
+ {
+ if (!String.IsNullOrWhiteSpace(this.Type))
+ {
+ StringBuilder vt = new StringBuilder();
+
+ if ((this.Const == ConstType.Value) || (this.Const == ConstType.Both))
+ {
+ vt.Append("const ");
+ }
+
+ vt.Append(this.Type);
+ vt.Append(" ");
+
+ if (!String.IsNullOrWhiteSpace(this.Indirection))
+ {
+ vt.Append(this.Indirection);
+ }
+
+ if ((this.Const == ConstType.Indirection) || (this.Const == ConstType.Both))
+ {
+ vt.Append("const ");
+ }
+
+ if (!String.IsNullOrWhiteSpace(this.Name))
+ {
+ vt.Append(this.Name);
+ }
+
+ if (this.ArraySpecifier != null)
+ {
+ vt.Append("[");
+ vt.Append(this.ArraySpecifier);
+ vt.Append("]");
+ }
+
+ return vt.ToString().Trim();
+ }
+
+ return base.ToString();
+ }
+
+ #region ICloneable Member
+
+ public object Clone()
+ {
+ // we only have value types as members -> simply use .net base function
+ return this.MemberwiseClone();
+ }
+
+ #endregion
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipMibCompiler.sln b/contrib/apps/LwipMibCompiler/LwipMibCompiler.sln
new file mode 100644
index 0000000..ee04141
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipMibCompiler.sln
@@ -0,0 +1,47 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LwipMibCompiler", "LwipMibCompiler\LwipMibCompiler.csproj", "{C25D5640-D999-49BD-82E0-A1975296A91E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LwipSnmpCodeGeneration", "LwipSnmpCodeGeneration\LwipSnmpCodeGeneration.csproj", "{AABCAB90-1540-45D4-A159-14831A54E9A3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCodeGeneration", "CCodeGeneration\CCodeGeneration.csproj", "{7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpSnmpLib.Mib", "SharpSnmpLib\SharpSnmpLib.Mib.csproj", "{CBE20411-5DB7-487D-825D-7694267BB6F5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MibViewer", "MibViewer\MibViewer.csproj", "{86CC0B65-7985-4017-A252-0A7A18DCAEF3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AABCAB90-1540-45D4-A159-14831A54E9A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AABCAB90-1540-45D4-A159-14831A54E9A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AABCAB90-1540-45D4-A159-14831A54E9A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AABCAB90-1540-45D4-A159-14831A54E9A3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C25D5640-D999-49BD-82E0-A1975296A91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C25D5640-D999-49BD-82E0-A1975296A91E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C25D5640-D999-49BD-82E0-A1975296A91E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C25D5640-D999-49BD-82E0-A1975296A91E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CBE20411-5DB7-487D-825D-7694267BB6F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CBE20411-5DB7-487D-825D-7694267BB6F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CBE20411-5DB7-487D-825D-7694267BB6F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CBE20411-5DB7-487D-825D-7694267BB6F5}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = LwipMibCompiler\LwipMibCompiler.csproj
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/contrib/apps/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj b/contrib/apps/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj
new file mode 100644
index 0000000..694263a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{C25D5640-D999-49BD-82E0-A1975296A91E}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>LwipMibCompiler</RootNamespace>
+ <AssemblyName>LwipMibCompiler</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+ <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+ <WarningLevel>4</WarningLevel>
+ <Optimize>false</Optimize>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="app.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\CCodeGeneration\CCodeGeneration.csproj">
+ <Project>{7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}</Project>
+ <Name>CCodeGeneration</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\LwipSnmpCodeGeneration\LwipSnmpCodeGeneration.csproj">
+ <Project>{AABCAB90-1540-45D4-A159-14831A54E9A3}</Project>
+ <Name>LwipSnmpCodeGeneration</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\SharpSnmpLib\SharpSnmpLib.Mib.csproj">
+ <Project>{CBE20411-5DB7-487D-825D-7694267BB6F5}</Project>
+ <Name>SharpSnmpLib.Mib</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/LwipMibCompiler/Program.cs b/contrib/apps/LwipMibCompiler/LwipMibCompiler/Program.cs
new file mode 100644
index 0000000..5dff840
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipMibCompiler/Program.cs
@@ -0,0 +1,480 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using CCodeGeneration;
+using Lextm.SharpSnmpLib.Mib;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+using LwipSnmpCodeGeneration;
+
+namespace LwipMibCompiler
+{
+ class Program
+ {
+ private static readonly Regex _alphaNumericRegex = new Regex("[^a-zA-Z0-9]");
+
+ static void Main(string[] args)
+ {
+ Console.WriteLine("lwIP MIB Compiler");
+ Console.WriteLine("");
+
+ // check args
+ if ((args.Length < 2) || String.IsNullOrWhiteSpace(args[0]) || String.IsNullOrWhiteSpace(args[1]))
+ {
+ PrintUsage();
+ return;
+ }
+
+ string mibFile = args[0];
+ if (!File.Exists(mibFile))
+ {
+ Console.WriteLine(String.Format("Unable to find file '{0}'!", mibFile));
+ }
+
+ string destFile = args[1];
+ string destHeaderFile;
+
+ if (Directory.Exists(destFile))
+ {
+ // only directory passed -> create dest filename from mib filename
+ string mibFileName = Path.GetFileNameWithoutExtension(mibFile).ToLowerInvariant();
+ destFile = Path.Combine(destFile, mibFileName + ".c");
+ }
+
+ string destFileExt = Path.GetExtension(destFile);
+ if (!String.IsNullOrEmpty(destFileExt))
+ {
+ destHeaderFile = destFile.Substring(0, destFile.Length - destFileExt.Length);
+ }
+ else
+ {
+ destHeaderFile = destFile;
+ }
+ destHeaderFile += ".h";
+
+ for (int i=2; i<args.Length; i++)
+ {
+ if (!String.IsNullOrWhiteSpace(args[i]) && Directory.Exists(args[i]))
+ {
+ MibTypesResolver.RegisterResolver(new FileSystemMibResolver(args[i], true));
+ }
+ }
+
+
+ // read and resolve MIB
+ Console.WriteLine(" Reading MIB file...");
+
+ MibDocument md = new MibDocument(mibFile);
+ MibTypesResolver.ResolveTypes(md.Modules[0]);
+ MibTree mt = new MibTree(md.Modules[0] as MibModule);
+
+ if (mt.Root.Count == 0)
+ {
+ Console.WriteLine("No root element found inside MIB!");
+ return;
+ }
+
+ MibCFile generatedFile = new MibCFile();
+ MibHeaderFile generatedHeaderFile = new MibHeaderFile();
+
+ foreach (MibTreeNode mibTreeNode in mt.Root)
+ {
+ // create LWIP object tree from MIB structure
+ Console.WriteLine(" Creating lwIP object tree " + mibTreeNode.Entity.Name);
+
+ SnmpMib snmpMib = new SnmpMib();
+ snmpMib.Oid = mibTreeNode.Entity.Value;
+ snmpMib.BaseOid = MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidValues();
+ snmpMib.Name = mibTreeNode.Entity.Name;
+
+ ProcessMibTreeNode(mibTreeNode, snmpMib);
+
+ // let the tree transform itself depending on node structure
+ snmpMib.Analyze();
+
+ if (snmpMib.ChildNodes.Count != 0)
+ {
+ // generate code from LWIP object tree
+ Console.WriteLine(" Generating code " + snmpMib.Name);
+ snmpMib.Generate(generatedFile, generatedHeaderFile);
+ }
+ }
+
+ string preservedCode = MibCFile.GetPreservedCode(destFile);
+ if (!string.IsNullOrEmpty(preservedCode))
+ {
+ generatedFile.PreservedCode.Add(new PlainText(preservedCode));
+ }
+ else
+ {
+ generatedFile.PreservedCode.AddRange(generatedFile.Implementation);
+ }
+ generatedFile.Implementation.Clear();
+
+
+ using (StreamWriter fileWriter = new StreamWriter(destHeaderFile))
+ {
+ CGenerator cGenerator = new CGenerator(fileWriter, destHeaderFile, 3, " ", Environment.NewLine);
+ generatedHeaderFile.Save(cGenerator);
+ }
+ using (StreamWriter fileWriter = new StreamWriter(destFile))
+ {
+ CGenerator cGenerator = new CGenerator(fileWriter, destFile, 3, " ", Environment.NewLine);
+ generatedFile.Save(cGenerator);
+ }
+
+ Console.WriteLine(" Done");
+ }
+
+ private static void PrintUsage()
+ {
+ string codeBase = Assembly.GetExecutingAssembly().CodeBase;
+ string appName = Path.GetFileName(codeBase);
+
+ Console.WriteLine("Usage:");
+ Console.WriteLine(String.Format(" {0} <source MIB file> <dest C file> [<search path 1 for referred MIB's> <search path 2 for referred MIB's> ...]", appName));
+ Console.WriteLine("");
+ Console.WriteLine(" <source MIB file>");
+ Console.WriteLine(" Path and filename of MIB file to convert.");
+ Console.WriteLine("");
+ Console.WriteLine(" <dest C file>");
+ Console.WriteLine(" Destination path and file. If a path is passed only, filename is auto");
+ Console.WriteLine(" generated from MIB file name.");
+ Console.WriteLine("");
+ Console.WriteLine(" <search path X for referred MIB's>");
+ Console.WriteLine(" It's important to provide all referred MIB's in order to correctly ");
+ Console.WriteLine(" resolve all used types.");
+ Console.WriteLine("");
+ }
+
+
+ #region Generation of LWIP Object Tree
+
+ private static void ProcessMibTreeNode(MibTreeNode mibTreeNode, SnmpTreeNode assignedSnmpNode)
+ {
+ foreach (MibTreeNode mtn in mibTreeNode.ChildNodes)
+ {
+ // in theory container nodes may also be scalars or tables at the same time (for now only process real containers)
+ if (mtn.NodeType == MibTreeNodeType.Container)
+ {
+ SnmpTreeNode snmpTreeNode = GenerateSnmpTreeNode(mtn, assignedSnmpNode);
+ assignedSnmpNode.ChildNodes.Add(snmpTreeNode);
+
+ ProcessMibTreeNode(mtn, snmpTreeNode);
+ }
+ else if ((mtn.NodeType & MibTreeNodeType.Scalar) != 0)
+ {
+ SnmpScalarNode snmpScalarNode = GenerateSnmpScalarNode(mtn, assignedSnmpNode);
+ if (snmpScalarNode != null)
+ {
+ assignedSnmpNode.ChildNodes.Add(snmpScalarNode);
+ }
+ }
+ else if ((mtn.NodeType & MibTreeNodeType.Table) != 0)
+ {
+ SnmpTableNode snmpTableNode = GenerateSnmpTableNode(mtn, assignedSnmpNode);
+ if (snmpTableNode != null)
+ {
+ assignedSnmpNode.ChildNodes.Add(snmpTableNode);
+ }
+ }
+ }
+ }
+
+ private static SnmpTreeNode GenerateSnmpTreeNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode)
+ {
+ SnmpTreeNode result = new SnmpTreeNode(parentNode);
+ result.Name = _alphaNumericRegex.Replace (mibTreeNode.Entity.Name, "");
+ result.Oid = mibTreeNode.Entity.Value;
+ result.FullOid = MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidString();
+
+ return result;
+ }
+
+ private static SnmpScalarNode GenerateSnmpScalarNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode, bool ignoreAccessibleFlag = false)
+ {
+ ObjectType ote = mibTreeNode.Entity as ObjectType;
+ if (ote != null)
+ {
+ return GenerateSnmpScalarNode(ote, parentNode, ignoreAccessibleFlag);
+ }
+
+ return null;
+ }
+
+ private static SnmpScalarNode GenerateSnmpScalarNode(ObjectType ote, SnmpTreeNode parentNode, bool ignoreAccessibleFlag = false)
+ {
+ SnmpScalarNode result;
+
+ ITypeAssignment mibType = ote.BaseType;
+ IntegerType it = (mibType as IntegerType);
+ if (it != null)
+ {
+ if (ote.ReferredType.Name == Symbol.TruthValue.ToString())
+ {
+ result = new SnmpScalarNodeTruthValue(parentNode);
+ }
+ else if ((it.Type == IntegerType.Types.Integer) || (it.Type == IntegerType.Types.Integer32))
+ {
+ result = new SnmpScalarNodeInt(parentNode);
+ }
+ else
+ {
+ Console.WriteLine(String.Format("Unsupported IntegerType '{0}'!", it.Type));
+ return null;
+ }
+ if (it.IsEnumeration)
+ {
+ result.Restrictions.AddRange(CreateRestrictions(it.Enumeration));
+ }
+ else
+ {
+ result.Restrictions.AddRange(CreateRestrictions(it.Ranges));
+ }
+ }
+ else
+ {
+ UnsignedType ut = (mibType as UnsignedType);
+ if (ut != null)
+ {
+ if ((ut.Type == UnsignedType.Types.Unsigned32) ||
+ (ut.Type == UnsignedType.Types.Gauge32))
+ {
+ result = new SnmpScalarNodeUint(SnmpDataType.Gauge, parentNode);
+ }
+ else if (ut.Type == UnsignedType.Types.Counter32)
+ {
+ result = new SnmpScalarNodeUint(SnmpDataType.Counter, parentNode);
+ }
+ else if (ut.Type == UnsignedType.Types.TimeTicks)
+ {
+ result = new SnmpScalarNodeUint(SnmpDataType.TimeTicks, parentNode);
+ }
+ else if (ut.Type == UnsignedType.Types.Counter64)
+ {
+ result = new SnmpScalarNodeCounter64(parentNode);
+ if ((ut.Ranges != null) && (ut.Ranges.Count > 0))
+ {
+ Console.WriteLine(String.Format("Generation of ranges is not supported for Counter64 type!"));
+ return null;
+ }
+ }
+ else
+ {
+ Console.WriteLine(String.Format("Unsupported UnsignedType '{0}'!", ut.Type));
+ return null;
+ }
+ result.Restrictions.AddRange(CreateRestrictions(ut.Ranges));
+ }
+ else if (mibType is IpAddressType)
+ {
+ result = new SnmpScalarNodeOctetString(SnmpDataType.IpAddress, parentNode);
+ result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size));
+ }
+ else if (mibType is OpaqueType)
+ {
+ result = new SnmpScalarNodeOctetString(SnmpDataType.Opaque, parentNode);
+ result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size));
+ }
+ else if (mibType is OctetStringType)
+ {
+ result = new SnmpScalarNodeOctetString(SnmpDataType.OctetString, parentNode);
+ result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size));
+ }
+ else if (mibType is ObjectIdentifierType)
+ {
+ result = new SnmpScalarNodeObjectIdentifier(parentNode);
+ }
+ else if (mibType is BitsType)
+ {
+ result = new SnmpScalarNodeBits(parentNode, (uint)((mibType as BitsType).Map.GetHighestValue() + 1));
+ result.Restrictions.AddRange(CreateRestrictions(mibType as BitsType));
+ }
+ else
+ {
+ TypeAssignment ta = mibType as TypeAssignment;
+ if (ta != null)
+ {
+ Console.WriteLine(String.Format("Unsupported BaseType: Module='{0}', Name='{1}', Type='{2}'!", ta.Module.Name, ta.Name, ta.Type));
+ }
+ else
+ {
+ Console.WriteLine(String.Format("Unsupported BaseType: Module='{0}', Name='{1}'!", mibType.Module, mibType.Name));
+ }
+
+ return null;
+ }
+ }
+
+ result.Name = _alphaNumericRegex.Replace(ote.Name, "");
+ result.Oid = ote.Value;
+
+ if (ote.Access == MaxAccess.readWrite)
+ {
+ result.AccessMode = SnmpAccessMode.ReadWrite;
+ }
+ else if (ote.Access == MaxAccess.readOnly)
+ {
+ result.AccessMode = SnmpAccessMode.ReadOnly;
+ }
+ else if (ote.Access == MaxAccess.readCreate)
+ {
+ result.AccessMode = SnmpAccessMode.ReadOnly;
+ }
+ else if (ignoreAccessibleFlag && (ote.Access == MaxAccess.notAccessible))
+ {
+ result.AccessMode = SnmpAccessMode.NotAccessible;
+ }
+ else
+ {
+ // not accessible or unsupported access type
+ return null;
+ }
+
+ return result;
+ }
+
+ private static IEnumerable<IRestriction> CreateRestrictions(ValueRanges ranges)
+ {
+ List<IRestriction> result = new List<IRestriction>();
+
+ if (ranges != null)
+ {
+ foreach (ValueRange range in ranges)
+ {
+ if (!range.End.HasValue)
+ {
+ result.Add(new IsEqualRestriction(range.Start));
+ }
+ else
+ {
+ result.Add(new IsInRangeRestriction(range.Start, range.End.Value));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private static IEnumerable<IRestriction> CreateRestrictions(ValueMap map)
+ {
+ if ((map != null) && (map.Count > 0))
+ {
+ return CreateRestrictions(map.GetContinousRanges());
+ }
+
+ return new List<IRestriction>();
+ }
+
+ private static IEnumerable<IRestriction> CreateRestrictions(BitsType bt)
+ {
+ List<IRestriction> result = new List<IRestriction>();
+
+ if ((bt != null) && (bt.Map != null))
+ {
+ result.Add(new BitMaskRestriction(bt.Map.GetBitMask()));
+ }
+
+ return result;
+ }
+
+ private static SnmpTableNode GenerateSnmpTableNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode)
+ {
+ SnmpTableNode result = new SnmpTableNode(parentNode);
+ result.Name = mibTreeNode.Entity.Name;
+ result.Oid = mibTreeNode.Entity.Value;
+
+ // expect exactly one row entry
+ if ((mibTreeNode.ChildNodes.Count != 1) || ((mibTreeNode.ChildNodes[0].NodeType & MibTreeNodeType.TableRow) == 0) || (mibTreeNode.ChildNodes[0].Entity.Value != 1))
+ {
+ Console.WriteLine("Found table with unsupported properties! Table needs exactly one (fixed) TableRow with OID=1 ! (" + mibTreeNode.Entity.Name + ")");
+ return null;
+ }
+
+ MibTreeNode rowNode = mibTreeNode.ChildNodes[0];
+
+ ObjectType rot = rowNode.Entity as ObjectType;
+ if (rot != null)
+ {
+ if (!String.IsNullOrWhiteSpace(rot.Augments))
+ {
+ result.AugmentedTableRow = rot.Augments;
+
+ // the indices from another table shall be used because this table is only an extension of it
+ rot = MibTypesResolver.ResolveDeclaration(rot.Module, rot.Augments) as ObjectType;
+ }
+
+ if (rot.Indices != null)
+ {
+ foreach (string index in rot.Indices)
+ {
+ ObjectType indexEntity = MibTypesResolver.ResolveDeclaration(rot.Module, index) as ObjectType;
+ if (indexEntity == null)
+ {
+ Console.WriteLine(String.Format("Could not resolve index '{0}' for table '{1}'! Table omitted!", index, result.Name));
+ return null;
+ }
+
+ result.IndexNodes.Add(GenerateSnmpScalarNode(indexEntity, parentNode, ignoreAccessibleFlag: true));
+ }
+ }
+ }
+
+ if (result.IndexNodes.Count == 0)
+ {
+ // a table cannot be used without index
+ Console.WriteLine("Found table without any index column ! (" + mibTreeNode.Entity.Name + ")");
+ return null;
+ }
+
+ // add child nodes
+ foreach (MibTreeNode cellNode in rowNode.ChildNodes)
+ {
+ SnmpScalarNode ssn = GenerateSnmpScalarNode(cellNode, parentNode);
+ if (ssn != null)
+ {
+ result.CellNodes.Add(ssn);
+ }
+ }
+
+ return result;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs b/contrib/apps/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d30b842
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die mit einer Assembly verknüpft sind.
+[assembly: AssemblyTitle("ConsoleApplication28")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ConsoleApplication28")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
+// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
+// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("0abf7541-6a96-43cd-9e24-462e074b2c96")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/contrib/apps/LwipMibCompiler/LwipMibCompiler/app.config b/contrib/apps/LwipMibCompiler/LwipMibCompiler/app.config
new file mode 100644
index 0000000..e365603
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipMibCompiler/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs
new file mode 100644
index 0000000..ee2f453
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace LwipSnmpCodeGeneration
+{
+ public interface IRestriction
+ {
+ string GetCheckCodeValid(string varNameToCheck);
+ string GetCheckCodeInvalid(string varNameToCheck);
+ }
+
+ public class BitMaskRestriction : IRestriction
+ {
+ UInt32 mask;
+
+ public BitMaskRestriction(UInt32 mask)
+ {
+ this.mask = mask;
+ }
+
+ public string GetCheckCodeValid(string varNameToCheck)
+ {
+ return String.Format("(({0} & {1}) == {0})", varNameToCheck, this.mask);
+ }
+
+ public string GetCheckCodeInvalid(string varNameToCheck)
+ {
+ return String.Format("(({0} & {1}) != {0})", varNameToCheck, this.mask);
+ }
+ }
+
+ public class IsEqualRestriction : IRestriction
+ {
+ private Int64 value;
+
+ public IsEqualRestriction(Int64 value)
+ {
+ this.value = value;
+ }
+
+ public long Value
+ {
+ get { return value; }
+ }
+
+ public string GetCheckCodeValid(string varNameToCheck)
+ {
+ return String.Format("({0} == {1})", varNameToCheck, this.value);
+ }
+
+ public string GetCheckCodeInvalid(string varNameToCheck)
+ {
+ return String.Format("({0} != {1})", varNameToCheck, this.value);
+ }
+ }
+
+ public class IsInRangeRestriction : IRestriction
+ {
+ private Int64 rangeStart;
+ private Int64 rangeEnd;
+
+ public IsInRangeRestriction(Int64 rangeStart, Int64 rangeEnd)
+ {
+ this.rangeStart = rangeStart;
+ this.rangeEnd = rangeEnd;
+ }
+
+ public long RangeStart
+ {
+ get { return this.rangeStart; }
+ }
+
+ public long RangeEnd
+ {
+ get { return this.rangeEnd; }
+ }
+
+ public string GetCheckCodeValid(string varNameToCheck)
+ {
+ return String.Format("(({0} >= {1}) && ({0} <= {2}))", varNameToCheck, this.rangeStart, this.rangeEnd);
+ }
+
+ public string GetCheckCodeInvalid(string varNameToCheck)
+ {
+ return String.Format("(({0} < {1}) || ({0} > {2}))", varNameToCheck, this.rangeStart, this.rangeEnd);
+ }
+ }
+
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs
new file mode 100644
index 0000000..edac59e
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+
+namespace LwipSnmpCodeGeneration
+{
+ public static class LwipOpts
+ {
+ public static bool GenerateEmptyFolders = false;
+ /// <summary>
+ /// If a tree node only has scalar nodes as child nodes, it is replaced by
+ /// a single scalar array node in order to save memory and have only one single get/test/set method for all scalars.
+ /// </summary>
+ public static bool GenerateScalarArrays = true;
+ /// <summary>
+ /// If a tree node has multiple scalars as subnodes as well as other treenodes it
+ /// defines a single get/test/set method for all scalar child node.
+ /// (without other treenodes as child it would have been converted to scalar array node).
+ /// </summary>
+ public static bool GenerateSingleAccessMethodsForTreeNodeScalars = GenerateScalarArrays;
+ }
+
+ public static class LwipDefs
+ {
+ public const string Null = "NULL";
+ public const string Vt_U8 = "u8_t";
+ public const string Vt_U16 = "u16_t";
+ public const string Vt_U32 = "u32_t";
+ public const string Vt_S8 = "s8_t";
+ public const string Vt_S16 = "s16_t";
+ public const string Vt_S32 = "s32_t";
+ public const string Vt_Snmp_err = "snmp_err_t";
+
+ public const string Incl_SnmpOpts = "lwip/apps/snmp_opts.h";
+ public const string Opt_SnmpEnabled = "LWIP_SNMP";
+
+ public const string Vt_StMib = "struct snmp_mib";
+ public const string Vt_StObjectId = "struct snmp_obj_id";
+ public const string Vt_StNode = "struct snmp_node";
+ public const string Vt_StNodeInstance = "struct snmp_node_instance";
+ public const string Vt_StTreeNode = "struct snmp_tree_node";
+ public const string Vt_StScalarNode = "struct snmp_scalar_node";
+ public const string Vt_StScalarArrayNode = "struct snmp_scalar_array_node";
+ public const string Vt_StScalarArrayNodeDef = "struct snmp_scalar_array_node_def";
+ public const string Vt_StTableNode = "struct snmp_table_node";
+ public const string Vt_StTableColumnDef = "struct snmp_table_col_def";
+ public const string Vt_StNextOidState = "struct snmp_next_oid_state";
+
+ public const string Def_NodeAccessReadOnly = "SNMP_NODE_INSTANCE_READ_ONLY";
+ public const string Def_NodeAccessReadWrite = "SNMP_NODE_INSTANCE_READ_WRITE";
+ public const string Def_NodeAccessWriteOnly = "SNMP_NODE_INSTANCE_WRITE_ONLY";
+ public const string Def_NodeAccessNotAccessible = "SNMP_NODE_INSTANCE_NOT_ACCESSIBLE";
+
+ public const string Def_ErrorCode_Ok = "SNMP_ERR_NOERROR";
+ public const string Def_ErrorCode_WrongValue = "SNMP_ERR_WRONGVALUE";
+ public const string Def_ErrorCode_NoSuchInstance = "SNMP_ERR_NOSUCHINSTANCE";
+
+ public const string FnctSuffix_GetValue = "_get_value";
+ public const string FnctSuffix_SetTest = "_set_test";
+ public const string FnctSuffix_SetValue = "_set_value";
+ public const string FnctSuffix_GetInstance = "_get_instance";
+ public const string FnctSuffix_GetNextInstance = "_get_next_instance";
+
+ public const string FnctName_SetTest_Ok = "snmp_set_test_ok";
+
+ public static string GetLwipDefForSnmpAccessMode(SnmpAccessMode am)
+ {
+ switch (am)
+ {
+ case SnmpAccessMode.ReadOnly: return Def_NodeAccessReadOnly;
+ case SnmpAccessMode.ReadWrite: return Def_NodeAccessReadWrite;
+ case SnmpAccessMode.NotAccessible: return Def_NodeAccessNotAccessible;
+ case SnmpAccessMode.WriteOnly: return Def_NodeAccessWriteOnly;
+ default: throw new NotSupportedException("Unknown SnmpAccessMode!");
+ }
+ }
+
+ public static string GetAsn1DefForSnmpDataType(SnmpDataType dt)
+ {
+ switch (dt)
+ {
+ // primitive
+ case SnmpDataType.Null:
+ return "SNMP_ASN1_TYPE_NULL";
+ case SnmpDataType.Bits:
+ case SnmpDataType.OctetString:
+ return "SNMP_ASN1_TYPE_OCTET_STRING";
+ case SnmpDataType.ObjectIdentifier:
+ return "SNMP_ASN1_TYPE_OBJECT_ID";
+ case SnmpDataType.Integer:
+ return "SNMP_ASN1_TYPE_INTEGER";
+
+ // application
+ case SnmpDataType.IpAddress:
+ return "SNMP_ASN1_TYPE_IPADDR";
+ case SnmpDataType.Counter:
+ return "SNMP_ASN1_TYPE_COUNTER";
+ case SnmpDataType.Gauge:
+ return "SNMP_ASN1_TYPE_GAUGE";
+ case SnmpDataType.TimeTicks:
+ return "SNMP_ASN1_TYPE_TIMETICKS";
+ case SnmpDataType.Opaque:
+ return "SNMP_ASN1_TYPE_OPAQUE";
+ case SnmpDataType.Counter64:
+ return "SNMP_ASN1_TYPE_COUNTER64";
+ default:
+ throw new NotSupportedException("Unknown SnmpDataType!");
+ }
+ }
+
+ public static string GetLengthForSnmpDataType(SnmpDataType dt)
+ {
+ switch (dt)
+ {
+ case SnmpDataType.Null:
+ return "0";
+
+ case SnmpDataType.Integer:
+ case SnmpDataType.Counter:
+ case SnmpDataType.IpAddress:
+ case SnmpDataType.Gauge:
+ case SnmpDataType.TimeTicks:
+ return "4";
+
+ case SnmpDataType.Counter64:
+ return "8";
+
+ case SnmpDataType.OctetString:
+ case SnmpDataType.ObjectIdentifier:
+ case SnmpDataType.Bits:
+ case SnmpDataType.Opaque:
+ return null;
+
+ default:
+ throw new NotSupportedException("Unknown SnmpDataType!");
+ }
+ }
+ }
+
+ public enum SnmpDataType
+ {
+ Null,
+
+ Integer, // INTEGER, Integer32
+
+ Counter, // Counter, Counter32
+ Gauge, // Gauge, Gauge32, Unsigned32
+ TimeTicks,
+
+ Counter64,
+
+ OctetString,
+ Opaque,
+ Bits,
+
+ ObjectIdentifier,
+
+ IpAddress,
+ }
+
+ public enum SnmpAccessMode
+ {
+ ReadOnly,
+ ReadWrite,
+ WriteOnly,
+ NotAccessible
+ }
+
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj
new file mode 100644
index 0000000..f4541c0
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{AABCAB90-1540-45D4-A159-14831A54E9A3}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>LwipSnmpCodeGeneration</RootNamespace>
+ <AssemblyName>LwipSnmpCodeGeneration</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="IRestriction.cs" />
+ <Compile Include="SnmpScalarNodeCounter64.cs" />
+ <Compile Include="SnmpScalarNodeTruthValue.cs" />
+ <Compile Include="SnmpScalarAggregationNode.cs" />
+ <Compile Include="SnmpTableNode.cs" />
+ <Compile Include="SnmpScalarArrayNode.cs" />
+ <Compile Include="MibHeaderFile.cs" />
+ <Compile Include="SnmpScalarNodeBits.cs" />
+ <Compile Include="SnmpMib.cs" />
+ <Compile Include="SnmpScalarNodeInt.cs" />
+ <Compile Include="SnmpScalarNodeObjectIdentifier.cs" />
+ <Compile Include="SnmpScalarNodeOctetString.cs" />
+ <Compile Include="SnmpScalarNodeUint.cs" />
+ <Compile Include="SnmpTreeNode.cs" />
+ <Compile Include="LwipSnmp.cs" />
+ <Compile Include="MibCFile.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="SnmpNode.cs" />
+ <Compile Include="SnmpScalarNode.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\CCodeGeneration\CCodeGeneration.csproj">
+ <Project>{7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}</Project>
+ <Name>CCodeGeneration</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs
new file mode 100644
index 0000000..c48ec29
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System.Collections.Generic;
+using CCodeGeneration;
+using System;
+using System.IO;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class MibCFile
+ {
+ #region Fields
+
+ private const string PreservedSectionMarker = "LWIP MIB generator - preserved section begin";
+ private const string PreservedSectionHeader =
+ "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" +
+ PreservedSectionMarker + "\n" +
+ "Code below is preserved on regeneration. Remove these comment lines to regenerate code.\n" +
+ "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
+
+ private readonly List<CodeElement> includes = new List<CodeElement>();
+ private readonly List<CodeElement> defines = new List<CodeElement>();
+ private readonly List<CodeElement> declarations = new List<CodeElement>();
+ private readonly List<CodeElement> implementation = new List<CodeElement>();
+ private readonly List<CodeElement> preservedCode = new List<CodeElement>();
+
+ #endregion
+
+ public MibCFile()
+ {
+ }
+
+ #region Accessors
+
+ public List<CodeElement> Includes
+ {
+ get { return this.includes; }
+ }
+
+ public List<CodeElement> Defines
+ {
+ get { return this.defines; }
+ }
+
+ public List<CodeElement> Declarations
+ {
+ get { return this.declarations; }
+ }
+
+ public List<CodeElement> Implementation
+ {
+ get { return this.implementation; }
+ }
+
+ public List<CodeElement> PreservedCode
+ {
+ get { return this.preservedCode; }
+ }
+
+ #endregion
+
+ #region Methods
+
+ public void Save(CGenerator cGenerator)
+ {
+ CFile cFile = new CFile();
+
+ cFile.AddElement(new Comment("Generated by LwipMibCompiler"));
+ cFile.AddElement(EmptyLine.SingleLine);
+
+ cFile.AddElement(new PP_Include(LwipDefs.Incl_SnmpOpts));
+ CodeContainerBase e = cFile.AddElement(new PP_If(LwipDefs.Opt_SnmpEnabled)) as CodeContainerBase;
+ e.AddElement(EmptyLine.SingleLine);
+
+ // include header file
+ string file = cGenerator.FileName;
+ if (!String.IsNullOrWhiteSpace(file))
+ {
+ string ext = System.IO.Path.GetExtension(file);
+
+ string headerFile = !String.IsNullOrEmpty(ext) ? file.Substring(0, file.Length - ext.Length) : file;
+ headerFile += ".h";
+
+ e.AddElement(new PP_Include(headerFile));
+ }
+
+ // include common snmp files
+ e.AddElement(new PP_Include("lwip/apps/snmp.h"));
+ e.AddElement(new PP_Include("lwip/apps/snmp_core.h"));
+ e.AddElement(new PP_Include("lwip/apps/snmp_scalar.h"));
+ e.AddElement(new PP_Include("lwip/apps/snmp_table.h"));
+
+ if (this.includes.Count > 0)
+ {
+ e.AddElement(EmptyLine.SingleLine);
+ e.AddElements(this.includes);
+ }
+
+ if (this.defines.Count > 0)
+ {
+ e.AddElement(EmptyLine.SingleLine);
+ e.AddElements(this.defines);
+ }
+
+ if (this.declarations.Count > 0)
+ {
+ e.AddElement(EmptyLine.TwoLines);
+ e.AddElements(this.declarations);
+ }
+
+ if (this.implementation.Count > 0)
+ {
+ e.AddElement(EmptyLine.TwoLines);
+ e.AddElements(this.implementation);
+ }
+
+ if (this.preservedCode.Count > 0)
+ {
+ e.AddElement(EmptyLine.TwoLines);
+ e.AddElement(new Comment(PreservedSectionHeader));
+ e.AddElement(EmptyLine.SingleLine);
+ e.AddElements(this.preservedCode);
+ }
+
+ cFile.Save(cGenerator);
+ }
+
+ public static string GetPreservedCode(string file)
+ {
+ if (File.Exists(file))
+ {
+ using (StreamReader fileStream = new StreamReader(file))
+ {
+ while (!fileStream.EndOfStream)
+ {
+ string line = fileStream.ReadLine();
+ if (line == PreservedSectionMarker)
+ {
+ break;
+ }
+ }
+
+ if (!fileStream.EndOfStream)
+ {
+ // skip the rest of the comment + spacer line
+ fileStream.ReadLine(); // "Code below is preserved...
+ fileStream.ReadLine(); // "+++++++++++++++++++++++...
+ fileStream.ReadLine(); // */
+ fileStream.ReadLine(); //
+
+ string preservedCode = fileStream.ReadToEnd();
+
+ int lastEndif = preservedCode.LastIndexOf("#endif", StringComparison.Ordinal);
+ preservedCode = preservedCode.Remove(lastEndif);
+
+ return preservedCode;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ #endregion
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs
new file mode 100644
index 0000000..95f2a06
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class MibHeaderFile
+ {
+
+ #region Fields
+
+ private readonly List<CodeElement> defines = new List<CodeElement>();
+ private readonly List<CodeElement> includes = new List<CodeElement>();
+ private readonly List<CodeElement> functionDeclarations = new List<CodeElement>();
+ private readonly List<CodeElement> variableDeclarations = new List<CodeElement>();
+
+ #endregion
+
+ public MibHeaderFile()
+ {
+ }
+
+ #region Accessors
+
+ public List<CodeElement> Defines
+ {
+ get { return this.defines; }
+ }
+
+ public List<CodeElement> Includes
+ {
+ get { return this.includes; }
+ }
+
+ public List<CodeElement> FunctionDeclarations
+ {
+ get { return this.functionDeclarations; }
+ }
+
+ public List<CodeElement> VariableDeclarations
+ {
+ get { return this.variableDeclarations; }
+ }
+
+ #endregion
+
+ #region Methods
+
+ public void Save(CGenerator cGenerator)
+ {
+ CFile cFile = new CFile();
+
+ cFile.AddElement(new Comment("Generated by LwipMibCompiler"));
+ cFile.AddElement(EmptyLine.SingleLine);
+
+ string headerDefine = cGenerator.FileName;
+ headerDefine = new Regex("[^a-zA-Z0-9]").Replace(headerDefine, "_");
+ headerDefine = headerDefine.ToUpperInvariant();
+
+ CodeContainerBase e = cFile.AddElement(new PP_Ifdef(headerDefine, inverted: true)) as CodeContainerBase;
+ e.AddElement(new PP_Macro(headerDefine, headerDefine));
+ e.AddElement(EmptyLine.SingleLine);
+
+ e.AddElement(new PP_Include(LwipDefs.Incl_SnmpOpts));
+ e = e.AddElement(new PP_If(LwipDefs.Opt_SnmpEnabled)) as CodeContainerBase;
+ e.AddElement(EmptyLine.SingleLine);
+
+ CodeContainerBase cplusplusopen = e.AddElement(new PP_Ifdef("__cplusplus")) as CodeContainerBase;
+ cplusplusopen.AddElement(new Code("extern \"C\" {"));
+ e.AddElement(EmptyLine.SingleLine);
+
+ if (this.includes.Count > 0)
+ {
+ e.AddElements(this.includes);
+ e.AddElement(EmptyLine.SingleLine);
+ }
+
+ if (this.defines.Count > 0)
+ {
+ e.AddElements(this.defines);
+ e.AddElement(EmptyLine.SingleLine);
+ }
+
+ e.AddElements(this.functionDeclarations, EmptyLine.SingleLine);
+ e.AddElements(this.variableDeclarations, EmptyLine.SingleLine);
+
+ e.AddElement(EmptyLine.SingleLine);
+ CodeContainerBase cplusplusclose = e.AddElement(new PP_Ifdef("__cplusplus")) as CodeContainerBase;
+ cplusplusclose.AddElement(new Code("}"));
+
+ e.AddElement(EmptyLine.SingleLine);
+ cFile.Save(cGenerator);
+ }
+
+ #endregion
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e68b43d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die mit einer Assembly verknüpft sind.
+[assembly: AssemblyTitle("LwipSnmpCodeGeneration")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LwipSnmpCodeGeneration")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
+// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
+// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("8cfbbb8b-dfbb-4dd5-80c9-e07845dd58c9")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs
new file mode 100644
index 0000000..477a18b
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpMib : SnmpTreeNode
+ {
+ public uint[] BaseOid { get; set; }
+
+ public SnmpMib()
+ : base(null)
+ {
+ }
+
+ public SnmpMib(uint[] baseOid)
+ : base(null)
+ {
+ this.BaseOid = baseOid;
+ }
+
+ public override string FullNodeName
+ {
+ get { return this.Name.ToLowerInvariant() + "_root"; }
+ }
+
+ public override void GenerateCode(MibCFile mibFile)
+ {
+ base.GenerateCode(mibFile);
+
+ System.Diagnostics.Debug.Assert((this.BaseOid != null) && (this.BaseOid.Length > 0));
+
+ // create and add BaseOID declarations
+ StringBuilder boidInitialization = new StringBuilder("{");
+ foreach (uint t in this.BaseOid)
+ {
+ boidInitialization.Append(t);
+ boidInitialization.Append(",");
+ }
+ boidInitialization.Length -= 1;
+ boidInitialization.Append("}");
+
+ VariableDeclaration boidDecl = new VariableDeclaration(
+ new VariableType(this.Name.ToLowerInvariant() + "_base_oid", LwipDefs.Vt_U32, null, ConstType.Value, String.Empty),
+ boidInitialization.ToString(), true);
+
+ mibFile.Declarations.Add(boidDecl);
+ mibFile.Declarations.Add(GetExportDeclaration());
+ }
+
+ public override void GenerateHeaderCode(MibHeaderFile mibHeaderFile)
+ {
+ mibHeaderFile.Includes.Add(new PP_Include("lwip/apps/snmp_core.h"));
+
+ mibHeaderFile.VariableDeclarations.Add(VariablePrototype.FromVariableDeclaration(GetExportDeclaration()));
+ }
+
+ VariableDeclaration GetExportDeclaration()
+ {
+ return new VariableDeclaration(
+ new VariableType(this.Name.ToLowerInvariant(), LwipDefs.Vt_StMib, null, ConstType.Value),
+ String.Format("{{{0}_base_oid, LWIP_ARRAYSIZE({0}_base_oid), &{1}.node}}", this.Name.ToLowerInvariant(), this.FullNodeName));
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs
new file mode 100644
index 0000000..fceb4d5
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text.RegularExpressions;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public abstract class SnmpNode
+ {
+ public static readonly Regex NameValidationRegex = new Regex(@"^\w+$");
+
+ private string name;
+ private readonly SnmpTreeNode parentNode;
+
+ protected SnmpNode(SnmpTreeNode parentNode)
+ {
+ this.parentNode = parentNode;
+ }
+
+ public SnmpTreeNode ParentNode
+ {
+ get { return this.parentNode; }
+ }
+
+ public virtual uint Oid { get; set; }
+
+ public abstract string FullNodeName
+ {
+ get;
+ }
+
+ public virtual string Name
+ {
+ get { return this.name; }
+ set
+ {
+ if (value != this.name)
+ {
+ // check for valid name
+ if (!NameValidationRegex.IsMatch(value))
+ {
+ throw new ArgumentOutOfRangeException("Name");
+ }
+
+ this.name = value;
+ }
+ }
+ }
+
+ public virtual void Generate(MibCFile generatedFile, MibHeaderFile generatedHeaderFile)
+ {
+ int declCount = generatedFile.Declarations.Count;
+ int implCount = generatedFile.Implementation.Count;
+
+ this.GenerateHeaderCode(generatedHeaderFile);
+ this.GenerateCode(generatedFile);
+
+ if (generatedFile.Declarations.Count != declCount)
+ {
+ generatedFile.Declarations.Add(EmptyLine.SingleLine);
+ }
+ if (generatedFile.Implementation.Count != implCount)
+ {
+ generatedFile.Implementation.Add(EmptyLine.SingleLine);
+ }
+ }
+
+ public abstract void GenerateCode(MibCFile mibFile);
+
+ public virtual void GenerateHeaderCode(MibHeaderFile mibHeaderFile)
+ {
+ }
+
+ /// <summary>
+ /// Called after node structure creation is completed and before code is created.
+ /// Offers the possibility to perform operations depending on properties/subnodes.
+ /// If the node shall be transformed to another node(-type) than the own instance
+ /// may be replaced on parent node by the transformed instance.
+ /// Calling sequence is always from leafs up to root. So a tree node can assume
+ /// that the analyze method was already called on all child nodes.
+ /// E.g. a tree node only has scalar sub nodes -> it transforms itself to a scalar array node
+ /// </summary>
+ /// <returns>The transformed node or null if nothing shall be changed in parent structure.</returns>
+ public virtual void Analyze()
+ {
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs
new file mode 100644
index 0000000..f5c558c
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System.Collections.Generic;
+using System.Globalization;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public abstract class SnmpScalarAggregationNode: SnmpNode
+ {
+ private bool getMethodRequired = false;
+ private bool testMethodRequired = false;
+ private bool setMethodRequired = false;
+
+ protected SnmpScalarAggregationNode(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ }
+
+ protected virtual string GetMethodName
+ {
+ get { return this.FullNodeName + LwipDefs.FnctSuffix_GetValue; }
+ }
+
+ protected bool GetMethodRequired
+ {
+ get { return this.getMethodRequired; }
+ }
+
+ protected virtual string TestMethodName
+ {
+ get { return this.FullNodeName + LwipDefs.FnctSuffix_SetTest; }
+ }
+
+ protected bool TestMethodRequired
+ {
+ get { return this.testMethodRequired; }
+ }
+
+ protected virtual string SetMethodName
+ {
+ get { return this.FullNodeName + LwipDefs.FnctSuffix_SetValue; }
+ }
+
+ protected bool SetMethodRequired
+ {
+ get { return this.setMethodRequired; }
+ }
+
+ protected abstract IEnumerable<SnmpScalarNode> AggregatedScalarNodes
+ {
+ get;
+ }
+
+ public override void Analyze()
+ {
+ base.Analyze();
+
+ this.getMethodRequired = false;
+ this.testMethodRequired = false;
+ this.setMethodRequired = false;
+
+ foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes)
+ {
+ if ((scalarNode.AccessMode == SnmpAccessMode.ReadOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite))
+ {
+ this.getMethodRequired = true;
+ }
+ if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite))
+ {
+ this.testMethodRequired = true;
+ this.setMethodRequired = true;
+ }
+
+ if (this.getMethodRequired && this.setMethodRequired)
+ {
+ break;
+ }
+ }
+ }
+
+ protected void GenerateAggregatedCode(MibCFile mibFile, VariableType instanceType, string switchSelector, bool generateDeclarations = true, bool generateImplementations = true)
+ {
+ if (this.getMethodRequired)
+ {
+ FunctionDeclaration getMethodDecl = new FunctionDeclaration(this.GetMethodName, isStatic: true);
+ getMethodDecl.Parameter.Add(instanceType);
+ getMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ getMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_S16);
+
+ if (generateDeclarations)
+ {
+ mibFile.Declarations.Add(getMethodDecl);
+ }
+ if (generateImplementations)
+ {
+ Function getMethod = Function.FromDeclaration(getMethodDecl);
+ GenerateGetMethodCode(getMethod, switchSelector);
+ mibFile.Implementation.Add(getMethod);
+ }
+ }
+
+ if (this.testMethodRequired)
+ {
+ FunctionDeclaration testMethodDecl = new FunctionDeclaration(this.TestMethodName, isStatic: true);
+ testMethodDecl.Parameter.Add(instanceType);
+ testMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
+ testMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ testMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+
+ if (generateDeclarations)
+ {
+ mibFile.Declarations.Add(testMethodDecl);
+ }
+ if (generateImplementations)
+ {
+ Function testMethod = Function.FromDeclaration(testMethodDecl);
+ GenerateTestMethodCode(testMethod, switchSelector);
+ mibFile.Implementation.Add(testMethod);
+ }
+ }
+
+ if (this.setMethodRequired)
+ {
+ FunctionDeclaration setMethodDecl = new FunctionDeclaration(this.SetMethodName, isStatic: true);
+ setMethodDecl.Parameter.Add(instanceType);
+ setMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
+ setMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ setMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+
+ if (generateDeclarations)
+ {
+ mibFile.Declarations.Add(setMethodDecl);
+ }
+ if (generateImplementations)
+ {
+ Function setMethod = Function.FromDeclaration(setMethodDecl);
+ GenerateSetMethodCode(setMethod, switchSelector);
+ mibFile.Implementation.Add(setMethod);
+ }
+ }
+ }
+
+ protected virtual void GenerateGetMethodCode(Function getMethod, string switchSelector)
+ {
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)getMethod.ReturnType.Clone());
+ returnValue.Type.Name = "value_len";
+ getMethod.Declarations.Add(returnValue);
+ Switch sw = new Switch(switchSelector);
+
+ bool valueVarUsed = false;
+
+ foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes)
+ {
+ if ((scalarNode.AccessMode == SnmpAccessMode.ReadOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite))
+ {
+ SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture));
+ sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true));
+
+ scalarNode.GenerateGetMethodCode(sc, getMethod.Parameter[1].Name, ref valueVarUsed, returnValue.Type.Name);
+
+ sw.Switches.Add(sc);
+ }
+ }
+
+ SwitchCase scd = SwitchCase.GenerateDefault();
+ scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", getMethod.Name, switchSelector);
+ scd.AddCodeFormat("{0} = 0;", returnValue.Type.Name);
+ sw.Switches.Add(scd);
+
+ if (!valueVarUsed)
+ {
+ getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[1].Name);
+ }
+
+ getMethod.AddElement(sw);
+
+ getMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+ }
+
+ protected virtual void GenerateTestMethodCode(Function testMethod, string switchSelector)
+ {
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)testMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_WrongValue);
+ returnValue.Type.Name = "err";
+ testMethod.Declarations.Add(returnValue);
+ Switch sw = new Switch(switchSelector);
+
+ bool valueVarUsed = false;
+ bool lenVarUsed = false;
+
+ foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes)
+ {
+ if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite))
+ {
+ SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture));
+ sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true));
+
+ scalarNode.GenerateTestMethodCode(sc, testMethod.Parameter[2].Name, ref valueVarUsed, testMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);
+
+ sw.Switches.Add(sc);
+ }
+ }
+
+ SwitchCase scd = SwitchCase.GenerateDefault();
+ scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", testMethod.Name, switchSelector);
+ sw.Switches.Add(scd);
+
+ if (!valueVarUsed)
+ {
+ testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[2].Name);
+ }
+ if (!lenVarUsed)
+ {
+ testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[1].Name);
+ }
+
+ testMethod.AddElement(sw);
+
+ testMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+ }
+
+ protected virtual void GenerateSetMethodCode(Function setMethod, string switchSelector)
+ {
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok);
+ returnValue.Type.Name = "err";
+ setMethod.Declarations.Add(returnValue);
+ Switch sw = new Switch(switchSelector);
+
+ bool valueVarUsed = false;
+ bool lenVarUsed = false;
+
+ foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes)
+ {
+ if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite))
+ {
+ SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture));
+ sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true));
+
+ scalarNode.GenerateSetMethodCode(sc, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);
+
+ sw.Switches.Add(sc);
+ }
+ }
+
+ SwitchCase scd = SwitchCase.GenerateDefault();
+ scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", setMethod.Name, switchSelector);
+ sw.Switches.Add(scd);
+
+ if (!valueVarUsed)
+ {
+ setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[2].Name);
+ }
+ if (!lenVarUsed)
+ {
+ setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[1].Name);
+ }
+
+ setMethod.AddElement(sw);
+
+ setMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs
new file mode 100644
index 0000000..086fbb9
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarArrayNode : SnmpScalarAggregationNode
+ {
+ private readonly List<SnmpScalarNode> scalarNodes;
+
+ public SnmpScalarArrayNode(List<SnmpScalarNode> scalarNodes, SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ this.scalarNodes = scalarNodes;
+ }
+
+ public override string FullNodeName
+ {
+ get { return this.Name.ToLowerInvariant() + "_scalars"; }
+ }
+
+ protected override IEnumerable<SnmpScalarNode> AggregatedScalarNodes
+ {
+ get { return this.scalarNodes; }
+ }
+
+ public override void GenerateCode(MibCFile mibFile)
+ {
+ VariableType instanceType = new VariableType("node", LwipDefs.Vt_StScalarArrayNodeDef, "*", ConstType.Value);
+ GenerateAggregatedCode(
+ mibFile,
+ instanceType,
+ instanceType.Name + "->oid");
+
+
+ // create and add node definitions
+ StringBuilder nodeDefs = new StringBuilder();
+ foreach (SnmpScalarNode scalarNode in this.scalarNodes)
+ {
+ nodeDefs.AppendFormat(" {{{0}, {1}, {2}}}, /* {3} */ \n",
+ scalarNode.Oid,
+ LwipDefs.GetAsn1DefForSnmpDataType(scalarNode.DataType),
+ LwipDefs.GetLwipDefForSnmpAccessMode(scalarNode.AccessMode),
+ scalarNode.Name);
+ }
+ if (nodeDefs.Length > 0)
+ nodeDefs.Length--;
+
+ VariableDeclaration nodeDefsDecl = new VariableDeclaration(
+ new VariableType(this.FullNodeName + "_nodes", LwipDefs.Vt_StScalarArrayNodeDef, null, ConstType.Value, String.Empty),
+ "{\n" + nodeDefs + "\n}" ,
+ isStatic: true);
+
+ mibFile.Declarations.Add(nodeDefsDecl);
+
+
+ // create and add node declaration
+ string nodeInitialization = String.Format("SNMP_SCALAR_CREATE_ARRAY_NODE({0}, {1}, {2}, {3}, {4})",
+ this.Oid,
+ nodeDefsDecl.Type.Name,
+ (this.GetMethodRequired) ? this.GetMethodName : LwipDefs.Null,
+ (this.TestMethodRequired) ? this.TestMethodName : LwipDefs.Null,
+ (this.SetMethodRequired) ? this.SetMethodName : LwipDefs.Null
+ );
+
+ mibFile.Declarations.Add(new VariableDeclaration(
+ new VariableType(this.FullNodeName, LwipDefs.Vt_StScalarArrayNode, null, ConstType.Value),
+ nodeInitialization,
+ isStatic: true));
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs
new file mode 100644
index 0000000..6be54c4
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNode: SnmpNode
+ {
+ protected const string LocalValueName = "v"; // name of (casted) local value variable
+
+ private SnmpDataType dataType;
+ private SnmpAccessMode accessMode;
+ private readonly List<IRestriction> restrictions = new List<IRestriction>();
+
+ private bool useExternalMethods = false;
+ private string externalGetMethod;
+ private string externalTestMethod;
+ private string externalSetMethod;
+
+
+ public SnmpScalarNode(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ }
+
+ public override string FullNodeName
+ {
+ get { return this.Name.ToLowerInvariant() + "_scalar"; }
+ }
+
+ public SnmpDataType DataType
+ {
+ get { return this.dataType; }
+ set { this.dataType = value; }
+ }
+
+ public List<IRestriction> Restrictions
+ {
+ get { return this.restrictions; }
+ }
+
+ public SnmpAccessMode AccessMode
+ {
+ get { return this.accessMode; }
+ set { this.accessMode = value; }
+ }
+
+ public virtual string FixedValueLength
+ {
+ get { return null; }
+ }
+
+ /// <summary>
+ /// If scalar is used as a table index its value becomes part of the OID. This value returns how many OID parts are required to represent this value.
+ /// </summary>
+ public virtual int OidRepresentationLen
+ {
+ get { return -1; }
+ }
+
+ public bool UseExternalMethods
+ {
+ get { return this.useExternalMethods; }
+ set { this.useExternalMethods = value; }
+ }
+
+ public string ExternalGetMethod
+ {
+ get { return this.externalGetMethod; }
+ set { this.externalGetMethod = value; }
+ }
+ public string ExternalTestMethod
+ {
+ get { return this.externalTestMethod; }
+ set { this.externalTestMethod = value; }
+ }
+ public string ExternalSetMethod
+ {
+ get { return this.externalSetMethod; }
+ set { this.externalSetMethod = value; }
+ }
+
+ public override void GenerateCode(MibCFile mibFile)
+ {
+ string getMethodName;
+ string testMethodName;
+ string setMethodName;
+
+ if (this.useExternalMethods)
+ {
+ getMethodName = this.externalGetMethod;
+ testMethodName = this.externalTestMethod;
+ setMethodName = this.externalSetMethod;
+ }
+ else
+ {
+ getMethodName = LwipDefs.Null;
+ testMethodName = LwipDefs.Null;
+ setMethodName = LwipDefs.Null;
+
+ if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.ReadOnly))
+ {
+ FunctionDeclaration getMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_GetValue, isStatic: true);
+ getMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
+ getMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ getMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_S16);
+ mibFile.Declarations.Add(getMethodDecl);
+
+ Function getMethod = Function.FromDeclaration(getMethodDecl);
+ getMethodName = getMethod.Name;
+
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)getMethod.ReturnType.Clone());
+ returnValue.Type.Name = "value_len";
+ getMethod.Declarations.Add(returnValue);
+ getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[0].Name);
+
+ bool valueVarUsed = false;
+ GenerateGetMethodCode(getMethod, getMethod.Parameter[1].Name, ref valueVarUsed, returnValue.Type.Name);
+ if (!valueVarUsed)
+ {
+ getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[1].Name);
+ }
+
+ getMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+
+ mibFile.Implementation.Add(getMethod);
+ }
+
+ if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.WriteOnly))
+ {
+ bool valueVarUsed;
+ bool lenVarUsed;
+ VariableDeclaration returnValue;
+
+ if (this.restrictions.Count > 0)
+ {
+ FunctionDeclaration testMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetTest, isStatic: true);
+ testMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
+ testMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
+ testMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ testMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+ mibFile.Declarations.Add(testMethodDecl);
+
+ Function testMethod = Function.FromDeclaration(testMethodDecl);
+ testMethodName = testMethod.Name;
+
+ returnValue = new VariableDeclaration((VariableType)testMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_WrongValue);
+ returnValue.Type.Name = "err";
+ testMethod.Declarations.Add(returnValue);
+ testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[0].Name);
+
+ valueVarUsed = false;
+ lenVarUsed = false;
+
+ GenerateTestMethodCode(testMethod, testMethod.Parameter[2].Name, ref valueVarUsed, testMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);
+
+ if (!valueVarUsed)
+ {
+ testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[2].Name);
+ }
+ if (!lenVarUsed)
+ {
+ testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[1].Name);
+ }
+
+ testMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+
+ mibFile.Implementation.Add(testMethod);
+
+ }
+ else
+ {
+ testMethodName = LwipDefs.FnctName_SetTest_Ok;
+ }
+
+ FunctionDeclaration setMethodDecl = null;
+ setMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetValue, isStatic: true);
+ setMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
+ setMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
+ setMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
+ setMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+ mibFile.Declarations.Add(setMethodDecl);
+
+ Function setMethod = Function.FromDeclaration(setMethodDecl);
+ setMethodName = setMethod.Name;
+
+ returnValue = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok);
+ returnValue.Type.Name = "err";
+ setMethod.Declarations.Add(returnValue);
+ setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[0].Name);
+
+ valueVarUsed = false;
+ lenVarUsed = false;
+
+ GenerateSetMethodCode(setMethod, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);
+
+ if (!valueVarUsed)
+ {
+ setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[2].Name);
+ }
+ if (!lenVarUsed)
+ {
+ setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[1].Name);
+ }
+
+ setMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+
+ mibFile.Implementation.Add(setMethod);
+ }
+ }
+
+ // create and add node declaration
+ string nodeInitialization;
+ if (this.accessMode == SnmpAccessMode.ReadOnly)
+ {
+ nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE_READONLY({0}, {1}, {2})",
+ this.Oid,
+ LwipDefs.GetAsn1DefForSnmpDataType(this.dataType),
+ getMethodName);
+ }
+ else
+ {
+ nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE({0}, {1}, {2}, {3}, {4}, {5})",
+ this.Oid,
+ LwipDefs.GetLwipDefForSnmpAccessMode(this.accessMode),
+ LwipDefs.GetAsn1DefForSnmpDataType(this.dataType),
+ getMethodName,
+ testMethodName,
+ setMethodName);
+ }
+
+ mibFile.Declarations.Add(new VariableDeclaration(
+ new VariableType(this.FullNodeName, LwipDefs.Vt_StScalarNode, null, ConstType.Value),
+ nodeInitialization, isStatic: true));
+ }
+
+ public virtual void GenerateGetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string retLenVarName)
+ {
+ bool localValueVarUsed;
+ if (GenerateValueDeclaration(container, LocalValueName, valueVarName))
+ {
+ valueVarUsed = true;
+ localValueVarUsed = false;
+ }
+ else
+ {
+ localValueVarUsed = true; // do not generate UNUSED_ARG code
+ }
+
+ if (this.FixedValueLength == null)
+ {
+ // check that value with variable length fits into buffer
+ container.AddElement(new Comment(String.Format("TODO: take care that value with variable length fits into buffer: ({0} <= SNMP_MAX_VALUE_SIZE)", retLenVarName), singleLine: true));
+ }
+
+ GenerateGetMethodCodeCore(container, LocalValueName, ref localValueVarUsed, retLenVarName);
+ if (!localValueVarUsed)
+ {
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName));
+ }
+ }
+
+ protected virtual void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName)
+ {
+ container.AddElement(new Comment(String.Format("TODO: put requested value to '*{0}' here", localValueVarName), singleLine: true));
+ container.AddCodeFormat("{0} = {1};",
+ retLenVarName,
+ (!String.IsNullOrWhiteSpace(this.FixedValueLength)) ? this.FixedValueLength : "0");
+ }
+
+ public virtual void GenerateTestMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ if (this.Restrictions.Count > 0)
+ {
+ bool localVarUsed;
+ if (GenerateValueDeclaration(container, LocalValueName, valueVarName))
+ {
+ valueVarUsed = true;
+ localVarUsed = false;
+ }
+ else
+ {
+ localVarUsed = true; // do not generate UNUSED_ARG code
+ }
+
+ if (!String.IsNullOrWhiteSpace(this.FixedValueLength))
+ {
+ // check for fixed value
+ container.AddCodeFormat("LWIP_ASSERT(\"Invalid length for datatype\", ({0} == {1}));", lenVarName, this.FixedValueLength);
+ lenVarUsed = true;
+ }
+
+ GenerateTestMethodCodeCore(container, LocalValueName, ref localVarUsed, lenVarName, ref lenVarUsed, retErrVarName);
+
+ if (!localVarUsed)
+ {
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName));
+ }
+ }
+ else
+ {
+ container.AddCodeFormat("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok);
+ }
+ }
+
+ protected virtual void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ container.AddElement(new Comment(String.Format("TODO: test new value here:\nif (*{0} == ) {1} = {2};", localValueVarName, retErrVarName, LwipDefs.Def_ErrorCode_Ok)));
+ }
+
+ public virtual void GenerateSetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ bool localVarUsed;
+ if (GenerateValueDeclaration(container, LocalValueName, valueVarName))
+ {
+ valueVarUsed = true;
+ localVarUsed = false;
+ }
+ else
+ {
+ localVarUsed = true; // do not generate UNUSED_ARG code
+ }
+
+ GenerateSetMethodCodeCore(container, LocalValueName, ref localVarUsed, lenVarName, ref lenVarUsed, retErrVarName);
+
+ if (!localVarUsed)
+ {
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName));
+ }
+ }
+
+ protected virtual void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ container.AddElement(new Comment(String.Format("TODO: store new value contained in '*{0}' here", localValueVarName), singleLine: true));
+ }
+
+
+ protected virtual bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName)
+ {
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName, LwipDefs.Vt_U8, "*"),
+ "(" + new VariableType(null, LwipDefs.Vt_U8, "*") + ")" + sourceName));
+
+ return true;
+ }
+
+ public static SnmpScalarNode CreateFromDatatype(SnmpDataType dataType, SnmpTreeNode parentNode)
+ {
+ switch (dataType)
+ {
+ case SnmpDataType.Integer:
+ return new SnmpScalarNodeInt(parentNode);
+
+ case SnmpDataType.Gauge:
+ case SnmpDataType.Counter:
+ case SnmpDataType.TimeTicks:
+ return new SnmpScalarNodeUint(dataType, parentNode);
+ }
+
+ return new SnmpScalarNode(parentNode);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs
new file mode 100644
index 0000000..906a5a6
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeBits : SnmpScalarNode
+ {
+ private readonly uint bitCount;
+
+ public SnmpScalarNodeBits(SnmpTreeNode parentNode, uint bitCount)
+ : base(parentNode)
+ {
+ this.DataType = SnmpDataType.Bits;
+ this.bitCount = bitCount;
+ }
+
+ public override void GenerateGetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string retLenVarName)
+ {
+ container.AddCode(String.Format(
+ "{0} = snmp_encode_bits(({1} *){2}, SNMP_MAX_VALUE_SIZE, 0 /* TODO: pass real value here */, {3});",
+ retLenVarName,
+ LwipDefs.Vt_U8,
+ valueVarName,
+ this.bitCount));
+
+ valueVarUsed = true;
+ }
+
+ public override void GenerateTestMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ if (this.Restrictions.Count > 0)
+ {
+ const string bitVarName = "bits";
+
+ container.Declarations.Add(new VariableDeclaration(new VariableType(bitVarName, LwipDefs.Vt_U32)));
+
+ IfThenElse ite = new IfThenElse(String.Format(
+ "snmp_decode_bits(({0} *){1}, {2}, &{3}) == ERR_OK",
+ LwipDefs.Vt_U8,
+ valueVarName,
+ lenVarName,
+ bitVarName));
+
+ valueVarUsed = true;
+ lenVarUsed = true;
+
+ StringBuilder innerIfCond = new StringBuilder();
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ innerIfCond.Append(restriction.GetCheckCodeValid(bitVarName));
+ innerIfCond.Append(" || ");
+ }
+
+ innerIfCond.Length -= 4;
+
+ IfThenElse innerIte = new IfThenElse(innerIfCond.ToString());
+ innerIte.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok));
+ ite.AddElement(innerIte);
+ container.AddElement(ite);
+ }
+ else
+ {
+ base.GenerateTestMethodCode(container, valueVarName, ref valueVarUsed, lenVarName, ref lenVarUsed, retErrVarName);
+ }
+ }
+
+ public override void GenerateSetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ const string bitVarName = "bits";
+
+ container.Declarations.Add(new VariableDeclaration(new VariableType(bitVarName, LwipDefs.Vt_U32)));
+
+ IfThenElse ite = new IfThenElse(String.Format(
+ "snmp_decode_bits(({0} *){1}, {2}, &{3}) == ERR_OK",
+ LwipDefs.Vt_U8,
+ valueVarName,
+ lenVarName,
+ bitVarName));
+
+ valueVarUsed = true;
+ lenVarUsed = true;
+
+ ite.AddElement(new Comment(String.Format("TODO: store new value contained in '{0}' here", bitVarName), singleLine: true));
+
+ container.AddElement(ite);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs
new file mode 100644
index 0000000..8f450c8
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeCounter64 : SnmpScalarNode
+ {
+ public SnmpScalarNodeCounter64(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ this.DataType = SnmpDataType.Counter64;
+ }
+
+ protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName)
+ {
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName + "_high", LwipDefs.Vt_U32, "*"),
+ "(" + new VariableType(null, LwipDefs.Vt_U32, "*").ToString() + ")" + sourceName));
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName + "_low", LwipDefs.Vt_U32, "*"),
+ variableName + "_high + 1"));
+
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0}_high);", variableName));
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0}_low);", variableName));
+
+ return false;
+ }
+
+ public override string FixedValueLength
+ {
+ get { return String.Format("(2 * sizeof({0}))", LwipDefs.Vt_U32); }
+ }
+
+ public override int OidRepresentationLen
+ {
+ get { return 1; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs
new file mode 100644
index 0000000..a381234
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeInt : SnmpScalarNode
+ {
+ public SnmpScalarNodeInt(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ this.DataType = SnmpDataType.Integer;
+ }
+
+ protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0);
+
+ StringBuilder ifCond = new StringBuilder();
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ ifCond.Append(restriction.GetCheckCodeValid("*" + localValueVarName));
+ ifCond.Append(" || ");
+
+ localValueVarUsed = true;
+ }
+
+ ifCond.Length -= 4;
+
+ IfThenElse ite = new IfThenElse(ifCond.ToString());
+ ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok));
+ container.AddElement(ite);
+ }
+
+ protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName)
+ {
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName, LwipDefs.Vt_S32, "*"),
+ "(" + new VariableType(null, LwipDefs.Vt_S32, "*") + ")" + sourceName));
+
+ return true;
+ }
+
+ public override string FixedValueLength
+ {
+ get { return String.Format("sizeof({0})", LwipDefs.Vt_S32); }
+ }
+
+ public override int OidRepresentationLen
+ {
+ get { return 1; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs
new file mode 100644
index 0000000..5ce8d14
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeObjectIdentifier: SnmpScalarNode
+ {
+ public SnmpScalarNodeObjectIdentifier(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ this.DataType = SnmpDataType.ObjectIdentifier;
+ }
+
+ protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName)
+ {
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName, LwipDefs.Vt_U32, "*"),
+ "(" + new VariableType(null, LwipDefs.Vt_U32, "*") + ")" + sourceName));
+
+ return true;
+ }
+
+ protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName)
+ {
+ container.AddElement(new Comment(String.Format("TODO: put requested value to '*{0}' here. '{0}' has to be interpreted as {1}[]", localValueVarName, LwipDefs.Vt_U32), singleLine: true));
+ container.AddElement(EmptyLine.SingleLine);
+ container.AddCode(String.Format("{0} = 0; // TODO: return real value length here (should be 'numOfElements * sizeof({1})')", retLenVarName, LwipDefs.Vt_U32));
+ }
+
+ protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ VariableDeclaration objIdLenVar = new VariableDeclaration(
+ new VariableType(localValueVarName + "_len", LwipDefs.Vt_U8),
+ String.Format("{0} / sizeof({1})", lenVarName, LwipDefs.Vt_U32));
+ lenVarUsed = true;
+
+ container.Declarations.Add(objIdLenVar);
+
+ base.GenerateTestMethodCodeCore(container, localValueVarName, ref localValueVarUsed, lenVarName, ref lenVarUsed, retErrVarName);
+
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", objIdLenVar.Type.Name));
+ }
+
+ protected override void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ VariableDeclaration objIdLenVar = new VariableDeclaration(
+ new VariableType(localValueVarName + "_len", LwipDefs.Vt_U8),
+ String.Format("{0} / sizeof({1})", lenVarName, LwipDefs.Vt_U32));
+ lenVarUsed = true;
+
+ container.Declarations.Add(objIdLenVar);
+
+ base.GenerateSetMethodCodeCore(container, localValueVarName, ref localValueVarUsed, lenVarName, ref lenVarUsed, retErrVarName);
+
+ container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", objIdLenVar.Type.Name));
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs
new file mode 100644
index 0000000..bf10f9a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeOctetString : SnmpScalarNode
+ {
+ public SnmpScalarNodeOctetString(SnmpDataType dataType, SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ System.Diagnostics.Debug.Assert(
+ (dataType == SnmpDataType.OctetString) ||
+ (dataType == SnmpDataType.Opaque) ||
+ (dataType == SnmpDataType.IpAddress));
+
+ this.DataType = dataType;
+ }
+
+ protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName)
+ {
+ if (this.Restrictions.Count > 0)
+ {
+ StringBuilder ifCond = new StringBuilder();
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ ifCond.Append(restriction.GetCheckCodeValid(retLenVarName));
+ ifCond.Append(" || ");
+ }
+
+ ifCond.Length -= 4;
+ container.AddElement(new Comment("TODO: take care of len restrictions defined in MIB: " + ifCond, singleLine: true));
+ }
+ base.GenerateGetMethodCodeCore(container, localValueVarName, ref localValueVarUsed, retLenVarName);
+ }
+
+ protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0);
+
+ // checks refer to length of octet string
+ StringBuilder ifCond = new StringBuilder();
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ ifCond.Append(restriction.GetCheckCodeValid(lenVarName));
+ ifCond.Append(" || ");
+
+ lenVarUsed = true;
+ }
+
+ ifCond.Length -= 4;
+
+ IfThenElse ite = new IfThenElse(ifCond.ToString());
+ ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok));
+ container.AddElement(ite);
+ }
+
+ public override int OidRepresentationLen
+ {
+ get
+ {
+ // check restrictions if we are set to one fixed length
+ if ((this.Restrictions != null) && (this.Restrictions.Count > 0))
+ {
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ if (restriction is IsInRangeRestriction)
+ {
+ if ((restriction as IsInRangeRestriction).RangeStart == (restriction as IsInRangeRestriction).RangeEnd)
+ {
+ return (int)(restriction as IsInRangeRestriction).RangeStart;
+ }
+ }
+ else if (restriction is IsEqualRestriction)
+ {
+ return (int)(restriction as IsEqualRestriction).Value;
+ }
+ }
+ }
+
+ return -1; // variable length
+ }
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs
new file mode 100644
index 0000000..0f55752
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeTruthValue : SnmpScalarNodeInt
+ {
+ public SnmpScalarNodeTruthValue(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ }
+
+ protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName)
+ {
+ container.AddCodeFormat("snmp_encode_truthvalue({0}, /* TODO: put requested bool value here */ 0);", localValueVarName);
+ localValueVarUsed = true;
+
+ container.AddCode(String.Format("{0} = {1};",
+ retLenVarName,
+ (!String.IsNullOrWhiteSpace(this.FixedValueLength)) ? this.FixedValueLength : "0"));
+ }
+
+ protected override void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ VariableType truthVar = new VariableType("bool_value", LwipDefs.Vt_U8);
+ container.Declarations.Add(new VariableDeclaration(truthVar));
+
+ container.AddCodeFormat("snmp_decode_truthvalue({0}, &{1});", localValueVarName, truthVar.Name);
+ localValueVarUsed = true;
+
+ container.AddElement(new Comment(String.Format("TODO: store new value contained in '{0}' here", truthVar.Name), singleLine: true));
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs
new file mode 100644
index 0000000..edc161a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpScalarNodeUint : SnmpScalarNode
+ {
+ public SnmpScalarNodeUint(SnmpDataType dataType, SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ System.Diagnostics.Debug.Assert(
+ (dataType == SnmpDataType.Counter) ||
+ (dataType == SnmpDataType.Gauge) ||
+ (dataType == SnmpDataType.TimeTicks));
+
+ this.DataType = dataType;
+ }
+
+ protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName)
+ {
+ System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0);
+
+ StringBuilder ifCond = new StringBuilder();
+ foreach (IRestriction restriction in this.Restrictions)
+ {
+ ifCond.Append(restriction.GetCheckCodeValid("*" + localValueVarName));
+ ifCond.Append(" || ");
+
+ localValueVarUsed = true;
+ }
+
+ ifCond.Length -= 4;
+
+ IfThenElse ite = new IfThenElse(ifCond.ToString());
+ ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok));
+ container.AddElement(ite);
+ }
+
+ protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName)
+ {
+ container.AddDeclaration(new VariableDeclaration(
+ new VariableType(variableName, LwipDefs.Vt_U32, "*"),
+ "(" + new VariableType(null, LwipDefs.Vt_U32, "*") + ")" + sourceName));
+
+ return true;
+ }
+
+ public override string FixedValueLength
+ {
+ get { return String.Format("sizeof({0})", LwipDefs.Vt_U32); }
+ }
+
+ public override int OidRepresentationLen
+ {
+ get { return 1; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs
new file mode 100644
index 0000000..13a3bf2
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs
@@ -0,0 +1,332 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpTableNode: SnmpScalarAggregationNode
+ {
+ private readonly List<SnmpScalarNode> cellNodes = new List<SnmpScalarNode>();
+ private readonly List<SnmpScalarNode> indexNodes = new List<SnmpScalarNode>();
+ private string augmentedTableRow = null;
+
+
+ public SnmpTableNode(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ }
+
+ public List<SnmpScalarNode> CellNodes
+ {
+ get { return cellNodes; }
+ }
+
+ public List<SnmpScalarNode> IndexNodes
+ {
+ get { return indexNodes; }
+ }
+
+ public string AugmentedTableRow
+ {
+ get { return this.augmentedTableRow; }
+ set { this.augmentedTableRow = value; }
+ }
+
+ public override string FullNodeName
+ {
+ get
+ {
+ string result = this.Name.ToLowerInvariant();
+ if (!result.Contains("table"))
+ {
+ result += "_table";
+ }
+
+ return result;
+ }
+ }
+
+ protected override IEnumerable<SnmpScalarNode> AggregatedScalarNodes
+ {
+ get { return this.cellNodes; }
+ }
+
+ public override void GenerateCode(MibCFile mibFile)
+ {
+ FunctionDeclaration getInstanceMethodDecl = new FunctionDeclaration(this.FullNodeName + LwipDefs.FnctSuffix_GetInstance, isStatic: true);
+ getInstanceMethodDecl.Parameter.Add(new VariableType("column", LwipDefs.Vt_U32, "*", ConstType.Value));
+ getInstanceMethodDecl.Parameter.Add(new VariableType("row_oid", LwipDefs.Vt_U32, "*", ConstType.Value));
+ getInstanceMethodDecl.Parameter.Add(new VariableType("row_oid_len", LwipDefs.Vt_U8, ""));
+ getInstanceMethodDecl.Parameter.Add(new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*"));
+ getInstanceMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+ mibFile.Declarations.Add(getInstanceMethodDecl);
+
+ Function getInstanceMethod = Function.FromDeclaration(getInstanceMethodDecl);
+ GenerateGetInstanceMethodCode(getInstanceMethod);
+ mibFile.Implementation.Add(getInstanceMethod);
+
+
+ FunctionDeclaration getNextInstanceMethodDecl = new FunctionDeclaration(this.FullNodeName + LwipDefs.FnctSuffix_GetNextInstance, isStatic: true);
+ getNextInstanceMethodDecl.Parameter.Add(new VariableType("column", LwipDefs.Vt_U32, "*", ConstType.Value));
+ getNextInstanceMethodDecl.Parameter.Add(new VariableType("row_oid", LwipDefs.Vt_StObjectId, "*"));
+ getNextInstanceMethodDecl.Parameter.Add(new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*"));
+ getNextInstanceMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
+ mibFile.Declarations.Add(getNextInstanceMethodDecl);
+
+ Function getNextInstanceMethod = Function.FromDeclaration(getNextInstanceMethodDecl);
+ GenerateGetNextInstanceMethodCode(getNextInstanceMethod);
+ mibFile.Implementation.Add(getNextInstanceMethod);
+
+
+ VariableType instanceType = new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*");
+ GenerateAggregatedCode(
+ mibFile,
+ instanceType,
+ String.Format("SNMP_TABLE_GET_COLUMN_FROM_OID({0}->instance_oid.id)", instanceType.Name));
+
+
+ #region create and add column/table definitions
+
+ StringBuilder colDefs = new StringBuilder();
+ foreach (SnmpScalarNode colNode in this.cellNodes)
+ {
+ colDefs.AppendFormat(" {{{0}, {1}, {2}}}, /* {3} */ \n",
+ colNode.Oid,
+ LwipDefs.GetAsn1DefForSnmpDataType(colNode.DataType),
+ LwipDefs.GetLwipDefForSnmpAccessMode(colNode.AccessMode),
+ colNode.Name);
+ }
+ if (colDefs.Length > 0)
+ {
+ colDefs.Length--;
+ }
+
+ VariableDeclaration colDefsDecl = new VariableDeclaration(
+ new VariableType(this.FullNodeName + "_columns", LwipDefs.Vt_StTableColumnDef, null, ConstType.Value, String.Empty),
+ "{\n" + colDefs + "\n}",
+ isStatic: true);
+
+ mibFile.Declarations.Add(colDefsDecl);
+
+ string nodeInitialization = String.Format("SNMP_TABLE_CREATE({0}, {1}, {2}, {3}, {4}, {5}, {6})",
+ this.Oid,
+ colDefsDecl.Type.Name,
+ getInstanceMethodDecl.Name, getNextInstanceMethodDecl.Name,
+ (this.GetMethodRequired) ? this.GetMethodName : LwipDefs.Null,
+ (this.TestMethodRequired) ? this.TestMethodName : LwipDefs.Null,
+ (this.SetMethodRequired) ? this.SetMethodName : LwipDefs.Null
+ );
+
+ mibFile.Declarations.Add(new VariableDeclaration(
+ new VariableType(this.FullNodeName, LwipDefs.Vt_StTableNode, null, ConstType.Value),
+ nodeInitialization,
+ isStatic: true));
+
+ #endregion
+ }
+
+ protected virtual void GenerateGetInstanceMethodCode(Function getInstanceMethod)
+ {
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)getInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance);
+ returnValue.Type.Name = "err";
+ getInstanceMethod.Declarations.Add(returnValue);
+
+ int instanceOidLength = 0;
+ StringBuilder indexColumns = new StringBuilder();
+ foreach (SnmpScalarNode indexNode in this.indexNodes)
+ {
+ if (instanceOidLength >= 0)
+ {
+ if (indexNode.OidRepresentationLen >= 0)
+ {
+ instanceOidLength += indexNode.OidRepresentationLen;
+ }
+ else
+ {
+ // at least one index column has a variable length -> we cannot perform a static check
+ instanceOidLength = -1;
+ }
+ }
+
+ indexColumns.AppendFormat(
+ " {0} ({1}, OID length = {2})\n",
+ indexNode.Name,
+ indexNode.DataType,
+ (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable");
+ }
+ if (indexColumns.Length > 0)
+ {
+ indexColumns.Length--;
+
+ getInstanceMethod.Declarations.Insert(0, new Comment(String.Format(
+ "The instance OID of this table consists of following (index) column(s):\n{0}",
+ indexColumns)));
+ }
+
+ string augmentsHint = "";
+ if (!String.IsNullOrWhiteSpace(this.augmentedTableRow))
+ {
+ augmentsHint = String.Format(
+ "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" +
+ "You may simply call the '*{1}' method of this table.\n\n",
+ (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow,
+ LwipDefs.FnctSuffix_GetInstance);
+ }
+
+ CodeContainerBase ccb = getInstanceMethod;
+ if (instanceOidLength > 0)
+ {
+ IfThenElse ite = new IfThenElse(String.Format("{0} == {1}", getInstanceMethod.Parameter[2].Name, instanceOidLength));
+ getInstanceMethod.AddElement(ite);
+ ccb = ite;
+ }
+
+ ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[0].Name);
+ ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[1].Name);
+ if (instanceOidLength <= 0)
+ {
+ ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[2].Name);
+ }
+ ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[3].Name);
+
+ ccb.AddElement(new Comment(String.Format(
+ "TODO: check if '{0}'/'{1}' params contain a valid instance oid for a row\n" +
+ "If so, set '{2} = {3};'\n\n" +
+ "snmp_oid_* methods may be used for easier processing of oid\n\n" +
+ "{4}" +
+ "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" +
+ "you may store an arbitrary value (like a pointer to target value object) in '{5}->reference'/'{5}->reference_len'.\n" +
+ "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" +
+ "You also may replace function pointers in '{5}' param for get/test/set methods which contain the default values from table definition,\n" +
+ "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.",
+ getInstanceMethod.Parameter[1].Name,
+ getInstanceMethod.Parameter[2].Name,
+ returnValue.Type.Name,
+ LwipDefs.Def_ErrorCode_Ok,
+ augmentsHint,
+ getInstanceMethod.Parameter[3].Name
+ )));
+
+ getInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+ }
+
+ protected virtual void GenerateGetNextInstanceMethodCode(Function getNextInstanceMethod)
+ {
+ getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[0].Name);
+ getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[1].Name);
+ getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[2].Name);
+
+ VariableDeclaration returnValue = new VariableDeclaration((VariableType)getNextInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance);
+ returnValue.Type.Name = "err";
+ getNextInstanceMethod.Declarations.Add(returnValue);
+
+ StringBuilder indexColumns = new StringBuilder();
+ foreach (SnmpScalarNode indexNode in this.indexNodes)
+ {
+ indexColumns.AppendFormat(
+ " {0} ({1}, OID length = {2})\n",
+ indexNode.Name,
+ indexNode.DataType,
+ (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable");
+ }
+ if (indexColumns.Length > 0)
+ {
+ indexColumns.Length--;
+
+ getNextInstanceMethod.Declarations.Insert(0, new Comment(String.Format(
+ "The instance OID of this table consists of following (index) column(s):\n{0}",
+ indexColumns)));
+ }
+
+ string augmentsHint = "";
+ if (!String.IsNullOrWhiteSpace(this.augmentedTableRow))
+ {
+ augmentsHint = String.Format(
+ "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" +
+ "You may simply call the '*{1}' method of this table.\n\n",
+ (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow,
+ LwipDefs.FnctSuffix_GetNextInstance);
+ }
+
+ getNextInstanceMethod.AddElement(new Comment(String.Format(
+ "TODO: analyze '{0}->id'/'{0}->len' and return the subsequent row instance\n" +
+ "Be aware that '{0}->id'/'{0}->len' must not point to a valid instance or have correct instance length.\n" +
+ "If '{0}->len' is 0, return the first instance. If '{0}->len' is longer than expected, cut superfluous OID parts.\n" +
+ "If a valid next instance is found, store it in '{0}->id'/'{0}->len' and set '{1} = {2};'\n\n" +
+ "snmp_oid_* methods may be used for easier processing of oid\n\n" +
+ "{3}" +
+ "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" +
+ "you may store an arbitrary value (like a pointer to target value object) in '{4}->reference'/'{4}->reference_len'.\n" +
+ "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" +
+ "You also may replace function pointers in '{4}' param for get/test/set methods which contain the default values from table definition,\n" +
+ "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.",
+ getNextInstanceMethod.Parameter[1].Name,
+ returnValue.Type.Name,
+ LwipDefs.Def_ErrorCode_Ok,
+ augmentsHint,
+ getNextInstanceMethod.Parameter[2].Name
+ )));
+
+ getNextInstanceMethod.AddElement(new Comment(String.Format(
+ "For easier processing and getting the next instance, you may use the 'snmp_next_oid_*' enumerator.\n" +
+ "Simply pass all known instance OID's to it and it returns the next valid one:\n\n" +
+ "{0} state;\n" +
+ "{1} result_buf;\n" +
+ "snmp_next_oid_init(&state, {2}->id, {2}->len, result_buf.id, SNMP_MAX_OBJ_ID_LEN);\n" +
+ "while ({{not all instances passed}}) {{\n" +
+ " {1} test_oid;\n" +
+ " {{fill test_oid to create instance oid for next instance}}\n" +
+ " snmp_next_oid_check(&state, test_oid.id, test_oid.len, {{target_data_ptr}});\n" +
+ "}}\n" +
+ "if(state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {{\n" +
+ " snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n" +
+ " {3}->reference.ptr = state.reference; //==target_data_ptr, for usage in subsequent get/test/set\n" +
+ " {4} = {5};\n" +
+ "}}"
+ ,
+ LwipDefs.Vt_StNextOidState,
+ LwipDefs.Vt_StObjectId,
+ getNextInstanceMethod.Parameter[1].Name,
+ getNextInstanceMethod.Parameter[2].Name,
+ returnValue.Type.Name,
+ LwipDefs.Def_ErrorCode_Ok
+ )));
+
+ getNextInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name);
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs
new file mode 100644
index 0000000..bf0c604
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using CCodeGeneration;
+
+namespace LwipSnmpCodeGeneration
+{
+ public class SnmpTreeNode: SnmpScalarAggregationNode
+ {
+ private readonly List<SnmpNode> childNodes = new List<SnmpNode>();
+ private readonly List<SnmpScalarNode> childScalarNodes = new List<SnmpScalarNode>();
+ private string fullOid = "";
+
+ public SnmpTreeNode(SnmpTreeNode parentNode)
+ : base(parentNode)
+ {
+ }
+
+ public override string FullNodeName
+ {
+ get { return this.Name.ToLowerInvariant() + "_treenode"; }
+ }
+
+ public string FullOid
+ {
+ get { return this.fullOid; }
+ set { this.fullOid = value; }
+ }
+
+ public List<SnmpNode> ChildNodes
+ {
+ get { return this.childNodes; }
+ }
+
+ protected override IEnumerable<SnmpScalarNode> AggregatedScalarNodes
+ {
+ get { return this.childScalarNodes; }
+ }
+
+ private void GenerateAggregatedCode(MibCFile mibFile, bool generateDeclarations, bool generateImplementations)
+ {
+ VariableType instanceType = new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*");
+ base.GenerateAggregatedCode(
+ mibFile,
+ instanceType,
+ String.Format("{0}->node->oid", instanceType.Name),
+ generateDeclarations,
+ generateImplementations);
+ }
+
+ private void GenerateAggregateMethodDeclarations(MibCFile mibFile)
+ {
+ if (LwipOpts.GenerateSingleAccessMethodsForTreeNodeScalars && (this.childScalarNodes.Count > 1))
+ {
+ GenerateAggregatedCode(mibFile, true, false);
+ }
+ }
+
+ public override void GenerateCode(MibCFile mibFile)
+ {
+ string nodeInitialization;
+
+ if (LwipOpts.GenerateSingleAccessMethodsForTreeNodeScalars && (this.childScalarNodes.Count > 1))
+ {
+ GenerateAggregatedCode(mibFile, false, true);
+ }
+
+ // create and add node declaration
+ if (this.childNodes.Count > 0)
+ {
+ StringBuilder subnodeArrayInitialization = new StringBuilder();
+
+ for (int i=0; i<this.childNodes.Count; i++)
+ {
+ subnodeArrayInitialization.Append(" &");
+ subnodeArrayInitialization.Append(this.childNodes[i].FullNodeName);
+ subnodeArrayInitialization.Append(".node");
+ if (!(this.childNodes[i] is SnmpTreeNode))
+ {
+ subnodeArrayInitialization.Append(".node");
+ }
+
+ if (i < (this.childNodes.Count - 1))
+ {
+ subnodeArrayInitialization.Append(",\n");
+ }
+ }
+
+ VariableDeclaration subnodeArray = new VariableDeclaration(
+ new VariableType(this.Name.ToLowerInvariant() + "_subnodes", LwipDefs.Vt_StNode, "*", ConstType.Both, String.Empty),
+ "{\n" + subnodeArrayInitialization + "\n}",
+ isStatic: true);
+
+ mibFile.Declarations.Add(subnodeArray);
+
+ nodeInitialization = String.Format("SNMP_CREATE_TREE_NODE({0}, {1})", this.Oid, subnodeArray.Type.Name);
+ }
+ else
+ {
+ nodeInitialization = String.Format("SNMP_CREATE_EMPTY_TREE_NODE({0})", this.Oid);
+ }
+
+ mibFile.Declarations.Add(new VariableDeclaration(
+ new VariableType(this.FullNodeName, LwipDefs.Vt_StTreeNode, null, ConstType.Value),
+ nodeInitialization,
+ isStatic: true));
+ }
+
+ public override void Analyze()
+ {
+ this.childScalarNodes.Clear();
+
+ // delegate analyze (don't use enumerator because the child node may change our child collection by e.g. removing or replacing itself)
+ for (int i=this.ChildNodes.Count-1; i>=0; i--)
+ {
+ this.ChildNodes[i].Analyze();
+ }
+
+ // collect scalar nodes
+ foreach (SnmpNode childNode in this.childNodes)
+ {
+ SnmpScalarNode scalarNode = childNode as SnmpScalarNode;
+ if (scalarNode != null)
+ {
+ this.childScalarNodes.Add(scalarNode);
+ }
+ }
+
+ base.Analyze();
+
+ // check if we can merge this node to a scalar array node (all childs need to be scalars)
+ if (this.childNodes.Count > 0)
+ {
+ if (LwipOpts.GenerateScalarArrays && (this.childScalarNodes.Count == this.childNodes.Count) && (this.ParentNode != null))
+ {
+ SnmpScalarArrayNode scalarArrayNode = new SnmpScalarArrayNode(this.childScalarNodes, this.ParentNode);
+ scalarArrayNode.Oid = this.Oid;
+ scalarArrayNode.Name = this.Name;
+ scalarArrayNode.Analyze();
+
+ for (int i=0; i<this.ParentNode.ChildNodes.Count; i++)
+ {
+ if (this.ParentNode.ChildNodes[i] == this)
+ {
+ this.ParentNode.ChildNodes.RemoveAt(i);
+ this.ParentNode.ChildNodes.Insert(i, scalarArrayNode);
+ break;
+ }
+ }
+ }
+ else if (LwipOpts.GenerateSingleAccessMethodsForTreeNodeScalars && (this.childScalarNodes.Count > 1))
+ {
+ foreach (SnmpScalarNode scalarNode in this.childScalarNodes)
+ {
+ scalarNode.UseExternalMethods = true;
+ scalarNode.ExternalGetMethod = this.GetMethodName;
+ scalarNode.ExternalTestMethod = this.TestMethodName;
+ scalarNode.ExternalSetMethod = this.SetMethodName;
+ }
+ }
+ }
+ else // if (this.childNodes.Count == 0)
+ {
+ if (!LwipOpts.GenerateEmptyFolders && (this.ParentNode != null))
+ {
+ // do not generate this empty folder because it only waste (static) memory
+ for (int i=0; i<this.ParentNode.ChildNodes.Count; i++)
+ {
+ if (this.ParentNode.ChildNodes[i] == this)
+ {
+ this.ParentNode.ChildNodes.RemoveAt(i);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public override void Generate(MibCFile generatedFile, MibHeaderFile generatedHeaderFile)
+ {
+ // generate code of child nodes
+ foreach (SnmpNode childNode in this.childNodes)
+ {
+ if (childNode is SnmpTreeNode)
+ {
+ childNode.Generate(generatedFile, generatedHeaderFile);
+ }
+ }
+
+ Comment dividerComment = new Comment(
+ String.Format("--- {0} {1} -----------------------------------------------------", this.Name, this.fullOid),
+ singleLine: true);
+
+ generatedFile.Declarations.Add(dividerComment);
+ generatedFile.Implementation.Add(dividerComment);
+
+ this.GenerateAggregateMethodDeclarations(generatedFile);
+
+ foreach (SnmpNode childNode in this.childNodes)
+ {
+ if (!(childNode is SnmpTreeNode))
+ {
+ childNode.Generate(generatedFile, generatedHeaderFile);
+ }
+ }
+
+ base.Generate(generatedFile, generatedHeaderFile);
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/FormMain.Designer.cs b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.Designer.cs
new file mode 100644
index 0000000..dcd19aa
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.Designer.cs
@@ -0,0 +1,166 @@
+namespace LwipMibViewer
+{
+ partial class FormMain
+ {
+ /// <summary>
+ /// Erforderliche Designervariable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Verwendete Ressourcen bereinigen.
+ /// </summary>
+ /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Vom Windows Form-Designer generierter Code
+
+ /// <summary>
+ /// Erforderliche Methode für die Designerunterstützung.
+ /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
+ this.treeMib = new System.Windows.Forms.TreeView();
+ this.imagelistTreeNodeImages = new System.Windows.Forms.ImageList(this.components);
+ this.splitContainerMain = new System.Windows.Forms.SplitContainer();
+ this.listviewNodeDetails = new System.Windows.Forms.ListView();
+ this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.toolStripMain = new System.Windows.Forms.ToolStrip();
+ this.toolbuttonOpenMib = new System.Windows.Forms.ToolStripButton();
+ this.dialogOpenMib = new System.Windows.Forms.OpenFileDialog();
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).BeginInit();
+ this.splitContainerMain.Panel1.SuspendLayout();
+ this.splitContainerMain.Panel2.SuspendLayout();
+ this.splitContainerMain.SuspendLayout();
+ this.toolStripMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // treeMib
+ //
+ this.treeMib.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.treeMib.ImageIndex = 0;
+ this.treeMib.ImageList = this.imagelistTreeNodeImages;
+ this.treeMib.Location = new System.Drawing.Point(0, 0);
+ this.treeMib.Name = "treeMib";
+ this.treeMib.SelectedImageIndex = 0;
+ this.treeMib.Size = new System.Drawing.Size(1028, 418);
+ this.treeMib.TabIndex = 0;
+ this.treeMib.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMib_AfterSelect);
+ //
+ // imagelistTreeNodeImages
+ //
+ this.imagelistTreeNodeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagelistTreeNodeImages.ImageStream")));
+ this.imagelistTreeNodeImages.TransparentColor = System.Drawing.Color.Transparent;
+ this.imagelistTreeNodeImages.Images.SetKeyName(0, "ntimgContainer");
+ this.imagelistTreeNodeImages.Images.SetKeyName(1, "ntimgTable");
+ this.imagelistTreeNodeImages.Images.SetKeyName(2, "ntimgRow");
+ this.imagelistTreeNodeImages.Images.SetKeyName(3, "ntimgColumn");
+ this.imagelistTreeNodeImages.Images.SetKeyName(4, "ntimgScalar");
+ this.imagelistTreeNodeImages.Images.SetKeyName(5, "ntimgUnknown");
+ //
+ // splitContainerMain
+ //
+ this.splitContainerMain.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.splitContainerMain.Location = new System.Drawing.Point(0, 25);
+ this.splitContainerMain.Name = "splitContainerMain";
+ this.splitContainerMain.Orientation = System.Windows.Forms.Orientation.Horizontal;
+ //
+ // splitContainerMain.Panel1
+ //
+ this.splitContainerMain.Panel1.Controls.Add(this.treeMib);
+ //
+ // splitContainerMain.Panel2
+ //
+ this.splitContainerMain.Panel2.Controls.Add(this.listviewNodeDetails);
+ this.splitContainerMain.Size = new System.Drawing.Size(1028, 625);
+ this.splitContainerMain.SplitterDistance = 418;
+ this.splitContainerMain.TabIndex = 1;
+ //
+ // listviewNodeDetails
+ //
+ this.listviewNodeDetails.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.columnHeader1,
+ this.columnHeader2});
+ this.listviewNodeDetails.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.listviewNodeDetails.FullRowSelect = true;
+ this.listviewNodeDetails.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+ this.listviewNodeDetails.Location = new System.Drawing.Point(0, 0);
+ this.listviewNodeDetails.Name = "listviewNodeDetails";
+ this.listviewNodeDetails.Size = new System.Drawing.Size(1028, 203);
+ this.listviewNodeDetails.TabIndex = 0;
+ this.listviewNodeDetails.UseCompatibleStateImageBehavior = false;
+ this.listviewNodeDetails.View = System.Windows.Forms.View.Details;
+ //
+ // columnHeader1
+ //
+ this.columnHeader1.Text = "";
+ this.columnHeader1.Width = 150;
+ //
+ // columnHeader2
+ //
+ this.columnHeader2.Text = "";
+ this.columnHeader2.Width = 777;
+ //
+ // toolStripMain
+ //
+ this.toolStripMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolbuttonOpenMib});
+ this.toolStripMain.Location = new System.Drawing.Point(0, 0);
+ this.toolStripMain.Name = "toolStripMain";
+ this.toolStripMain.Size = new System.Drawing.Size(1028, 25);
+ this.toolStripMain.TabIndex = 2;
+ //
+ // toolbuttonOpenMib
+ //
+ this.toolbuttonOpenMib.Image = ((System.Drawing.Image)(resources.GetObject("toolbuttonOpenMib.Image")));
+ this.toolbuttonOpenMib.Name = "toolbuttonOpenMib";
+ this.toolbuttonOpenMib.Size = new System.Drawing.Size(65, 22);
+ this.toolbuttonOpenMib.Text = "Open...";
+ this.toolbuttonOpenMib.Click += new System.EventHandler(this.toolbuttonOpenMib_Click);
+ //
+ // FormMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1028, 650);
+ this.Controls.Add(this.splitContainerMain);
+ this.Controls.Add(this.toolStripMain);
+ this.Name = "FormMain";
+ this.Text = "MIB Viewer";
+ this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+ this.splitContainerMain.Panel1.ResumeLayout(false);
+ this.splitContainerMain.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).EndInit();
+ this.splitContainerMain.ResumeLayout(false);
+ this.toolStripMain.ResumeLayout(false);
+ this.toolStripMain.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TreeView treeMib;
+ private System.Windows.Forms.SplitContainer splitContainerMain;
+ private System.Windows.Forms.ListView listviewNodeDetails;
+ private System.Windows.Forms.ColumnHeader columnHeader1;
+ private System.Windows.Forms.ColumnHeader columnHeader2;
+ private System.Windows.Forms.ImageList imagelistTreeNodeImages;
+ private System.Windows.Forms.ToolStrip toolStripMain;
+ private System.Windows.Forms.ToolStripButton toolbuttonOpenMib;
+ private System.Windows.Forms.OpenFileDialog dialogOpenMib;
+ }
+}
+
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/FormMain.cs b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.cs
new file mode 100644
index 0000000..7d2490d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.cs
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System.Windows.Forms;
+using Lextm.SharpSnmpLib.Mib;
+using Lextm.SharpSnmpLib.Mib.Elements;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using System.IO;
+
+namespace LwipMibViewer
+{
+ public partial class FormMain : Form
+ {
+ readonly ListViewGroup listviewgroupAbstract;
+ readonly ListViewGroup listviewgroupElement;
+ readonly ListViewGroup listviewgroupBaseType;
+ readonly ListViewGroup listviewgroupTypeChain;
+
+ public FormMain()
+ {
+ this.Font = SystemInformation.MenuFont;
+ InitializeComponent();
+
+ this.listviewgroupAbstract = new ListViewGroup("Abstract", System.Windows.Forms.HorizontalAlignment.Left);
+ this.listviewgroupElement = new ListViewGroup("Element Properties", System.Windows.Forms.HorizontalAlignment.Left);
+ this.listviewgroupBaseType = new ListViewGroup("Element Base Type", System.Windows.Forms.HorizontalAlignment.Left);
+ this.listviewgroupTypeChain = new ListViewGroup("Element Type Chain", System.Windows.Forms.HorizontalAlignment.Left);
+ this.listviewNodeDetails.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+ listviewgroupAbstract,
+ listviewgroupElement,
+ listviewgroupBaseType,
+ listviewgroupTypeChain});
+
+ try
+ {
+ DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(Application.ExecutablePath));
+ if (dirInfo != null)
+ {
+ dirInfo = dirInfo.Parent;
+ if (dirInfo != null)
+ {
+ dirInfo = dirInfo.Parent;
+ if (dirInfo != null)
+ {
+ dirInfo = new DirectoryInfo(Path.Combine(dirInfo.FullName, "Mibs"));
+ if (dirInfo.Exists)
+ {
+ MibTypesResolver.RegisterResolver(new FileSystemMibResolver(dirInfo.FullName, true));
+ }
+ }
+ }
+ }
+ }
+ catch
+ { }
+ }
+
+ #region GUI Event Handler
+
+ private void toolbuttonOpenMib_Click(object sender, System.EventArgs e)
+ {
+ if (this.dialogOpenMib.ShowDialog() == DialogResult.OK)
+ {
+ OpenMib(this.dialogOpenMib.FileName);
+ }
+ }
+
+ private void treeMib_AfterSelect(object sender, TreeViewEventArgs e)
+ {
+ listviewNodeDetails.Items.Clear();
+
+ if (e.Node != null)
+ {
+ MibTreeNode mtn = e.Node.Tag as MibTreeNode;
+ if (mtn != null)
+ {
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Abstract", mtn.NodeType.ToString() }, this.listviewgroupAbstract));
+
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Module", (mtn.Entity.Module != null) ? mtn.Entity.Module.Name : "" }, this.listviewgroupElement));
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Type", mtn.Entity.GetType().Name }, this.listviewgroupElement));
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Name", mtn.Entity.Name }, this.listviewgroupElement));
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Description", mtn.Entity.Description }, this.listviewgroupElement));
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "OID", mtn.Entity.Value.ToString() }, this.listviewgroupElement));
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Full OID", MibTypesResolver.ResolveOid(mtn.Entity).GetOidString() }, this.listviewgroupElement));
+ if (mtn.Entity is ObjectType)
+ {
+ listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Access", (mtn.Entity as ObjectType).Access.ToString() }, this.listviewgroupElement));
+ }
+
+ ITypeReferrer tr = mtn.Entity as ITypeReferrer;
+ if (tr != null)
+ {
+ ShowTypeDetails(listviewNodeDetails, this.listviewgroupBaseType, tr.BaseType);
+ ShowTypeChain(listviewNodeDetails, tr.ReferredType);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Methods
+
+ private void OpenMib(string file)
+ {
+ try
+ {
+ MibDocument md = new MibDocument(file);
+ MibTypesResolver.ResolveTypes(md.Modules[0]);
+
+ this.treeMib.Nodes.Clear();
+ this.listviewNodeDetails.Items.Clear();
+
+ MibTree mt = new MibTree(md.Modules[0] as MibModule);
+ foreach (MibTreeNode mibTreeNode in mt.Root)
+ {
+ AddNode(mibTreeNode, this.treeMib.Nodes);
+
+ foreach (TreeNode node in this.treeMib.Nodes)
+ {
+ node.Expand();
+ }
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ private void AddNode(MibTreeNode mibNode, TreeNodeCollection parentNodes)
+ {
+ int imgIndex = 5; //unknown
+ if ((mibNode.NodeType & MibTreeNodeType.Table) != 0)
+ {
+ imgIndex = 1;
+ }
+ else if ((mibNode.NodeType & MibTreeNodeType.TableRow) != 0)
+ {
+ imgIndex = 2;
+ }
+ else if ((mibNode.NodeType & MibTreeNodeType.TableCell) != 0)
+ {
+ imgIndex = 3;
+ }
+ else if ((mibNode.NodeType & MibTreeNodeType.Scalar) != 0)
+ {
+ imgIndex = 4;
+ }
+ else if ((mibNode.NodeType & MibTreeNodeType.Container) != 0)
+ {
+ imgIndex = 0;
+ }
+
+ TreeNode newNode = new TreeNode(mibNode.Entity.Name, imgIndex, imgIndex);
+ newNode.Tag = mibNode;
+
+ parentNodes.Add(newNode);
+
+ foreach (MibTreeNode child in mibNode.ChildNodes)
+ {
+ AddNode(child, newNode.Nodes);
+ }
+ }
+
+ private void ShowTypeChain(ListView lv, ITypeAssignment type)
+ {
+ ShowTypeDetails(lv, this.listviewgroupTypeChain, type);
+
+ ITypeReferrer tr = type as ITypeReferrer;
+ if ((tr != null) && (tr.ReferredType != null))
+ {
+ lv.Items.Add(new ListViewItem(new string[] { " >>>", "" }, this.listviewgroupTypeChain));
+ ShowTypeChain(listviewNodeDetails, tr.ReferredType);
+ }
+ }
+
+ private void ShowTypeDetails(ListView lv, ListViewGroup lvg, ITypeAssignment type)
+ {
+ lv.Items.Add(new ListViewItem(new string[] { "Module", (type.Module != null) ? type.Module.Name : "" }, lvg));
+ lv.Items.Add(new ListViewItem(new string[] { "Type", type.GetType().Name }, lvg));
+ lv.Items.Add(new ListViewItem(new string[] { "Name", type.Name }, lvg));
+ }
+
+ #endregion
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/FormMain.resx b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.resx
new file mode 100644
index 0000000..973f546
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/FormMain.resx
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="imagelistTreeNodeImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <data name="imagelistTreeNodeImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo
+ IQAAAk1TRnQBSQFMAgEBBgEAARABAAEQAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ AwABIAMAAQEBAAEgBgABIBIAAwQBBQMWAR4DIgEyAzEBTwJGAUQBhwMvAUsDHgErAxsBJgMYASIDFQEd
+ AxIBGAMNARIDCgENAwcBCQMEAQUDAQECAwQBBQMWAR4DIgEyAzEBTgJGAUQBhwMvAUsDHgErAxsBJgMb
+ ASYDIQExAyEBMAMdASoDGwEmAxgBIQMLAQ8DAQECgAADAgEDAwwBEAMrAUMCRgFEAYIC/wHwAf8CRgFE
+ AYIDKgFAAw8BFAMNAREDCwEPAwkBDAMHAQoDBQEHAwQBBQMCAQMDAAEBAwIBAwMLAQ8DKwFDAkYBRAGC
+ Av8B8AH/AkYBRAGCAyoBQAMOARMDEgEZAT0COwFpAVwBRQFCAawBZwE+AToBxAFaAUUBQwGqATwBOwE6
+ AWYDEAEWAwABAYQAAx4BKwJEAUIBewL/AfAB/wLpAdoD/wHxAf8CRAFCAXsDHgErJAADHgErAkQBQgF7
+ Av8B8AH/AukB2gP/AfEB/wJEAUIBewMeASsBLgItAUcBdwFHATwByQG7AVQBPQHxA+4B/wG7AVMBPAHx
+ AXcBRgE8AckBLgItAUeEAAMdASoCRAFCAXcC/wHwAf8B6wHdAbEB/wH3AcEBNwH/Ae0B3wGzA/8B8gH/
+ AkQBQgF3Ax0BKhwAAx0BKgJEAUIBdwL/AfAB/wLpAdoB/wLqAdwB/wLrAd4D/wHyAf8CRAFCAXcBZAFJ
+ AUIBrwG2AVkBQQHxAc0BVAEyAf8BvQF5AWIB/wHFAVABLgH/AbEBUQE1AfEBXAFIAUQBn4QAAkMBQQF2
+ Av8B8AH/AukB2gH/AecBqwEhAf8B5wGrASEB/wHnAasBIQH/AeoB2wGwA/8B9AH/AkMBQQF2Ax0BKhgA
+ AkMBQQF2Av8B8AH/AukB2gH/AuoB3AH/AusB3gH/AuwB3wH/Au0B4QP/AfQB/wGAAUQBMQHaAc4BcAFN
+ AfwBugFMASoB/wPSAf8BvgGLAXgB/wG7AVIBMgH8AW8BSQE/AbqEAAMdASkCQwFBAXQC/wHxAf8B5wHX
+ AasB/wHXAZYBDAH/AdcBlgEMAf8B1wGWAQwB/wHoAdgBrgP/AfUB/wJDAUEBdAMdASkUAAMdASkCQwFB
+ AXQC/wHxAf8C6wHeAf8C7AHfAf8C7QHhAf8C7gHjAf8C7wHlAf8BzQF5AV4B/wHOAXcBWAH3AbwBVAEy
+ Af8BtAFMASoB/wPmAf8BtwFlAUsB8AFdAUkBRAGdiAADHQEpAkIBQQFyAv8B8gH/AeUB1AGpAf8BzQGJ
+ AQAB/wHNAYkBAAH/Ac0BiQEAAf8B6AHXAa8D/wH3Af8CQgFBAXIDHAEoFAADHQEpAkIBQQFyAv8B8gH/
+ Au0B4QH/Au4B4wH/Au8B5QH/AvAB5wH/AeABuwGqAf8BzgFpAUgB/wHjAcsBwQH5BP8B3gHHAb0B9QF+
+ AU8BQgHEAi0BLAFFjAADHAEoAkEBQAFxAv8B9AH/AecB1gGsAf8B0QGOAQQB/wHRAY4BBAH/AdEBjgEE
+ Af8B7AHbAbMD/wH4Af8CQQFAAXEDHAEoFAADHAEoAkEBQAFxAv8B9AH/Au8B5QH/AvAB5wH/AvEB6QH/
+ AvMB6gH/AeQBvgGsAf8B1AGBAWIB/wGGAUoBNAHXAWYBTQFEAaoCLQEsAUWUAAMcAScCQQFAAW8C/wH1
+ Af8B7AHcAbMB/wHfAaEBFwH/Ad8BoQEXAf8B3wGhARcB/wHxAeIBuwP/AfoB/wJBAUABbwMcAScUAAMc
+ AScCQQFAAW8C/wH1Af8C8QHpAf8C8wHqAf8C9AHsAf8C9QHuAf8C9gHwA/8B+gH/AkEBQAFvAxwBJ5gA
+ AxwBJwJAAT8BbQL/AfcB/wHyAeMBuwH/AfABuAEuAf8B8AG4AS4B/wHwAbgBLgH/AvgB9AP/AfsB/wJA
+ AT8BbQMcAScUAAMcAScCQAE/AW0C/wH3Af8C9AHsAf8C9QHuAf8C9gHwAf8C9wHyAf8C+AH0A/8B+wH/
+ AkABPwFtAxwBJ5gAAxsBJgJAAT8BbAL/AfgB/wH3AeoBwwH/Af0ByQE/Af8B+QHsAccB/wL7AfcB/wL8
+ AfkD/wH8Af8CQAE/AWwDGwEmFAADGwEmAkABPwFsAv8B+AH/AvYB8AH/AvcB8gH/AvgB9AH/AvsB9wH/
+ AvwB+QP/AfwB/wJAAT8BbAMbASaYAAMbASYCPwE+AWsC/wH6Af8C+AH0Af8C+wH3Af8C3wHVAf8CyQG5
+ Af8C4AHWA/8B/gH/Aj8BPgFrGAADGwEmAj8BPgFrAv8B+gH/AvgB9AH/AvsB9wH/At8B1QH/AskBuQH/
+ AuAB1gP/Af4B/wI/AT4Ba5wAAxoBJQI/AT0BaQL/AfsB/wL8AfkB/wK8AawB/wQAArwBrAP/Af4B/wI/
+ AT0BaRwAAxoBJQI/AT0BaQL/AfsB/wL8AfkB/wK8AawB/wQAArwBrAP/Af4B/wI/AT0BaaAAAxoBJQI+
+ AT0BaAL/AfwB/wLLAcEB/wKgAZAB/wLLAcED/wH+Af8CPgE9AWggAAMaASUCPgE9AWgC/wH8Af8CywHB
+ Af8CoAGQAf8CywHBA/8B/gH/Aj4BPQFopAADGgElAj4BPQFnAv8B/gP/Af4D/wH+Bf8CPgE9AWckAAMa
+ ASUCPgE9AWcC/wH+A/8B/gP/Af4F/wI+AT0BZ6gAAxoBJAI+AT0BZgI+AT0BZgI+AT0BZgI+AT0BZgMx
+ AU0oAAMaASQCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYDMQFNlAADIQEwAUABRgFIAXwBQwFOAVIBkgMF
+ AQccAAMHAQkDEAEWAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa
+ AxABFgMHAQkDBwEJAxABFgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa
+ AxMBGgMQARYDBwEJAwcBCQMQARYDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa
+ AxMBGgMTARoDEAEWAwcBCQwAAjIBMwFQAUMBUQFXAZkBRQFkAXQBwAFYAYsBogHgATwBWAFqAcEDEwEa
+ AwUBBxgAAjwBOwFpAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGH
+ AkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAjwBOwFpAjkBNAFpAkABNwGHAkABNwGH
+ AkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGH
+ AkABNwGHAkABNwGHAjkBNAFpAjwBOwFpAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGH
+ AkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAjwBOwFpAw0BEQMa
+ ASQBRAFNAVEBmAE8AYkBrAHyAWcBrwHTAfoBggHLAewB/wGFAc4B7gH/ARUBWwGCAe8BOgFXAWYBxAE6
+ AVcBZgHEAT4BWgFqAb4BPgFaAWoBvgE+AVoBagG+AUQBTQFRAZgDGgEkAw0BEQJGAUMBgQL5AekB/wLz
+ AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz
+ AeIB/wLzAeIB/wL5AekB/wJGAUMBgQJDAToBgQL5AekB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz
+ AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wL5AekB/wJDAToBgQJG
+ AUMBgQL5AekB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz
+ AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wL5AekB/wJGAUMBgQMHAQkDDQESAUIBWwFmAbIBiAHQAe8B/wF9
+ AcoB6QH/AX0BygHpAf8BhwHQAe8B/wEkAXsBqQH/AX0BvAHbAf8BfQG8AdsB/wGNAdEB8wH/AY0B0QHz
+ Af8BkAHUAfUB/wFCAVsBZgGyATACMQFNAwcBCQJEAUMBegL0AeQC/wHMAUIB/wH+AcsBQQH/AewB0gGG
+ Af8C2gHJAf8C2AHHAf8C1gHFAf8C1AHDAf8C0wHCAf8C0QHAAf8CzwG+Af8CzgG9Af8CzQG8Af8C9AHk
+ Af8CRAFDAXoCRgE+AXoC9AHkAv8BzAFDAf8B/gHLAUIB/wHsAdIBhgH/AtoByQH/AtgBxwH/AtYBxQH/
+ AtQBwwH/AtMBwgH/AtEBwAH/As8BvgH/As4BvQH/As0BvAH/AvQB5AH/AkYBPgF6AkQBQwF6AvQB5AL/
+ AcwBQgH/Af4BywFBAf8B7AHSAYYB/wLaAckB/wLYAccB/wHnAWEBPwH/AecBYQE/Af8B5wFhAT8B/wHn
+ AWEBPwH/As8BvgH/As4BvQH/As0BvAH/AvQB5AH/AkQBQwF6CAABQwFXAWABpAGKAdMB8AH/AYIBzQHr
+ Af8BggHNAesB/wGKAdMB8AH/ASQBfAGrAf8BegG5AdgB/wF6AbkB2AH/AYoBzgHwAf8BigHOAfAB/wGP
+ AdMB9AH/AfQBtgEsAf8BQwFXAWABpAQAAkQBQgF3AvUB5gL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C9QHu
+ Af8C9QHuAf8C1gHFAf8C9QHuAf8C9QHuAf8C0QHAAf8C9QHuAf8C9QHuAf8CzQG8Af8C9QHmAf8CRAFC
+ AXcCRwE/AXcC9QHmAv8BzAFDAv8B7gGIAf8B7AHSAYYB/wL1Ae4B/wL1Ae4B/wLWAcUB/wL1Ae4B/wL1
+ Ae4B/wLRAcAB/wL1Ae4B/wL1Ae4B/wLNAbwB/wL1AeYB/wJHAT8BdwJEAUIBdwL1AeYC/wHMAUIC/wHu
+ AYgB/wHsAdIBhgH/AvUB7gH/AvUB7gH/AdkBWAE2Af8B8gHJAbgB/wHyAckBuAH/AdkBWAE2Af8C9QHu
+ Af8C9QHuAf8CzQG8Af8C9QHmAf8CRAFCAXcIAAFDAVUBXgGeAY4B1gHyAf8BhwHQAe0B/wGHAdAB7QH/
+ AY4B1gHyAf8BJgGCAa8B/wF7AboB2AH/AXsBugHYAf8BiwHPAfEB/wGLAc8B8QH/AZEB1QH1Af8B/gHJ
+ AT8B/wFDAVUBXgGeBAACQwFBAXUC9gHpAv8BzAFCAf8B/gHLAUEB/wHsAdIBhgH/AtoByQH/AtgBxwH/
+ AtwBzAH/AtQBwwH/AtMBwgH/AtgByAH/As8BvgH/As4BvQH/As0BvAH/AvYB6QH/AkMBQQF1AkcBPwF1
+ AvYB6QL/AcwBQwH/Af4BywFCAf8B7AHSAYYB/wLaAckB/wLYAccB/wLcAcwB/wLUAcMB/wLTAcIB/wLY
+ AcgB/wLPAb4B/wLOAb0B/wLNAbwB/wL2AekB/wJHAT8BdQJDAUEBdQL2AekC/wHMAUIB/wH+AcsBQQH/
+ AewB0gGGAf8C2gHJAf8C2AHHAf8ByAFPAS0B/wHeAbYBngH/Ad4BtQGdAf8ByAFPAS0B/wLPAb4B/wLO
+ Ab0B/wLNAbwB/wL2AekB/wJDAUEBdQgAAUQBVQFdAZsBkgHaAfQB/wGLAdQB8AH/AYsB1AHwAf8BkgHa
+ AfQB/wEpAYUBswH/AX0BvAHaAf8BfQG8AdoB/wGNAdEB8wH/AY0B0QHzAf8BkwHXAfYB/wLrAd0B/wFE
+ AVUBXQGbBAACQgFBAXMC9wHrAv8BzAFCAv8B7gGIAf8B7AHSAYYB/wL3AfEB/wL3AfEB/wLWAcUB/wL3
+ AfEB/wL3AfEB/wLRAcAB/wL3AfEB/wL3AfEB/wLNAbwB/wL3AesB/wJCAUEBcwJHAT8BcwL3AesC/wHM
+ AUMC/wHuAYgB/wHsAdIBhgH/AvcB8QH/AvcB8QH/AtYBxQH/AvcB8QH/AvcB8QH/AtEBwAH/AvcB8QH/
+ AvcB8QH/As0BvAH/AvcB6wH/AkcBPwFzAkIBQQFzAvcB6wL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C9wHx
+ Af8C9wHxAf8BuAFHASUB/wHzAcsBuQH/AfMBywG5Af8BuAFHASUB/wL3AfEB/wL3AfEB/wLNAbwB/wL3
+ AesB/wJCAUEBcwgAAUQBUwFbApcB3gH2Af8BkAHYAfIB/wGQAdgB8gH/AZcB3gH2Af8BKwGJAbcB/wGA
+ Ab0B3AH/AYABvQHcAf8BjwHTAfUB/wGPAdMB9QH/AZUB2QH4Af8C9QHuAf8BRAFTAVsBlwQAAkIBQQFy
+ AvgB7gL/AcwBQgH/Af4BywFBAf8B7AHSAYYB/wLaAckB/wLYAccB/wLdAc4B/wLUAcMB/wLTAcIB/wLZ
+ AcoB/wLPAb4B/wLOAb0B/wLNAbwB/wL4Ae4B/wJCAUEBcgJIAUABcgL4Ae4B/wHsAYYBYwH/AeIBewFZ
+ Af8B1AFuAUwB/wHEAWABPgH/AbYBUgEwAf8BrQFHASUB/wGrAUMBIQH/AbEBRAEiAf8BvQFKASgB/wHM
+ AVIBMAH/AdsBWgE4Af8B6AFiAUAB/wL4Ae4B/wJIAUABcgJCAUEBcgL4Ae4C/wHMAUIB/wH+AcsBQQH/
+ AewB0gGGAf8C2gHJAf8C2AHHAf8BrQFCASAB/wHeAbYBngH/Ad4BtQGdAf8BrQFCASAB/wLPAb4B/wLO
+ Ab0B/wLNAbwB/wL4Ae4B/wJCAUEBcggAAUQBUwFaAZQBmwHhAfcB/wGUAdsB9AH/AZQB2wH0Af8BmwHh
+ AfcB/wEuAY0BvAH/AYEBvgHdAf8BgQG+Ad0B/wGQAdQB9gH/AZAB1AH2Af8BlwHbAfkB/wL+Af0B/wFE
+ AVMBWgGUBAACQQFAAXAC+QHxAv8BzAFCAv8B7gGIAf8B7AHSAYYB/wL5AfUB/wL5AfUB/wLWAcUB/wL5
+ AfUB/wL5AfUB/wLRAcAB/wL5AfUB/wL5AfUB/wLNAbwB/wL5AfEB/wJBAUABcAJHAUABcAL5AfEB/wHs
+ AYYBYwH/AfgBxQF5Af8B7QG1AXgB/wH1AcwBvAH/AfUBzAG8Af8B4AG3AZ8B/wH1AcwBvAH/AfUBzAG8
+ Af8B3QG0AZwB/wH1AcwBvAH/AfUBzAG8Af8B6AFiAUAB/wL5AfEB/wJHAUABcAJBAUABcAL5AfEC/wHM
+ AUIC/wHuAYgB/wHsAdIBhgH/AvkB9QH/AvkB9QH/AasBRAEiAf8B9QHMAbwB/wH1AcwBvAH/AasBRAEi
+ Af8C+QH1Af8C+QH1Af8CzQG8Af8C+QHxAf8CQQFAAXAIAAFEAVEBVwGQAZ4B5QH5Af8BmAHfAfYB/wGY
+ Ad8B9gH/AZ4B5QH5Af8BMAGQAcAB/wGDAcAB3wH/AYMBwAHfAf8BkgHWAfgB/wGSAdYB+AH/AZkB3QH6
+ Af8BRAFRAVcBkAMjATMEAAJBAUABbgL7AfQC/wHMAUIB/wH+AcsBQQH/AewB0gGGAf8C2gHJAf8C2AHH
+ Af8C3gHQAf8C1AHDAf8C0wHCAf8C2gHMAf8CzwG+Af8CzgG9Af8CzQG8Af8C+wH0Af8CQQFAAW4CRwFA
+ AW4C+wH0Af8B7AGGAWMB/wHiAXsBWQH/AdQBbgFMAf8BxAFgAT4B/wG2AVIBMAH/Aa0BRwElAf8BqwFD
+ ASEB/wGxAUQBIgH/Ab0BSgEoAf8BzAFSATAB/wHbAVoBOAH/AegBYgFAAf8C+wH0Af8CRwFAAW4CQQFA
+ AW4C+wH0Av8BzAFCAf8B/gHLAUEB/wHsAdIBhgH/AtoByQH/AtgBxwH/AbIBTAEqAf8B3gG2AZ4B/wHe
+ AbUBnQH/AbIBTAEqAf8CzwG+Af8CzgG9Af8CzQG8Af8C+wH0Af8CQQFAAW4IAAFDAU8BVQGNAaMB6AH7
+ Af8BnQHjAfkB/wGdAeMB+QH/AaMB6AH7Af8BMwGUAcUB/wGFAcIB4QH/AYUBwgHhAf8BlAHYAfoB/wGU
+ AdgB+gH/AZsB3wH8Af8BQwFPAVUBjQgAAkABPwFtAvwB9wL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C/AH6
+ Af8C/AH6Af8C1gHFAf8C/AH6Af8C/AH6Af8C0QHAAf8C/AH6Af8C/AH6Af8CzQG8Af8C/AH3Af8CQAE/
+ AW0CRwFAAW0C/AH3Av8BzAFDAv8B7gGIAf8B7AHSAYYB/wL8AfoB/wL8AfoB/wLWAcUB/wL8AfoB/wL8
+ AfoB/wLRAcAB/wL8AfoB/wL8AfoB/wLNAbwB/wL8AfcB/wJHAUABbQJAAT8BbQL8AfcC/wHMAUIC/wHu
+ AYgB/wHsAdIBhgH/AvwB+gH/AvwB+gH/AcABWgE4Af8B9gHOAb8B/wH2Ac4BvwH/AcABWgE4Af8C/AH6
+ Af8C/AH6Af8CzQG8Af8C/AH3Af8CQAE/AW0IAAFDAU8BVAGKAaYB6wH8Af8BoQHmAfsB/wGhAeYB+wH/
+ AaYB6wH8Af8BOgGdAc8B/wGHAcQB4gH/AYcBxAHiAf8BlgHaAfwB/wGWAdoB/AH/AZ4B4gH9Af8BQwFP
+ AVQBiggAAj8BPgFrAv0B+QL/AcwBQgH/Af4BywFBAf8B9QHOAWIB/wHrAdIBhQH/AekB0AGDAf8B5wHO
+ AYEB/wHlAcwBgAH/AeQBywF8Af8B4gHJAXoB/wHgAccBeAH/Ad8BxgF3Af8B3gHFAXYB/wL9AfkB/wI/
+ AT4BawJHAUABawL9AfkC/wHMAUMB/wH+AcsBQgH/AfUBzgFjAf8B6wHSAYUB/wHpAdABgwH/AecBzgGB
+ Af8B5QHMAYAB/wHkAcsBfQH/AeIByQF7Af8B4AHHAXkB/wHfAcYBeAH/Ad4BxQF3Af8C/QH5Af8CRwFA
+ AWsCPwE+AWsC/QH5Av8BzAFCAf8B/gHLAUEB/wH1Ac4BYgH/AesB0gGFAf8B6QHQAYMB/wHRAWoBSAH/
+ AekBsQF0Af8B6AGwAXMB/wHRAWoBSAH/AeABxwF4Af8B3wHGAXcB/wHeAcUBdgH/Av0B+QH/Aj8BPgFr
+ CAABQgFNAVIBhwGpAe4B/QH/AaQB6QH8Af8BpAHpAfwB/wGqAe8B/QH/AUABoQHRAf8BkAHRAfEB/wGW
+ AdoB+wH/AZcB2wH9Af8BlwHbAf0B/wGfAeMB/gH/AUIBTQFSAYcIAAI/AT4BagL+AfwC/wHMAUIC/wHu
+ AYgB/wH9AcoBQAH/AfwB6wGFAf8B+wHqAYQB/wH4AcUBOwH/AfYB5QF9Af8B9AHjAXsB/wHzAcABNgH/
+ AfEB4AF4Af8B7wHeAXYB/wHvAbwBMgH/Av4B/AH/Aj8BPgFqAkcBQAFqAv4B/AL/AcwBQwL/Ae4BiAH/
+ Af0BygFBAf8B/AHrAYUB/wH7AeoBhAH/AfgBxQE8Af8B9gHlAX4B/wH0AeMBfAH/AfMBwAE3Af8B8QHg
+ AXkB/wHvAd4BdwH/Ae8BvAEzAf8C/gH8Af8CRwFAAWoCPwE+AWoC/gH8Av8BzAFCAv8B7gGIAf8B/QHK
+ AUAB/wH8AesBhQH/AfsB6gGEAf8B4QF5AVcB/wHzAcABcwH/AfIBvwFyAf8B4QF5AVcB/wHxAeABeAH/
+ Ae8B3gF2Af8B7wG8ATIB/wL+AfwB/wI/AT4BaggAAUMBTAFSAYUBrQHxAv8BqwHvAf4B/wGVAeIB+AH/
+ AWwByQHtAf8BRgGpAdkB/wGYAdwB/gH/AZgB3AH+Af8BmAHcAf4B/wGYAdwB/gH/AaEB5QL/AUMBTAFS
+ AYUIAAI+AT0BaAL/Af4C/wHMAUIB/wH+AcsBQQH/Af0BygFAAf8B/AHJAT8B/wH6AccBPQH/AfgBxQE7
+ Af8B9gHDAToB/wH1AcIBOAH/AfMBwAE2Af8B8QG+ATQB/wHwAb0BMwH/Ae8BvAEyA/8B/gH/Aj4BPQFo
+ AkcBQAFoAv8B/gL/AcwBQwH/Af4BywFCAf8B/QHKAUEB/wH8AckBQAH/AfoBxwE+Af8B+AHFATwB/wH2
+ AcMBOwH/AfUBwgE5Af8B8wHAATcB/wHxAb4BNQH/AfABvQE0Af8B7wG8ATMD/wH+Af8CRwFAAWgCPgE9
+ AWgC/wH+Av8BzAFCAf8B/gHLAUEB/wH9AcoBQAH/AfwByQE/Af8B+gHHAT0B/wHsAYYBYgH/AewBhgFi
+ Af8B7AGGAWIB/wHsAYYBYgH/AfEBvgE0Af8B8AG9ATMB/wHvAbwBMgP/Af4B/wI+AT0BaAgAAUMBTAFQ
+ AYMBiAHcAfQB/wFeAcAB6QH/AV0BvwHqAf8BgAHTAfQB/wGcAeMB/QH/AaIB5gL/AaIB5gL/AaIB5gL/
+ AaIB5gL/AaYB6gL/AUMBTAFQAYMIAAI+AT0BZzj/Aj4BPQFnAkcBQAFnOP8CRwFAAWcCPgE9AWc4/wI+
+ AT0BZwgAATkBOwE9AWEBQgFLAU8BgQFCAUsBTwGBAUIBSwFPAYEBQgFLAU8BgQFCAUsBTwGBAUIBSwFP
+ AYEBQgFLAU8BgQFCAUsBTwGBAUIBSwFPAYEBQgFLAU8BgQE5ATsBPQFhCAADMQFNAj4BPQFmAj4BPQFm
+ Aj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFm
+ Aj4BPQFmAj4BPQFmAzEBTQI3ATQBTQJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJH
+ AUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgI3ATQBTQMxAU0CPgE9
+ AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9
+ AWYCPgE9AWYCPgE9AWYCPgE9AWYDMQFNAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYA
+ A/8RAAGAAf8BgAEBBQABfwEAAQEFAAE/AQABAQUAAR8BAAEBBAABgAEPAYABAQQAAcABBwHAAQMEAAHg
+ AQMB4AEDBAAB8AEBAfABAQQAAfgBAAH4BQAB/AEAAfwFAAH+AQgB/gEIBAAB/wEAAf8FAAH/AYAB/wGA
+ BAAB/wHAAf8BwAQAAfgBfwYAAeABPxYAAcABAQYAAcABAQYAAcABAQYAAcABAQYAAcABAQYAAcABAQYA
+ AcABAwYAAcABAwYAAcABAwYAAcABAwYAAcABAwYAAcABAwYACw==
+</value>
+ </data>
+ <metadata name="toolStripMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>211, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="toolbuttonOpenMib.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAK6SURBVDhPjZNbSNNRHMfPU9DtwR71oZf5IgkF0YMEEYb2
+ EGgG5YNgGQmGSUoYimbel5KKmlM0u3jJSpv3ad7WnGkzb2yO4bByF3WuuTnnnLv47Zw/9YclQQc+/L//
+ P+d8/r/f+Z8/Ib/HjJDcmhaS3P+Bzf2zjr8qiki+QyuE6dNNbIzFw6F8DJ++AVh97c9GK9jcA4LJAlKI
+ rQ7sW9/DpauGZSoFg6JwfJSU+TE0XIXOgqCaAwJ5ASn2bb6F19TM4bO+w4z4HgwWC9YcDugpK3Y7umQy
+ FOZEDMRkZQX7SWS5pMRrboVn9RUHy1/aEqDSajGn0WDZbIZ6bQ0t/f1gIzojI8lPMvaIPPWsN2FP/5yD
+ ZdmLWLwUi/FhZASSqSlOUtXczBMcGZnFVzGUTSr2jI1wfq/lYHms4Tqkc3MYnZ2F0mDAqs3GV8LaiUhN
+ TeYFA5mkenelHg5tNQfLw3UxaOrpQZdUiu7xca5/Mc0do6PQb28jPDk5hRf0PiQi5zcR7JoKDpYHaqIg
+ VyohW1jg+lcZjVwlCzod1p1OXEhMvM8LOtNJvWOpEjZVKQfL/ZVX0NrXh165HP2Tk5hQqzGuUmFQocCm
+ y4XzCQlpvKA9jTTa1WWwzBdzsNxdfhmfFxcxQRct0Q3UmEzY2t2FdWcHdrcb5+LiHvCC1hTSbFOWwDyT
+ x8GyuDQCbRIJ3tBPp6CfU0pbcdA3M4mDCs7ExqYzwWHKibo7pNs6T4+yIofDSqtof3IJBtqzTq+Hx+uF
+ y+OBky5kkh2aT0VFZTNBAEWQFEFqhyvO2pclSe6f03nYnC1EW9FFGOnGGSi+/X14KW6fD3tUtkdzYFiY
+ 0O801iWSaNFtUteWGST92nL1R/q1Q7ojAkHV0ZCQkuOhocV/c0wguHvgn2APyuPJ6dI4kpV/gzyjtycp
+ gf8g4Begs1B6Kbj3cQAAAABJRU5ErkJggg==
+</value>
+ </data>
+ <metadata name="dialogOpenMib.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>337, 17</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/MibViewer.csproj b/contrib/apps/LwipMibCompiler/MibViewer/MibViewer.csproj
new file mode 100644
index 0000000..957c058
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/MibViewer.csproj
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{86CC0B65-7985-4017-A252-0A7A18DCAEF3}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>LwipMibViewer</RootNamespace>
+ <AssemblyName>MibViewer</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+ <DebugSymbols>true</DebugSymbols>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <DebugType>full</DebugType>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+ <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+ <WarningLevel>4</WarningLevel>
+ <Optimize>false</Optimize>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <Optimize>true</Optimize>
+ <DebugType>pdbonly</DebugType>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <ErrorReport>prompt</ErrorReport>
+ <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+ <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+ <WarningLevel>4</WarningLevel>
+ <UseVSHostingProcess>false</UseVSHostingProcess>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="FormMain.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="FormMain.Designer.cs">
+ <DependentUpon>FormMain.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="FormMain.resx">
+ <DependentUpon>FormMain.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="app.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\SharpSnmpLib\SharpSnmpLib.Mib.csproj">
+ <Project>{CBE20411-5DB7-487D-825D-7694267BB6F5}</Project>
+ <Name>SharpSnmpLib.Mib</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Program.cs b/contrib/apps/LwipMibCompiler/MibViewer/Program.cs
new file mode 100644
index 0000000..cd3ef31
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Program.cs
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Martin Hentschel <info@cl-soft.de>
+ *
+ */
+
+using System;
+using System.Windows.Forms;
+
+namespace LwipMibViewer
+{
+ static class Program
+ {
+ /// <summary>
+ /// Der Haupteinstiegspunkt für die Anwendung.
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new FormMain());
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Properties/AssemblyInfo.cs b/contrib/apps/LwipMibCompiler/MibViewer/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..06e7286
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die mit einer Assembly verknüpft sind.
+[assembly: AssemblyTitle("LwipMibViewer")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("LwipMibViewer")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
+// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
+// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("7ffbd1c1-1c64-45bb-b243-2400446c649d")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.Designer.cs b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..bf15717
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.225
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LwipMibViewer.Properties {
+ using System;
+
+
+ /// <summary>
+ /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
+ /// </summary>
+ // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+ // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+ // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+ // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LwipMibViewer.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+ /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.resx b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.Designer.cs b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..9831b20
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.225
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LwipMibViewer.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.settings b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
diff --git a/contrib/apps/LwipMibCompiler/MibViewer/app.config b/contrib/apps/LwipMibCompiler/MibViewer/app.config
new file mode 100644
index 0000000..e365603
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/MibViewer/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB
new file mode 100644
index 0000000..1010795
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB
@@ -0,0 +1,131 @@
+
+
+ IANA-ADDRESS-FAMILY-NUMBERS-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY,
+ mib-2 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+ ianaAddressFamilyNumbers MODULE-IDENTITY
+ LAST-UPDATED "200203140000Z" -- March 14, 2002
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ "Postal: Internet Assigned Numbers Authority
+ Internet Corporation for Assigned Names
+ and Numbers
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292-6601
+ USA
+
+ Tel: +1 310-823-9358
+ E-Mail: iana&iana.org"
+ DESCRIPTION
+ "The MIB module defines the AddressFamilyNumbers
+ textual convention."
+
+ -- revision history
+
+ REVISION "200203140000Z" -- March 14, 2002
+ DESCRIPTION "AddressFamilyNumbers assignment 22 to
+ fibreChannelWWPN. AddressFamilyNumbers
+ assignment 23 to fibreChannelWWNN.
+ AddressFamilyNumers assignment 24 to gwid."
+
+ REVISION "200009080000Z" -- September 8, 2000
+ DESCRIPTION "AddressFamilyNumbers assignment 19 to xtpOverIpv4.
+ AddressFamilyNumbers assignment 20 to xtpOverIpv6.
+ AddressFamilyNumbers assignment 21 to xtpNativeModeXTP."
+
+ REVISION "200003010000Z" -- March 1, 2000
+ DESCRIPTION "AddressFamilyNumbers assignment 17 to distinguishedName.
+ AddressFamilyNumbers assignment 18 to asNumber."
+
+ REVISION "200002040000Z" -- February 4, 2000
+ DESCRIPTION "AddressFamilyNumbers assignment 16 to dns."
+
+ REVISION "9908260000Z" -- August 26, 1999
+ DESCRIPTION "Initial version, published as RFC 2677."
+
+ ::= { mib-2 72 }
+
+
+ AddressFamilyNumbers ::= TEXTUAL-CONVENTION
+
+ STATUS current
+ DESCRIPTION
+ "The definition of this textual convention with the
+ addition of newly assigned values is published
+ periodically by the IANA, in either the Assigned
+ Numbers RFC, or some derivative of it specific to
+ Internet Network Management number assignments.
+ (The latest arrangements can be obtained by
+ contacting the IANA.)
+
+ The enumerations are described as:
+
+ other(0), -- none of the following
+ ipV4(1), -- IP Version 4
+ ipV6(2), -- IP Version 6
+ nsap(3), -- NSAP
+ hdlc(4), -- (8-bit multidrop)
+ bbn1822(5),
+ all802(6), -- (includes all 802 media
+ -- plus Ethernet 'canonical format')
+ e163(7),
+ e164(8), -- (SMDS, Frame Relay, ATM)
+ f69(9), -- (Telex)
+ x121(10), -- (X.25, Frame Relay)
+ ipx(11), -- IPX (Internet Protocol Exchange)
+ appleTalk(12), -- Apple Talk
+ decnetIV(13), -- DEC Net Phase IV
+ banyanVines(14), -- Banyan Vines
+ e164withNsap(15),
+ -- (E.164 with NSAP format subaddress)
+ dns(16), -- (Domain Name System)
+ distinguishedName(17), -- (Distinguished Name, per X.500)
+ asNumber(18), -- (16-bit quantity, per the AS number space)
+ xtpOverIpv4(19), -- XTP over IP version 4
+ xtpOverIpv6(20), -- XTP over IP version 6
+ xtpNativeModeXTP(21), -- XTP native mode XTP
+ fibreChannelWWPN(22), -- Fibre Channel World-Wide Port Name
+ fibreChannelWWNN(23), -- Fibre Channel World-Wide Node Name
+ gwid(24), -- Gateway Identifier
+ afi(25), -- AFI for L2VPN information
+ reserved(65535)
+
+
+
+ Requests for new values should be made to IANA via
+ email (iana&iana.org)."
+
+ SYNTAX INTEGER {
+ other(0),
+ ipV4(1),
+ ipV6(2),
+ nsap(3),
+ hdlc(4),
+ bbn1822(5),
+ all802(6),
+ e163(7),
+ e164(8),
+ f69(9),
+ x121(10),
+ ipx(11),
+ appleTalk(12),
+ decnetIV(13),
+ banyanVines(14),
+ e164withNsap(15),
+ dns(16),
+ distinguishedName(17), -- (Distinguished Name, per X.500)
+ asNumber(18), -- (16-bit quantity, per the AS number space)
+ xtpOverIpv4(19),
+ xtpOverIpv6(20),
+ xtpNativeModeXTP(21),
+ fibreChannelWWPN(22),
+ fibreChannelWWNN(23),
+ gwid(24),
+ afi(25),
+ reserved(65535)
+ }
+ END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA-CHARSET-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA-CHARSET-MIB
new file mode 100644
index 0000000..499d54e
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA-CHARSET-MIB
@@ -0,0 +1,345 @@
+IANA-CHARSET-MIB DEFINITIONS ::= BEGIN
+-- http://www.iana.org/assignments/ianacharset-mib
+
+IMPORTS
+ MODULE-IDENTITY,
+ mib-2
+ FROM SNMPv2-SMI -- [RFC2578]
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC; -- [RFC2579]
+
+ianaCharsetMIB MODULE-IDENTITY
+ LAST-UPDATED "200705140000Z"
+ ORGANIZATION "IANA"
+ CONTACT-INFO " Internet Assigned Numbers Authority
+
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1 310 823 9358
+ E-Mail: iana&iana.org"
+
+ DESCRIPTION "This MIB module defines the IANACharset
+ TEXTUAL-CONVENTION. The IANACharset TC is used to
+ specify the encoding of string objects defined in
+ a MIB.
+
+ Each version of this MIB will be released based on
+ the IANA Charset Registry file (see RFC 2978) at
+ http://www.iana.org/assignments/character-sets.
+
+ Note: The IANACharset TC, originally defined in
+ RFC 1759, was inaccurately named CodedCharSet.
+
+ Note: Best practice is to define new MIB string
+ objects with invariant UTF-8 (RFC 3629) syntax
+ using the SnmpAdminString TC (defined in RFC 3411)
+ in accordance with IETF Policy on Character Sets and
+ Languages (RFC 2277).
+
+ Copyright (C) The Internet Society (2004). The
+ initial version of this MIB module was published
+ in RFC 3808; for full legal notices see the RFC
+ itself. Supplementary information may be
+ available on
+ http://www.ietf.org/copyrights/ianamib.html."
+
+ -- revision history
+
+ REVISION "200705140000Z"
+ DESCRIPTION "Registration of new charset 2107."
+
+ REVISION "200612070000Z"
+ DESCRIPTION "Registration of new charsets numbered 118, 119,
+ and 2106."
+
+ REVISION "200406080000Z"
+ DESCRIPTION "Original version transferred from Printer MIB,
+ generated from the IANA maintained assignments
+ http://www.iana.org/assignments/character-sets."
+
+ ::= { mib-2 106 }
+
+IANACharset ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Specifies an IANA registered 'charset' - coded character set
+ (CCS) plus optional character encoding scheme (CES) - terms
+ defined in 'IANA Charset Registration Procedures' (RFC 2978).
+
+ Objects of this syntax are used to specify the encoding for
+ string objects defined in one or more MIBs. For example, the
+ prtLocalizationCharacterSet, prtInterpreterDefaultCharSetIn, and
+ prtInterpreterDefaultCharSetOut objects defined in Printer MIB.
+
+ The current list of 'charset' names and enumerated values
+ is contained in the IANA Character Set Registry at:
+
+ http://www.iana.org/assignments/character-sets
+
+ Enum names are derived from the IANA Charset Registry 'Alias'
+ fields that begin with 'cs' (for character set).
+ Enum values are derived from the parallel 'MIBenum' fields."
+ SYNTAX INTEGER {
+ other(1), -- used if the designated
+ -- character set is not currently
+ -- registered by IANA
+ unknown(2), -- used as a default value
+ csASCII(3),
+ csISOLatin1(4),
+ csISOLatin2(5),
+ csISOLatin3(6),
+ csISOLatin4(7),
+ csISOLatinCyrillic(8),
+ csISOLatinArabic(9),
+ csISOLatinGreek(10),
+ csISOLatinHebrew(11),
+ csISOLatin5(12),
+ csISOLatin6(13),
+ csISOTextComm(14),
+ csHalfWidthKatakana(15),
+ csJISEncoding(16),
+ csShiftJIS(17),
+ csEUCPkdFmtJapanese(18),
+ csEUCFixWidJapanese(19),
+ csISO4UnitedKingdom(20),
+ csISO11SwedishForNames(21),
+ csISO15Italian(22),
+ csISO17Spanish(23),
+ csISO21German(24),
+ csISO60DanishNorwegian(25),
+ csISO69French(26),
+ csISO10646UTF1(27),
+ csISO646basic1983(28),
+ csINVARIANT(29),
+ csISO2IntlRefVersion(30),
+ csNATSSEFI(31),
+ csNATSSEFIADD(32),
+ csNATSDANO(33),
+ csNATSDANOADD(34),
+ csISO10Swedish(35),
+ csKSC56011987(36),
+ csISO2022KR(37),
+ csEUCKR(38),
+ csISO2022JP(39),
+ csISO2022JP2(40),
+ csISO13JISC6220jp(41),
+ csISO14JISC6220ro(42),
+ csISO16Portuguese(43),
+ csISO18Greek7Old(44),
+ csISO19LatinGreek(45),
+ csISO25French(46),
+ csISO27LatinGreek1(47),
+ csISO5427Cyrillic(48),
+ csISO42JISC62261978(49),
+ csISO47BSViewdata(50),
+ csISO49INIS(51),
+ csISO50INIS8(52),
+ csISO51INISCyrillic(53),
+ csISO54271981(54),
+ csISO5428Greek(55),
+ csISO57GB1988(56),
+ csISO58GB231280(57),
+ csISO61Norwegian2(58),
+ csISO70VideotexSupp1(59),
+ csISO84Portuguese2(60),
+ csISO85Spanish2(61),
+ csISO86Hungarian(62),
+ csISO87JISX0208(63),
+ csISO88Greek7(64),
+ csISO89ASMO449(65),
+ csISO90(66),
+ csISO91JISC62291984a(67),
+ csISO92JISC62991984b(68),
+ csISO93JIS62291984badd(69),
+ csISO94JIS62291984hand(70),
+ csISO95JIS62291984handadd(71),
+ csISO96JISC62291984kana(72),
+ csISO2033(73),
+ csISO99NAPLPS(74),
+ csISO102T617bit(75),
+ csISO103T618bit(76),
+ csISO111ECMACyrillic(77),
+ csa71(78),
+ csa72(79),
+ csISO123CSAZ24341985gr(80),
+ csISO88596E(81),
+ csISO88596I(82),
+ csISO128T101G2(83),
+ csISO88598E(84),
+ csISO88598I(85),
+ csISO139CSN369103(86),
+ csISO141JUSIB1002(87),
+ csISO143IECP271(88),
+ csISO146Serbian(89),
+ csISO147Macedonian(90),
+ csISO150(91),
+ csISO151Cuba(92),
+ csISO6937Add(93),
+ csISO153GOST1976874(94),
+ csISO8859Supp(95),
+ csISO10367Box(96),
+ csISO158Lap(97),
+ csISO159JISX02121990(98),
+ csISO646Danish(99),
+ csUSDK(100),
+ csDKUS(101),
+ csKSC5636(102),
+ csUnicode11UTF7(103),
+ csISO2022CN(104),
+ csISO2022CNEXT(105),
+ csUTF8(106),
+ csISO885913(109),
+ csISO885914(110),
+ csISO885915(111),
+ csISO885916(112),
+ csGBK(113),
+ csGB18030(114),
+ csOSDEBCDICDF0415(115),
+ csOSDEBCDICDF03IRV(116),
+ csOSDEBCDICDF041(117),
+ csISO115481(118),
+ csKZ1048(119),
+ csUnicode(1000),
+ csUCS4(1001),
+ csUnicodeASCII(1002),
+ csUnicodeLatin1(1003),
+ csUnicodeIBM1261(1005),
+ csUnicodeIBM1268(1006),
+ csUnicodeIBM1276(1007),
+ csUnicodeIBM1264(1008),
+ csUnicodeIBM1265(1009),
+ csUnicode11(1010),
+ csSCSU(1011),
+ csUTF7(1012),
+ csUTF16BE(1013),
+ csUTF16LE(1014),
+ csUTF16(1015),
+ csCESU8(1016),
+ csUTF32(1017),
+ csUTF32BE(1018),
+ csUTF32LE(1019),
+ csBOCU1(1020),
+ csWindows30Latin1(2000),
+ csWindows31Latin1(2001),
+ csWindows31Latin2(2002),
+ csWindows31Latin5(2003),
+ csHPRoman8(2004),
+ csAdobeStandardEncoding(2005),
+ csVenturaUS(2006),
+ csVenturaInternational(2007),
+ csDECMCS(2008),
+ csPC850Multilingual(2009),
+ csPCp852(2010),
+ csPC8CodePage437(2011),
+ csPC8DanishNorwegian(2012),
+ csPC862LatinHebrew(2013),
+ csPC8Turkish(2014),
+ csIBMSymbols(2015),
+ csIBMThai(2016),
+ csHPLegal(2017),
+ csHPPiFont(2018),
+ csHPMath8(2019),
+ csHPPSMath(2020),
+ csHPDesktop(2021),
+ csVenturaMath(2022),
+ csMicrosoftPublishing(2023),
+ csWindows31J(2024),
+ csGB2312(2025),
+ csBig5(2026),
+ csMacintosh(2027),
+ csIBM037(2028),
+ csIBM038(2029),
+ csIBM273(2030),
+ csIBM274(2031),
+ csIBM275(2032),
+ csIBM277(2033),
+ csIBM278(2034),
+ csIBM280(2035),
+ csIBM281(2036),
+ csIBM284(2037),
+ csIBM285(2038),
+ csIBM290(2039),
+ csIBM297(2040),
+ csIBM420(2041),
+ csIBM423(2042),
+ csIBM424(2043),
+ csIBM500(2044),
+ csIBM851(2045),
+ csIBM855(2046),
+ csIBM857(2047),
+ csIBM860(2048),
+ csIBM861(2049),
+ csIBM863(2050),
+ csIBM864(2051),
+ csIBM865(2052),
+ csIBM868(2053),
+ csIBM869(2054),
+ csIBM870(2055),
+ csIBM871(2056),
+ csIBM880(2057),
+ csIBM891(2058),
+ csIBM903(2059),
+ csIBBM904(2060),
+ csIBM905(2061),
+ csIBM918(2062),
+ csIBM1026(2063),
+ csIBMEBCDICATDE(2064),
+ csEBCDICATDEA(2065),
+ csEBCDICCAFR(2066),
+ csEBCDICDKNO(2067),
+ csEBCDICDKNOA(2068),
+ csEBCDICFISE(2069),
+ csEBCDICFISEA(2070),
+ csEBCDICFR(2071),
+ csEBCDICIT(2072),
+ csEBCDICPT(2073),
+ csEBCDICES(2074),
+ csEBCDICESA(2075),
+ csEBCDICESS(2076),
+ csEBCDICUK(2077),
+ csEBCDICUS(2078),
+ csUnknown8BiT(2079),
+ csMnemonic(2080),
+ csMnem(2081),
+ csVISCII(2082),
+ csVIQR(2083),
+ csKOI8R(2084),
+ csHZGB2312(2085),
+ csIBM866(2086),
+ csPC775Baltic(2087),
+ csKOI8U(2088),
+ csIBM00858(2089),
+ csIBM00924(2090),
+ csIBM01140(2091),
+ csIBM01141(2092),
+ csIBM01142(2093),
+ csIBM01143(2094),
+ csIBM01144(2095),
+ csIBM01145(2096),
+ csIBM01146(2097),
+ csIBM01147(2098),
+ csIBM01148(2099),
+ csIBM01149(2100),
+ csBig5HKSCS(2101),
+ csIBM1047(2102),
+ csPTCP154(2103),
+ csAmiga1251(2104),
+ csKOI7switched(2105),
+ csBRF(2106),
+ csTSCII(2107),
+ cswindows1250(2250),
+ cswindows1251(2251),
+ cswindows1252(2252),
+ cswindows1253(2253),
+ cswindows1254(2254),
+ cswindows1255(2255),
+ cswindows1256(2256),
+ cswindows1257(2257),
+ cswindows1258(2258),
+ csTIS620(2259),
+ reserved(3000)
+ }
+END
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB
new file mode 100644
index 0000000..8579485
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB
@@ -0,0 +1,333 @@
+IANA-ITU-ALARM-TC-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+ ianaItuAlarmNumbers MODULE-IDENTITY
+ LAST-UPDATED "200409090000Z" -- September 09, 2004
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ "Postal: Internet Assigned Numbers Authority
+ Internet Corporation for Assigned Names
+ and Numbers
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292-6601
+ USA
+
+ Tel: +1 310-823-9358
+ E-Mail: iana&iana.org"
+ DESCRIPTION
+ "The MIB module defines the ITU Alarm
+ textual convention for objects expected to require
+ regular extension.
+
+ Copyright (C) The Internet Society (2004). The
+ initial version of this MIB module was published
+ in RFC 3877. For full legal notices see the RFC
+ itself. Supplementary information may be available on:
+ http://www.ietf.org/copyrights/ianamib.html"
+ REVISION "200409090000Z"
+ DESCRIPTION
+ "Initial version, published as RFC 3877."
+ ::= { mib-2 119 }
+
+
+ IANAItuProbableCause ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "ITU-T probable cause values. Duplicate values defined in
+ X.733 are appended with X733 to ensure syntactic uniqueness.
+ Probable cause value 0 is reserved for special purposes.
+
+ The Internet Assigned Number Authority (IANA) is responsible
+ for the assignment of the enumerations in this TC.
+ IANAItuProbableCause value of 0 is reserved for special
+ purposes and MUST NOT be assigned.
+
+ Values of IANAItuProbableCause in the range 1 to 1023 are
+ reserved for causes that correspond to ITU-T probable cause.
+
+ All other requests for new causes will be handled on a
+ first-come, first served basis and will be assigned
+ enumeration values starting with 1025.
+
+ Request should come in the form of well-formed
+ SMI [RFC2578] for enumeration names that are unique and
+ sufficiently descriptive.
+
+ While some effort will be taken to ensure that new probable
+ causes do not conceptually duplicate existing probable
+ causes it is acknowledged that the existence of conceptual
+ duplicates in the starting probable cause list is an known
+ industry reality.
+
+ To aid IANA in the administration of probable cause names
+ and values, the OPS Area Director will appoint one or more
+ experts to help review requests.
+
+ See http://www.iana.org"
+ REFERENCE
+ "ITU Recommendation M.3100, 'Generic Network Information
+ Model', 1995
+ ITU Recommendation X.733, 'Information Technology - Open
+ Systems Interconnection - System Management: Alarm
+ Reporting Function', 1992
+ ITU Recommendation X.736, 'Information Technology - Open
+ Systems Interconnection - System Management: Security
+ Alarm Reporting Function', 1992"
+
+ SYNTAX INTEGER
+ {
+ -- The following probable causes were defined in M.3100
+ aIS (1),
+ callSetUpFailure (2),
+ degradedSignal (3),
+ farEndReceiverFailure (4),
+ framingError (5),
+ lossOfFrame (6),
+ lossOfPointer (7),
+ lossOfSignal (8),
+ payloadTypeMismatch (9),
+ transmissionError (10),
+ remoteAlarmInterface (11),
+ excessiveBER (12),
+ pathTraceMismatch (13),
+ unavailable (14),
+ signalLabelMismatch (15),
+ lossOfMultiFrame (16),
+ receiveFailure (17),
+ transmitFailure (18),
+ modulationFailure (19),
+ demodulationFailure (20),
+ broadcastChannelFailure (21),
+ connectionEstablishmentError (22),
+ invalidMessageReceived (23),
+ localNodeTransmissionError (24),
+ remoteNodeTransmissionError (25),
+ routingFailure (26),
+ --Values 27-50 are reserved for communications alarm related
+ --probable causes
+ -- The following are used with equipment alarm.
+ backplaneFailure (51),
+ dataSetProblem (52),
+ equipmentIdentifierDuplication (53),
+ externalIFDeviceProblem (54),
+ lineCardProblem (55),
+ multiplexerProblem (56),
+ nEIdentifierDuplication (57),
+ powerProblem (58),
+ processorProblem (59),
+ protectionPathFailure (60),
+ receiverFailure (61),
+ replaceableUnitMissing (62),
+ replaceableUnitTypeMismatch (63),
+ synchronizationSourceMismatch (64),
+ terminalProblem (65),
+ timingProblem (66),
+ transmitterFailure (67),
+ trunkCardProblem (68),
+ replaceableUnitProblem (69),
+ realTimeClockFailure (70),
+ --An equipment alarm to be issued if the system detects that the
+ --real time clock has failed
+ antennaFailure (71),
+ batteryChargingFailure (72),
+ diskFailure (73),
+ frequencyHoppingFailure (74),
+ iODeviceError (75),
+ lossOfSynchronisation (76),
+ lossOfRedundancy (77),
+ powerSupplyFailure (78),
+ signalQualityEvaluationFailure (79),
+ tranceiverFailure (80),
+ protectionMechanismFailure (81),
+ protectingResourceFailure (82),
+ -- Values 83-100 are reserved for equipment alarm related probable
+ -- causes
+ -- The following are used with environmental alarm.
+ airCompressorFailure (101),
+ airConditioningFailure (102),
+ airDryerFailure (103),
+ batteryDischarging (104),
+ batteryFailure (105),
+ commercialPowerFailure (106),
+ coolingFanFailure (107),
+ engineFailure (108),
+ fireDetectorFailure (109),
+ fuseFailure (110),
+ generatorFailure (111),
+ lowBatteryThreshold (112),
+ pumpFailure (113),
+ rectifierFailure (114),
+ rectifierHighVoltage (115),
+ rectifierLowFVoltage (116),
+ ventilationsSystemFailure (117),
+ enclosureDoorOpen (118),
+ explosiveGas (119),
+ fire (120),
+ flood (121),
+ highHumidity (122),
+ highTemperature (123),
+ highWind (124),
+ iceBuildUp (125),
+ intrusionDetection (126),
+ lowFuel (127),
+ lowHumidity (128),
+ lowCablePressure (129),
+ lowTemperatue (130),
+ lowWater (131),
+ smoke (132),
+ toxicGas (133),
+ coolingSystemFailure (134),
+ externalEquipmentFailure (135),
+ externalPointFailure (136),
+ -- Values 137-150 are reserved for environmental alarm related
+ -- probable causes
+ -- The following are used with Processing error alarm.
+ storageCapacityProblem (151),
+ memoryMismatch (152),
+ corruptData (153),
+ outOfCPUCycles (154),
+ sfwrEnvironmentProblem (155),
+ sfwrDownloadFailure (156),
+ lossOfRealTimel (157),
+ --A processing error alarm to be issued after the system has
+ --reinitialised. This will indicate
+ --to the management systems that the view they have of the managed
+ --system may no longer
+ --be valid. Usage example: The managed
+ --system issues this alarm after a reinitialization with severity
+ --warning to inform the
+ --management system about the event. No clearing notification will
+ --be sent.
+ applicationSubsystemFailure (158),
+ configurationOrCustomisationError (159),
+ databaseInconsistency (160),
+ fileError (161),
+ outOfMemory (162),
+ softwareError (163),
+ timeoutExpired (164),
+ underlayingResourceUnavailable (165),
+ versionMismatch (166),
+ --Values 168-200 are reserved for processing error alarm related
+ -- probable causes.
+ bandwidthReduced (201),
+ congestion (202),
+ excessiveErrorRate (203),
+ excessiveResponseTime (204),
+ excessiveRetransmissionRate (205),
+ reducedLoggingCapability (206),
+ systemResourcesOverload (207 ),
+ -- The following were defined X.733
+ adapterError (500),
+ applicationSubsystemFailture (501),
+ bandwidthReducedX733 (502),
+ callEstablishmentError (503),
+ communicationsProtocolError (504),
+ communicationsSubsystemFailure (505),
+ configurationOrCustomizationError (506),
+ congestionX733 (507),
+ coruptData (508),
+ cpuCyclesLimitExceeded (509),
+ dataSetOrModemError (510),
+ degradedSignalX733 (511),
+ dteDceInterfaceError (512),
+ enclosureDoorOpenX733 (513),
+ equipmentMalfunction (514),
+ excessiveVibration (515),
+ fileErrorX733 (516),
+ fireDetected (517),
+ framingErrorX733 (518),
+ heatingVentCoolingSystemProblem (519),
+ humidityUnacceptable (520),
+ inputOutputDeviceError (521),
+ inputDeviceError (522),
+ lanError (523),
+ leakDetected (524),
+ localNodeTransmissionErrorX733 (525),
+ lossOfFrameX733 (526),
+ lossOfSignalX733 (527),
+ materialSupplyExhausted (528),
+ multiplexerProblemX733 (529),
+ outOfMemoryX733 (530),
+ ouputDeviceError (531),
+ performanceDegraded (532),
+ powerProblems (533),
+ pressureUnacceptable (534),
+ processorProblems (535),
+ pumpFailureX733 (536),
+ queueSizeExceeded (537),
+ receiveFailureX733 (538),
+ receiverFailureX733 (539),
+ remoteNodeTransmissionErrorX733 (540),
+ resourceAtOrNearingCapacity (541),
+ responseTimeExecessive (542),
+ retransmissionRateExcessive (543),
+ softwareErrorX733 (544),
+ softwareProgramAbnormallyTerminated (545),
+ softwareProgramError (546),
+ storageCapacityProblemX733 (547),
+ temperatureUnacceptable (548),
+ thresholdCrossed (549),
+ timingProblemX733 (550),
+ toxicLeakDetected (551),
+ transmitFailureX733 (552),
+ transmiterFailure (553),
+ underlyingResourceUnavailable (554),
+ versionMismatchX733 (555),
+ -- The following are defined in X.736
+ authenticationFailure (600),
+ breachOfConfidentiality (601),
+ cableTamper (602),
+ delayedInformation (603),
+ denialOfService (604),
+ duplicateInformation (605),
+ informationMissing (606),
+ informationModificationDetected (607),
+ informationOutOfSequence (608),
+ keyExpired (609),
+ nonRepudiationFailure (610),
+ outOfHoursActivity (611),
+ outOfService (612),
+ proceduralError (613),
+ unauthorizedAccessAttempt (614),
+ unexpectedInformation (615),
+
+ other (1024)
+ }
+
+ IANAItuEventType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The ITU event Type values.
+
+ The Internet Assigned Number Authority (IANA) is
+ responsible for the assignment of the enumerations
+ in this TC.
+
+ Request should come in the form of well-formed
+ SMI [RFC2578] for enumeration names that are unique
+ and sufficiently descriptive.
+
+ See http://www.iana.org "
+ REFERENCE
+ "ITU Recommendation X.736, 'Information Technology - Open
+ Systems Interconnection - System Management: Security
+ Alarm Reporting Function', 1992"
+ SYNTAX INTEGER
+ {
+ other (1),
+ communicationsAlarm (2),
+ qualityOfServiceAlarm (3),
+ processingErrorAlarm (4),
+ equipmentAlarm (5),
+ environmentalAlarm (6),
+ integrityViolation (7),
+ operationalViolation (8),
+ physicalViolation (9),
+ securityServiceOrMechanismViolation (10),
+ timeDomainViolation (11)
+ }
+
+ END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB
new file mode 100644
index 0000000..6210f72
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB
@@ -0,0 +1,127 @@
+
+ IANA-LANGUAGE-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, OBJECT-IDENTITY, mib-2
+ FROM SNMPv2-SMI;
+
+ ianaLanguages MODULE-IDENTITY
+ LAST-UPDATED "200005100000Z" -- May 10, 2000
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ "Internet Assigned Numbers Authority (IANA)
+
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1 310 823 9358 x20
+ E-Mail: iana&iana.org"
+ DESCRIPTION
+ "The MIB module registers object identifier values for
+ well-known programming and scripting languages. Every
+ language registration MUST describe the format used
+ when transferring scripts written in this language.
+
+ Any additions or changes to the contents of this MIB
+ module require Designated Expert Review as defined in
+ the Guidelines for Writing IANA Considerations Section
+ document. The Designated Expert will be selected by
+ the IESG Area Director of the OPS Area.
+
+ Note, this module does not have to register all possible
+ languages since languages are identified by object
+ identifier values. It is therefore possible to registered
+ languages in private OID trees. The references given below are not
+ normative with regard to the language version. Other
+ references might be better suited to describe some newer
+ versions of this language. The references are only
+ provided as `a pointer into the right direction'."
+
+ -- Revision log, in reverse chronological order
+
+ REVISION "200005100000Z" -- May 10, 2000
+ DESCRIPTION "Import mib-2 instead of experimental, so that
+ this module compiles"
+
+ REVISION "199909090900Z" -- September 9, 1999
+ DESCRIPTION "Initial version as published at time of
+ publication of RFC 2591."
+
+ ::= { mib-2 73 }
+
+
+ ianaLangJavaByteCode OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "Java byte code to be processed by a Java virtual machine.
+ A script written in Java byte code is transferred by using
+ the Java archive file format (JAR)."
+ REFERENCE
+ "The Java Virtual Machine Specification.
+ ISBN 0-201-63452-X"
+ ::= { ianaLanguages 1 }
+
+ ianaLangTcl OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The Tool Command Language (Tcl). A script written in the
+ Tcl language is transferred in Tcl source code format."
+ REFERENCE
+ "Tcl and the Tk Toolkit.
+ ISBN 0-201-63337-X"
+ ::= { ianaLanguages 2 }
+
+ ianaLangPerl OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The Perl language. A script written in the Perl language
+ is transferred in Perl source code format."
+ REFERENCE
+ "Programming Perl.
+ ISBN 1-56592-149-6"
+ ::= { ianaLanguages 3 }
+
+ ianaLangScheme OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The Scheme language. A script written in the Scheme
+ language is transferred in Scheme source code format."
+ REFERENCE
+ "The Revised^4 Report on the Algorithmic Language Scheme.
+ MIT Press"
+ ::= { ianaLanguages 4 }
+
+ ianaLangSRSL OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP Script Language defined by SNMP Research. A
+ script written in the SNMP Script Language is transferred
+ in the SNMP Script Language source code format."
+ ::= { ianaLanguages 5 }
+
+ ianaLangPSL OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The Patrol Script Language defined by BMC Software. A script
+ written in the Patrol Script Language is transferred in the
+ Patrol Script Language source code format."
+ REFERENCE
+ "PATROL Script Language Reference Manual, Version 3.0,
+ November 30, 1995. BMC Software, Inc. 2101 City West Blvd.,
+ Houston, Texas 77042."
+ ::= { ianaLanguages 6 }
+
+ ianaLangSMSL OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The Systems Management Scripting Language. A script written
+ in the SMSL language is transferred in the SMSL source code
+ format."
+ REFERENCE
+ "ISO/ITU Command Sequencer.
+ ISO 10164-21 or ITU X.753"
+ ::= { ianaLanguages 7 }
+
+ END
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB
new file mode 100644
index 0000000..5869a36
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB
@@ -0,0 +1,67 @@
+
+IANA-MALLOC-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+ianaMallocMIB MODULE-IDENTITY
+ LAST-UPDATED "200301271200Z" -- January 27, 2003
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ " Internet Assigned Numbers Authority
+ Internet Corporation for Assigned Names and Numbers
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292-6601
+
+ Phone: +1 310 823 9358
+ EMail: iana&iana.org"
+ DESCRIPTION
+ "This MIB module defines the IANAscopeSource and
+ IANAmallocRangeSource textual conventions for use in MIBs
+ which need to identify ways of learning multicast scope and
+ range information.
+
+ Any additions or changes to the contents of this MIB module
+ require either publication of an RFC, or Designated Expert
+ Review as defined in the Guidelines for Writing IANA
+ Considerations Section document. The Designated Expert will
+ be selected by the IESG Area Director(s) of the Transport
+ Area."
+
+ -- revision log
+
+ REVISION "200301271200Z" -- January 27, 2003
+ DESCRIPTION
+ "Initial version."
+ ::= { mib-2 102 }
+
+IANAscopeSource ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The source of multicast scope information."
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ manual(2), -- statically configured
+ local(3), -- automatically added by the system,
+ -- such as a Source-Specific Multicast
+ -- scope
+ mzap(4), -- MZAP
+ madcap(5) -- MADCAP
+ }
+
+IANAmallocRangeSource ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The source of multicast address allocation range
+ information."
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ manual(2), -- statically configured
+ local(3) -- automatically added by the system,
+ -- such as a Source-Specific Multicast
+ -- range
+ }
+
+END
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB
new file mode 100644
index 0000000..35c3f4a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB
@@ -0,0 +1,770 @@
+IANA-MAU-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, OBJECT-IDENTITY, mib-2
+ FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC
+ ;
+
+ ianaMauMIB MODULE-IDENTITY
+ LAST-UPDATED "200704210000Z" -- April 21, 2007
+ ORGANIZATION "IANA"
+ CONTACT-INFO " Internet Assigned Numbers Authority
+
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1-310-823-9358
+ EMail: iana&iana.org"
+
+ DESCRIPTION
+ "This MIB module defines dot3MauType OBJECT-IDENTITIES and
+ IANAifMauListBits, IANAifMauMediaAvailable,
+ IANAifMauAutoNegCapBits, and IANAifJackType
+
+ TEXTUAL-CONVENTIONs, specifying enumerated values of the
+ ifMauTypeListBits, ifMauMediaAvailable / rpMauMediaAvailable,
+ ifMauAutoNegCapabilityBits / ifMauAutoNegCapAdvertisedBits /
+ ifMauAutoNegCapReceivedBits and ifJackType / rpJackType objects
+ respectively, defined in the MAU-MIB.
+
+ It is intended that each new MAU type, Media Availability
+ state, Auto Negotiation capability and/or Jack type defined by
+ the IEEE 802.3 working group and approved for publication in a
+ revision of IEEE Std 802.3 will be added to this MIB module,
+ provided that it is suitable for being managed by the base
+ objects in the MAU-MIB. An Expert Review, as defined in
+ RFC 2434 [RFC2434], is REQUIRED for such additions.
+
+ The following reference is used throughout this MIB module:
+
+ [IEEE802.3] refers to:
+ IEEE Std 802.3, 2005 Edition: 'IEEE Standard for
+ Information technology - Telecommunications and information
+ exchange between systems - Local and metropolitan area
+ networks - Specific requirements -
+ Part 3: Carrier sense multiple access with collision
+ detection (CSMA/CD) access method and physical layer
+ specifications'.
+
+ This reference should be updated as appropriate when new
+ MAU types, Media Availability states, Auto Negotiation
+ capabilities, and/or Jack types are added to this MIB module.
+
+ Copyright (C) The IETF Trust (2007).
+ The initial version of this MIB module was published in
+ RFC 4836; for full legal notices see the RFC itself.
+ Supplementary information may be available at:
+ http://www.ietf.org/copyrights/ianamib.html"
+
+ REVISION "200704210000Z" -- April 21, 2007
+ DESCRIPTION "Initial version of this MIB as published in
+ RFC 4836."
+ ::= { mib-2 154 }
+
+ -- Textual Conventions
+
+ IANAifMauTypeListBits ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This data type is used as the syntax of the ifMauTypeListBits
+ object in the (updated) definition of MAU-MIB's ifMauTable.
+
+ The most recent version of this textual convention is available
+ in the online version of this MIB module on the IANA web site.
+
+ Requests for new values should be made to IANA via email
+ (iana&iana.org).
+
+ Note that changes in this textual convention SHALL be
+ synchronized with relevant changes in the dot3MauType
+ OBJECT-IDENTITIES."
+ REFERENCE
+ "[IEEE802.3], Section 30.5.1.1.2"
+ SYNTAX BITS {
+ bOther(0), -- other or unknown
+ bAUI(1), -- AUI
+ b10base5(2), -- 10BASE-5
+ bFoirl(3), -- FOIRL
+
+ b10base2(4), -- 10BASE-2
+ b10baseT(5), -- 10BASE-T duplex mode unknown
+ b10baseFP(6), -- 10BASE-FP
+ b10baseFB(7), -- 10BASE-FB
+ b10baseFL(8), -- 10BASE-FL duplex mode unknown
+ b10broad36(9), -- 10BROAD36
+ b10baseTHD(10), -- 10BASE-T half duplex mode
+ b10baseTFD(11), -- 10BASE-T full duplex mode
+ b10baseFLHD(12), -- 10BASE-FL half duplex mode
+ b10baseFLFD(13), -- 10BASE-FL full duplex mode
+ b100baseT4(14), -- 100BASE-T4
+ b100baseTXHD(15), -- 100BASE-TX half duplex mode
+ b100baseTXFD(16), -- 100BASE-TX full duplex mode
+ b100baseFXHD(17), -- 100BASE-FX half duplex mode
+ b100baseFXFD(18), -- 100BASE-FX full duplex mode
+ b100baseT2HD(19), -- 100BASE-T2 half duplex mode
+ b100baseT2FD(20), -- 100BASE-T2 full duplex mode
+
+ b1000baseXHD(21), -- 1000BASE-X half duplex mode
+ b1000baseXFD(22), -- 1000BASE-X full duplex mode
+ b1000baseLXHD(23), -- 1000BASE-LX half duplex mode
+ b1000baseLXFD(24), -- 1000BASE-LX full duplex mode
+ b1000baseSXHD(25), -- 1000BASE-SX half duplex mode
+ b1000baseSXFD(26), -- 1000BASE-SX full duplex mode
+ b1000baseCXHD(27), -- 1000BASE-CX half duplex mode
+ b1000baseCXFD(28), -- 1000BASE-CX full duplex mode
+ b1000baseTHD(29), -- 1000BASE-T half duplex mode
+ b1000baseTFD(30), -- 1000BASE-T full duplex mode
+
+ b10GbaseX(31), -- 10GBASE-X
+ b10GbaseLX4(32), -- 10GBASE-LX4
+
+ b10GbaseR(33), -- 10GBASE-R
+ b10GbaseER(34), -- 10GBASE-ER
+ b10GbaseLR(35), -- 10GBASE-LR
+ b10GbaseSR(36), -- 10GBASE-SR
+ b10GbaseW(37), -- 10GBASE-W
+ b10GbaseEW(38), -- 10GBASE-EW
+ b10GbaseLW(39), -- 10GBASE-LW
+ b10GbaseSW(40), -- 10GBASE-SW
+ -- new since RFC 3636
+ b10GbaseCX4(41), -- 10GBASE-CX4
+ b2BaseTL(42), -- 2BASE-TL
+ b10PassTS(43), -- 10PASS-TS
+ b100BaseBX10D(44), -- 100BASE-BX10D
+ b100BaseBX10U(45), -- 100BASE-BX10U
+ b100BaseLX10(46), -- 100BASE-LX10
+ b1000BaseBX10D(47), -- 1000BASE-BX10D
+ b1000BaseBX10U(48), -- 1000BASE-BX10U
+ b1000BaseLX10(49), -- 1000BASE-LX10
+ b1000BasePX10D(50), -- 1000BASE-PX10D
+ b1000BasePX10U(51), -- 1000BASE-PX10U
+ b1000BasePX20D(52), -- 1000BASE-PX20D
+ b1000BasePX20U(53) -- 1000BASE-PX20U
+ }
+
+ IANAifMauMediaAvailable ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This data type is used as the syntax of the
+ ifMauMediaAvailable and rpMauMediaAvailable objects in the
+ (updated) definition of MAU-MIB's ifMauTable and rpMauTable
+ respectively.
+
+ Possible values are:
+ other(1) - undefined (not listed below)
+ unknown(2) - MAU's true state is unknown; e.g.,
+ during initialization
+ available(3) - link, light, or loopback is normal
+ notAvailable(4) - link loss, low light, or no loopback
+ remoteFault(5) - a fault has been detected at the
+ remote end of the link. This value
+ applies to 10BASE-FB, 100BASE-T4 Far
+ End Fault Indication and non-specified
+ remote faults from a system running
+ auto-negotiation
+ invalidSignal(6) - invalid signal has been received from
+ the other end of the link, 10BASE-FB
+ only
+ remoteJabber(7) - remote fault, due to jabber
+
+ remoteLinkLoss(8) - remote fault, due to link loss
+ remoteTest(9) - remote fault, due to test
+ offline(10) - offline, Clause 37 Auto-Negotiation
+ only
+ autoNegError(11) - Auto-Negotiation Error, Clause 37
+ Auto-Negotiation only
+ pmdLinkFault(12) - PMA/PMD receive link fault. In case
+ of PAF (2BASE-TL / 10PASS-TS PHYs),
+ all PMEs in the aggregation group have
+ detected a link fault
+ wisFrameLoss(13) - WIS loss of frame, 10GBASE-W only
+ wisSignalLoss(14) - WIS loss of signal, 10GBASE-W only
+ pcsLinkFault(15) - PCS receive link fault
+ excessiveBER(16) - PCS Bit Error Ratio monitor
+ reporting excessive error ratio
+ dxsLinkFault(17) - DTE XGXS receive link fault, XAUI only
+ pxsLinkFault(18) - PHY XGXS receive link fault, XAUI only
+ availableReduced(19) - link normal, reduced bandwidth,
+ 2BASE-TL / 10PASS-TS only
+ ready(20) - at least one PME in the aggregation
+ group is detecting handshake tones,
+ 2BASE-TL / 10PASS-TS only
+
+ If the MAU is a 10M b/s link or fiber type (FOIRL, 10BASE-T,
+ 10BASE-F), then this is equivalent to the link test fail
+ state/low light function. For an AUI, 10BASE2, 10BASE5, or
+ 10BROAD36 MAU, this indicates whether loopback is detected on
+ the DI circuit. The value of this attribute persists between
+ packets for MAU types AUI, 10BASE5, 10BASE2, 10BROAD36, and
+ 10BASEFP.
+
+ At power-up or following a reset, the Media Available state
+ will be unknown(2) for AUI, 10BASE5, 10BASE2, 10BROAD36, and
+ 10BASE-FP MAUs. For these MAUs loopback will be tested on each
+ transmission during which no collision is detected.
+ If DI is receiving input when DO returns to IDL after a
+ transmission and there has been no collision during the
+ transmission, then loopback will be detected. The Media
+ Available state will only change during noncollided
+ transmissions for AUI, 10BASE2, 10BASE5, 10BROAD36, and
+ 10BASE-FP MAUs.
+
+ For 100BASE-T2, 100BASE-T4, 100BASE-TX, 100BASE-FX,
+ 100BASE-LX10, and 100BASE-BX10 PHYs the enumerations match the
+ states within the link integrity state diagram.
+ Any MAU that implements management of [IEEE802.3] Clause
+ 28 Auto-Negotiation, will map remote fault indication to
+ remoteFault(5).
+
+ Any MAU that implements management of Clause 37
+ Auto-Negotiation, will map the received RF1 and RF2 bits as
+ follows: Offline maps to offline(10), Link_Failure maps to
+ remoteFault(5), and Auto-Negotiation Error maps to
+ autoNegError(11).
+
+ The value remoteFault(5) applies to 10BASE-FB remote
+ fault indication, the 100BASE-X far-end fault indication, and
+ nonspecified remote faults from a system running Clause 28
+ Auto-Negotiation.
+
+ The value remoteJabber(7), remoteLink loss(8), or remoteTest(9)
+ SHOULD be used instead of remoteFault(5) where the reason for
+ remote fault is identified in the remote signaling protocol.
+ Where a Clause 22 MII or Clause 35 GMII is present, a logic
+ one in the remote fault bit maps to the value remoteFault(5),
+ a logic zero in the link status bit maps to the enumeration
+ notAvailable(4). The value notAvailable(4) takes precedence
+ over remoteFault(5).
+
+ For 2BASE-TL and 10PASS-TS PHYs, the value unknown(2) maps to
+ the condition where the PHY (PCS with connected PMEs) is
+ initializing, the value ready(20) maps to the condition where
+ the interface is down and at least one PME in the aggregation
+ group is ready for handshake, the value available(3) maps to
+ the condition where all the PMEs in the aggregation group are
+ up, the value notAvailable(4) maps to the condition where all
+ the PMEs in the aggregation group are down and no handshake
+ tones are detected, the value availableReduced(19) maps to the
+ condition where the interface is up, a link fault is detected
+ at the receive direction by one or more PMEs in the
+ aggregation group, but at least one PME is up and the
+ enumeration pmdLinkFault(12) maps to the condition where a link
+ fault is detected at the receive direction by all of the PMEs
+ in the aggregation group.
+
+ For 10 Gb/s the enumerations map to value of the link_fault
+ variable within the Link Fault Signaling state diagram
+ as follows: the value OK maps to the value available(3),
+ the value Local Fault maps to the value notAvailable(4),
+ and the value Remote Fault maps to the value remoteFault(5).
+ The value pmdLinkFault(12), wisFrameLoss(13),
+ wisSignalLoss(14), pcsLinkFault(15), excessiveBER(16), or
+ dxsLinkFault(17) SHOULD be used instead of the value
+ notAvailable(4), where the reason for the Local Fault state can
+ be identified through the use of the Clause 45 MDIO Interface.
+ Where multiple reasons for the Local Fault state can be
+ identified, only the highest precedence error SHOULD be
+
+ reported. This precedence in descending order is as follows:
+
+ pxsLinkFault
+ pmdLinkFault
+ wisFrameLoss
+ wisSignalLoss
+ pcsLinkFault
+ excessiveBER
+ dxsLinkFault.
+
+ Where a Clause 45 MDIO interface is present a logic zero in
+ the PMA/PMD Receive link status bit ([IEEE802.3]
+ Section 45.2.1.2.2) maps to the value pmdLinkFault(12),
+ logic one in the LOF status bit (Section 45.2.2.10.4) maps
+ to the value wisFrameLoss(13), a logic one in the LOS
+ status bit (Section 45.2.2.10.5) maps to the value
+ wisSignalLoss, a logic zero in the PCS Receive
+ link status bit (Section 45.2.3.2.2) maps to the value
+ pcsLinkFault(15), a logic one in the 10GBASE-R PCS Latched
+ high BER status bit (Section 45.2.3.12.2) maps to the value
+ excessiveBER, a logic zero in the DTE XS receive link status
+ bit (Section 45.2.5.2.2) maps to the value dxsLinkFault(17)
+ and a logic zero in the PHY XS transmit link status bit
+ (Section 45.2.4.2.2) maps to the value pxsLinkFault(18).
+
+ The most recent version of this textual convention is available
+ in the online version of this MIB module on the IANA web site.
+
+ Requests for new values should be made to IANA via email
+ (iana&iana.org)."
+ REFERENCE
+ "[IEEE802.3], Section 30.5.1.1.4"
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ available(3),
+ notAvailable(4),
+ remoteFault(5),
+ invalidSignal(6),
+ remoteJabber(7),
+ remoteLinkLoss(8),
+ remoteTest(9),
+ offline(10),
+ autoNegError(11),
+ pmdLinkFault(12),
+ wisFrameLoss(13),
+ wisSignalLoss(14),
+ pcsLinkFault(15),
+
+ excessiveBER(16),
+ dxsLinkFault(17),
+ pxsLinkFault(18),
+ availableReduced(19),
+ ready(20)
+ }
+
+ IANAifMauAutoNegCapBits ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This data type is used as the syntax of the
+ ifMauAutoNegCapabilityBits, ifMauAutoNegCapAdvertisedBits, and
+ ifMauAutoNegCapReceivedBits objects in the (updated) definition
+ of MAU-MIB's ifMauAutoNegTable.
+
+ The most recent version of this textual convention is available
+ in the online version of this MIB module on the IANA web site.
+
+ Requests for new values should be made to IANA via email
+ (iana&iana.org)."
+ REFERENCE
+ "[IEEE802.3], Section 30.6.1.1.5"
+ SYNTAX BITS {
+ bOther(0), -- other or unknown
+ b10baseT(1), -- 10BASE-T half duplex mode
+ b10baseTFD(2), -- 10BASE-T full duplex mode
+ b100baseT4(3), -- 100BASE-T4
+ b100baseTX(4), -- 100BASE-TX half duplex mode
+ b100baseTXFD(5), -- 100BASE-TX full duplex mode
+ b100baseT2(6), -- 100BASE-T2 half duplex mode
+ b100baseT2FD(7), -- 100BASE-T2 full duplex mode
+ bFdxPause(8), -- PAUSE for full-duplex links
+ bFdxAPause(9), -- Asymmetric PAUSE for full-duplex
+ -- links
+ bFdxSPause(10), -- Symmetric PAUSE for full-duplex
+ -- links
+ bFdxBPause(11), -- Asymmetric and Symmetric PAUSE for
+ -- full-duplex links
+ b1000baseX(12), -- 1000BASE-X, -LX, -SX, -CX half
+ -- duplex mode
+ b1000baseXFD(13), -- 1000BASE-X, -LX, -SX, -CX full
+ -- duplex mode
+ b1000baseT(14), -- 1000BASE-T half duplex mode
+ b1000baseTFD(15) -- 1000BASE-T full duplex mode
+ }
+
+ IANAifJackType ::= TEXTUAL-CONVENTION
+ STATUS current
+
+ DESCRIPTION
+ "Common enumeration values for repeater and interface MAU
+ jack types. This data type is used as the syntax of the
+ ifJackType and rpJackType objects in the (updated) definition
+ of MAU-MIB's ifJackTable and rpJackTable respectively.
+
+ Possible values are:
+ other(1) - undefined or unknown
+ rj45(2) - RJ45
+ rj45S(3) - RJ45 shielded
+ db9(4) - DB9
+ bnc(5) - BNC
+ fAUI(6) - AUI female
+ mAUI(7) - AUI male
+ fiberSC(8) - SC fiber
+ fiberMIC(9) - MIC fiber
+ fiberST(10) - ST fiber
+ telco(11) - Telco
+ mtrj(12) - MT-RJ fiber
+ hssdc(13) - fiber channel style-2
+ fiberLC(14) - LC fiber
+ cx4(15) - IB4X for 10GBASE-CX4
+
+ The most recent version of this textual convention is available
+ in the online version of this MIB module on the IANA web site.
+
+ Requests for new values should be made to IANA via email
+ (iana&iana.org)."
+ SYNTAX INTEGER {
+ other(1),
+ rj45(2),
+ rj45S(3),
+ db9(4),
+ bnc(5),
+ fAUI(6),
+ mAUI(7),
+ fiberSC(8),
+ fiberMIC(9),
+ fiberST(10),
+ telco(11),
+ mtrj(12),
+ hssdc(13),
+ fiberLC(14),
+ -- new since RFC 3636
+ cx4(15)
+ }
+
+ -- OBJECT IDENTITIES for MAU types
+
+ -- (see rpMauType and ifMauType of MAU-MIB for usage)
+ -- The following definitions has been moved from RFC 3636 and
+ -- no longer appear in its revision.
+
+ dot3MauType OBJECT IDENTIFIER ::= { mib-2 snmpDot3MauMgt(26) 4 }
+
+ dot3MauTypeAUI OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "no internal MAU, view from AUI"
+ REFERENCE "[IEEE802.3], Section 7"
+ ::= { dot3MauType 1 }
+
+ dot3MauType10Base5 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "thick coax MAU"
+ REFERENCE "[IEEE802.3], Section 7"
+ ::= { dot3MauType 2 }
+
+ dot3MauTypeFoirl OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "FOIRL MAU"
+ REFERENCE "[IEEE802.3], Section 9.9"
+ ::= { dot3MauType 3 }
+
+ dot3MauType10Base2 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "thin coax MAU"
+ REFERENCE "[IEEE802.3], Section 10"
+ ::= { dot3MauType 4 }
+
+ dot3MauType10BaseT OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "UTP MAU.
+ Note that it is strongly recommended that
+ agents return either dot3MauType10BaseTHD or
+ dot3MauType10BaseTFD if the duplex mode is
+ known. However, management applications should
+ be prepared to receive this MAU type value from
+ older agent implementations."
+ REFERENCE "[IEEE802.3], Section 14"
+ ::= { dot3MauType 5 }
+
+ dot3MauType10BaseFP OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "passive fiber MAU"
+ REFERENCE "[IEEE802.3], Section 16"
+ ::= { dot3MauType 6 }
+
+ dot3MauType10BaseFB OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "sync fiber MAU"
+ REFERENCE "[IEEE802.3], Section 17"
+ ::= { dot3MauType 7 }
+
+ dot3MauType10BaseFL OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "async fiber MAU.
+ Note that it is strongly recommended that
+ agents return either dot3MauType10BaseFLHD or
+ dot3MauType10BaseFLFD if the duplex mode is
+ known. However, management applications should
+ be prepared to receive this MAU type value from
+ older agent implementations."
+ REFERENCE "[IEEE802.3], Section 18"
+ ::= { dot3MauType 8 }
+
+ dot3MauType10Broad36 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "broadband DTE MAU.
+ Note that 10BROAD36 MAUs can be attached to
+ interfaces but not to repeaters."
+ REFERENCE "[IEEE802.3], Section 11"
+ ::= { dot3MauType 9 }
+
+ ------ new since RFC 1515:
+ dot3MauType10BaseTHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "UTP MAU, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 14"
+ ::= { dot3MauType 10 }
+
+ dot3MauType10BaseTFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "UTP MAU, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 14"
+ ::= { dot3MauType 11 }
+
+ dot3MauType10BaseFLHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "async fiber MAU, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 18"
+ ::= { dot3MauType 12 }
+
+ dot3MauType10BaseFLFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "async fiber MAU, full duplex mode"
+
+ REFERENCE "[IEEE802.3], Section 18"
+ ::= { dot3MauType 13 }
+
+ dot3MauType100BaseT4 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "4 pair category 3 UTP"
+ REFERENCE "[IEEE802.3], Section 23"
+ ::= { dot3MauType 14 }
+
+ dot3MauType100BaseTXHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "2 pair category 5 UTP, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 25"
+ ::= { dot3MauType 15 }
+
+ dot3MauType100BaseTXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "2 pair category 5 UTP, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 25"
+ ::= { dot3MauType 16 }
+
+ dot3MauType100BaseFXHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "X fiber over PMT, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 26"
+ ::= { dot3MauType 17 }
+
+ dot3MauType100BaseFXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "X fiber over PMT, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 26"
+ ::= { dot3MauType 18 }
+
+ dot3MauType100BaseT2HD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "2 pair category 3 UTP, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 32"
+ ::= { dot3MauType 19 }
+
+ dot3MauType100BaseT2FD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "2 pair category 3 UTP, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 32"
+ ::= { dot3MauType 20 }
+
+ ------ new since RFC 2239:
+ dot3MauType1000BaseXHD OBJECT-IDENTITY
+ STATUS current
+
+ DESCRIPTION "PCS/PMA, unknown PMD, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 36"
+ ::= { dot3MauType 21 }
+
+ dot3MauType1000BaseXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "PCS/PMA, unknown PMD, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 36"
+ ::= { dot3MauType 22 }
+
+ dot3MauType1000BaseLXHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Fiber over long-wavelength laser, half duplex
+ mode"
+ REFERENCE "[IEEE802.3], Section 38"
+ ::= { dot3MauType 23 }
+
+ dot3MauType1000BaseLXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Fiber over long-wavelength laser, full duplex
+ mode"
+ REFERENCE "[IEEE802.3], Section 38"
+ ::= { dot3MauType 24 }
+
+ dot3MauType1000BaseSXHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Fiber over short-wavelength laser, half
+ duplex mode"
+ REFERENCE "[IEEE802.3], Section 38"
+ ::= { dot3MauType 25 }
+
+ dot3MauType1000BaseSXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Fiber over short-wavelength laser, full
+ duplex mode"
+ REFERENCE "[IEEE802.3], Section 38"
+ ::= { dot3MauType 26 }
+
+ dot3MauType1000BaseCXHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Copper over 150-Ohm balanced cable, half
+ duplex mode"
+ REFERENCE "[IEEE802.3], Section 39"
+ ::= { dot3MauType 27 }
+
+ dot3MauType1000BaseCXFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Copper over 150-Ohm balanced cable, full
+
+ duplex mode"
+ REFERENCE "[IEEE802.3], Section 39"
+ ::= { dot3MauType 28 }
+
+ dot3MauType1000BaseTHD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Four-pair Category 5 UTP, half duplex mode"
+ REFERENCE "[IEEE802.3], Section 40"
+ ::= { dot3MauType 29 }
+
+ dot3MauType1000BaseTFD OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Four-pair Category 5 UTP, full duplex mode"
+ REFERENCE "[IEEE802.3], Section 40"
+ ::= { dot3MauType 30 }
+
+ ------ new since RFC 2668:
+ dot3MauType10GigBaseX OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "X PCS/PMA, unknown PMD."
+ REFERENCE "[IEEE802.3], Section 48"
+ ::= { dot3MauType 31 }
+
+ dot3MauType10GigBaseLX4 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "X fiber over WWDM optics"
+ REFERENCE "[IEEE802.3], Section 53"
+ ::= { dot3MauType 32 }
+
+ dot3MauType10GigBaseR OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "R PCS/PMA, unknown PMD."
+ REFERENCE "[IEEE802.3], Section 49"
+ ::= { dot3MauType 33 }
+
+ dot3MauType10GigBaseER OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "R fiber over 1550 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 34 }
+
+ dot3MauType10GigBaseLR OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "R fiber over 1310 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 35 }
+
+ dot3MauType10GigBaseSR OBJECT-IDENTITY
+
+ STATUS current
+ DESCRIPTION "R fiber over 850 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 36 }
+
+ dot3MauType10GigBaseW OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "W PCS/PMA, unknown PMD."
+ REFERENCE "[IEEE802.3], Section 49 and 50"
+ ::= { dot3MauType 37 }
+
+ dot3MauType10GigBaseEW OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "W fiber over 1550 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 38 }
+
+ dot3MauType10GigBaseLW OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "W fiber over 1310 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 39 }
+
+ dot3MauType10GigBaseSW OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "W fiber over 850 nm optics"
+ REFERENCE "[IEEE802.3], Section 52"
+ ::= { dot3MauType 40 }
+
+ ------ new since RFC 3636:
+ dot3MauType10GigBaseCX4 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "X copper over 8 pair 100-Ohm balanced cable"
+ REFERENCE "[IEEE802.3], Section 54"
+ ::= { dot3MauType 41 }
+
+ dot3MauType2BaseTL OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Voice grade UTP copper, up to 2700m, optional PAF"
+ REFERENCE "[IEEE802.3], Sections 61 and 63"
+ ::= { dot3MauType 42 }
+
+ dot3MauType10PassTS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Voice grade UTP copper, up to 750m, optional PAF"
+ REFERENCE "[IEEE802.3], Sections 61 and 62"
+ ::= { dot3MauType 43 }
+
+ dot3MauType100BaseBX10D OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber OLT, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 58"
+ ::= { dot3MauType 44 }
+
+ dot3MauType100BaseBX10U OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber ONU, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 58"
+ ::= { dot3MauType 45 }
+
+ dot3MauType100BaseLX10 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Two single-mode fibers, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 58"
+ ::= { dot3MauType 46 }
+
+ dot3MauType1000BaseBX10D OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber OLT, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 59"
+ ::= { dot3MauType 47 }
+
+ dot3MauType1000BaseBX10U OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber ONU, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 59"
+ ::= { dot3MauType 48 }
+
+ dot3MauType1000BaseLX10 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "Two sigle-mode fiber, long wavelength, 10km"
+ REFERENCE "[IEEE802.3], Section 59"
+ ::= { dot3MauType 49 }
+
+ dot3MauType1000BasePX10D OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber EPON OLT, 10km"
+ REFERENCE "[IEEE802.3], Section 60"
+ ::= { dot3MauType 50 }
+
+ dot3MauType1000BasePX10U OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber EPON ONU, 10km"
+ REFERENCE "[IEEE802.3], Section 60"
+ ::= { dot3MauType 51 }
+
+ dot3MauType1000BasePX20D OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber EPON OLT, 20km"
+ REFERENCE "[IEEE802.3], Section 60"
+ ::= { dot3MauType 52 }
+
+ dot3MauType1000BasePX20U OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION "One single-mode fiber EPON ONU, 20km"
+ REFERENCE "[IEEE802.3], Section 60"
+ ::= { dot3MauType 53 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB
new file mode 100644
index 0000000..856ed5f
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB
@@ -0,0 +1,1319 @@
+IANA-PRINTER-MIB DEFINITIONS ::= BEGIN
+ -- http://www.iana.org/assignments/ianaprinter-mib
+
+IMPORTS
+ MODULE-IDENTITY,
+ mib-2
+ FROM SNMPv2-SMI -- [RFC2578]
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC; -- [RFC2579]
+
+ianaPrinterMIB MODULE-IDENTITY
+ LAST-UPDATED "200509140000Z" -- September 14, 2005
+
+ ORGANIZATION "IANA"
+ CONTACT-INFO "Internet Assigned Numbers Authority
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1 310 823 9358
+ E-Mail: iana&iana.org"
+
+ DESCRIPTION "This MIB module defines a set of printing-related
+ TEXTUAL-CONVENTIONs for use in Printer MIB (RFC 3805),
+ Finisher MIB (RFC 3806), and other MIBs which need to
+ specify printing mechanism details.
+
+ Any additions or changes to the contents of this MIB
+ module require either publication of an RFC, or
+ Designated Expert Review as defined in RFC 2434,
+ Guidelines for Writing an IANA Considerations Section
+ in RFCs. The Designated Expert will be selected by
+ the IESG Area Director(s) of the Applications Area.
+
+ Copyright (C) The Internet Society (2004). The
+ initial version of this MIB module was published
+ in RFC 3805. For full legal notices see the RFC
+ itself or see:
+ http://www.ietf.org/copyrights/ianamib.html"
+
+ REVISION "200509140000Z" -- September 14, 2005
+ DESCRIPTION "Updates to include missing 'unknown' values
+ for PrtCoverStatusTC, PrtChannelTypeTC,
+ PrtAlertGroupTC and removal of comment for
+ for PrtAlertGroupTC."
+
+ REVISION "200406020000Z" -- June 2, 2004
+ DESCRIPTION "Original version, published in coordination
+ with Printer MIB (RFC 3805)."
+ ::= { mib-2 109 }
+
+--
+-- Generic TEXTUAL-CONVENTIONs
+--
+
+PrtCoverStatusTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtCoverStatus in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "Values for encoding the state of a particular cover or
+ access panel on the printer case or enclosure."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ coverOpen(3),
+ coverClosed(4),
+ interlockOpen(5),
+ interlockClosed(6)
+
+ }
+
+--
+-- General Group TEXTUAL-CONVENTIONs
+--
+
+PrtGeneralResetTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtGeneralReset in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "Values for reading and writing the prtGeneralReset object.
+
+ If a device does not have NVRAM, the device shall none the
+ less respond to a SET with the value resetToNVRAM(5) with a
+ sort of warm reset that resets the device to implementation-
+ defined state that is preferably under control of the system
+ administrator by some means outside the scope of the Printer
+ MIB specification."
+
+ SYNTAX INTEGER {
+ notResetting(3),
+ powerCycleReset(4), -- Cold Start
+ resetToNVRAM(5), -- Warm Start
+ resetToFactoryDefaults(6) -- Reset contents of
+ -- NVRAM to factory
+ -- defaults
+ }
+--
+-- Channel Group TEXTUAL-CONVENTIONs
+--
+
+PrtChannelTypeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtChannelType in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "This enumeration indicates the type of channel that is
+ receiving jobs."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ chSerialPort(3),
+ chParallelPort(4),
+ chIEEE1284Port(5),
+ chSCSIPort(6),
+ chAppleTalkPAP(7),
+ -- AppleTalk Printer
+ -- Access Protocol (PAP)
+ --
+ -- prtChannelInformation entry:
+
+ --
+ -- Printer Name
+ -- Keyword: Name
+ -- Syntax: Name
+ -- Status: Optional
+ -- Multiplicity: Single
+ -- Description: The name of the printer
+ -- within the AppleTalk naming scope
+ chLPDServer(8),
+ -- prtChannelInformation entry:
+ --
+ -- Printer queue name
+ -- Keyword: Queue
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: queue name as
+ -- defined in [RFC1179].
+ chNetwareRPrinter(9),
+ -- Novell, Inc.
+ -- For each entry of this type, the
+ -- prtChannelInformation must have a pair of
+ -- keywords. For Netware 3.x channels this must
+ -- be a (PServer, Printer) pair. For Netware
+ -- 4.x channels and for IntranetWare channels
+ -- this must be a (NDSTree, NDSPrinter) pair.
+ --
+ -- prtChannelInformation entries:
+
+ -- Print Server Name
+ -- Keyword: PServer
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The Pserver's SAP name
+ --
+ -- Printer Number
+ -- Keyword: Printer
+ -- Syntax: Integer
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The printer number
+ --
+ -- NDSTree
+ -- Keyword: NDSTree
+ -- Syntax: Name
+ -- Multiplicity: Single
+ -- Description: The tree's SAP name
+
+ --
+ -- NDS Printer object
+ -- Keyword: NDSPrinter
+ -- Syntax: Text (Unicode)
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The fully qualified
+ -- name of the Printer
+ --
+ -- In the Netware 3.x environment, the
+ -- client checks the Bindery object
+ -- representing the named PServer. The
+ -- client then checks for queues which
+ -- are associated with the numbered
+ -- printer. In the 4.x and IntraNetware
+ -- environment, the client looks up the
+ -- queues which are associated with the
+ -- NDS Printer Object in the named Tree.
+ -- Depending on client access rights to
+ -- those queues, the client submits jobs
+ -- to the appropriate queue.
+ chNetwarePServer(10),
+ -- Novell,Inc.
+ -- For each entry of this type, the
+ -- prtChannelInformation must have a pair
+ -- of keywords. For Netware 3.x channels
+ -- this must be a (Server, PServer) pair.
+ -- For Netware 4.x and IntranetWare
+ -- channels, this must be a
+ -- (NDSTree, NDSPServer) pair.
+ --
+ -- prtChannelInformation entries:
+ --
+ -- Server Name
+ -- Keyword: Server
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The SAP name of the
+ -- server for which the PServer is defined.
+ --
+ -- PServer
+ -- Keyword: PServer
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The bindery name of
+ -- the PServer
+
+ --
+ -- NDS Tree
+ -- Keyword: NDSTree
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The NDS Tree name
+ --
+ -- PServer
+ -- Keyword: NDSPServer
+ -- Syntax: Text (Unicode)
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The fully qualified
+ -- name of the PServer object in the tree.
+ --
+ -- In the 3.x environment, the client
+ -- checks the bindery object
+ -- representing the named PServer on the
+ -- named Server. In the 4.x and
+ -- IntranetWare environment,
+ -- the client checks the NDS object
+ -- representing the named PServer in the
+ -- named Tree. In either case, the
+ -- client then checks for all queues
+ -- associated with the Pserver object.
+ -- Depending on client access rights
+ -- to those queues, the client submits
+ -- jobs to the appropriate queue.
+ chPort9100(11),
+ -- DEPRECATED
+ -- (see chPortTCP - 37; chBidirPortTCP - 38)
+ chAppSocket(12),
+ -- A bi-directional, LPD-like, protocol using
+ -- 9101 for control and 9100 for data.
+ -- Adobe Systems, Inc.
+ chFTP(13), -- [RFC959]
+ chTFTP(14), -- [RFC1350]
+ chDLCLLCPort(15),
+ chIBM3270(16), -- IBM Coax
+ chIBM5250(17), -- IBM Twinax
+ chFax(18),
+ chIEEE1394(19),
+ chTransport1(20),
+ -- TCP port 35, for reserved TCP port list see
+ -- [RFC3232]. This RFC should also be
+ -- referenced for other channel
+ -- enumerations utilizing TCP port
+
+ -- numbers 0 through 1024.
+ chCPAP(21), -- TCP port 170
+ -- Digital Equipment Corp.
+ chDCERemoteProcCall(22), -- OSF
+ -- DEPRECATED
+ chONCRemoteProcCall(23), -- SUN Microsystems
+ -- DEPRECATED
+ chOLE(24), -- Microsoft
+ -- DEPRECATED
+ chNamedPipe(25),
+ chPCPrint(26), -- Banyan
+ chServerMessageBlock(27),
+ -- File/Print sharing protocol used by
+ -- various network operating systems
+ -- from IBM 3Com, Microsoft and others
+ --
+ -- prtChannelInformation entry:
+ --
+ -- Service Name
+ -- Keyword: Name
+ -- Syntax: Name
+ -- Status: Optional
+ -- Multiplicity: Single
+ -- Description: The service name of
+ -- the printer
+ chDPMF(28), -- IBM Infoprint
+ chDLLAPI(29), -- Microsoft
+ -- DEPRECATED
+ chVxDAPI(30), -- Microsoft
+ -- DEPRECATED
+ chSystemObjectManager(31), -- IBM
+ chDECLAT(32),
+ -- Digital Equipment Corp.
+ --
+ -- prtChannelInformation entries:
+ --
+ -- Port Name
+ -- Keyword: Port
+ -- Syntax: Name
+ -- Status: Conditionally
+ -- Mandatory
+ -- (see note below)
+ -- Multiplicity: Single
+ -- Description: LAT port name
+ --
+ -- Service Name
+ -- Keyword: Service
+ -- Syntax: Name
+
+ -- Status: Conditionally
+ -- Mandatory
+ -- Multiplicity: Single
+ -- Description: LAT service name
+ --
+ -- The LAT channel may be
+ -- identified by either a port or
+ -- service, so either a
+ -- Port or Service entry must be
+ -- specified, but not both.
+ chNPAP(33),
+ chUSB(34), -- Not in RFC 1759
+ -- Universal Serial Bus
+ chIRDA(35), -- Not in RFC 1759
+ -- Infrared Data Assoc. Prot.
+ chPrintXChange(36), -- Not in RFC 1759
+ -- PrintXChange Protocol
+ chPortTCP(37), -- Not in RFC 1759
+ -- A unidirectional "raw" TCP
+ -- channel that uses an administratively
+ -- assigned TCP port address.
+ --
+ -- prtChannelInformation entry:
+ --
+ -- Port Number
+ -- Keyword: Port
+ -- Syntax: decimal number
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: TCP port number
+ chBidirPortTCP(38), -- Not in RFC 1759
+ -- A bi-directional version of chPortTCP
+ --
+ -- prtChannelInformation entries:
+ -- (See chPortTCP)
+ chUNPP(39), -- Not in RFC 1759
+ -- Universal Network Printing
+ -- Protocol(UNPP). A bi-directional,
+ -- multiport network printing
+ -- application protocol available on
+ -- multiple transport protocols.
+ -- Underscore, Inc.
+ -- Contact: info&underscore.com
+ chAppleTalkADSP(40), -- Not in RFC 1759
+ -- AppleTalk Data Stream Protocol.
+ -- ADSP is part of the AppleTalk
+ -- suite of protocols.
+ -- It is a symmetric, connection-
+
+ -- oriented protocol that makes
+ -- possible the establishment
+ -- and maintenance of full-duplex
+ -- streams of data bytes between
+ -- two sockets in an AppleTalk
+ -- internet.
+ -- See [APPLEMAC].
+ chPortSPX(41), -- Not in RFC 1759
+ -- Sequenced Packet Exchange (SPX)
+ -- socket.
+ -- Novell, Inc. Similar to TCP, a
+ -- bi-directional data pipe using
+ -- Novell SPX as a transport.
+ --
+ -- prtChannelInformation entries:
+ --
+ -- Network Number
+ -- Keyword: Net
+ -- Syntax: HexString
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The network number
+ --
+ -- Node Number
+ -- Keyword: Node
+ -- Syntax: HexString
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The node number
+ --
+ -- Socket Number
+ -- Keyword: Socket
+ -- Syntax: HexString
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The SPX socket number
+ --
+ -- There must be exactly one "Net" and
+ -- one "Node" and one "Socket" entry. A
+ -- HexString is a binary value
+ -- represented as a string of
+ -- ASCII characters using hexadecimal
+ -- notation.
+ chPortHTTP(42), -- Not in RFC 1759
+ -- Hypertext Transfer Protocol. See [RFC1945]
+ -- and [RFC2616].
+ chNDPS(43), -- Not in RFC 1759
+ -- Novell, Inc.
+
+ --
+ -- prtChannelInformation entry:
+ --
+ -- Printer Agent Name
+ -- Keyword: PA
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Description: The NDPS Printer
+ -- Agent Name
+ chIPP(44), -- Not in RFC 1759
+ -- Internet Printing Protocol (IPP),
+ -- (IPP/1.1 - see [RFC2910] and [RFC2911])
+ -- also applies to all future versions of IPP.
+ --
+ -- IPP Printer URI
+ -- Keyword: URI
+ -- Syntax: URI (Unicode UTF-8 per
+ -- [RFC2396])
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Default: not applicable
+ -- Description: URI of this IPP Printer
+ -- within Internet naming scope. Unicode
+ -- UTF-8 [RFC3629] string with
+ -- hexadecimal escapes for any non-ASCII
+ -- characters (per [RFC2396]).
+ -- Conformance: An IPP Printer shall list all
+ -- IPP URI it supports (one per IPP Channel
+ -- entry). If a URI contains the 'http:'
+ -- scheme it must have an explicit port.
+ -- See: [RFC3629], [RFC2396], [RFC2910],
+ -- [RFC2911].
+ --
+ -- IPP Printer Client Authentication
+ -- Keyword: Auth
+ -- Syntax: Keyword
+ -- Status: Optional
+ -- Multiplicity: Single
+ -- Default: 'none'
+ -- Description: A client authentication
+ -- mechanism supported for this IPP Printer
+ -- URI:
+ -- 'none'
+ -- no client authentication mechanism
+ -- 'requesting-user-name'
+ -- authenticated user in 'requesting-
+ -- user-name'
+
+ -- 'basic'
+ -- authenticated user via HTTP Basic
+ -- mechanism
+ -- 'digest'
+ -- authenticated user via HTTP Digest
+ -- mechanism
+ -- 'certificate'
+ -- authenticated user via certificate
+ -- mechanism
+ -- Conformance: An IPP Printer should list
+ -- all IPP client authentication mechanisms
+ -- it supports (one per IPP Channel entry).
+ -- See: [RFC2911] and [RFC2910].
+ --
+ -- IPP Printer Security
+ -- Keyword: Security
+ -- Syntax: Keyword
+ -- Status: Optional
+ -- Multiplicity: Single
+ -- Default: 'none'
+ -- Description: A security mechanism
+ -- supported for this IPP Printer URI:
+ -- 'none'
+ -- no security mechanism
+ -- 'ssl3'
+ -- SSL3 secure communications channel
+ -- protocol
+ -- 'tls'
+ -- TLS secure communications channel
+ -- protocol
+ -- Conformance: An IPP Printer should list
+ -- all IPP security mechanisms it supports
+ -- (one per IPP Channel entry).
+ -- See: [RFC2246], [RFC2911].
+ --
+ -- IPP Printer Protocol Version
+ -- Keyword: Version
+ -- Syntax: Keyword
+ -- Status: Optional
+ -- Multiplicity: Multiple
+ -- Default: '1.1'
+ -- Description: All of the IPP protocol
+ -- versions (major.minor) supported for
+ -- this IPP Printer URI:
+ -- '1.0'
+ -- IPP/1.0 conforming Printer
+ -- '1.1'
+ -- IPP/1.1 conforming Printer
+
+ -- Conformance: An IPP Printer should list
+ -- all IPP versions it supports (all listed
+ -- in each IPP Channel entry). An IPP
+ -- Client should select the highest
+ -- numbered version the IPP Client supports
+ -- for use in all IPP Requests (for optimum
+ -- interworking).
+ -- See: [RFC2911].
+ chSMTP(45)
+ -- Print Job submission via Simple Mail
+ -- Transfer Protocol (SMTP) - see [RFC2821]
+ --
+ -- prtChannelInformation entry:
+ --
+ -- Keyword: Mailto
+ -- Syntax: Name
+ -- Status: Mandatory
+ -- Multiplicity: Single
+ -- Default: not applicable
+ -- Description: The SMTP URL of the printer.
+}
+
+--
+-- Interpreter Group TEXTUAL-CONVENTIONs
+--
+
+PrtInterpreterLangFamilyTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtInterpreterLangFamily in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "This enumeration indicates the type of interpreter that is
+ receiving jobs."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2), -- Not in RFC 1759
+ langPCL(3), -- PCL. Starting with PCL version 5,
+ -- HP-GL/2 is included as part of the
+ -- PCL language.
+ -- PCL and HP-GL/2 are registered
+ -- trademarks of Hewlett-Packard
+ -- Company.
+ langHPGL(4), -- Hewlett-Packard Graphics Language.
+ -- HP-GL is a registered trademark of
+ -- Hewlett-Packard Company.
+ langPJL(5), -- Peripheral Job Language. Appears in
+ -- the data stream between data intended
+ -- for a page description language.
+ -- Hewlett-Packard Co.
+
+ langPS(6), -- PostScript (tm) Language
+ -- Postscript - a trademark of Adobe
+ -- Systems Incorporated which may be
+ -- registered in certain jurisdictions
+ langIPDS(7), -- Intelligent Printer Data Stream
+ -- Bi-directional print data stream for
+ -- documents consisting of data objects
+ -- (text, image, graphics, bar codes),
+ -- resources (fonts, overlays) and page,
+ -- form and finishing instructions.
+ -- Facilitates system level device
+ -- control, document tracking and error
+ -- recovery throughout the print
+ -- process.
+ -- IBM Corporation.
+ langPPDS(8), -- IBM Personal Printer Data Stream.
+ -- Originally called IBM ASCII, the name
+ -- was changed to PPDS when the Laser
+ -- Printer was introduced in 1989.
+ -- Lexmark International, Inc.
+ langEscapeP(9), -- Epson Corp.
+ langEpson(10),
+ langDDIF(11), -- Digital Document Interchange Format
+ -- Digital Equipment Corp., Maynard MA
+ langInterpress(12),
+ -- Xerox Corp.
+ langISO6429(13), -- ISO 6429. Control functions for
+ -- Coded Character Sets (has ASCII
+ -- control characters, plus additional
+ -- controls for
+ -- character imaging devices.)
+ langLineData(14), -- line-data: Lines of data as
+ -- separate ASCII or EBCDIC records
+ -- and containing no control functions
+ -- (no CR, LF, HT, FF, etc.)
+ -- For use with traditional line
+ -- printers. May use CR and/or LF to
+ -- delimit lines, instead of records.
+ -- See ISO 10175 Document Printing
+ -- Application (DPA) [ISO10175].
+ langMODCA(15), -- Mixed Object Document Content
+ -- Architecture
+ -- Definitions that allow the
+ -- composition, interchange, and
+ -- presentation of final form
+ -- documents as a collection of data
+ -- objects (text, image, graphics, bar
+ -- codes), resources (fonts, overlays)
+
+ -- and page, form and finishing
+ -- instructions.
+ -- IBM Corporation.
+ langREGIS(16), -- Remote Graphics Instruction Set,
+ -- Digital Equipment Corp., Maynard MA
+ langSCS(17), -- SNA Character String
+ -- Bi-directional print data stream for
+ -- SNA LU-1 mode of communication.
+ -- IBM
+ langSPDL(18), -- ISO 10180 Standard Page Description
+ -- Language
+ -- ISO Standard
+ langTEK4014(19), -- Tektronix Corp.
+ langPDS(20),
+ langIGP(21), -- Printronix Corp.
+ langCodeV(22), -- Magnum Code-V, Image and printer
+ -- control language used to control
+ -- impact/dot-matrix printers.
+ -- QMS, Inc., Mobile AL
+ langDSCDSE(23), -- DSC-DSE: Data Stream Compatible and
+ -- Emulation Bi-directional print data
+ -- stream for non-SNA (DSC) and SNA LU-3
+ -- 3270 controller (DSE) communications
+ -- IBM
+ langWPS(24), -- Windows Printing System, Resource
+ -- based command/data stream used by
+ -- Microsoft At Work Peripherals.
+ -- Developed by the Microsoft
+ -- Corporation.
+ langLN03(25), -- Early DEC-PPL3, Digital Equipment
+ -- Corp.
+ langCCITT(26),
+ langQUIC(27), -- QUIC (Quality Information Code), Page
+ -- Description Language for laser
+ -- printers. Included graphics, printer
+ -- control capability and emulation of
+ -- other well-known printer.
+ -- QMS, Inc.
+ langCPAP(28), -- Common Printer Access Protocol
+ -- Digital Equipment Corp.
+ langDecPPL(29), -- Digital ANSI-Compliant Printing
+ -- Protocol
+ -- (DEC-PPL)
+ -- Digital Equipment Corp.
+ langSimpleText(30),
+ -- simple-text: character coded data,
+ -- including NUL, CR , LF, HT, and FF
+ -- control characters. See ISO 10175
+
+ -- Document Printing Application (DPA)
+ -- [ISO10175].
+ langNPAP(31), -- Network Printer Alliance Protocol
+ -- (NPAP). This protocol has been
+ -- superseded by the IEEE 1284.1 TIPSI
+ -- Std (ref. LangTIPSI(49)).
+ langDOC(32), -- Document Option Commands, Appears in
+ -- the data stream between data
+ -- intended for a page description.
+ -- QMS, Inc.
+ langimPress(33), -- imPRESS, Page description language
+ -- originally developed for the
+ -- ImageServer product line. A binary
+ -- language providing representations
+ -- of text, simple graphics, and some
+ -- large forms (simple
+ -- bit-map and CCITT group 3/4
+ -- encoded).The
+ -- language was intended to be sent over
+ -- an 8-bit channel and supported early
+ -- document preparation languages (e.g.,
+ -- TeX and TROFF).
+ -- QMS, Inc.
+ langPinwriter(34),
+ -- 24 wire dot matrix printer for
+ -- USA, Europe, and Asia except
+ -- Japan.
+ -- More widely used in Germany, and
+ -- some Asian countries than in US.
+ -- NEC
+ langNPDL(35), -- Page printer for Japanese market.
+ -- NEC
+ langNEC201PL(36), -- Serial printer language used in
+ -- the Japanese market.
+ -- NEC
+ langAutomatic(37),
+ -- Automatic PDL sensing. Automatic
+ -- sensing of the interpreter
+ -- language family by the printer
+ -- examining the document content.
+ -- Which actual interpreter language
+ -- families are sensed depends on
+ -- the printer implementation.
+ langPages(38), -- Page printer Advanced Graphic
+ -- Escape Set
+ -- IBM Japan
+ langLIPS(39), -- LBP Image Processing System
+ langTIFF(40), -- Tagged Image File Format (Aldus)
+
+ langDiagnostic(41),
+ -- A hex dump of the input to the
+ -- interpreter
+ langPSPrinter(42),
+ -- The PostScript Language used for
+ -- control (with any PDLs)
+ -- Adobe Systems Incorporated
+ langCaPSL(43), -- Canon Print Systems Language
+ langEXCL(44), -- Extended Command Language
+ -- Talaris Systems Inc.
+ langLCDS(45), -- Line Conditioned Data Stream
+ -- Xerox Corporation
+ langXES(46), -- Xerox Escape Sequences
+ -- Xerox Corporation
+ langPCLXL(47), -- Not in RFC 1759
+ -- Printer Control Language. Extended
+ -- language features for printing, and
+ -- printer control.
+ -- Hewlett-Packard Co.
+ langART(48), -- Not in RFC 1759
+ -- Advanced Rendering Tools (ART).
+ -- Page Description language
+ -- originally developed for the Laser
+ -- Press printers.
+ -- Technical reference manual: "ART IV
+ -- Reference Manual", No F33M.
+ -- Fuji Xerox Co., Ltd.
+ langTIPSI(49), -- Not in RFC 1759
+ -- Transport Independent Printer
+ -- System Interface (ref. IEEE Std.
+ -- 1284.1)
+ langPrescribe(50), -- Not in RFC 1759
+ -- Page description and printer
+ -- control language. It can be
+ -- described with ordinary ASCII
+ -- Technical reference manual:
+ -- "PRESCRIBE II Programming Manual"
+ langLinePrinter(51), -- Not in RFC 1759
+ -- A simple-text character stream which
+ -- supports the control codes LF, VT,
+ -- FF, and plus Centronics or
+ -- Dataproducts Vertical Format Unit
+ -- (VFU) language is commonly used on
+ -- many older model line and matrix
+ -- printers.
+ langIDP(52), -- Not in RFC 1759
+ -- Imaging Device Protocol
+ -- Apple Computer.
+
+ langXJCL(53), -- Not in RFC 1759
+ -- Xerox Job Control Language (JCL).
+ -- A Job Control language originally
+ -- developed for the LaserPress printers
+ -- and is capable of switching PDLs.
+ -- Technical reference manual:
+ -- "ART IV Reference Manual", No F33M.
+ -- Fuji Xerox Co., Ltd.
+ langPDF(54), -- Not in RFC 1759
+ -- Adobe Portable Document Format
+ -- Adobe Systems, Inc.
+ langRPDL(55), -- Not in RFC 1759
+ -- Ricoh Page Description Language for
+ -- printers.
+ -- Technical manual "RPDL command
+ -- reference" No.307029
+ -- RICOH, Co. LTD
+ langIntermecIPL(56), -- Not in RFC 1759
+ -- Intermec Printer Language for label
+ -- printers.
+ -- Technical Manual: "IPL Programmers
+ -- Reference Manual"
+ -- Intermec Corporation
+ langUBIFingerprint(57), -- Not in RFC 1759
+ -- An intelligent basic-like programming
+ -- language for label printers.
+ -- Reference Manual: "UBI Fingerprint
+ -- 7.1", No. 1-960434-00
+ -- United Barcode Industries
+ langUBIDirectProtocol(58), -- Not in RFC 1759
+ -- An intelligent control language for
+ -- label printers.
+ -- Programmers guide: " UBI Direct
+ -- Protocol", No. 1-960419-00
+ -- United Barcode Industries
+ langFujitsu(59), -- Not in RFC 1759
+ -- Fujitsu Printer Language
+ -- Reference Manual:
+ -- "FM Printer Sequence" No. 80HP-0770
+ -- FUJITSU LIMITED
+ langCGM(60), -- Not in RFC 1759
+ -- Computer Graphics Metafile
+ -- MIME type 'image/cgm'
+ langJPEG(61), -- Not in RFC 1759
+ -- Joint Photographic Experts Group
+ -- MIME type 'image/jpeg'
+ langCALS1(62), -- Not in RFC 1759
+ -- US DOD CALS1 (see MIL-STD-1840)
+
+ -- MIME type 'application/cals-1840'
+ langCALS2(63), -- Not in RFC 1759
+ -- US DOD CALS2 (see MIL-STD-1840)
+ -- MIME type 'application/cals-1840'
+ langNIRS(64), -- Not in RFC 1759
+ -- US DOD NIRS (see MIL-STD-1840)
+ -- MIME type 'application/cals-1840'
+ langC4(65) -- Not in RFC 1759
+ -- US DOD C4 (see MIL-STD-1840)
+ -- MIME type 'application/cals-1840'
+}
+
+--
+-- Input/Output Group TEXTUAL-CONVENTIONs
+--
+
+PrtInputTypeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtInputType in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The type of technology (discriminated primarily according to
+ feeder mechanism type) employed by a specific component or
+ components."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ sheetFeedAutoRemovableTray(3),
+ sheetFeedAutoNonRemovableTray(4),
+ sheetFeedManual(5),
+ continuousRoll(6),
+ continuousFanFold(7)
+ }
+
+PrtOutputTypeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtOutputType in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The Type of technology supported by this output subunit."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ removableBin(3),
+ unRemovableBin(4),
+ continuousRollDevice(5),
+ mailBox(6),
+ continuousFanFold(7)
+ }
+
+--
+-- Marker Group TEXTUAL-CONVENTIONs
+--
+
+PrtMarkerMarkTechTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtMarkerMarkTech in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The type of marking technology used for this marking
+ subunit."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ electrophotographicLED(3),
+ electrophotographicLaser(4),
+ electrophotographicOther(5),
+ impactMovingHeadDotMatrix9pin(6),
+ impactMovingHeadDotMatrix24pin(7),
+ impactMovingHeadDotMatrixOther(8),
+ impactMovingHeadFullyFormed(9),
+ impactBand(10),
+ impactOther(11),
+ inkjetAqueous(12),
+ inkjetSolid(13),
+ inkjetOther(14),
+ pen(15),
+ thermalTransfer(16),
+ thermalSensitive(17),
+ thermalDiffusion(18),
+ thermalOther(19),
+ electroerosion(20),
+ electrostatic(21),
+ photographicMicrofiche(22),
+ photographicImagesetter(23),
+ photographicOther(24),
+ ionDeposition(25),
+ eBeam(26),
+ typesetter(27)
+ }
+
+PrtMarkerSuppliesTypeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtMarkerSuppliesType in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The type of this supply."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+
+ -- Values for Printer MIB
+ toner(3),
+ wasteToner(4),
+ ink(5),
+ inkCartridge(6),
+ inkRibbon(7),
+ wasteInk(8),
+ opc(9), -- photo conductor
+ developer(10),
+ fuserOil(11),
+ solidWax(12),
+ ribbonWax(13),
+ wasteWax(14),
+ fuser(15), -- Not in RFC 1759
+ coronaWire(16), -- Not in RFC 1759
+ fuserOilWick(17), -- Not in RFC 1759
+ cleanerUnit(18), -- Not in RFC 1759
+ fuserCleaningPad(19), -- Not in RFC 1759
+ transferUnit(20), -- Not in RFC 1759
+ tonerCartridge(21), -- Not in RFC 1759
+ fuserOiler(22), -- Not in RFC 1759
+ -- End of values for Printer MIB
+ -- Values for Finisher MIB
+ water(23), -- Not in RFC 1759
+ wasteWater(24), -- Not in RFC 1759
+ glueWaterAdditive(25),-- Not in RFC 1759
+ wastePaper(26), -- Not in RFC 1759
+ bindingSupply(27), -- Not in RFC 1759
+ bandingSupply(28), -- Not in RFC 1759
+ stitchingWire(29), -- Not in RFC 1759
+ shrinkWrap(30), -- Not in RFC 1759
+ paperWrap(31), -- Not in RFC 1759
+ staples(32), -- Not in RFC 1759
+ inserts(33), -- Not in RFC 1759
+ covers(34) -- Not in RFC 1759
+ -- End of values for Finisher MIB
+ }
+
+--
+-- Media Path TEXTUAL-CONVENTIONs
+--
+
+PrtMediaPathTypeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtMediaPathType in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The type of the media path for this media path."
+ SYNTAX INTEGER {
+
+ other(1),
+ unknown(2),
+ longEdgeBindingDuplex(3),
+ shortEdgeBindingDuplex(4),
+ simplex(5)
+ }
+
+--
+-- Console Group TEXTUAL-CONVENTIONs
+--
+
+PrtConsoleColorTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtConsoleColor in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The color of this light."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ white(3),
+ red(4),
+ green(5),
+ blue(6),
+ cyan(7),
+ magenta(8),
+ yellow(9),
+ orange(10) -- Not in RFC 1759
+ }
+
+PrtConsoleDisableTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtConsoleDisable in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "This value indicates whether or not input is accepted from
+ the operator console. A value of 'enabled' indicates that
+ input is accepted from the console, and a value of 'disabled'
+ indicates that input is not accepted from the console. "
+ SYNTAX INTEGER {
+ enabled(3),
+ disabled(4)
+ }
+
+--
+-- Alert Group TEXTUAL-CONVENTIONs
+--
+
+PrtAlertTrainingLevelTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtAlertTrainingLevel in RFC 1759.
+
+ STATUS current
+ DESCRIPTION
+ "The level of training required to handle this alert, if
+ human intervention is required. The noInterventionRequired
+ value should be used if the event does not require any human
+ intervention. The training level is an enumeration that is
+ determined and assigned by the printer manufacturer based on
+ the information or training required to handle this alert.
+ The printer will break alerts into these different training
+ levels. It is the responsibility of a management application
+ in the system to determine how a particular alert is handled
+ and how and to whom that alert is routed. The following are
+ the four training levels of alerts:
+
+ Field Service - Alerts that typically require advanced
+ training and technical knowledge of the printer and its
+ subunits. An example of a technical person would be a
+ manufacturer's Field Service representative, or other
+ person formally trained by the manufacturer or similar
+ representative.
+ Trained - Alerts that require an intermediate or moderate
+ knowledge of the printer and its subunits. A typical
+ example of such an alert is replacing a toner cartridge.
+ Untrained - Alerts that can be fixed without prior
+ training either because the action to correct the alert
+ is obvious or the printer can help the untrained person
+ fix the problem. A typical example of such an alert is
+ reloading paper trays or emptying output bins on a low
+ end printer.
+ Management - Alerts that have to do with overall operation
+ of and configuration of the printer. Examples of such
+ management events are configuration change of subunits."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ untrained(3),
+ trained(4),
+ fieldService(5),
+ management(6),
+ noInterventionRequired(7) -- Not in RFC 1759
+ }
+
+PrtAlertGroupTC ::= TEXTUAL-CONVENTION
+ -- Values in the range 1 to 29 must not be IANA-assigned without
+ -- re-publishing Printer MIB.
+ -- Values of 30 and greater are for use in MIBs that augment
+ -- the Printer MIB, such as the Finisher MIB.
+ -- This TC extracted from prtAlertGroup in RFC 1759.
+
+ STATUS current
+ DESCRIPTION
+ "The type of subunit within the printer model that this alert
+ is related. Input, output, and markers are examples of
+ printer model groups, i.e., examples of types of subunits.
+ Wherever possible, the enumerations match the sub-identifier
+ that identifies the relevant table in the Printer MIB.
+
+ NOTE: Alert type codes have been added for the Host Resources
+ MIB storage table and device table. These additional types
+ are for situations in which the printer's storage and device
+ objects must generate alerts (and possibly traps for critical
+ alerts)."
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ -- Values for Host Resources MIB
+ hostResourcesMIBStorageTable(3),
+ hostResourcesMIBDeviceTable(4),
+ -- Values for Printer MIB
+ generalPrinter(5),
+ cover(6),
+ localization(7),
+ input(8),
+ output(9),
+ marker(10),
+ markerSupplies(11),
+ markerColorant(12),
+ mediaPath(13),
+ channel(14),
+ interpreter(15),
+ consoleDisplayBuffer(16),
+ consoleLights(17),
+ alert(18), -- Not in RFC 1759
+ -- Values (5) to (29) reserved for Printer MIB
+ -- Values for Finisher MIB
+ finDevice(30), -- Not in RFC 1759
+ finSupply(31), -- Not in RFC 1759
+ finSupplyMediaInput(32), -- Not in RFC 1759
+ finAttribute(33) -- Not in RFC 1759
+ -- Values (30) to (39) reserved for Finisher MIB
+ }
+
+PrtAlertCodeTC ::= TEXTUAL-CONVENTION
+ -- This TC was extracted from prtAlertCode in RFC 1759.
+ STATUS current
+ DESCRIPTION
+ "The code that describes the type of alert for this entry in
+
+ the table. Binary change event alerts describe states of the
+ subunit while unary change event alerts describe a single
+ event. The same alert code can be used for a binary change
+ event or a unary change event, depending on implementation.
+ Also, the same alert code can be used to indicate a critical
+ or non-critical (warning) alert, depending on implementation.
+ The value of prtAlertSeverityLevel specifies binary vs. unary
+ and critical vs. non-critical for each event for the
+ implementation.
+
+ While there are some specific codes for many subunits, the
+ generic codes should be used for most subunit alerts. The
+ network management station can then query the subunit
+ specified by prtAlertGroup to determine further subunit
+ status and other subunit information.
+
+ An agent shall not add two entries to the alert table for the
+ same event, one containing a generic event code and the other
+ containing a specific event code; the agent shall add only
+ one entry in the alert table for each event; either generic
+ (preferred) or specific, not both.
+
+ Implementation of the unary change event
+ alertRemovalOfBinaryChangeEntry(1801) is optional. When
+ implemented, this alert code shall indicate to network
+ management stations that the trailing edge of a binary change
+ event has occurred and the corresponding alert entry has been
+ removed from the alert table. As with all events, the
+ alertRemovalOfBinaryChangeEntry(1801) alert shall be placed
+ at the end of the alert table. Such an alert table entry
+ shall specify the following information:
+
+ prtAlertSeverityLevel warningUnaryChangeEvent(4)
+ prtAlertTrainingLevel noInterventionRequired(7)
+ prtAlertGroup alert(18)
+ prtAlertGroupIndex the index of the row in the
+ alert table of the binary
+ change event that this event
+ has removed.
+ prtAlertLocation unknown (-2)
+ prtAlertCode alertRemovalOfBinaryChangeEntry(1801)
+ prtAlertDescription <description or null string>
+ prtAlertTime the value of sysUpTime at
+ the time of the removal of the
+ binary change event from the
+ alert table.
+
+ Optionally, the agent may generate a trap coincident with
+
+ removing the binary change event and placing the unary change
+ event alertRemovalOfBinaryChangeEntry(1801) in the alert
+ table. For such a trap, the prtAlertIndex sent with the above
+ trap parameters shall be the index of the
+ alertRemovalOfBinaryChangeEvent row that was added to the
+ prtAlertTable; not the index of the row that was removed from
+ the prtAlertTable."
+ SYNTAX INTEGER {
+ other(1),
+ -- an event that is not represented
+ -- by one of the alert codes
+ -- specified below.
+ unknown(2),
+ -- The following generic codes are common to
+ -- multiple groups. The NMS may examine the
+ -- prtAlertGroup object to determine what group
+ -- to query for further information.
+ coverOpen(3),
+ coverClosed(4),
+ interlockOpen(5),
+ interlockClosed(6),
+ configurationChange(7),
+ jam(8),
+ subunitMissing(9), -- Not in RFC 1759
+ -- The subunit tray, bin, etc.
+ -- has been removed.
+ subunitLifeAlmostOver(10), -- Not in RFC 1759
+ subunitLifeOver(11), -- Not in RFC 1759
+ subunitAlmostEmpty(12), -- Not in RFC 1759
+ subunitEmpty(13), -- Not in RFC 1759
+ subunitAlmostFull(14), -- Not in RFC 1759
+ subunitFull(15), -- Not in RFC 1759
+ subunitNearLimit(16), -- Not in RFC 1759
+ subunitAtLimit(17), -- Not in RFC 1759
+ subunitOpened(18), -- Not in RFC 1759
+ subunitClosed(19), -- Not in RFC 1759
+ subunitTurnedOn(20), -- Not in RFC 1759
+ subunitTurnedOff(21), -- Not in RFC 1759
+ subunitOffline(22), -- Not in RFC 1759
+ subunitPowerSaver(23), -- Not in RFC 1759
+ subunitWarmingUp(24), -- Not in RFC 1759
+ subunitAdded(25), -- Not in RFC 1759
+ subunitRemoved(26), -- Not in RFC 1759
+ subunitResourceAdded(27), -- Not in RFC 1759
+ subunitResourceRemoved(28), -- Not in RFC 1759
+ subunitRecoverableFailure(29),
+ -- Not in RFC 1759
+ subunitUnrecoverableFailure(30),
+
+ -- Not in RFC 1759
+ subunitRecoverableStorageError(31),
+ -- Not in RFC 1759
+ subunitUnrecoverableStorageError(32),
+ -- Not in RFC 1759
+ subunitMotorFailure(33), -- Not in RFC 1759
+ subunitMemoryExhausted(34), -- Not in RFC 1759
+ subunitUnderTemperature(35), -- Not in RFC 1759
+ subunitOverTemperature(36), -- Not in RFC 1759
+ subunitTimingFailure(37), -- Not in RFC 1759
+ subunitThermistorFailure(38), -- Not in RFC 1759
+
+ -- General Printer group
+ doorOpen(501), -- DEPRECATED
+ -- Use coverOpened(3)
+ doorClosed(502), -- DEPRECATED
+ -- Use coverClosed(4)
+ powerUp(503),
+ powerDown(504),
+ printerNMSReset(505), -- Not in RFC 1759
+ -- The printer has been reset by some
+ -- network management station(NMS)
+ -- writing into 'prtGeneralReset'.
+ printerManualReset(506), -- Not in RFC 1759
+ -- The printer has been reset manually.
+ printerReadyToPrint(507), -- Not in RFC 1759
+ -- The printer is ready to print. (i.e.,
+ -- not warming up, not in power save
+ -- state, not adjusting print quality,
+ -- etc.).
+
+ -- Input Group
+ inputMediaTrayMissing(801),
+ inputMediaSizeChange(802),
+ inputMediaWeightChange(803),
+ inputMediaTypeChange(804),
+ inputMediaColorChange(805),
+ inputMediaFormPartsChange(806),
+ inputMediaSupplyLow(807),
+ inputMediaSupplyEmpty(808),
+ inputMediaChangeRequest(809), -- Not in RFC 1759
+ -- An interpreter has detected that a
+ -- different medium is need in this input
+ -- tray subunit. The prtAlertDescription may
+ -- be used to convey a human readable
+ -- description of the medium required to
+ -- satisfy the request.
+ inputManualInputRequest(810), -- Not in RFC 1759
+
+ -- An interpreter has detected that manual
+ -- input is required in this subunit. The
+ -- prtAlertDescription may be used to convey
+ -- a human readable description of the medium
+ -- required to satisfy the request.
+ inputTrayPositionFailure(811), -- Not in RFC 1759
+ -- The input tray failed to position correctly.
+ inputTrayElevationFailure(812),
+ -- Not in RFC 1759
+ inputCannotFeedSizeSelected(813),
+ -- Not in RFC 1759
+ -- Output Group
+ outputMediaTrayMissing(901),
+ outputMediaTrayAlmostFull(902),
+ outputMediaTrayFull(903),
+ outputMailboxSelectFailure(904),
+ -- Not in RFC 1759
+ -- Marker group
+ markerFuserUnderTemperature(1001),
+ markerFuserOverTemperature(1002),
+ markerFuserTimingFailure(1003),
+ -- Not in RFC 1759
+ markerFuserThermistorFailure(1004),
+ -- Not in RFC 1759
+ markerAdjustingPrintQuality(1005),
+ -- Not in RFC 1759
+ -- Marker Supplies group
+ markerTonerEmpty(1101),
+ markerInkEmpty(1102),
+ markerPrintRibbonEmpty(1103),
+ markerTonerAlmostEmpty(1104),
+ markerInkAlmostEmpty(1105),
+ markerPrintRibbonAlmostEmpty(1106),
+ markerWasteTonerReceptacleAlmostFull(1107),
+ markerWasteInkReceptacleAlmostFull(1108),
+ markerWasteTonerReceptacleFull(1109),
+ markerWasteInkReceptacleFull(1110),
+ markerOpcLifeAlmostOver(1111),
+ markerOpcLifeOver(1112),
+ markerDeveloperAlmostEmpty(1113),
+ markerDeveloperEmpty(1114),
+ markerTonerCartridgeMissing(1115),
+ -- Not in RFC 1759
+ -- Media Path Device Group
+ mediaPathMediaTrayMissing(1301),
+ mediaPathMediaTrayAlmostFull(1302),
+ mediaPathMediaTrayFull(1303),
+ mediaPathCannotDuplexMediaSelected(1304),
+
+ -- Not in RFC 1759
+ -- Interpreter Group
+ interpreterMemoryIncrease(1501),
+ interpreterMemoryDecrease(1502),
+ interpreterCartridgeAdded(1503),
+ interpreterCartridgeDeleted(1504),
+ interpreterResourceAdded(1505),
+ interpreterResourceDeleted(1506),
+ interpreterResourceUnavailable(1507),
+ interpreterComplexPageEncountered(1509),
+ -- Not in RFC 1759
+ -- The interpreter has encountered a page
+ -- that is too complex for the resources that
+ -- are available.
+ -- Alert Group
+ alertRemovalOfBinaryChangeEntry(1801)
+ -- Not in RFC 1759
+ -- A binary change event entry has been
+ -- removed from the alert table. This unary
+ -- change alert table entry is added to the
+ -- end of the alert table.
+ }
+END
+
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB
new file mode 100644
index 0000000..952c84e
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB
@@ -0,0 +1,92 @@
+
+IANA-RTPROTO-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+ianaRtProtoMIB MODULE-IDENTITY
+ LAST-UPDATED "200009260000Z" -- September 26, 2000
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ " Internet Assigned Numbers Authority
+ Internet Corporation for Assigned Names and Numbers
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292-6601
+
+ Phone: +1 310 823 9358
+ EMail: iana&iana.org"
+ DESCRIPTION
+ "This MIB module defines the IANAipRouteProtocol and
+ IANAipMRouteProtocol textual conventions for use in MIBs
+ which need to identify unicast or multicast routing
+ mechanisms.
+
+ Any additions or changes to the contents of this MIB module
+ require either publication of an RFC, or Designated Expert
+ Review as defined in RFC 2434, Guidelines for Writing an
+ IANA Considerations Section in RFCs. The Designated Expert
+ will be selected by the IESG Area Director(s) of the Routing
+ Area."
+
+ REVISION "200009260000Z" -- September 26, 2000
+ DESCRIPTION "Original version, published in coordination
+ with RFC 2932."
+
+ ::= { mib-2 84 }
+
+IANAipRouteProtocol ::= TEXTUAL-CONVENTION
+ STATUS current
+
+ DESCRIPTION
+ "A mechanism for learning routes. Inclusion of values for
+ routing protocols is not intended to imply that those
+ protocols need be supported."
+ SYNTAX INTEGER {
+ other (1), -- not specified
+ local (2), -- local interface
+ netmgmt (3), -- static route
+ icmp (4), -- result of ICMP Redirect
+
+ -- the following are all dynamic
+ -- routing protocols
+
+ egp (5), -- Exterior Gateway Protocol
+ ggp (6), -- Gateway-Gateway Protocol
+ hello (7), -- FuzzBall HelloSpeak
+ rip (8), -- Berkeley RIP or RIP-II
+ isIs (9), -- Dual IS-IS
+ esIs (10), -- ISO 9542
+ ciscoIgrp (11), -- Cisco IGRP
+ bbnSpfIgp (12), -- BBN SPF IGP
+ ospf (13), -- Open Shortest Path First
+ bgp (14), -- Border Gateway Protocol
+ idpr (15), -- InterDomain Policy Routing
+ ciscoEigrp (16), -- Cisco EIGRP
+ dvmrp (17) -- DVMRP
+ }
+
+IANAipMRouteProtocol ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The multicast routing protocol. Inclusion of values for
+ multicast routing protocols is not intended to imply that
+ those protocols need be supported."
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ local(2), -- e.g., manually configured
+ netmgmt(3), -- set via net.mgmt protocol
+ dvmrp(4),
+ mospf(5),
+ pimSparseDense(6), -- PIMv1, both DM and SM
+ cbt(7),
+ pimSparseMode(8), -- PIM-SM
+ pimDenseMode(9), -- PIM-DM
+ igmpOnly(10),
+ bgmp(11),
+ msdp(12)
+ }
+
+END
+
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB
new file mode 100644
index 0000000..e774ac0
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB
@@ -0,0 +1,306 @@
+
+ IANATn3270eTC-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, mib-2
+ FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC;
+
+ ianaTn3270eTcMib MODULE-IDENTITY
+ LAST-UPDATED "200005100000Z" -- May 10, 2000
+ ORGANIZATION "IANA"
+ CONTACT-INFO
+ "Internet Assigned Numbers Authority
+
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1 310 823 9358 x20
+ E-Mail: iana&iana.org"
+ DESCRIPTION
+ "This module defines a set of textual conventions
+ for use by the TN3270E-MIB and the TN3270E-RT-MIB.
+
+ Any additions or changes to the contents of this
+ MIB module must first be discussed on the tn3270e
+ working group list at: tn3270e&list.nih.gov
+ and approved by one of the following TN3270E
+ working group contacts:
+
+ Ed Bailey (co-chair) - elbailey&us.ibm.com
+ Michael Boe (co-chair) - mboe&cisco.com
+ Ken White - kennethw&vnet.ibm.com
+ Robert Moore - remoore&us.ibm.com
+
+ The above list of contacts can be altered with
+ the approval of the two co-chairs.
+
+ The Textual Conventions defined within this MIB have
+ no security issues associated with them unless
+ explicitly stated in their corresponding
+ DESCRIPTION clause."
+
+ -- revision log, in reverse chronological order
+
+ REVISION "200005100000Z" -- May 10, 2000
+ DESCRIPTION "Fix to import mib-2 instead of experimental."
+
+ REVISION "199909011000Z" -- September 1, 1999
+ DESCRIPTION
+ "Initial version transferred from the TN3270E
+ working group to IANA."
+
+ ::= { mib-2 61 }
+
+
+ -- Textual Conventions
+
+ IANATn3270eAddrType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The textual convention for defining the type of a
+ client address. The enumeration value unknown(0) is
+ also used to indicate that no actual address is present."
+ SYNTAX INTEGER {
+ unknown(0),
+ ipv4(1),
+ ipv6(2)
+ }
+
+ IANATn3270eAddress ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Denotes a client address. The type of client address is
+ determined by use of the IANATn3270eAddrType textual
+convention.
+ The length in octets of a IANATn3270eAddress object is:
+
+ IANATn3270eAddrType Address Length
+ +++++++++++++++++++ ++++++++++++++
+ unknown(0) not specified or unknown; the
+ actual length of the
+ IANATn3270eAddress octet string
+ indicates if an address
+ is present
+ ipv4(1) 4 OCTETS
+ ipv6(2) 16 OCTETS
+
+ This textual convention is similar to the TAddress
+ TC defined by RFC1903 except that it allows a
+ zero-length octet string and is not a full transport
+ layer address."
+ SYNTAX OCTET STRING (SIZE (0..255))
+
+ IANATn3270eClientType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The textual convention for defining the set of
+ enumerations used by tn3270eTcpConnClientIdFormat
+ in the TN3270E-MIB:
+
+ ENUMERATION OCTETs DESCRIPTION
+
+ none(1) 0 Not specified
+ other(2) 1..512 Implementation specific
+ ipv4(3) 6 4-octet IP Address plus
+ 2-octet TCP Port
+ ipv6(4) 18 16-octet IPv6 Address
+ plus 2-octet TCP Port
+ domainName(5) 1..512 The DNS name of a
+ client.
+ truncDomainName(6) 1..512 The (truncated) DNS name
+ of a client.
+ string(7) 1..512 Unknown Utf8String
+ certificate(8) 1..512 certificate
+ userId(9) 1..8 Client's userid
+ x509dn(10) 1..512 X.509 Distinguished Name
+
+ Representation of a certificate(8) may be lead to
+ a security exposure and is NOT RECOMMENDED without
+ adequate security."
+ SYNTAX INTEGER {
+ none(1),
+ other(2),
+ ipv4(3),
+ ipv6(4),
+ domainName(5),
+ truncDomainName(6),
+ string(7),
+ certificate(8),
+ userId(9),
+ x509dn(10)
+ }
+
+ IANATn3270Functions ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This textual convention reflects the current set of
+ TN3270 and TN3270E functions that can be negotiated
+ between a server and its client:
+
+ RFC856
+ transmitBinary The sender of this command REQUESTS
+ permission to begin transmitting, or
+ confirms that it will now begin
+ transmitting characters which are to
+ be interpreted as 8 bits of binary
+ data by the receiver of the data.
+ RFC860
+ timingMark The sender of this command REQUESTS
+ that the receiver of this command
+ return a WILL TIMING-MARK in the data
+ stream at the 'appropriate place'.
+ RFC885
+ endOfRecord The sender of this command requests
+ permission to begin transmission of
+ the Telnet END-OF-RECORD (EOR) code
+ when transmitting data characters, or
+ the sender of this command confirms it
+ will now begin transmission of EORs
+ with transmitted data characters.
+ RFC1091
+ terminalType Sender is willing to send terminal
+ type information in a subsequent
+ sub-negotiation.
+
+ RFC1041
+ tn3270Regime Sender is willing to send list of
+ supported 3270 Regimes in a
+ subsequent sub-negotiation.
+ RFC2355
+ scsCtlCodes (Printer sessions only). Allows the
+ use of the SNA Character Stream (SCS)
+ and SCS control codes on the session.
+ SCS is used with LU type 1 SNA sessions.
+ dataStreamCtl (Printer sessions only). Allows the use
+ of the standard 3270 data stream. This
+ corresponds to LU type 3 SNA sessions.
+ responses Provides support for positive and
+ negative response handling. Allows the
+ server to reflect to the client any and
+ all definite, exception, and no response
+ requests sent by the host application.
+ bindImage Allows the server to send the SNA Bind
+ image and Unbind notification to the
+ client.
+ sysreq Allows the client and server to emulate
+ some (or all, depending on the server) of
+ the functions of the SYSREQ key in an SNA
+ environment."
+ SYNTAX BITS {
+ transmitBinary(0),-- rfc856
+ timemark(1), -- rfc860
+ endOfRecord(2), -- rfc885
+ terminalType(3), -- rfc1091
+ tn3270Regime(4), -- rfc1041
+ scsCtlCodes(5), -- rfc2355
+ dataStreamCtl(6), -- rfc2355
+ responses(7), -- rfc2355
+ bindImage(8), -- rfc2355
+ sysreq(9) -- rfc2355
+ }
+
+ IANATn3270ResourceType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The type of resource defined by a resource pool. Refer
+ to tn3270eResPoolTable."
+ SYNTAX INTEGER {
+ other(1),
+ terminal(2),
+ printer(3),
+ terminalOrPrinter(4)
+ }
+
+ IANATn3270DeviceType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This textual convention defines the list of device
+ types that can be set, as defined by RFC 2355."
+ SYNTAX INTEGER {
+ -- terminals
+ ibm3278d2(1), -- (24 row x 80 col display)
+ ibm3278d2E(2), -- (24 row x 80 col display)
+ ibm3278d3(3), -- (32 row x 80 col display)
+ ibm3278d3E(4), -- (32 row x 80 col display)
+ ibm3278d4(5), -- (43 row x 80 col display)
+ ibm3278d4E(6), -- (43 row x 80 col display)
+ ibm3278d5(7), -- (27 row x 132 col display)
+ ibm3278d5E(8), -- (27 row x 132 col display)
+ ibmDynamic(9), -- (no pre-defined display size)
+
+ -- printers
+ ibm3287d1(10),
+
+ unknown(100)
+ }
+
+ IANATn3270eLogData ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "An octet string representing log data as pertaining to
+ either a TN3270 or TN3270E Session as reported from a
+ TN3270E Server. Log data is stored in an octet string
+ in time order (from earliest to latest).
+
+ Each log element has the following form:
+
+ +------+----+---------+------------+
+ !length!type!TimeStamp! data !
+ +------+----+---------+------------+
+
+ where
+
+ length = one-octet length of the data portion of the
+ trace element, not including the length,
+ type, and TimeStamp fields
+ type = one-octet code point characterizing the data.
+ TimeStamp = A 4-octet field representing the number of
+ TimeTicks since the TN3270E server was last
+ activated. The server's last activation time
+ is available in the tn3270eSrvrConfLastActTime
+ object in the TN3270E MIB, which has the
+ syntax DateAndTime.
+ data = initial part of a PDU.
+
+ length type
+
+ 0-255 x'00' - unknown
+ 0 x'01' - inactivity timer expired
+ 0 x'02' - dynamic timer expired
+ 0 x'03' - actlu req
+ 0 x'04' - bind req
+ 0 x'05' - clear req
+ 0 x'06' - dactlu req
+ 0 x'07' - warm actpu req
+ 0 x'08' - sdt req
+ 0 x'09' - unbind req
+ 0 x'0A' - notify resp
+ 0 x'0B' - reply PSID neg rsp
+ 0 x'0C' - reply PSID pos rsp
+ 0 x'0D' - unbind rsp
+ 0 x'0E' - hierarchical reset
+ 0 x'0F' - client connect req
+ 0 x'10' - client disconnect req
+ 0 x'11' - timingmark received
+ 0 x'12' - flowControl timer expired
+ 0 x'13' - neg rsp to host
+ 0 x'14' - neg rsp from host
+ 0 x'15' - data contention
+ 0 x'16' - no buffer to send SNA data
+ 0 x'17' - receive response while inbound
+ 0 x'18' - client protocol error
+ 0 x'19' - badClientSequenceReceived
+ 1-255 x'1A' - utf8String
+ 2 x'1B' - hexCode, implementation dependent
+
+ Log element entries have a minimum length of 6 octets.
+ The zero-length string indicates that no log data is
+ available."
+ SYNTAX OCTET STRING (SIZE (0 | 6..2048))
+
+ END
+
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IANA/IANAifType-MIB b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANAifType-MIB
new file mode 100644
index 0000000..39dddf9
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IANA/IANAifType-MIB
@@ -0,0 +1,572 @@
+ IANAifType-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+ ianaifType MODULE-IDENTITY
+ LAST-UPDATED "200709130000Z" -- September 13, 2007
+ ORGANIZATION "IANA"
+ CONTACT-INFO " Internet Assigned Numbers Authority
+
+ Postal: ICANN
+ 4676 Admiralty Way, Suite 330
+ Marina del Rey, CA 90292
+
+ Tel: +1 310 823 9358
+ E-Mail: iana&iana.org"
+
+ DESCRIPTION "This MIB module defines the IANAifType Textual
+ Convention, and thus the enumerated values of
+ the ifType object defined in MIB-II's ifTable."
+
+ REVISION "200709130000Z" -- September 13, 2007
+ DESCRIPTION "Registration of new IANAifTypes 243 and 244."
+
+ REVISION "200705290000Z" -- May 29, 2007
+ DESCRIPTION "Changed the description for IANAifType 228."
+
+ REVISION "200703080000Z" -- March 08, 2007
+ DESCRIPTION "Registration of new IANAifType 242."
+
+ REVISION "200701230000Z" -- January 23, 2007
+ DESCRIPTION "Registration of new IANAifTypes 239, 240, and 241."
+
+ REVISION "200610170000Z" -- October 17, 2006
+ DESCRIPTION "Deprecated/Obsoleted IANAifType 230. Registration of
+ IANAifType 238."
+
+ REVISION "200609250000Z" -- September 25, 2006
+ DESCRIPTION "Changed the description for IANA ifType
+ 184 and added new IANA ifType 237."
+
+ REVISION "200608170000Z" -- August 17, 2006
+ DESCRIPTION "Changed the descriptions for IANAifTypes
+ 20 and 21."
+
+ REVISION "200608110000Z" -- August 11, 2006
+ DESCRIPTION "Changed the descriptions for IANAifTypes
+ 7, 11, 62, 69, and 117."
+
+ REVISION "200607250000Z" -- July 25, 2006
+ DESCRIPTION "Registration of new IANA ifType 236."
+
+ REVISION "200606140000Z" -- June 14, 2006
+ DESCRIPTION "Registration of new IANA ifType 235."
+
+ REVISION "200603310000Z" -- March 31, 2006
+ DESCRIPTION "Registration of new IANA ifType 234."
+
+ REVISION "200603300000Z" -- March 30, 2006
+ DESCRIPTION "Registration of new IANA ifType 233."
+
+ REVISION "200512220000Z" -- December 22, 2005
+ DESCRIPTION "Registration of new IANA ifTypes 231 and 232."
+
+ REVISION "200510100000Z" -- October 10, 2005
+ DESCRIPTION "Registration of new IANA ifType 230."
+
+ REVISION "200509090000Z" -- September 09, 2005
+ DESCRIPTION "Registration of new IANA ifType 229."
+
+ REVISION "200505270000Z" -- May 27, 2005
+ DESCRIPTION "Registration of new IANA ifType 228."
+
+ REVISION "200503030000Z" -- March 3, 2005
+ DESCRIPTION "Added the IANAtunnelType TC and deprecated
+ IANAifType sixToFour (215) per RFC4087."
+
+ REVISION "200411220000Z" -- November 22, 2004
+ DESCRIPTION "Registration of new IANA ifType 227 per RFC4631."
+
+ REVISION "200406170000Z" -- June 17, 2004
+ DESCRIPTION "Registration of new IANA ifType 226."
+
+ REVISION "200405120000Z" -- May 12, 2004
+ DESCRIPTION "Added description for IANAifType 6, and
+ changed the descriptions for IANAifTypes
+ 180, 181, and 182."
+
+ REVISION "200405070000Z" -- May 7, 2004
+ DESCRIPTION "Registration of new IANAifType 225."
+
+ REVISION "200308250000Z" -- Aug 25, 2003
+ DESCRIPTION "Deprecated IANAifTypes 7 and 11. Obsoleted
+ IANAifTypes 62, 69, and 117. ethernetCsmacd (6)
+ should be used instead of these values"
+
+ REVISION "200308180000Z" -- Aug 18, 2003
+ DESCRIPTION "Registration of new IANAifType
+ 224."
+
+ REVISION "200308070000Z" -- Aug 7, 2003
+ DESCRIPTION "Registration of new IANAifTypes
+ 222 and 223."
+
+ REVISION "200303180000Z" -- Mar 18, 2003
+ DESCRIPTION "Registration of new IANAifType
+ 221."
+
+ REVISION "200301130000Z" -- Jan 13, 2003
+ DESCRIPTION "Registration of new IANAifType
+ 220."
+
+ REVISION "200210170000Z" -- Oct 17, 2002
+ DESCRIPTION "Registration of new IANAifType
+ 219."
+
+ REVISION "200207160000Z" -- Jul 16, 2002
+ DESCRIPTION "Registration of new IANAifTypes
+ 217 and 218."
+
+ REVISION "200207100000Z" -- Jul 10, 2002
+ DESCRIPTION "Registration of new IANAifTypes
+ 215 and 216."
+
+ REVISION "200206190000Z" -- Jun 19, 2002
+ DESCRIPTION "Registration of new IANAifType
+ 214."
+
+ REVISION "200201040000Z" -- Jan 4, 2002
+ DESCRIPTION "Registration of new IANAifTypes
+ 211, 212 and 213."
+
+ REVISION "200112200000Z" -- Dec 20, 2001
+ DESCRIPTION "Registration of new IANAifTypes
+ 209 and 210."
+
+ REVISION "200111150000Z" -- Nov 15, 2001
+ DESCRIPTION "Registration of new IANAifTypes
+ 207 and 208."
+
+
+ REVISION "200111060000Z" -- Nov 6, 2001
+ DESCRIPTION "Registration of new IANAifType
+ 206."
+
+
+ REVISION "200111020000Z" -- Nov 2, 2001
+ DESCRIPTION "Registration of new IANAifType
+ 205."
+
+
+ REVISION "200110160000Z" -- Oct 16, 2001
+ DESCRIPTION "Registration of new IANAifTypes
+ 199, 200, 201, 202, 203, and 204."
+
+
+ REVISION "200109190000Z" -- Sept 19, 2001
+ DESCRIPTION "Registration of new IANAifType
+ 198."
+
+ REVISION "200105110000Z" -- May 11, 2001
+ DESCRIPTION "Registration of new IANAifType
+ 197."
+
+
+ REVISION "200101120000Z" -- Jan 12, 2001
+ DESCRIPTION "Registration of new IANAifTypes
+ 195 and 196."
+
+ REVISION "200012190000Z" -- Dec 19, 2000
+ DESCRIPTION "Registration of new IANAifTypes
+ 193 and 194."
+
+ REVISION "200012070000Z" -- Dec 07, 2000
+ DESCRIPTION "Registration of new IANAifTypes
+ 191 and 192."
+
+ REVISION "200012040000Z" -- Dec 04, 2000
+ DESCRIPTION "Registration of new IANAifType
+ 190."
+
+ REVISION "200010170000Z" -- Oct 17, 2000
+ DESCRIPTION "Registration of new IANAifTypes
+ 188 and 189."
+
+ REVISION "200010020000Z" -- Oct 02, 2000
+ DESCRIPTION "Registration of new IANAifType 187."
+
+ REVISION "200009010000Z" -- Sept 01, 2000
+ DESCRIPTION "Registration of new IANAifTypes
+ 184, 185, and 186."
+
+ REVISION "200008240000Z" -- Aug 24, 2000
+ DESCRIPTION "Registration of new IANAifType 183."
+
+ REVISION "200008230000Z" -- Aug 23, 2000
+ DESCRIPTION "Registration of new IANAifTypes
+ 174-182."
+
+ REVISION "200008220000Z" -- Aug 22, 2000
+ DESCRIPTION "Registration of new IANAifTypes 170,
+ 171, 172 and 173."
+
+ REVISION "200004250000Z" -- Apr 25, 2000
+ DESCRIPTION "Registration of new IANAifTypes 168 and 169."
+
+ REVISION "200003060000Z" -- Mar 6, 2000
+ DESCRIPTION "Fixed a missing semi-colon in the IMPORT.
+ Also cleaned up the REVISION log a bit.
+ It is not complete, but from now on it will
+ be maintained and kept up to date with each
+ change to this MIB module."
+
+ REVISION "199910081430Z" -- Oct 08, 1999
+ DESCRIPTION "Include new name assignments up to cnr(85).
+ This is the first version available via the WWW
+ at: ftp://ftp.isi.edu/mib/ianaiftype.mib"
+
+ REVISION "199401310000Z" -- Jan 31, 1994
+ DESCRIPTION "Initial version of this MIB as published in
+ RFC 1573."
+
+ ::= { mib-2 30 }
+
+
+ IANAifType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This data type is used as the syntax of the ifType
+ object in the (updated) definition of MIB-II's
+ ifTable.
+
+ The definition of this textual convention with the
+ addition of newly assigned values is published
+ periodically by the IANA, in either the Assigned
+ Numbers RFC, or some derivative of it specific to
+ Internet Network Management number assignments. (The
+ latest arrangements can be obtained by contacting the
+ IANA.)
+
+ Requests for new values should be made to IANA via
+ email (iana&iana.org).
+
+ The relationship between the assignment of ifType
+ values and of OIDs to particular media-specific MIBs
+ is solely the purview of IANA and is subject to change
+ without notice. Quite often, a media-specific MIB's
+ OID-subtree assignment within MIB-II's 'transmission'
+ subtree will be the same as its ifType value.
+ However, in some circumstances this will not be the
+ case, and implementors must not pre-assume any
+ specific relationship between ifType values and
+ transmission subtree OIDs."
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ regular1822(2),
+ hdh1822(3),
+ ddnX25(4),
+ rfc877x25(5),
+ ethernetCsmacd(6), -- for all ethernet-like interfaces,
+ -- regardless of speed, as per RFC3635
+ iso88023Csmacd(7), -- Deprecated via RFC3635
+ -- ethernetCsmacd (6) should be used instead
+ iso88024TokenBus(8),
+ iso88025TokenRing(9),
+ iso88026Man(10),
+ starLan(11), -- Deprecated via RFC3635
+ -- ethernetCsmacd (6) should be used instead
+ proteon10Mbit(12),
+ proteon80Mbit(13),
+ hyperchannel(14),
+ fddi(15),
+ lapb(16),
+ sdlc(17),
+ ds1(18), -- DS1-MIB
+ e1(19), -- Obsolete see DS1-MIB
+ basicISDN(20), -- no longer used
+ -- see also RFC2127
+ primaryISDN(21), -- no longer used
+ -- see also RFC2127
+ propPointToPointSerial(22), -- proprietary serial
+ ppp(23),
+ softwareLoopback(24),
+ eon(25), -- CLNP over IP
+ ethernet3Mbit(26),
+ nsip(27), -- XNS over IP
+ slip(28), -- generic SLIP
+ ultra(29), -- ULTRA technologies
+ ds3(30), -- DS3-MIB
+ sip(31), -- SMDS, coffee
+ frameRelay(32), -- DTE only.
+ rs232(33),
+ para(34), -- parallel-port
+ arcnet(35), -- arcnet
+ arcnetPlus(36), -- arcnet plus
+ atm(37), -- ATM cells
+ miox25(38),
+ sonet(39), -- SONET or SDH
+ x25ple(40),
+ iso88022llc(41),
+ localTalk(42),
+ smdsDxi(43),
+ frameRelayService(44), -- FRNETSERV-MIB
+ v35(45),
+ hssi(46),
+ hippi(47),
+ modem(48), -- Generic modem
+ aal5(49), -- AAL5 over ATM
+ sonetPath(50),
+ sonetVT(51),
+ smdsIcip(52), -- SMDS InterCarrier Interface
+ propVirtual(53), -- proprietary virtual/internal
+ propMultiplexor(54),-- proprietary multiplexing
+ ieee80212(55), -- 100BaseVG
+ fibreChannel(56), -- Fibre Channel
+ hippiInterface(57), -- HIPPI interfaces
+ frameRelayInterconnect(58), -- Obsolete use either
+ -- frameRelay(32) or
+ -- frameRelayService(44).
+ aflane8023(59), -- ATM Emulated LAN for 802.3
+ aflane8025(60), -- ATM Emulated LAN for 802.5
+ cctEmul(61), -- ATM Emulated circuit
+ fastEther(62), -- Obsoleted via RFC3635
+ -- ethernetCsmacd (6) should be used instead
+ isdn(63), -- ISDN and X.25
+ v11(64), -- CCITT V.11/X.21
+ v36(65), -- CCITT V.36
+ g703at64k(66), -- CCITT G703 at 64Kbps
+ g703at2mb(67), -- Obsolete see DS1-MIB
+ qllc(68), -- SNA QLLC
+ fastEtherFX(69), -- Obsoleted via RFC3635
+ -- ethernetCsmacd (6) should be used instead
+ channel(70), -- channel
+ ieee80211(71), -- radio spread spectrum
+ ibm370parChan(72), -- IBM System 360/370 OEMI Channel
+ escon(73), -- IBM Enterprise Systems Connection
+ dlsw(74), -- Data Link Switching
+ isdns(75), -- ISDN S/T interface
+ isdnu(76), -- ISDN U interface
+ lapd(77), -- Link Access Protocol D
+ ipSwitch(78), -- IP Switching Objects
+ rsrb(79), -- Remote Source Route Bridging
+ atmLogical(80), -- ATM Logical Port
+ ds0(81), -- Digital Signal Level 0
+ ds0Bundle(82), -- group of ds0s on the same ds1
+ bsc(83), -- Bisynchronous Protocol
+ async(84), -- Asynchronous Protocol
+ cnr(85), -- Combat Net Radio
+ iso88025Dtr(86), -- ISO 802.5r DTR
+ eplrs(87), -- Ext Pos Loc Report Sys
+ arap(88), -- Appletalk Remote Access Protocol
+ propCnls(89), -- Proprietary Connectionless Protocol
+ hostPad(90), -- CCITT-ITU X.29 PAD Protocol
+ termPad(91), -- CCITT-ITU X.3 PAD Facility
+ frameRelayMPI(92), -- Multiproto Interconnect over FR
+ x213(93), -- CCITT-ITU X213
+ adsl(94), -- Asymmetric Digital Subscriber Loop
+ radsl(95), -- Rate-Adapt. Digital Subscriber Loop
+ sdsl(96), -- Symmetric Digital Subscriber Loop
+ vdsl(97), -- Very H-Speed Digital Subscrib. Loop
+ iso88025CRFPInt(98), -- ISO 802.5 CRFP
+ myrinet(99), -- Myricom Myrinet
+ voiceEM(100), -- voice recEive and transMit
+ voiceFXO(101), -- voice Foreign Exchange Office
+ voiceFXS(102), -- voice Foreign Exchange Station
+ voiceEncap(103), -- voice encapsulation
+ voiceOverIp(104), -- voice over IP encapsulation
+ atmDxi(105), -- ATM DXI
+ atmFuni(106), -- ATM FUNI
+ atmIma (107), -- ATM IMA
+ pppMultilinkBundle(108), -- PPP Multilink Bundle
+ ipOverCdlc (109), -- IBM ipOverCdlc
+ ipOverClaw (110), -- IBM Common Link Access to Workstn
+ stackToStack (111), -- IBM stackToStack
+ virtualIpAddress (112), -- IBM VIPA
+ mpc (113), -- IBM multi-protocol channel support
+ ipOverAtm (114), -- IBM ipOverAtm
+ iso88025Fiber (115), -- ISO 802.5j Fiber Token Ring
+ tdlc (116), -- IBM twinaxial data link control
+ gigabitEthernet (117), -- Obsoleted via RFC3635
+ -- ethernetCsmacd (6) should be used instead
+ hdlc (118), -- HDLC
+ lapf (119), -- LAP F
+ v37 (120), -- V.37
+ x25mlp (121), -- Multi-Link Protocol
+ x25huntGroup (122), -- X25 Hunt Group
+ trasnpHdlc (123), -- Transp HDLC
+ interleave (124), -- Interleave channel
+ fast (125), -- Fast channel
+ ip (126), -- IP (for APPN HPR in IP networks)
+ docsCableMaclayer (127), -- CATV Mac Layer
+ docsCableDownstream (128), -- CATV Downstream interface
+ docsCableUpstream (129), -- CATV Upstream interface
+ a12MppSwitch (130), -- Avalon Parallel Processor
+ tunnel (131), -- Encapsulation interface
+ coffee (132), -- coffee pot
+ ces (133), -- Circuit Emulation Service
+ atmSubInterface (134), -- ATM Sub Interface
+ l2vlan (135), -- Layer 2 Virtual LAN using 802.1Q
+ l3ipvlan (136), -- Layer 3 Virtual LAN using IP
+ l3ipxvlan (137), -- Layer 3 Virtual LAN using IPX
+ digitalPowerline (138), -- IP over Power Lines
+ mediaMailOverIp (139), -- Multimedia Mail over IP
+ dtm (140), -- Dynamic syncronous Transfer Mode
+ dcn (141), -- Data Communications Network
+ ipForward (142), -- IP Forwarding Interface
+ msdsl (143), -- Multi-rate Symmetric DSL
+ ieee1394 (144), -- IEEE1394 High Performance Serial Bus
+ if-gsn (145), -- HIPPI-6400
+ dvbRccMacLayer (146), -- DVB-RCC MAC Layer
+ dvbRccDownstream (147), -- DVB-RCC Downstream Channel
+ dvbRccUpstream (148), -- DVB-RCC Upstream Channel
+ atmVirtual (149), -- ATM Virtual Interface
+ mplsTunnel (150), -- MPLS Tunnel Virtual Interface
+ srp (151), -- Spatial Reuse Protocol
+ voiceOverAtm (152), -- Voice Over ATM
+ voiceOverFrameRelay (153), -- Voice Over Frame Relay
+ idsl (154), -- Digital Subscriber Loop over ISDN
+ compositeLink (155), -- Avici Composite Link Interface
+ ss7SigLink (156), -- SS7 Signaling Link
+ propWirelessP2P (157), -- Prop. P2P wireless interface
+ frForward (158), -- Frame Forward Interface
+ rfc1483 (159), -- Multiprotocol over ATM AAL5
+ usb (160), -- USB Interface
+ ieee8023adLag (161), -- IEEE 802.3ad Link Aggregate
+ bgppolicyaccounting (162), -- BGP Policy Accounting
+ frf16MfrBundle (163), -- FRF .16 Multilink Frame Relay
+ h323Gatekeeper (164), -- H323 Gatekeeper
+ h323Proxy (165), -- H323 Voice and Video Proxy
+ mpls (166), -- MPLS
+ mfSigLink (167), -- Multi-frequency signaling link
+ hdsl2 (168), -- High Bit-Rate DSL - 2nd generation
+ shdsl (169), -- Multirate HDSL2
+ ds1FDL (170), -- Facility Data Link 4Kbps on a DS1
+ pos (171), -- Packet over SONET/SDH Interface
+ dvbAsiIn (172), -- DVB-ASI Input
+ dvbAsiOut (173), -- DVB-ASI Output
+ plc (174), -- Power Line Communtications
+ nfas (175), -- Non Facility Associated Signaling
+ tr008 (176), -- TR008
+ gr303RDT (177), -- Remote Digital Terminal
+ gr303IDT (178), -- Integrated Digital Terminal
+ isup (179), -- ISUP
+ propDocsWirelessMaclayer (180), -- Cisco proprietary Maclayer
+ propDocsWirelessDownstream (181), -- Cisco proprietary Downstream
+ propDocsWirelessUpstream (182), -- Cisco proprietary Upstream
+ hiperlan2 (183), -- HIPERLAN Type 2 Radio Interface
+ propBWAp2Mp (184), -- PropBroadbandWirelessAccesspt2multipt
+ -- use of this iftype for IEEE 802.16 WMAN
+ -- interfaces as per IEEE Std 802.16f is
+ -- deprecated and ifType 237 should be used instead.
+ sonetOverheadChannel (185), -- SONET Overhead Channel
+ digitalWrapperOverheadChannel (186), -- Digital Wrapper
+ aal2 (187), -- ATM adaptation layer 2
+ radioMAC (188), -- MAC layer over radio links
+ atmRadio (189), -- ATM over radio links
+ imt (190), -- Inter Machine Trunks
+ mvl (191), -- Multiple Virtual Lines DSL
+ reachDSL (192), -- Long Reach DSL
+ frDlciEndPt (193), -- Frame Relay DLCI End Point
+ atmVciEndPt (194), -- ATM VCI End Point
+ opticalChannel (195), -- Optical Channel
+ opticalTransport (196), -- Optical Transport
+ propAtm (197), -- Proprietary ATM
+ voiceOverCable (198), -- Voice Over Cable Interface
+ infiniband (199), -- Infiniband
+ teLink (200), -- TE Link
+ q2931 (201), -- Q.2931
+ virtualTg (202), -- Virtual Trunk Group
+ sipTg (203), -- SIP Trunk Group
+ sipSig (204), -- SIP Signaling
+ docsCableUpstreamChannel (205), -- CATV Upstream Channel
+ econet (206), -- Acorn Econet
+ pon155 (207), -- FSAN 155Mb Symetrical PON interface
+ pon622 (208), -- FSAN622Mb Symetrical PON interface
+ bridge (209), -- Transparent bridge interface
+ linegroup (210), -- Interface common to multiple lines
+ voiceEMFGD (211), -- voice E&M Feature Group D
+ voiceFGDEANA (212), -- voice FGD Exchange Access North American
+ voiceDID (213), -- voice Direct Inward Dialing
+ mpegTransport (214), -- MPEG transport interface
+ sixToFour (215), -- 6to4 interface (DEPRECATED)
+ gtp (216), -- GTP (GPRS Tunneling Protocol)
+ pdnEtherLoop1 (217), -- Paradyne EtherLoop 1
+ pdnEtherLoop2 (218), -- Paradyne EtherLoop 2
+ opticalChannelGroup (219), -- Optical Channel Group
+ homepna (220), -- HomePNA ITU-T G.989
+ gfp (221), -- Generic Framing Procedure (GFP)
+ ciscoISLvlan (222), -- Layer 2 Virtual LAN using Cisco ISL
+ actelisMetaLOOP (223), -- Acteleis proprietary MetaLOOP High Speed Link
+ fcipLink (224), -- FCIP Link
+ rpr (225), -- Resilient Packet Ring Interface Type
+ qam (226), -- RF Qam Interface
+ lmp (227), -- Link Management Protocol
+ cblVectaStar (228), -- Cambridge Broadband Networks Limited VectaStar
+ docsCableMCmtsDownstream (229), -- CATV Modular CMTS Downstream Interface
+ adsl2 (230), -- Asymmetric Digital Subscriber Loop Version 2
+ -- (DEPRECATED/OBSOLETED - please use adsl2plus 238 instead)
+ macSecControlledIF (231), -- MACSecControlled
+ macSecUncontrolledIF (232), -- MACSecUncontrolled
+ aviciOpticalEther (233), -- Avici Optical Ethernet Aggregate
+ atmbond (234), -- atmbond
+ voiceFGDOS (235), -- voice FGD Operator Services
+ mocaVersion1 (236), -- MultiMedia over Coax Alliance (MoCA) Interface
+ -- as documented in information provided privately to IANA
+ ieee80216WMAN (237), -- IEEE 802.16 WMAN interface
+ adsl2plus (238), -- Asymmetric Digital Subscriber Loop Version 2,
+ -- Version 2 Plus and all variants
+ dvbRcsMacLayer (239), -- DVB-RCS MAC Layer
+ dvbTdm (240), -- DVB Satellite TDM
+ dvbRcsTdma (241), -- DVB-RCS TDMA
+ x86Laps (242), -- LAPS based on ITU-T X.86/Y.1323
+ wwanPP (243), -- 3GPP WWAN
+ wwanPP2 (244) -- 3GPP2 WWAN
+ }
+
+IANAtunnelType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The encapsulation method used by a tunnel. The value
+ direct indicates that a packet is encapsulated
+ directly within a normal IP header, with no
+ intermediate header, and unicast to the remote tunnel
+ endpoint (e.g., an RFC 2003 IP-in-IP tunnel, or an RFC
+ 1933 IPv6-in-IPv4 tunnel). The value minimal indicates
+ that a Minimal Forwarding Header (RFC 2004) is
+ inserted between the outer header and the payload
+ packet. The value UDP indicates that the payload
+ packet is encapsulated within a normal UDP packet
+ (e.g., RFC 1234).
+
+ The values sixToFour, sixOverFour, and isatap
+ indicates that an IPv6 packet is encapsulated directly
+ within an IPv4 header, with no intermediate header,
+ and unicast to the destination determined by the 6to4,
+ 6over4, or ISATAP protocol.
+
+ The remaining protocol-specific values indicate that a
+ header of the protocol of that name is inserted
+ between the outer header and the payload header.
+
+ The assignment policy for IANAtunnelType values is
+ identical to the policy for assigning IANAifType
+ values."
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ direct(2), -- no intermediate header
+ gre(3), -- GRE encapsulation
+ minimal(4), -- Minimal encapsulation
+ l2tp(5), -- L2TP encapsulation
+ pptp(6), -- PPTP encapsulation
+ l2f(7), -- L2F encapsulation
+ udp(8), -- UDP encapsulation
+ atmp(9), -- ATMP encapsulation
+ msdp(10), -- MSDP encapsulation
+ sixToFour(11), -- 6to4 encapsulation
+ sixOverFour(12), -- 6over4 encapsulation
+ isatap(13), -- ISATAP encapsulation
+ teredo(14) -- Teredo encapsulation
+ }
+
+ END
+
+
+
+
+
+
+
+
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IF-MIB b/contrib/apps/LwipMibCompiler/Mibs/IF-MIB
new file mode 100644
index 0000000..8713894
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IF-MIB
@@ -0,0 +1,1899 @@
+IF-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Counter64,
+ Integer32, TimeTicks, mib-2,
+ NOTIFICATION-TYPE FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION, DisplayString,
+ PhysAddress, TruthValue, RowStatus,
+ TimeStamp, AutonomousType, TestAndIncr FROM SNMPv2-TC
+ MODULE-COMPLIANCE, OBJECT-GROUP,
+ NOTIFICATION-GROUP FROM SNMPv2-CONF
+ snmpTraps FROM SNMPv2-MIB
+ IANAifType FROM IANAifType-MIB;
+
+
+ifMIB MODULE-IDENTITY
+ LAST-UPDATED "200006140000Z"
+ ORGANIZATION "IETF Interfaces MIB Working Group"
+ CONTACT-INFO
+ " Keith McCloghrie
+ Cisco Systems, Inc.
+ 170 West Tasman Drive
+ San Jose, CA 95134-1706
+ US
+
+ 408-526-5260
+ kzm@cisco.com"
+ DESCRIPTION
+ "The MIB module to describe generic objects for network
+ interface sub-layers. This MIB is an updated version of
+ MIB-II's ifTable, and incorporates the extensions defined in
+ RFC 1229."
+
+
+ REVISION "200006140000Z"
+ DESCRIPTION
+ "Clarifications agreed upon by the Interfaces MIB WG, and
+ published as RFC 2863."
+ REVISION "199602282155Z"
+ DESCRIPTION
+ "Revisions made by the Interfaces MIB WG, and published in
+ RFC 2233."
+ REVISION "199311082155Z"
+ DESCRIPTION
+ "Initial revision, published as part of RFC 1573."
+ ::= { mib-2 31 }
+
+
+ifMIBObjects OBJECT IDENTIFIER ::= { ifMIB 1 }
+
+interfaces OBJECT IDENTIFIER ::= { mib-2 2 }
+
+--
+-- Textual Conventions
+--
+
+
+-- OwnerString has the same semantics as used in RFC 1271
+
+OwnerString ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "255a"
+ STATUS deprecated
+ DESCRIPTION
+ "This data type is used to model an administratively
+ assigned name of the owner of a resource. This information
+ is taken from the NVT ASCII character set. It is suggested
+ that this name contain one or more of the following: ASCII
+ form of the manager station's transport address, management
+ station name (e.g., domain name), network management
+ personnel's name, location, or phone number. In some cases
+ the agent itself will be the owner of an entry. In these
+ cases, this string shall be set to a string starting with
+ 'agent'."
+ SYNTAX OCTET STRING (SIZE(0..255))
+
+-- InterfaceIndex contains the semantics of ifIndex and should be used
+-- for any objects defined in other MIB modules that need these semantics.
+
+InterfaceIndex ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+
+
+ "A unique value, greater than zero, for each interface or
+ interface sub-layer in the managed system. It is
+ recommended that values are assigned contiguously starting
+ from 1. The value for each interface sub-layer must remain
+ constant at least from one re-initialization of the entity's
+ network management system to the next re-initialization."
+ SYNTAX Integer32 (1..2147483647)
+
+InterfaceIndexOrZero ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+ "This textual convention is an extension of the
+ InterfaceIndex convention. The latter defines a greater
+ than zero value used to identify an interface or interface
+ sub-layer in the managed system. This extension permits the
+ additional value of zero. the value zero is object-specific
+ and must therefore be defined as part of the description of
+ any object which uses this syntax. Examples of the usage of
+ zero might include situations where interface was unknown,
+ or when none or all interfaces need to be referenced."
+ SYNTAX Integer32 (0..2147483647)
+
+ifNumber OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of network interfaces (regardless of their
+ current state) present on this system."
+ ::= { interfaces 1 }
+
+ifTableLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time of the last creation or
+ deletion of an entry in the ifTable. If the number of
+ entries has been unchanged since the last re-initialization
+ of the local network management subsystem, then this object
+ contains a zero value."
+ ::= { ifMIBObjects 5 }
+
+
+-- the Interfaces table
+
+-- The Interfaces table contains information on the entity's
+
+
+-- interfaces. Each sub-layer below the internetwork-layer
+-- of a network interface is considered to be an interface.
+
+ifTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A list of interface entries. The number of entries is
+ given by the value of ifNumber."
+ ::= { interfaces 2 }
+
+ifEntry OBJECT-TYPE
+ SYNTAX IfEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing management information applicable to a
+ particular interface."
+ INDEX { ifIndex }
+ ::= { ifTable 1 }
+
+IfEntry ::=
+ SEQUENCE {
+ ifIndex InterfaceIndex,
+ ifDescr DisplayString,
+ ifType IANAifType,
+ ifMtu Integer32,
+ ifSpeed Gauge32,
+ ifPhysAddress PhysAddress,
+ ifAdminStatus INTEGER,
+ ifOperStatus INTEGER,
+ ifLastChange TimeTicks,
+ ifInOctets Counter32,
+ ifInUcastPkts Counter32,
+ ifInNUcastPkts Counter32, -- deprecated
+ ifInDiscards Counter32,
+ ifInErrors Counter32,
+ ifInUnknownProtos Counter32,
+ ifOutOctets Counter32,
+ ifOutUcastPkts Counter32,
+ ifOutNUcastPkts Counter32, -- deprecated
+ ifOutDiscards Counter32,
+ ifOutErrors Counter32,
+ ifOutQLen Gauge32, -- deprecated
+ ifSpecific OBJECT IDENTIFIER -- deprecated
+ }
+
+
+
+ifIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value, greater than zero, for each interface. It
+ is recommended that values are assigned contiguously
+ starting from 1. The value for each interface sub-layer
+ must remain constant at least from one re-initialization of
+ the entity's network management system to the next re-
+ initialization."
+ ::= { ifEntry 1 }
+
+ifDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual string containing information about the
+ interface. This string should include the name of the
+ manufacturer, the product name and the version of the
+ interface hardware/software."
+ ::= { ifEntry 2 }
+
+ifType OBJECT-TYPE
+ SYNTAX IANAifType
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The type of interface. Additional values for ifType are
+ assigned by the Internet Assigned Numbers Authority (IANA),
+ through updating the syntax of the IANAifType textual
+ convention."
+ ::= { ifEntry 3 }
+
+ifMtu OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The size of the largest packet which can be sent/received
+ on the interface, specified in octets. For interfaces that
+ are used for transmitting network datagrams, this is the
+ size of the largest network datagram that can be sent on the
+ interface."
+ ::= { ifEntry 4 }
+
+ifSpeed OBJECT-TYPE
+
+
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An estimate of the interface's current bandwidth in bits
+ per second. For interfaces which do not vary in bandwidth
+ or for those where no accurate estimation can be made, this
+ object should contain the nominal bandwidth. If the
+ bandwidth of the interface is greater than the maximum value
+ reportable by this object then this object should report its
+ maximum value (4,294,967,295) and ifHighSpeed must be used
+ to report the interace's speed. For a sub-layer which has
+ no concept of bandwidth, this object should be zero."
+ ::= { ifEntry 5 }
+
+ifPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The interface's address at its protocol sub-layer. For
+ example, for an 802.x interface, this object normally
+ contains a MAC address. The interface's media-specific MIB
+ must define the bit and byte ordering and the format of the
+ value of this object. For interfaces which do not have such
+ an address (e.g., a serial line), this object should contain
+ an octet string of zero length."
+ ::= { ifEntry 6 }
+
+ifAdminStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3) -- in some test mode
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The desired state of the interface. The testing(3) state
+ indicates that no operational packets can be passed. When a
+ managed system initializes, all interfaces start with
+ ifAdminStatus in the down(2) state. As a result of either
+ explicit management action or per configuration information
+ retained by the managed system, ifAdminStatus is then
+ changed to either the up(1) or testing(3) states (or remains
+ in the down(2) state)."
+ ::= { ifEntry 7 }
+
+
+
+ifOperStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3), -- in some test mode
+ unknown(4), -- status can not be determined
+ -- for some reason.
+ dormant(5),
+ notPresent(6), -- some component is missing
+ lowerLayerDown(7) -- down due to state of
+ -- lower-layer interface(s)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The current operational state of the interface. The
+ testing(3) state indicates that no operational packets can
+ be passed. If ifAdminStatus is down(2) then ifOperStatus
+ should be down(2). If ifAdminStatus is changed to up(1)
+ then ifOperStatus should change to up(1) if the interface is
+ ready to transmit and receive network traffic; it should
+ change to dormant(5) if the interface is waiting for
+ external actions (such as a serial line waiting for an
+ incoming connection); it should remain in the down(2) state
+ if and only if there is a fault that prevents it from going
+ to the up(1) state; it should remain in the notPresent(6)
+ state if the interface has missing (typically, hardware)
+ components."
+ ::= { ifEntry 8 }
+
+ifLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time the interface entered
+ its current operational state. If the current state was
+ entered prior to the last re-initialization of the local
+ network management subsystem, then this object contains a
+ zero value."
+ ::= { ifEntry 9 }
+
+ifInOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received on the interface,
+
+
+ including framing characters.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 10 }
+
+ifInUcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were not addressed to a multicast
+ or broadcast address at this sub-layer.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 11 }
+
+ifInNUcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a multicast or
+ broadcast address at this sub-layer.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+
+ This object is deprecated in favour of ifInMulticastPkts and
+ ifInBroadcastPkts."
+ ::= { ifEntry 12 }
+
+ifInDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of inbound packets which were chosen to be
+ discarded even though no errors had been detected to prevent
+
+
+ their being deliverable to a higher-layer protocol. One
+ possible reason for discarding such a packet could be to
+ free up buffer space.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 13 }
+
+ifInErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "For packet-oriented interfaces, the number of inbound
+ packets that contained errors preventing them from being
+ deliverable to a higher-layer protocol. For character-
+ oriented or fixed-length interfaces, the number of inbound
+ transmission units that contained errors preventing them
+ from being deliverable to a higher-layer protocol.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 14 }
+
+ifInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "For packet-oriented interfaces, the number of packets
+ received via the interface which were discarded because of
+ an unknown or unsupported protocol. For character-oriented
+ or fixed-length interfaces that support protocol
+ multiplexing the number of transmission units received via
+ the interface which were discarded because of an unknown or
+ unsupported protocol. For any interface that does not
+ support protocol multiplexing, this counter will always be
+ 0.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 15 }
+
+
+ifOutOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted out of the
+ interface, including framing characters.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 16 }
+
+ifOutUcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were not addressed to a
+ multicast or broadcast address at this sub-layer, including
+ those that were discarded or not sent.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 17 }
+
+ifOutNUcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ multicast or broadcast address at this sub-layer, including
+ those that were discarded or not sent.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime.
+
+ This object is deprecated in favour of ifOutMulticastPkts
+ and ifOutBroadcastPkts."
+ ::= { ifEntry 18 }
+
+
+ifOutDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of outbound packets which were chosen to be
+ discarded even though no errors had been detected to prevent
+ their being transmitted. One possible reason for discarding
+ such a packet could be to free up buffer space.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 19 }
+
+ifOutErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "For packet-oriented interfaces, the number of outbound
+ packets that could not be transmitted because of errors.
+ For character-oriented or fixed-length interfaces, the
+ number of outbound transmission units that could not be
+ transmitted because of errors.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifEntry 20 }
+
+ifOutQLen OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The length of the output packet queue (in packets)."
+ ::= { ifEntry 21 }
+
+ifSpecific OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "A reference to MIB definitions specific to the particular
+ media being used to realize the interface. It is
+
+
+ recommended that this value point to an instance of a MIB
+ object in the media-specific MIB, i.e., that this object
+ have the semantics associated with the InstancePointer
+ textual convention defined in RFC 2579. In fact, it is
+ recommended that the media-specific MIB specify what value
+ ifSpecific should/can take for values of ifType. If no MIB
+ definitions specific to the particular media are available,
+ the value should be set to the OBJECT IDENTIFIER { 0 0 }."
+ ::= { ifEntry 22 }
+
+
+
+--
+-- Extension to the interface table
+--
+-- This table replaces the ifExtnsTable table.
+--
+
+ifXTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfXEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A list of interface entries. The number of entries is
+ given by the value of ifNumber. This table contains
+ additional objects for the interface table."
+ ::= { ifMIBObjects 1 }
+
+ifXEntry OBJECT-TYPE
+ SYNTAX IfXEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing additional management information
+ applicable to a particular interface."
+ AUGMENTS { ifEntry }
+ ::= { ifXTable 1 }
+
+IfXEntry ::=
+ SEQUENCE {
+ ifName DisplayString,
+ ifInMulticastPkts Counter32,
+ ifInBroadcastPkts Counter32,
+ ifOutMulticastPkts Counter32,
+ ifOutBroadcastPkts Counter32,
+ ifHCInOctets Counter64,
+ ifHCInUcastPkts Counter64,
+ ifHCInMulticastPkts Counter64,
+
+
+ ifHCInBroadcastPkts Counter64,
+ ifHCOutOctets Counter64,
+ ifHCOutUcastPkts Counter64,
+ ifHCOutMulticastPkts Counter64,
+ ifHCOutBroadcastPkts Counter64,
+ ifLinkUpDownTrapEnable INTEGER,
+ ifHighSpeed Gauge32,
+ ifPromiscuousMode TruthValue,
+ ifConnectorPresent TruthValue,
+ ifAlias DisplayString,
+ ifCounterDiscontinuityTime TimeStamp
+ }
+
+
+ifName OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The textual name of the interface. The value of this
+ object should be the name of the interface as assigned by
+ the local device and should be suitable for use in commands
+ entered at the device's `console'. This might be a text
+ name, such as `le0' or a simple port number, such as `1',
+ depending on the interface naming syntax of the device. If
+ several entries in the ifTable together represent a single
+ interface as named by the device, then each will have the
+ same value of ifName. Note that for an agent which responds
+ to SNMP queries concerning an interface on some other
+ (proxied) device, then the value of ifName for such an
+ interface is the proxied device's local name for it.
+
+ If there is no local name, or this object is otherwise not
+ applicable, then this object contains a zero-length string."
+ ::= { ifXEntry 1 }
+
+ifInMulticastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a multicast
+ address at this sub-layer. For a MAC layer protocol, this
+ includes both Group and Functional addresses.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+
+
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 2 }
+
+ifInBroadcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a broadcast
+ address at this sub-layer.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 3 }
+
+ifOutMulticastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ multicast address at this sub-layer, including those that
+ were discarded or not sent. For a MAC layer protocol, this
+ includes both Group and Functional addresses.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 4 }
+
+ifOutBroadcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ broadcast address at this sub-layer, including those that
+ were discarded or not sent.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+
+
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 5 }
+
+--
+-- High Capacity Counter objects. These objects are all
+-- 64 bit versions of the "basic" ifTable counters. These
+-- objects all have the same basic semantics as their 32-bit
+-- counterparts, however, their syntax has been extended
+-- to 64 bits.
+--
+
+ifHCInOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received on the interface,
+ including framing characters. This object is a 64-bit
+ version of ifInOctets.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 6 }
+
+ifHCInUcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were not addressed to a multicast
+ or broadcast address at this sub-layer. This object is a
+ 64-bit version of ifInUcastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 7 }
+
+ifHCInMulticastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a multicast
+ address at this sub-layer. For a MAC layer protocol, this
+ includes both Group and Functional addresses. This object
+ is a 64-bit version of ifInMulticastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 8 }
+
+ifHCInBroadcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of packets, delivered by this sub-layer to a
+ higher (sub-)layer, which were addressed to a broadcast
+ address at this sub-layer. This object is a 64-bit version
+ of ifInBroadcastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 9 }
+
+ifHCOutOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted out of the
+ interface, including framing characters. This object is a
+ 64-bit version of ifOutOctets.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 10 }
+
+ifHCOutUcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were not addressed to a
+ multicast or broadcast address at this sub-layer, including
+ those that were discarded or not sent. This object is a
+ 64-bit version of ifOutUcastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 11 }
+
+ifHCOutMulticastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ multicast address at this sub-layer, including those that
+ were discarded or not sent. For a MAC layer protocol, this
+ includes both Group and Functional addresses. This object
+ is a 64-bit version of ifOutMulticastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 12 }
+
+ifHCOutBroadcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of packets that higher-level protocols
+ requested be transmitted, and which were addressed to a
+ broadcast address at this sub-layer, including those that
+ were discarded or not sent. This object is a 64-bit version
+ of ifOutBroadcastPkts.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ifCounterDiscontinuityTime."
+ ::= { ifXEntry 13 }
+
+ifLinkUpDownTrapEnable OBJECT-TYPE
+
+
+ SYNTAX INTEGER { enabled(1), disabled(2) }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "Indicates whether linkUp/linkDown traps should be generated
+ for this interface.
+
+ By default, this object should have the value enabled(1) for
+ interfaces which do not operate on 'top' of any other
+ interface (as defined in the ifStackTable), and disabled(2)
+ otherwise."
+ ::= { ifXEntry 14 }
+
+ifHighSpeed OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An estimate of the interface's current bandwidth in units
+ of 1,000,000 bits per second. If this object reports a
+ value of `n' then the speed of the interface is somewhere in
+ the range of `n-500,000' to `n+499,999'. For interfaces
+ which do not vary in bandwidth or for those where no
+ accurate estimation can be made, this object should contain
+ the nominal bandwidth. For a sub-layer which has no concept
+ of bandwidth, this object should be zero."
+ ::= { ifXEntry 15 }
+
+ifPromiscuousMode OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "This object has a value of false(2) if this interface only
+ accepts packets/frames that are addressed to this station.
+ This object has a value of true(1) when the station accepts
+ all packets/frames transmitted on the media. The value
+ true(1) is only legal on certain types of media. If legal,
+ setting this object to a value of true(1) may require the
+ interface to be reset before becoming effective.
+
+ The value of ifPromiscuousMode does not affect the reception
+ of broadcast and multicast packets/frames by the interface."
+ ::= { ifXEntry 16 }
+
+ifConnectorPresent OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-only
+
+
+ STATUS current
+ DESCRIPTION
+ "This object has the value 'true(1)' if the interface
+ sublayer has a physical connector and the value 'false(2)'
+ otherwise."
+ ::= { ifXEntry 17 }
+
+ifAlias OBJECT-TYPE
+ SYNTAX DisplayString (SIZE(0..64))
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "This object is an 'alias' name for the interface as
+ specified by a network manager, and provides a non-volatile
+ 'handle' for the interface.
+
+ On the first instantiation of an interface, the value of
+ ifAlias associated with that interface is the zero-length
+ string. As and when a value is written into an instance of
+ ifAlias through a network management set operation, then the
+ agent must retain the supplied value in the ifAlias instance
+ associated with the same interface for as long as that
+ interface remains instantiated, including across all re-
+ initializations/reboots of the network management system,
+ including those which result in a change of the interface's
+ ifIndex value.
+
+ An example of the value which a network manager might store
+ in this object for a WAN interface is the (Telco's) circuit
+ number/identifier of the interface.
+
+ Some agents may support write-access only for interfaces
+ having particular values of ifType. An agent which supports
+ write access to this object is required to keep the value in
+ non-volatile storage, but it may limit the length of new
+ values depending on how much storage is already occupied by
+ the current values for other interfaces."
+ ::= { ifXEntry 18 }
+
+ifCounterDiscontinuityTime OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+ any one or more of this interface's counters suffered a
+ discontinuity. The relevant counters are the specific
+ instances associated with this interface of any Counter32 or
+
+
+ Counter64 object contained in the ifTable or ifXTable. If
+ no such discontinuities have occurred since the last re-
+ initialization of the local management subsystem, then this
+ object contains a zero value."
+ ::= { ifXEntry 19 }
+
+-- The Interface Stack Group
+--
+-- Implementation of this group is optional, but strongly recommended
+-- for all systems
+--
+
+ifStackTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfStackEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing information on the relationships
+ between the multiple sub-layers of network interfaces. In
+ particular, it contains information on which sub-layers run
+ 'on top of' which other sub-layers, where each sub-layer
+ corresponds to a conceptual row in the ifTable. For
+ example, when the sub-layer with ifIndex value x runs over
+ the sub-layer with ifIndex value y, then this table
+ contains:
+
+ ifStackStatus.x.y=active
+
+ For each ifIndex value, I, which identifies an active
+ interface, there are always at least two instantiated rows
+ in this table associated with I. For one of these rows, I
+ is the value of ifStackHigherLayer; for the other, I is the
+ value of ifStackLowerLayer. (If I is not involved in
+ multiplexing, then these are the only two rows associated
+ with I.)
+
+ For example, two rows exist even for an interface which has
+ no others stacked on top or below it:
+
+ ifStackStatus.0.x=active
+ ifStackStatus.x.0=active "
+ ::= { ifMIBObjects 2 }
+
+
+ifStackEntry OBJECT-TYPE
+ SYNTAX IfStackEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+ DESCRIPTION
+ "Information on a particular relationship between two sub-
+ layers, specifying that one sub-layer runs on 'top' of the
+ other sub-layer. Each sub-layer corresponds to a conceptual
+ row in the ifTable."
+ INDEX { ifStackHigherLayer, ifStackLowerLayer }
+ ::= { ifStackTable 1 }
+
+
+IfStackEntry ::=
+ SEQUENCE {
+ ifStackHigherLayer InterfaceIndexOrZero,
+ ifStackLowerLayer InterfaceIndexOrZero,
+ ifStackStatus RowStatus
+ }
+
+
+ifStackHigherLayer OBJECT-TYPE
+ SYNTAX InterfaceIndexOrZero
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The value of ifIndex corresponding to the higher sub-layer
+ of the relationship, i.e., the sub-layer which runs on 'top'
+ of the sub-layer identified by the corresponding instance of
+ ifStackLowerLayer. If there is no higher sub-layer (below
+ the internetwork layer), then this object has the value 0."
+ ::= { ifStackEntry 1 }
+
+
+ifStackLowerLayer OBJECT-TYPE
+ SYNTAX InterfaceIndexOrZero
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The value of ifIndex corresponding to the lower sub-layer
+ of the relationship, i.e., the sub-layer which runs 'below'
+ the sub-layer identified by the corresponding instance of
+ ifStackHigherLayer. If there is no lower sub-layer, then
+ this object has the value 0."
+ ::= { ifStackEntry 2 }
+
+
+ifStackStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+
+
+ "The status of the relationship between two sub-layers.
+
+ Changing the value of this object from 'active' to
+ 'notInService' or 'destroy' will likely have consequences up
+ and down the interface stack. Thus, write access to this
+ object is likely to be inappropriate for some types of
+ interfaces, and many implementations will choose not to
+ support write-access for any type of interface."
+ ::= { ifStackEntry 3 }
+
+ifStackLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time of the last change of
+ the (whole) interface stack. A change of the interface
+ stack is defined to be any creation, deletion, or change in
+ value of any instance of ifStackStatus. If the interface
+ stack has been unchanged since the last re-initialization of
+ the local network management subsystem, then this object
+ contains a zero value."
+ ::= { ifMIBObjects 6 }
+
+
+-- Generic Receive Address Table
+--
+-- This group of objects is mandatory for all types of
+-- interfaces which can receive packets/frames addressed to
+-- more than one address.
+--
+-- This table replaces the ifExtnsRcvAddr table. The main
+-- difference is that this table makes use of the RowStatus
+-- textual convention, while ifExtnsRcvAddr did not.
+
+ifRcvAddressTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfRcvAddressEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains an entry for each address (broadcast,
+ multicast, or uni-cast) for which the system will receive
+ packets/frames on a particular interface, except as follows:
+
+ - for an interface operating in promiscuous mode, entries
+ are only required for those addresses for which the system
+ would receive frames were it not operating in promiscuous
+ mode.
+
+
+ - for 802.5 functional addresses, only one entry is
+ required, for the address which has the functional address
+ bit ANDed with the bit mask of all functional addresses for
+ which the interface will accept frames.
+
+ A system is normally able to use any unicast address which
+ corresponds to an entry in this table as a source address."
+ ::= { ifMIBObjects 4 }
+
+ifRcvAddressEntry OBJECT-TYPE
+ SYNTAX IfRcvAddressEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A list of objects identifying an address for which the
+ system will accept packets/frames on the particular
+ interface identified by the index value ifIndex."
+ INDEX { ifIndex, ifRcvAddressAddress }
+ ::= { ifRcvAddressTable 1 }
+
+IfRcvAddressEntry ::=
+ SEQUENCE {
+ ifRcvAddressAddress PhysAddress,
+ ifRcvAddressStatus RowStatus,
+ ifRcvAddressType INTEGER
+ }
+
+ifRcvAddressAddress OBJECT-TYPE
+ SYNTAX PhysAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An address for which the system will accept packets/frames
+ on this entry's interface."
+ ::= { ifRcvAddressEntry 1 }
+
+ifRcvAddressStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "This object is used to create and delete rows in the
+ ifRcvAddressTable."
+
+ ::= { ifRcvAddressEntry 2 }
+
+ifRcvAddressType OBJECT-TYPE
+ SYNTAX INTEGER {
+
+
+ other(1),
+ volatile(2),
+ nonVolatile(3)
+ }
+
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "This object has the value nonVolatile(3) for those entries
+ in the table which are valid and will not be deleted by the
+ next restart of the managed system. Entries having the
+ value volatile(2) are valid and exist, but have not been
+ saved, so that will not exist after the next restart of the
+ managed system. Entries having the value other(1) are valid
+ and exist but are not classified as to whether they will
+ continue to exist after the next restart."
+
+ DEFVAL { volatile }
+ ::= { ifRcvAddressEntry 3 }
+
+-- definition of interface-related traps.
+
+linkDown NOTIFICATION-TYPE
+ OBJECTS { ifIndex, ifAdminStatus, ifOperStatus }
+ STATUS current
+ DESCRIPTION
+ "A linkDown trap signifies that the SNMP entity, acting in
+ an agent role, has detected that the ifOperStatus object for
+ one of its communication links is about to enter the down
+ state from some other state (but not from the notPresent
+ state). This other state is indicated by the included value
+ of ifOperStatus."
+ ::= { snmpTraps 3 }
+
+linkUp NOTIFICATION-TYPE
+ OBJECTS { ifIndex, ifAdminStatus, ifOperStatus }
+ STATUS current
+ DESCRIPTION
+ "A linkUp trap signifies that the SNMP entity, acting in an
+ agent role, has detected that the ifOperStatus object for
+ one of its communication links left the down state and
+ transitioned into some other state (but not into the
+ notPresent state). This other state is indicated by the
+ included value of ifOperStatus."
+ ::= { snmpTraps 4 }
+
+-- conformance information
+
+
+
+ifConformance OBJECT IDENTIFIER ::= { ifMIB 2 }
+
+ifGroups OBJECT IDENTIFIER ::= { ifConformance 1 }
+ifCompliances OBJECT IDENTIFIER ::= { ifConformance 2 }
+
+
+-- compliance statements
+
+ifCompliance3 MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for SNMP entities which have
+ network interfaces."
+
+ MODULE -- this module
+ MANDATORY-GROUPS { ifGeneralInformationGroup,
+ linkUpDownNotificationsGroup }
+
+-- The groups:
+-- ifFixedLengthGroup
+-- ifHCFixedLengthGroup
+-- ifPacketGroup
+-- ifHCPacketGroup
+-- ifVHCPacketGroup
+-- are mutually exclusive; at most one of these groups is implemented
+-- for a particular interface. When any of these groups is implemented
+-- for a particular interface, then ifCounterDiscontinuityGroup must
+-- also be implemented for that interface.
+
+
+ GROUP ifFixedLengthGroup
+ DESCRIPTION
+ "This group is mandatory for those network interfaces which
+ are character-oriented or transmit data in fixed-length
+ transmission units, and for which the value of the
+ corresponding instance of ifSpeed is less than or equal to
+ 20,000,000 bits/second."
+
+ GROUP ifHCFixedLengthGroup
+ DESCRIPTION
+ "This group is mandatory for those network interfaces which
+ are character-oriented or transmit data in fixed-length
+ transmission units, and for which the value of the
+ corresponding instance of ifSpeed is greater than 20,000,000
+ bits/second."
+
+ GROUP ifPacketGroup
+ DESCRIPTION
+
+
+ "This group is mandatory for those network interfaces which
+ are packet-oriented, and for which the value of the
+ corresponding instance of ifSpeed is less than or equal to
+ 20,000,000 bits/second."
+
+ GROUP ifHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are packet-oriented and for which the value of the
+ corresponding instance of ifSpeed is greater than 20,000,000
+ bits/second but less than or equal to 650,000,000
+ bits/second."
+
+ GROUP ifVHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are packet-oriented and for which the value of the
+ corresponding instance of ifSpeed is greater than
+ 650,000,000 bits/second."
+
+
+ GROUP ifCounterDiscontinuityGroup
+ DESCRIPTION
+ "This group is mandatory for those network interfaces that
+ are required to maintain counters (i.e., those for which one
+ of the ifFixedLengthGroup, ifHCFixedLengthGroup,
+ ifPacketGroup, ifHCPacketGroup, or ifVHCPacketGroup is
+ mandatory)."
+
+
+ GROUP ifRcvAddressGroup
+ DESCRIPTION
+ "The applicability of this group MUST be defined by the
+ media-specific MIBs. Media-specific MIBs must define the
+ exact meaning, use, and semantics of the addresses in this
+ group."
+
+ OBJECT ifLinkUpDownTrapEnable
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifPromiscuousMode
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifAdminStatus
+
+
+ SYNTAX INTEGER { up(1), down(2) }
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, nor is support for the value
+ testing(3)."
+
+ OBJECT ifAlias
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ ::= { ifCompliances 3 }
+
+-- units of conformance
+
+ifGeneralInformationGroup OBJECT-GROUP
+ OBJECTS { ifIndex, ifDescr, ifType, ifSpeed, ifPhysAddress,
+ ifAdminStatus, ifOperStatus, ifLastChange,
+ ifLinkUpDownTrapEnable, ifConnectorPresent,
+ ifHighSpeed, ifName, ifNumber, ifAlias,
+ ifTableLastChange }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information applicable to
+ all network interfaces."
+ ::= { ifGroups 10 }
+
+-- the following five groups are mutually exclusive; at most
+-- one of these groups is implemented for any interface
+
+ifFixedLengthGroup OBJECT-GROUP
+ OBJECTS { ifInOctets, ifOutOctets, ifInUnknownProtos,
+ ifInErrors, ifOutErrors }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information specific to
+ non-high speed (non-high speed interfaces transmit and
+ receive at speeds less than or equal to 20,000,000
+ bits/second) character-oriented or fixed-length-transmission
+ network interfaces."
+ ::= { ifGroups 2 }
+
+ifHCFixedLengthGroup OBJECT-GROUP
+ OBJECTS { ifHCInOctets, ifHCOutOctets,
+ ifInOctets, ifOutOctets, ifInUnknownProtos,
+ ifInErrors, ifOutErrors }
+ STATUS current
+ DESCRIPTION
+
+
+ "A collection of objects providing information specific to
+ high speed (greater than 20,000,000 bits/second) character-
+ oriented or fixed-length-transmission network interfaces."
+ ::= { ifGroups 3 }
+
+ifPacketGroup OBJECT-GROUP
+ OBJECTS { ifInOctets, ifOutOctets, ifInUnknownProtos,
+ ifInErrors, ifOutErrors,
+ ifMtu, ifInUcastPkts, ifInMulticastPkts,
+ ifInBroadcastPkts, ifInDiscards,
+ ifOutUcastPkts, ifOutMulticastPkts,
+ ifOutBroadcastPkts, ifOutDiscards,
+ ifPromiscuousMode }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information specific to
+ non-high speed (non-high speed interfaces transmit and
+ receive at speeds less than or equal to 20,000,000
+ bits/second) packet-oriented network interfaces."
+ ::= { ifGroups 4 }
+
+ifHCPacketGroup OBJECT-GROUP
+ OBJECTS { ifHCInOctets, ifHCOutOctets,
+ ifInOctets, ifOutOctets, ifInUnknownProtos,
+ ifInErrors, ifOutErrors,
+ ifMtu, ifInUcastPkts, ifInMulticastPkts,
+ ifInBroadcastPkts, ifInDiscards,
+ ifOutUcastPkts, ifOutMulticastPkts,
+ ifOutBroadcastPkts, ifOutDiscards,
+ ifPromiscuousMode }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information specific to
+ high speed (greater than 20,000,000 bits/second but less
+ than or equal to 650,000,000 bits/second) packet-oriented
+ network interfaces."
+ ::= { ifGroups 5 }
+
+ifVHCPacketGroup OBJECT-GROUP
+ OBJECTS { ifHCInUcastPkts, ifHCInMulticastPkts,
+ ifHCInBroadcastPkts, ifHCOutUcastPkts,
+ ifHCOutMulticastPkts, ifHCOutBroadcastPkts,
+ ifHCInOctets, ifHCOutOctets,
+ ifInOctets, ifOutOctets, ifInUnknownProtos,
+ ifInErrors, ifOutErrors,
+ ifMtu, ifInUcastPkts, ifInMulticastPkts,
+ ifInBroadcastPkts, ifInDiscards,
+ ifOutUcastPkts, ifOutMulticastPkts,
+
+
+ ifOutBroadcastPkts, ifOutDiscards,
+ ifPromiscuousMode }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information specific to
+ higher speed (greater than 650,000,000 bits/second) packet-
+ oriented network interfaces."
+ ::= { ifGroups 6 }
+
+ifRcvAddressGroup OBJECT-GROUP
+ OBJECTS { ifRcvAddressStatus, ifRcvAddressType }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information on the
+ multiple addresses which an interface receives."
+ ::= { ifGroups 7 }
+
+ifStackGroup2 OBJECT-GROUP
+ OBJECTS { ifStackStatus, ifStackLastChange }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information on the
+ layering of MIB-II interfaces."
+ ::= { ifGroups 11 }
+
+ifCounterDiscontinuityGroup OBJECT-GROUP
+ OBJECTS { ifCounterDiscontinuityTime }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing information specific to
+ interface counter discontinuities."
+ ::= { ifGroups 13 }
+
+linkUpDownNotificationsGroup NOTIFICATION-GROUP
+ NOTIFICATIONS { linkUp, linkDown }
+ STATUS current
+ DESCRIPTION
+ "The notifications which indicate specific changes in the
+ value of ifOperStatus."
+ ::= { ifGroups 14 }
+
+-- Deprecated Definitions - Objects
+
+
+--
+-- The Interface Test Table
+--
+-- This group of objects is optional. However, a media-specific
+
+
+-- MIB may make implementation of this group mandatory.
+--
+-- This table replaces the ifExtnsTestTable
+--
+
+ifTestTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfTestEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "This table contains one entry per interface. It defines
+ objects which allow a network manager to instruct an agent
+ to test an interface for various faults. Tests for an
+ interface are defined in the media-specific MIB for that
+ interface. After invoking a test, the object ifTestResult
+ can be read to determine the outcome. If an agent can not
+ perform the test, ifTestResult is set to so indicate. The
+ object ifTestCode can be used to provide further test-
+ specific or interface-specific (or even enterprise-specific)
+ information concerning the outcome of the test. Only one
+ test can be in progress on each interface at any one time.
+ If one test is in progress when another test is invoked, the
+ second test is rejected. Some agents may reject a test when
+ a prior test is active on another interface.
+
+ Before starting a test, a manager-station must first obtain
+ 'ownership' of the entry in the ifTestTable for the
+ interface to be tested. This is accomplished with the
+ ifTestId and ifTestStatus objects as follows:
+
+ try_again:
+ get (ifTestId, ifTestStatus)
+ while (ifTestStatus != notInUse)
+ /*
+ * Loop while a test is running or some other
+ * manager is configuring a test.
+ */
+ short delay
+ get (ifTestId, ifTestStatus)
+ }
+
+ /*
+ * Is not being used right now -- let's compete
+ * to see who gets it.
+ */
+ lock_value = ifTestId
+
+ if ( set(ifTestId = lock_value, ifTestStatus = inUse,
+
+
+ ifTestOwner = 'my-IP-address') == FAILURE)
+ /*
+ * Another manager got the ifTestEntry -- go
+ * try again
+ */
+ goto try_again;
+
+ /*
+ * I have the lock
+ */
+ set up any test parameters.
+
+ /*
+ * This starts the test
+ */
+ set(ifTestType = test_to_run);
+
+ wait for test completion by polling ifTestResult
+
+ when test completes, agent sets ifTestResult
+ agent also sets ifTestStatus = 'notInUse'
+
+ retrieve any additional test results, and ifTestId
+
+ if (ifTestId == lock_value+1) results are valid
+
+ A manager station first retrieves the value of the
+ appropriate ifTestId and ifTestStatus objects, periodically
+ repeating the retrieval if necessary, until the value of
+ ifTestStatus is 'notInUse'. The manager station then tries
+ to set the same ifTestId object to the value it just
+ retrieved, the same ifTestStatus object to 'inUse', and the
+ corresponding ifTestOwner object to a value indicating
+ itself. If the set operation succeeds then the manager has
+ obtained ownership of the ifTestEntry, and the value of the
+ ifTestId object is incremented by the agent (per the
+ semantics of TestAndIncr). Failure of the set operation
+ indicates that some other manager has obtained ownership of
+ the ifTestEntry.
+
+ Once ownership is obtained, any test parameters can be
+ setup, and then the test is initiated by setting ifTestType.
+ On completion of the test, the agent sets ifTestStatus to
+ 'notInUse'. Once this occurs, the manager can retrieve the
+ results. In the (rare) event that the invocation of tests
+ by two network managers were to overlap, then there would be
+ a possibility that the first test's results might be
+ overwritten by the second test's results prior to the first
+
+
+ results being read. This unlikely circumstance can be
+ detected by a network manager retrieving ifTestId at the
+ same time as retrieving the test results, and ensuring that
+ the results are for the desired request.
+
+ If ifTestType is not set within an abnormally long period of
+ time after ownership is obtained, the agent should time-out
+ the manager, and reset the value of the ifTestStatus object
+ back to 'notInUse'. It is suggested that this time-out
+ period be 5 minutes.
+
+ In general, a management station must not retransmit a
+ request to invoke a test for which it does not receive a
+ response; instead, it properly inspects an agent's MIB to
+ determine if the invocation was successful. Only if the
+ invocation was unsuccessful, is the invocation request
+ retransmitted.
+
+ Some tests may require the interface to be taken off-line in
+ order to execute them, or may even require the agent to
+ reboot after completion of the test. In these
+ circumstances, communication with the management station
+ invoking the test may be lost until after completion of the
+ test. An agent is not required to support such tests.
+ However, if such tests are supported, then the agent should
+ make every effort to transmit a response to the request
+ which invoked the test prior to losing communication. When
+ the agent is restored to normal service, the results of the
+ test are properly made available in the appropriate objects.
+ Note that this requires that the ifIndex value assigned to
+ an interface must be unchanged even if the test causes a
+ reboot. An agent must reject any test for which it cannot,
+ perhaps due to resource constraints, make available at least
+ the minimum amount of information after that test
+ completes."
+ ::= { ifMIBObjects 3 }
+
+ifTestEntry OBJECT-TYPE
+ SYNTAX IfTestEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "An entry containing objects for invoking tests on an
+ interface."
+ AUGMENTS { ifEntry }
+ ::= { ifTestTable 1 }
+
+IfTestEntry ::=
+
+
+ SEQUENCE {
+ ifTestId TestAndIncr,
+ ifTestStatus INTEGER,
+ ifTestType AutonomousType,
+ ifTestResult INTEGER,
+ ifTestCode OBJECT IDENTIFIER,
+ ifTestOwner OwnerString
+ }
+
+ifTestId OBJECT-TYPE
+ SYNTAX TestAndIncr
+ MAX-ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "This object identifies the current invocation of the
+ interface's test."
+ ::= { ifTestEntry 1 }
+
+ifTestStatus OBJECT-TYPE
+ SYNTAX INTEGER { notInUse(1), inUse(2) }
+ MAX-ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "This object indicates whether or not some manager currently
+ has the necessary 'ownership' required to invoke a test on
+ this interface. A write to this object is only successful
+ when it changes its value from 'notInUse(1)' to 'inUse(2)'.
+ After completion of a test, the agent resets the value back
+ to 'notInUse(1)'."
+ ::= { ifTestEntry 2 }
+
+ifTestType OBJECT-TYPE
+ SYNTAX AutonomousType
+ MAX-ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "A control variable used to start and stop operator-
+ initiated interface tests. Most OBJECT IDENTIFIER values
+ assigned to tests are defined elsewhere, in association with
+ specific types of interface. However, this document assigns
+ a value for a full-duplex loopback test, and defines the
+ special meanings of the subject identifier:
+
+ noTest OBJECT IDENTIFIER ::= { 0 0 }
+
+ When the value noTest is written to this object, no action
+ is taken unless a test is in progress, in which case the
+ test is aborted. Writing any other value to this object is
+
+
+ only valid when no test is currently in progress, in which
+ case the indicated test is initiated.
+
+ When read, this object always returns the most recent value
+ that ifTestType was set to. If it has not been set since
+ the last initialization of the network management subsystem
+ on the agent, a value of noTest is returned."
+ ::= { ifTestEntry 3 }
+
+ifTestResult OBJECT-TYPE
+ SYNTAX INTEGER {
+ none(1), -- no test yet requested
+ success(2),
+ inProgress(3),
+ notSupported(4),
+ unAbleToRun(5), -- due to state of system
+ aborted(6),
+ failed(7)
+ }
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "This object contains the result of the most recently
+ requested test, or the value none(1) if no tests have been
+ requested since the last reset. Note that this facility
+ provides no provision for saving the results of one test
+ when starting another, as could be required if used by
+ multiple managers concurrently."
+ ::= { ifTestEntry 4 }
+
+ifTestCode OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "This object contains a code which contains more specific
+ information on the test result, for example an error-code
+ after a failed test. Error codes and other values this
+ object may take are specific to the type of interface and/or
+ test. The value may have the semantics of either the
+ AutonomousType or InstancePointer textual conventions as
+ defined in RFC 2579. The identifier:
+
+ testCodeUnknown OBJECT IDENTIFIER ::= { 0 0 }
+
+ is defined for use if no additional result code is
+ available."
+ ::= { ifTestEntry 5 }
+
+
+ifTestOwner OBJECT-TYPE
+ SYNTAX OwnerString
+ MAX-ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "The entity which currently has the 'ownership' required to
+ invoke a test on this interface."
+ ::= { ifTestEntry 6 }
+
+-- Deprecated Definitions - Groups
+
+
+ifGeneralGroup OBJECT-GROUP
+ OBJECTS { ifDescr, ifType, ifSpeed, ifPhysAddress,
+ ifAdminStatus, ifOperStatus, ifLastChange,
+ ifLinkUpDownTrapEnable, ifConnectorPresent,
+ ifHighSpeed, ifName }
+ STATUS deprecated
+ DESCRIPTION
+ "A collection of objects deprecated in favour of
+ ifGeneralInformationGroup."
+ ::= { ifGroups 1 }
+
+
+ifTestGroup OBJECT-GROUP
+ OBJECTS { ifTestId, ifTestStatus, ifTestType,
+ ifTestResult, ifTestCode, ifTestOwner }
+ STATUS deprecated
+ DESCRIPTION
+ "A collection of objects providing the ability to invoke
+ tests on an interface."
+ ::= { ifGroups 8 }
+
+
+ifStackGroup OBJECT-GROUP
+ OBJECTS { ifStackStatus }
+ STATUS deprecated
+ DESCRIPTION
+ "The previous collection of objects providing information on
+ the layering of MIB-II interfaces."
+ ::= { ifGroups 9 }
+
+
+ifOldObjectsGroup OBJECT-GROUP
+ OBJECTS { ifInNUcastPkts, ifOutNUcastPkts,
+ ifOutQLen, ifSpecific }
+ STATUS deprecated
+ DESCRIPTION
+
+
+ "The collection of objects deprecated from the original MIB-
+ II interfaces group."
+ ::= { ifGroups 12 }
+
+-- Deprecated Definitions - Compliance
+
+ifCompliance MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "A compliance statement defined in a previous version of
+ this MIB module, for SNMP entities which have network
+ interfaces."
+
+ MODULE -- this module
+ MANDATORY-GROUPS { ifGeneralGroup, ifStackGroup }
+
+ GROUP ifFixedLengthGroup
+ DESCRIPTION
+ "This group is mandatory for all network interfaces which
+ are character-oriented or transmit data in fixed-length
+ transmission units."
+
+ GROUP ifHCFixedLengthGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are character-oriented or transmit data in fixed-
+ length transmission units, and for which the value of the
+ corresponding instance of ifSpeed is greater than 20,000,000
+ bits/second."
+
+ GROUP ifPacketGroup
+ DESCRIPTION
+ "This group is mandatory for all network interfaces which
+ are packet-oriented."
+
+ GROUP ifHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are packet-oriented and for which the value of the
+ corresponding instance of ifSpeed is greater than
+ 650,000,000 bits/second."
+
+ GROUP ifTestGroup
+ DESCRIPTION
+ "This group is optional. Media-specific MIBs which require
+ interface tests are strongly encouraged to use this group
+ for invoking tests and reporting results. A medium specific
+ MIB which has mandatory tests may make implementation of
+
+
+ this group mandatory."
+
+ GROUP ifRcvAddressGroup
+ DESCRIPTION
+ "The applicability of this group MUST be defined by the
+ media-specific MIBs. Media-specific MIBs must define the
+ exact meaning, use, and semantics of the addresses in this
+ group."
+
+ OBJECT ifLinkUpDownTrapEnable
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifPromiscuousMode
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifStackStatus
+ SYNTAX INTEGER { active(1) } -- subset of RowStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, and only one of the six
+ enumerated values for the RowStatus textual convention need
+ be supported, specifically: active(1)."
+
+ OBJECT ifAdminStatus
+ SYNTAX INTEGER { up(1), down(2) }
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, nor is support for the value
+ testing(3)."
+ ::= { ifCompliances 1 }
+
+ifCompliance2 MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "A compliance statement defined in a previous version of
+ this MIB module, for SNMP entities which have network
+ interfaces."
+
+ MODULE -- this module
+ MANDATORY-GROUPS { ifGeneralInformationGroup, ifStackGroup2,
+ ifCounterDiscontinuityGroup }
+
+ GROUP ifFixedLengthGroup
+ DESCRIPTION
+
+
+ "This group is mandatory for all network interfaces which
+ are character-oriented or transmit data in fixed-length
+ transmission units."
+
+ GROUP ifHCFixedLengthGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are character-oriented or transmit data in fixed-
+ length transmission units, and for which the value of the
+ corresponding instance of ifSpeed is greater than 20,000,000
+ bits/second."
+
+ GROUP ifPacketGroup
+ DESCRIPTION
+ "This group is mandatory for all network interfaces which
+ are packet-oriented."
+
+ GROUP ifHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory only for those network interfaces
+ which are packet-oriented and for which the value of the
+ corresponding instance of ifSpeed is greater than
+ 650,000,000 bits/second."
+
+ GROUP ifRcvAddressGroup
+ DESCRIPTION
+ "The applicability of this group MUST be defined by the
+ media-specific MIBs. Media-specific MIBs must define the
+ exact meaning, use, and semantics of the addresses in this
+ group."
+
+ OBJECT ifLinkUpDownTrapEnable
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifPromiscuousMode
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT ifStackStatus
+ SYNTAX INTEGER { active(1) } -- subset of RowStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, and only one of the six
+ enumerated values for the RowStatus textual convention need
+ be supported, specifically: active(1)."
+
+
+ OBJECT ifAdminStatus
+ SYNTAX INTEGER { up(1), down(2) }
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, nor is support for the value
+ testing(3)."
+
+ OBJECT ifAlias
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ ::= { ifCompliances 2 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/INET-ADDRESS-MIB b/contrib/apps/LwipMibCompiler/Mibs/INET-ADDRESS-MIB
new file mode 100644
index 0000000..a19b8d2
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/INET-ADDRESS-MIB
@@ -0,0 +1,421 @@
+INET-ADDRESS-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, mib-2, Unsigned32 FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION FROM SNMPv2-TC;
+
+inetAddressMIB MODULE-IDENTITY
+ LAST-UPDATED "200502040000Z"
+ ORGANIZATION
+ "IETF Operations and Management Area"
+ CONTACT-INFO
+ "Juergen Schoenwaelder (Editor)
+ International University Bremen
+ P.O. Box 750 561
+ 28725 Bremen, Germany
+
+ Phone: +49 421 200-3587
+ EMail: j.schoenwaelder@iu-bremen.de
+
+ Send comments to <ietfmibs@ops.ietf.org>."
+ DESCRIPTION
+ "This MIB module defines textual conventions for
+ representing Internet addresses. An Internet
+ address can be an IPv4 address, an IPv6 address,
+ or a DNS domain name. This module also defines
+ textual conventions for Internet port numbers,
+ autonomous system numbers, and the length of an
+ Internet address prefix.
+
+ Copyright (C) The Internet Society (2005). This version
+ of this MIB module is part of RFC 4001, see the RFC
+ itself for full legal notices."
+ REVISION "200502040000Z"
+ DESCRIPTION
+ "Third version, published as RFC 4001. This revision
+ introduces the InetZoneIndex, InetScopeType, and
+ InetVersion textual conventions."
+ REVISION "200205090000Z"
+ DESCRIPTION
+ "Second version, published as RFC 3291. This
+ revision contains several clarifications and
+ introduces several new textual conventions:
+ InetAddressPrefixLength, InetPortNumber,
+ InetAutonomousSystemNumber, InetAddressIPv4z,
+ and InetAddressIPv6z."
+ REVISION "200006080000Z"
+
+
+
+ DESCRIPTION
+ "Initial version, published as RFC 2851."
+ ::= { mib-2 76 }
+
+InetAddressType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "A value that represents a type of Internet address.
+
+ unknown(0) An unknown address type. This value MUST
+ be used if the value of the corresponding
+ InetAddress object is a zero-length string.
+ It may also be used to indicate an IP address
+ that is not in one of the formats defined
+ below.
+
+ ipv4(1) An IPv4 address as defined by the
+ InetAddressIPv4 textual convention.
+
+ ipv6(2) An IPv6 address as defined by the
+ InetAddressIPv6 textual convention.
+
+ ipv4z(3) A non-global IPv4 address including a zone
+ index as defined by the InetAddressIPv4z
+ textual convention.
+
+ ipv6z(4) A non-global IPv6 address including a zone
+ index as defined by the InetAddressIPv6z
+ textual convention.
+
+ dns(16) A DNS domain name as defined by the
+ InetAddressDNS textual convention.
+
+ Each definition of a concrete InetAddressType value must be
+ accompanied by a definition of a textual convention for use
+ with that InetAddressType.
+
+ To support future extensions, the InetAddressType textual
+ convention SHOULD NOT be sub-typed in object type definitions.
+ It MAY be sub-typed in compliance statements in order to
+ require only a subset of these address types for a compliant
+ implementation.
+
+ Implementations must ensure that InetAddressType objects
+ and any dependent objects (e.g., InetAddress objects) are
+ consistent. An inconsistentValue error must be generated
+ if an attempt to change an InetAddressType object would,
+ for example, lead to an undefined InetAddress value. In
+
+
+
+ particular, InetAddressType/InetAddress pairs must be
+ changed together if the address type changes (e.g., from
+ ipv6(2) to ipv4(1))."
+ SYNTAX INTEGER {
+ unknown(0),
+ ipv4(1),
+ ipv6(2),
+ ipv4z(3),
+ ipv6z(4),
+ dns(16)
+ }
+
+InetAddress ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Denotes a generic Internet address.
+
+ An InetAddress value is always interpreted within the context
+ of an InetAddressType value. Every usage of the InetAddress
+ textual convention is required to specify the InetAddressType
+ object that provides the context. It is suggested that the
+ InetAddressType object be logically registered before the
+ object(s) that use the InetAddress textual convention, if
+ they appear in the same logical row.
+
+ The value of an InetAddress object must always be
+ consistent with the value of the associated InetAddressType
+ object. Attempts to set an InetAddress object to a value
+ inconsistent with the associated InetAddressType
+ must fail with an inconsistentValue error.
+
+ When this textual convention is used as the syntax of an
+ index object, there may be issues with the limit of 128
+ sub-identifiers specified in SMIv2, STD 58. In this case,
+ the object definition MUST include a 'SIZE' clause to
+ limit the number of potential instance sub-identifiers;
+ otherwise the applicable constraints MUST be stated in
+ the appropriate conceptual row DESCRIPTION clauses, or
+ in the surrounding documentation if there is no single
+ DESCRIPTION clause that is appropriate."
+ SYNTAX OCTET STRING (SIZE (0..255))
+
+InetAddressIPv4 ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "1d.1d.1d.1d"
+ STATUS current
+ DESCRIPTION
+ "Represents an IPv4 network address:
+
+
+
+
+ Octets Contents Encoding
+ 1-4 IPv4 address network-byte order
+
+ The corresponding InetAddressType value is ipv4(1).
+
+ This textual convention SHOULD NOT be used directly in object
+ definitions, as it restricts addresses to a specific format.
+ However, if it is used, it MAY be used either on its own or in
+ conjunction with InetAddressType, as a pair."
+ SYNTAX OCTET STRING (SIZE (4))
+
+InetAddressIPv6 ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "2x:2x:2x:2x:2x:2x:2x:2x"
+ STATUS current
+ DESCRIPTION
+ "Represents an IPv6 network address:
+
+ Octets Contents Encoding
+ 1-16 IPv6 address network-byte order
+
+ The corresponding InetAddressType value is ipv6(2).
+
+ This textual convention SHOULD NOT be used directly in object
+ definitions, as it restricts addresses to a specific format.
+ However, if it is used, it MAY be used either on its own or in
+ conjunction with InetAddressType, as a pair."
+ SYNTAX OCTET STRING (SIZE (16))
+
+InetAddressIPv4z ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "1d.1d.1d.1d%4d"
+ STATUS current
+ DESCRIPTION
+ "Represents a non-global IPv4 network address, together
+ with its zone index:
+
+ Octets Contents Encoding
+ 1-4 IPv4 address network-byte order
+ 5-8 zone index network-byte order
+
+ The corresponding InetAddressType value is ipv4z(3).
+
+ The zone index (bytes 5-8) is used to disambiguate identical
+ address values on nodes that have interfaces attached to
+ different zones of the same scope. The zone index may contain
+ the special value 0, which refers to the default zone for each
+ scope.
+
+ This textual convention SHOULD NOT be used directly in object
+
+
+
+ definitions, as it restricts addresses to a specific format.
+ However, if it is used, it MAY be used either on its own or in
+ conjunction with InetAddressType, as a pair."
+ SYNTAX OCTET STRING (SIZE (8))
+
+InetAddressIPv6z ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "2x:2x:2x:2x:2x:2x:2x:2x%4d"
+ STATUS current
+ DESCRIPTION
+ "Represents a non-global IPv6 network address, together
+ with its zone index:
+
+ Octets Contents Encoding
+ 1-16 IPv6 address network-byte order
+ 17-20 zone index network-byte order
+
+ The corresponding InetAddressType value is ipv6z(4).
+
+ The zone index (bytes 17-20) is used to disambiguate
+ identical address values on nodes that have interfaces
+ attached to different zones of the same scope. The zone index
+ may contain the special value 0, which refers to the default
+ zone for each scope.
+
+ This textual convention SHOULD NOT be used directly in object
+ definitions, as it restricts addresses to a specific format.
+ However, if it is used, it MAY be used either on its own or in
+ conjunction with InetAddressType, as a pair."
+ SYNTAX OCTET STRING (SIZE (20))
+
+InetAddressDNS ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "255a"
+ STATUS current
+ DESCRIPTION
+ "Represents a DNS domain name. The name SHOULD be fully
+ qualified whenever possible.
+
+ The corresponding InetAddressType is dns(16).
+
+ The DESCRIPTION clause of InetAddress objects that may have
+ InetAddressDNS values MUST fully describe how (and when)
+ these names are to be resolved to IP addresses.
+
+ The resolution of an InetAddressDNS value may require to
+ query multiple DNS records (e.g., A for IPv4 and AAAA for
+ IPv6). The order of the resolution process and which DNS
+ record takes precedence depends on the configuration of the
+ resolver.
+
+
+
+ This textual convention SHOULD NOT be used directly in object
+ definitions, as it restricts addresses to a specific format.
+ However, if it is used, it MAY be used either on its own or in
+ conjunction with InetAddressType, as a pair."
+ SYNTAX OCTET STRING (SIZE (1..255))
+
+InetAddressPrefixLength ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+ "Denotes the length of a generic Internet network address
+ prefix. A value of n corresponds to an IP address mask
+ that has n contiguous 1-bits from the most significant
+ bit (MSB), with all other bits set to 0.
+
+ An InetAddressPrefixLength value is always interpreted within
+ the context of an InetAddressType value. Every usage of the
+ InetAddressPrefixLength textual convention is required to
+ specify the InetAddressType object that provides the
+ context. It is suggested that the InetAddressType object be
+ logically registered before the object(s) that use the
+ InetAddressPrefixLength textual convention, if they appear
+ in the same logical row.
+
+ InetAddressPrefixLength values larger than
+ the maximum length of an IP address for a specific
+ InetAddressType are treated as the maximum significant
+ value applicable for the InetAddressType. The maximum
+ significant value is 32 for the InetAddressType
+ 'ipv4(1)' and 'ipv4z(3)' and 128 for the InetAddressType
+ 'ipv6(2)' and 'ipv6z(4)'. The maximum significant value
+ for the InetAddressType 'dns(16)' is 0.
+
+ The value zero is object-specific and must be defined as
+ part of the description of any object that uses this
+ syntax. Examples of the usage of zero might include
+ situations where the Internet network address prefix
+ is unknown or does not apply.
+
+ The upper bound of the prefix length has been chosen to
+ be consistent with the maximum size of an InetAddress."
+ SYNTAX Unsigned32 (0..2040)
+
+InetPortNumber ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+ "Represents a 16 bit port number of an Internet transport
+
+
+
+ layer protocol. Port numbers are assigned by IANA. A
+ current list of all assignments is available from
+ <http://www.iana.org/>.
+
+ The value zero is object-specific and must be defined as
+ part of the description of any object that uses this
+ syntax. Examples of the usage of zero might include
+ situations where a port number is unknown, or when the
+ value zero is used as a wildcard in a filter."
+ REFERENCE "STD 6 (RFC 768), STD 7 (RFC 793) and RFC 2960"
+ SYNTAX Unsigned32 (0..65535)
+
+InetAutonomousSystemNumber ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+ "Represents an autonomous system number that identifies an
+ Autonomous System (AS). An AS is a set of routers under a
+ single technical administration, using an interior gateway
+ protocol and common metrics to route packets within the AS,
+ and using an exterior gateway protocol to route packets to
+ other ASes'. IANA maintains the AS number space and has
+ delegated large parts to the regional registries.
+
+ Autonomous system numbers are currently limited to 16 bits
+ (0..65535). There is, however, work in progress to enlarge the
+ autonomous system number space to 32 bits. Therefore, this
+ textual convention uses an Unsigned32 value without a
+ range restriction in order to support a larger autonomous
+ system number space."
+ REFERENCE "RFC 1771, RFC 1930"
+ SYNTAX Unsigned32
+
+InetScopeType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents a scope type. This textual convention can be used
+ in cases where a MIB has to represent different scope types
+ and there is no context information, such as an InetAddress
+ object, that implicitly defines the scope type.
+
+ Note that not all possible values have been assigned yet, but
+ they may be assigned in future revisions of this specification.
+ Applications should therefore be able to deal with values
+ not yet assigned."
+ REFERENCE "RFC 3513"
+ SYNTAX INTEGER {
+ -- reserved(0),
+
+
+
+ interfaceLocal(1),
+ linkLocal(2),
+ subnetLocal(3),
+ adminLocal(4),
+ siteLocal(5), -- site-local unicast addresses
+ -- have been deprecated by RFC 3879
+ -- unassigned(6),
+ -- unassigned(7),
+ organizationLocal(8),
+ -- unassigned(9),
+ -- unassigned(10),
+ -- unassigned(11),
+ -- unassigned(12),
+ -- unassigned(13),
+ global(14)
+ -- reserved(15)
+ }
+
+InetZoneIndex ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "d"
+ STATUS current
+ DESCRIPTION
+ "A zone index identifies an instance of a zone of a
+ specific scope.
+
+ The zone index MUST disambiguate identical address
+ values. For link-local addresses, the zone index will
+ typically be the interface index (ifIndex as defined in the
+ IF-MIB) of the interface on which the address is configured.
+
+ The zone index may contain the special value 0, which refers
+ to the default zone. The default zone may be used in cases
+ where the valid zone index is not known (e.g., when a
+ management application has to write a link-local IPv6
+ address without knowing the interface index value). The
+ default zone SHOULD NOT be used as an easy way out in
+ cases where the zone index for a non-global IPv6 address
+ is known."
+ REFERENCE "RFC4007"
+ SYNTAX Unsigned32
+
+InetVersion ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "A value representing a version of the IP protocol.
+
+ unknown(0) An unknown or unspecified version of the IP
+ protocol.
+
+
+
+ ipv4(1) The IPv4 protocol as defined in RFC 791 (STD 5).
+
+ ipv6(2) The IPv6 protocol as defined in RFC 2460.
+
+ Note that this textual convention SHOULD NOT be used to
+ distinguish different address types associated with IP
+ protocols. The InetAddressType has been designed for this
+ purpose."
+ REFERENCE "RFC 791, RFC 2460"
+ SYNTAX INTEGER {
+ unknown(0),
+ ipv4(1),
+ ipv6(2)
+ }
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/IP-MIB b/contrib/apps/LwipMibCompiler/Mibs/IP-MIB
new file mode 100644
index 0000000..0a93501
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/IP-MIB
@@ -0,0 +1,5254 @@
+IP-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE,
+ Integer32, Counter32, IpAddress,
+ mib-2, Unsigned32, Counter64,
+ zeroDotZero FROM SNMPv2-SMI
+ PhysAddress, TruthValue,
+ TimeStamp, RowPointer,
+ TEXTUAL-CONVENTION, TestAndIncr,
+ RowStatus, StorageType FROM SNMPv2-TC
+ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+ InetAddress, InetAddressType,
+ InetAddressPrefixLength,
+ InetVersion, InetZoneIndex FROM INET-ADDRESS-MIB
+ InterfaceIndex FROM IF-MIB;
+
+ipMIB MODULE-IDENTITY
+ LAST-UPDATED "200602020000Z"
+ ORGANIZATION "IETF IPv6 MIB Revision Team"
+ CONTACT-INFO
+ "Editor:
+
+
+
+ Shawn A. Routhier
+ Interworking Labs
+ 108 Whispering Pines Dr. Suite 235
+ Scotts Valley, CA 95066
+ USA
+ EMail: <sar@iwl.com>"
+ DESCRIPTION
+ "The MIB module for managing IP and ICMP implementations, but
+ excluding their management of IP routes.
+
+ Copyright (C) The Internet Society (2006). This version of
+ this MIB module is part of RFC 4293; see the RFC itself for
+ full legal notices."
+
+ REVISION "200602020000Z"
+ DESCRIPTION
+ "The IP version neutral revision with added IPv6 objects for
+ ND, default routers, and router advertisements. As well as
+ being the successor to RFC 2011, this MIB is also the
+ successor to RFCs 2465 and 2466. Published as RFC 4293."
+
+ REVISION "199411010000Z"
+ DESCRIPTION
+ "A separate MIB module (IP-MIB) for IP and ICMP management
+ objects. Published as RFC 2011."
+
+ REVISION "199103310000Z"
+ DESCRIPTION
+ "The initial revision of this MIB module was part of MIB-II,
+ which was published as RFC 1213."
+ ::= { mib-2 48}
+
+--
+-- The textual conventions we define and use in this MIB.
+--
+
+IpAddressOriginTC ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The origin of the address.
+
+ manual(2) indicates that the address was manually configured
+ to a specified address, e.g., by user configuration.
+
+ dhcp(4) indicates an address that was assigned to this
+ system by a DHCP server.
+
+ linklayer(5) indicates an address created by IPv6 stateless
+
+
+
+ auto-configuration.
+
+ random(6) indicates an address chosen by the system at
+ random, e.g., an IPv4 address within 169.254/16, or an RFC
+ 3041 privacy address."
+ SYNTAX INTEGER {
+ other(1),
+ manual(2),
+ dhcp(4),
+ linklayer(5),
+ random(6)
+ }
+
+IpAddressStatusTC ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The status of an address. Most of the states correspond to
+ states from the IPv6 Stateless Address Autoconfiguration
+ protocol.
+
+ The preferred(1) state indicates that this is a valid
+ address that can appear as the destination or source address
+ of a packet.
+
+ The deprecated(2) state indicates that this is a valid but
+ deprecated address that should no longer be used as a source
+ address in new communications, but packets addressed to such
+ an address are processed as expected.
+
+ The invalid(3) state indicates that this isn't a valid
+ address and it shouldn't appear as the destination or source
+ address of a packet.
+
+ The inaccessible(4) state indicates that the address is not
+ accessible because the interface to which this address is
+ assigned is not operational.
+
+ The unknown(5) state indicates that the status cannot be
+ determined for some reason.
+
+ The tentative(6) state indicates that the uniqueness of the
+ address on the link is being verified. Addresses in this
+ state should not be used for general communication and
+ should only be used to determine the uniqueness of the
+ address.
+
+ The duplicate(7) state indicates the address has been
+ determined to be non-unique on the link and so must not be
+
+
+
+ used.
+
+ The optimistic(8) state indicates the address is available
+ for use, subject to restrictions, while its uniqueness on
+ a link is being verified.
+
+ In the absence of other information, an IPv4 address is
+ always preferred(1)."
+ REFERENCE "RFC 2462"
+ SYNTAX INTEGER {
+ preferred(1),
+ deprecated(2),
+ invalid(3),
+ inaccessible(4),
+ unknown(5),
+ tentative(6),
+ duplicate(7),
+ optimistic(8)
+ }
+
+IpAddressPrefixOriginTC ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The origin of this prefix.
+
+ manual(2) indicates a prefix that was manually configured.
+
+ wellknown(3) indicates a well-known prefix, e.g., 169.254/16
+ for IPv4 auto-configuration or fe80::/10 for IPv6 link-local
+ addresses. Well known prefixes may be assigned by IANA,
+ the address registries, or by specification in a standards
+ track RFC.
+
+ dhcp(4) indicates a prefix that was assigned by a DHCP
+ server.
+
+ routeradv(5) indicates a prefix learned from a router
+ advertisement.
+
+ Note: while IpAddressOriginTC and IpAddressPrefixOriginTC
+ are similar, they are not identical. The first defines how
+ an address was created, while the second defines how a
+ prefix was found."
+ SYNTAX INTEGER {
+ other(1),
+ manual(2),
+ wellknown(3),
+ dhcp(4),
+
+
+
+ routeradv(5)
+ }
+
+Ipv6AddressIfIdentifierTC ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "2x:"
+ STATUS current
+ DESCRIPTION
+ "This data type is used to model IPv6 address
+ interface identifiers. This is a binary string
+ of up to 8 octets in network byte-order."
+ SYNTAX OCTET STRING (SIZE (0..8))
+
+--
+-- the IP general group
+-- some objects that affect all of IPv4
+--
+
+ip OBJECT IDENTIFIER ::= { mib-2 4 }
+
+ipForwarding OBJECT-TYPE
+ SYNTAX INTEGER {
+ forwarding(1), -- acting as a router
+ notForwarding(2) -- NOT acting as a router
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The indication of whether this entity is acting as an IPv4
+ router in respect to the forwarding of datagrams received
+ by, but not addressed to, this entity. IPv4 routers forward
+ datagrams. IPv4 hosts do not (except those source-routed
+ via the host).
+
+ When this object is written, the entity should save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system.
+ Note: a stronger requirement is not used because this object
+ was previously defined."
+ ::= { ip 1 }
+
+ipDefaultTTL OBJECT-TYPE
+ SYNTAX Integer32 (1..255)
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The default value inserted into the Time-To-Live field of
+ the IPv4 header of datagrams originated at this entity,
+ whenever a TTL value is not supplied by the transport layer
+
+
+
+ protocol.
+
+ When this object is written, the entity should save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system.
+ Note: a stronger requirement is not used because this object
+ was previously defined."
+ ::= { ip 2 }
+
+ipReasmTimeout OBJECT-TYPE
+ SYNTAX Integer32
+ UNITS "seconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The maximum number of seconds that received fragments are
+ held while they are awaiting reassembly at this entity."
+ ::= { ip 13 }
+
+--
+-- the IPv6 general group
+-- Some objects that affect all of IPv6
+--
+
+ipv6IpForwarding OBJECT-TYPE
+ SYNTAX INTEGER {
+ forwarding(1), -- acting as a router
+ notForwarding(2) -- NOT acting as a router
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The indication of whether this entity is acting as an IPv6
+ router on any interface in respect to the forwarding of
+ datagrams received by, but not addressed to, this entity.
+ IPv6 routers forward datagrams. IPv6 hosts do not (except
+ those source-routed via the host).
+
+ When this object is written, the entity SHOULD save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system."
+ ::= { ip 25 }
+
+ipv6IpDefaultHopLimit OBJECT-TYPE
+ SYNTAX Integer32 (0..255)
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The default value inserted into the Hop Limit field of the
+ IPv6 header of datagrams originated at this entity whenever
+ a Hop Limit value is not supplied by the transport layer
+ protocol.
+
+ When this object is written, the entity SHOULD save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system."
+ REFERENCE "RFC 2461 Section 6.3.2"
+ ::= { ip 26 }
+
+--
+-- IPv4 Interface Table
+--
+
+ipv4InterfaceTableLastChange OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+ a row in the ipv4InterfaceTable was added or deleted, or
+ when an ipv4InterfaceReasmMaxSize or an
+ ipv4InterfaceEnableStatus object was modified.
+
+ If new objects are added to the ipv4InterfaceTable that
+ require the ipv4InterfaceTableLastChange to be updated when
+ they are modified, they must specify that requirement in
+ their description clause."
+ ::= { ip 27 }
+
+ipv4InterfaceTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF Ipv4InterfaceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing per-interface IPv4-specific
+ information."
+ ::= { ip 28 }
+
+ipv4InterfaceEntry OBJECT-TYPE
+ SYNTAX Ipv4InterfaceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing IPv4-specific information for a specific
+ interface."
+ INDEX { ipv4InterfaceIfIndex }
+
+
+
+ ::= { ipv4InterfaceTable 1 }
+
+Ipv4InterfaceEntry ::= SEQUENCE {
+ ipv4InterfaceIfIndex InterfaceIndex,
+ ipv4InterfaceReasmMaxSize Integer32,
+ ipv4InterfaceEnableStatus INTEGER,
+ ipv4InterfaceRetransmitTime Unsigned32
+ }
+
+ipv4InterfaceIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipv4InterfaceEntry 1 }
+
+ipv4InterfaceReasmMaxSize OBJECT-TYPE
+ SYNTAX Integer32 (0..65535)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The size of the largest IPv4 datagram that this entity can
+ re-assemble from incoming IPv4 fragmented datagrams received
+ on this interface."
+ ::= { ipv4InterfaceEntry 2 }
+
+ipv4InterfaceEnableStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1),
+ down(2)
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The indication of whether IPv4 is enabled (up) or disabled
+ (down) on this interface. This object does not affect the
+ state of the interface itself, only its connection to an
+ IPv4 stack. The IF-MIB should be used to control the state
+ of the interface."
+ ::= { ipv4InterfaceEntry 3 }
+
+ipv4InterfaceRetransmitTime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milliseconds"
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The time between retransmissions of ARP requests to a
+ neighbor when resolving the address or when probing the
+ reachability of a neighbor."
+ REFERENCE "RFC 1122"
+ DEFVAL { 1000 }
+ ::= { ipv4InterfaceEntry 4 }
+
+--
+-- v6 interface table
+--
+
+ipv6InterfaceTableLastChange OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+ a row in the ipv6InterfaceTable was added or deleted or when
+ an ipv6InterfaceReasmMaxSize, ipv6InterfaceIdentifier,
+ ipv6InterfaceEnableStatus, ipv6InterfaceReachableTime,
+ ipv6InterfaceRetransmitTime, or ipv6InterfaceForwarding
+ object was modified.
+
+ If new objects are added to the ipv6InterfaceTable that
+ require the ipv6InterfaceTableLastChange to be updated when
+ they are modified, they must specify that requirement in
+ their description clause."
+ ::= { ip 29 }
+
+ipv6InterfaceTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF Ipv6InterfaceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing per-interface IPv6-specific
+ information."
+ ::= { ip 30 }
+
+ipv6InterfaceEntry OBJECT-TYPE
+ SYNTAX Ipv6InterfaceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing IPv6-specific information for a given
+ interface."
+
+
+
+ INDEX { ipv6InterfaceIfIndex }
+ ::= { ipv6InterfaceTable 1 }
+
+Ipv6InterfaceEntry ::= SEQUENCE {
+ ipv6InterfaceIfIndex InterfaceIndex,
+ ipv6InterfaceReasmMaxSize Unsigned32,
+ ipv6InterfaceIdentifier Ipv6AddressIfIdentifierTC,
+ ipv6InterfaceEnableStatus INTEGER,
+ ipv6InterfaceReachableTime Unsigned32,
+ ipv6InterfaceRetransmitTime Unsigned32,
+ ipv6InterfaceForwarding INTEGER
+ }
+
+ipv6InterfaceIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipv6InterfaceEntry 1 }
+
+ipv6InterfaceReasmMaxSize OBJECT-TYPE
+ SYNTAX Unsigned32 (1500..65535)
+ UNITS "octets"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The size of the largest IPv6 datagram that this entity can
+ re-assemble from incoming IPv6 fragmented datagrams received
+ on this interface."
+ ::= { ipv6InterfaceEntry 2 }
+
+ipv6InterfaceIdentifier OBJECT-TYPE
+ SYNTAX Ipv6AddressIfIdentifierTC
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The Interface Identifier for this interface. The Interface
+ Identifier is combined with an address prefix to form an
+ interface address.
+
+ By default, the Interface Identifier is auto-configured
+ according to the rules of the link type to which this
+ interface is attached.
+
+
+
+
+ A zero length identifier may be used where appropriate. One
+ possible example is a loopback interface."
+ ::= { ipv6InterfaceEntry 3 }
+
+-- This object ID is reserved as it was used in earlier versions of
+-- the MIB module. In theory, OIDs are not assigned until the
+-- specification is released as an RFC; however, as some companies
+-- may have shipped code based on earlier versions of the MIB, it
+-- seems best to reserve this OID. This OID had been
+-- ipv6InterfacePhysicalAddress.
+-- ::= { ipv6InterfaceEntry 4}
+
+ipv6InterfaceEnableStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1),
+ down(2)
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The indication of whether IPv6 is enabled (up) or disabled
+ (down) on this interface. This object does not affect the
+ state of the interface itself, only its connection to an
+ IPv6 stack. The IF-MIB should be used to control the state
+ of the interface.
+
+ When this object is written, the entity SHOULD save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system."
+ ::= { ipv6InterfaceEntry 5 }
+
+ipv6InterfaceReachableTime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milliseconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The time a neighbor is considered reachable after receiving
+ a reachability confirmation."
+ REFERENCE "RFC 2461, Section 6.3.2"
+ ::= { ipv6InterfaceEntry 6 }
+
+ipv6InterfaceRetransmitTime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milliseconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The time between retransmissions of Neighbor Solicitation
+ messages to a neighbor when resolving the address or when
+ probing the reachability of a neighbor."
+ REFERENCE "RFC 2461, Section 6.3.2"
+ ::= { ipv6InterfaceEntry 7 }
+
+ipv6InterfaceForwarding OBJECT-TYPE
+ SYNTAX INTEGER {
+ forwarding(1), -- acting as a router
+ notForwarding(2) -- NOT acting as a router
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The indication of whether this entity is acting as an IPv6
+ router on this interface with respect to the forwarding of
+ datagrams received by, but not addressed to, this entity.
+ IPv6 routers forward datagrams. IPv6 hosts do not (except
+ those source-routed via the host).
+
+ This object is constrained by ipv6IpForwarding and is
+ ignored if ipv6IpForwarding is set to notForwarding. Those
+ systems that do not provide per-interface control of the
+ forwarding function should set this object to forwarding for
+ all interfaces and allow the ipv6IpForwarding object to
+ control the forwarding capability.
+
+ When this object is written, the entity SHOULD save the
+ change to non-volatile storage and restore the object from
+ non-volatile storage upon re-initialization of the system."
+ ::= { ipv6InterfaceEntry 8 }
+
+--
+-- Per-Interface or System-Wide IP statistics.
+--
+-- The following two tables, ipSystemStatsTable and ipIfStatsTable,
+-- are intended to provide the same counters at different granularities.
+-- The ipSystemStatsTable provides system wide counters aggregating
+-- the traffic counters for all interfaces for a given address type.
+-- The ipIfStatsTable provides the same counters but for specific
+-- interfaces rather than as an aggregate.
+--
+-- Note well: If a system provides both system-wide and interface-
+-- specific values, the system-wide value may not be equal to the sum
+-- of the interface-specific values across all interfaces due to e.g.,
+-- dynamic interface creation/deletion.
+--
+-- Note well: Both of these tables contain some items that are
+
+
+
+-- represented by two objects, representing the value in either 32
+-- or 64 bits. For those objects, the 32-bit value MUST be the low
+-- order 32 bits of the 64-bit value. Also note that the 32-bit
+-- counters must be included when the 64-bit counters are included.
+
+ipTrafficStats OBJECT IDENTIFIER ::= { ip 31 }
+
+ipSystemStatsTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpSystemStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing system wide, IP version specific
+ traffic statistics. This table and the ipIfStatsTable
+ contain similar objects whose difference is in their
+ granularity. Where this table contains system wide traffic
+ statistics, the ipIfStatsTable contains the same statistics
+ but counted on a per-interface basis."
+ ::= { ipTrafficStats 1 }
+
+ipSystemStatsEntry OBJECT-TYPE
+ SYNTAX IpSystemStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A statistics entry containing system-wide objects for a
+ particular IP version."
+ INDEX { ipSystemStatsIPVersion }
+ ::= { ipSystemStatsTable 1 }
+
+IpSystemStatsEntry ::= SEQUENCE {
+ ipSystemStatsIPVersion InetVersion,
+ ipSystemStatsInReceives Counter32,
+ ipSystemStatsHCInReceives Counter64,
+ ipSystemStatsInOctets Counter32,
+ ipSystemStatsHCInOctets Counter64,
+ ipSystemStatsInHdrErrors Counter32,
+ ipSystemStatsInNoRoutes Counter32,
+ ipSystemStatsInAddrErrors Counter32,
+ ipSystemStatsInUnknownProtos Counter32,
+ ipSystemStatsInTruncatedPkts Counter32,
+ ipSystemStatsInForwDatagrams Counter32,
+ ipSystemStatsHCInForwDatagrams Counter64,
+ ipSystemStatsReasmReqds Counter32,
+ ipSystemStatsReasmOKs Counter32,
+ ipSystemStatsReasmFails Counter32,
+ ipSystemStatsInDiscards Counter32,
+ ipSystemStatsInDelivers Counter32,
+
+
+
+ ipSystemStatsHCInDelivers Counter64,
+ ipSystemStatsOutRequests Counter32,
+ ipSystemStatsHCOutRequests Counter64,
+ ipSystemStatsOutNoRoutes Counter32,
+ ipSystemStatsOutForwDatagrams Counter32,
+ ipSystemStatsHCOutForwDatagrams Counter64,
+ ipSystemStatsOutDiscards Counter32,
+ ipSystemStatsOutFragReqds Counter32,
+ ipSystemStatsOutFragOKs Counter32,
+ ipSystemStatsOutFragFails Counter32,
+ ipSystemStatsOutFragCreates Counter32,
+ ipSystemStatsOutTransmits Counter32,
+ ipSystemStatsHCOutTransmits Counter64,
+ ipSystemStatsOutOctets Counter32,
+ ipSystemStatsHCOutOctets Counter64,
+ ipSystemStatsInMcastPkts Counter32,
+ ipSystemStatsHCInMcastPkts Counter64,
+ ipSystemStatsInMcastOctets Counter32,
+ ipSystemStatsHCInMcastOctets Counter64,
+ ipSystemStatsOutMcastPkts Counter32,
+ ipSystemStatsHCOutMcastPkts Counter64,
+ ipSystemStatsOutMcastOctets Counter32,
+ ipSystemStatsHCOutMcastOctets Counter64,
+ ipSystemStatsInBcastPkts Counter32,
+ ipSystemStatsHCInBcastPkts Counter64,
+ ipSystemStatsOutBcastPkts Counter32,
+ ipSystemStatsHCOutBcastPkts Counter64,
+ ipSystemStatsDiscontinuityTime TimeStamp,
+ ipSystemStatsRefreshRate Unsigned32
+ }
+
+ipSystemStatsIPVersion OBJECT-TYPE
+ SYNTAX InetVersion
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP version of this row."
+ ::= { ipSystemStatsEntry 1 }
+
+-- This object ID is reserved to allow the IDs for this table's objects
+-- to align with the objects in the ipIfStatsTable.
+-- ::= { ipSystemStatsEntry 2 }
+
+ipSystemStatsInReceives OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The total number of input IP datagrams received, including
+ those received in error.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 3 }
+
+ipSystemStatsHCInReceives OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of input IP datagrams received, including
+ those received in error. This object counts the same
+ datagrams as ipSystemStatsInReceives, but allows for larger
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 4 }
+
+ipSystemStatsInOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in input IP datagrams,
+ including those received in error. Octets from datagrams
+ counted in ipSystemStatsInReceives MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 5 }
+
+ipSystemStatsHCInOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in input IP datagrams,
+ including those received in error. This object counts the
+ same octets as ipSystemStatsInOctets, but allows for larger
+
+
+
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 6 }
+
+ipSystemStatsInHdrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded due to errors in
+ their IP headers, including version number mismatch, other
+ format errors, hop count exceeded, errors discovered in
+ processing their IP options, etc.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 7 }
+
+ipSystemStatsInNoRoutes OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because no route
+ could be found to transmit them to their destination.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 8 }
+
+ipSystemStatsInAddrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because the IP
+ address in their IP header's destination field was not a
+ valid address to be received at this entity. This count
+ includes invalid addresses (e.g., ::0). For entities
+ that are not IP routers and therefore do not forward
+
+
+
+ datagrams, this counter includes datagrams discarded
+ because the destination address was not a local address.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 9 }
+
+ipSystemStatsInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of locally-addressed IP datagrams received
+ successfully but discarded because of an unknown or
+ unsupported protocol.
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 10 }
+
+ipSystemStatsInTruncatedPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because the
+ datagram frame didn't carry enough data.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 11 }
+
+ipSystemStatsInForwDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The number of input datagrams for which this entity was not
+ their final IP destination and for which this entity
+ attempted to find a route to forward them to that final
+ destination. In entities that do not act as IP routers,
+ this counter will include only those datagrams that were
+ Source-Routed via this entity, and the Source-Route
+ processing was successful.
+
+ When tracking interface statistics, the counter of the
+ incoming interface is incremented for each datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 12 }
+
+ipSystemStatsHCInForwDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input datagrams for which this entity was not
+ their final IP destination and for which this entity
+ attempted to find a route to forward them to that final
+ destination. This object counts the same packets as
+ ipSystemStatsInForwDatagrams, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 13 }
+
+ipSystemStatsReasmReqds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP fragments received that needed to be
+ reassembled at this interface.
+
+ When tracking interface statistics, the counter of the
+ interface to which these fragments were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the fragments.
+
+ Discontinuities in the value of this counter can occur at
+
+
+
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 14 }
+
+ipSystemStatsReasmOKs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams successfully reassembled.
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 15 }
+
+ipSystemStatsReasmFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of failures detected by the IP re-assembly
+ algorithm (for whatever reason: timed out, errors, etc.).
+ Note that this is not necessarily a count of discarded IP
+ fragments since some algorithms (notably the algorithm in
+ RFC 815) can lose track of the number of fragments by
+ combining them as they are received.
+
+ When tracking interface statistics, the counter of the
+ interface to which these fragments were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the fragments.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 16 }
+
+ipSystemStatsInDiscards OBJECT-TYPE
+ SYNTAX Counter32
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams for which no problems were
+ encountered to prevent their continued processing, but
+ were discarded (e.g., for lack of buffer space). Note that
+ this counter does not include any datagrams discarded while
+ awaiting re-assembly.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 17 }
+
+ipSystemStatsInDelivers OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of datagrams successfully delivered to IP
+ user-protocols (including ICMP).
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 18 }
+
+ipSystemStatsHCInDelivers OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of datagrams successfully delivered to IP
+ user-protocols (including ICMP). This object counts the
+ same packets as ipSystemStatsInDelivers, but allows for
+ larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+
+
+
+ ::= { ipSystemStatsEntry 19 }
+
+ipSystemStatsOutRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that local IP user-
+ protocols (including ICMP) supplied to IP in requests for
+ transmission. Note that this counter does not include any
+ datagrams counted in ipSystemStatsOutForwDatagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 20 }
+
+ipSystemStatsHCOutRequests OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that local IP user-
+ protocols (including ICMP) supplied to IP in requests for
+ transmission. This object counts the same packets as
+ ipSystemStatsOutRequests, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 21 }
+
+ipSystemStatsOutNoRoutes OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of locally generated IP datagrams discarded
+ because no route could be found to transmit them to their
+ destination.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 22 }
+
+
+
+ipSystemStatsOutForwDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of datagrams for which this entity was not their
+ final IP destination and for which it was successful in
+ finding a path to their final destination. In entities
+ that do not act as IP routers, this counter will include
+ only those datagrams that were Source-Routed via this
+ entity, and the Source-Route processing was successful.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ forwarded datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 23 }
+
+ipSystemStatsHCOutForwDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of datagrams for which this entity was not their
+ final IP destination and for which it was successful in
+ finding a path to their final destination. This object
+ counts the same packets as ipSystemStatsOutForwDatagrams,
+ but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 24 }
+
+ipSystemStatsOutDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of output IP datagrams for which no problem was
+ encountered to prevent their transmission to their
+ destination, but were discarded (e.g., for lack of
+ buffer space). Note that this counter would include
+
+
+
+ datagrams counted in ipSystemStatsOutForwDatagrams if any
+ such datagrams met this (discretionary) discard criterion.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 25 }
+
+ipSystemStatsOutFragReqds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that would require fragmentation
+ in order to be transmitted.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 26 }
+
+ipSystemStatsOutFragOKs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that have been successfully
+ fragmented.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 27 }
+
+ipSystemStatsOutFragFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that have been discarded because
+ they needed to be fragmented but could not be. This
+ includes IPv4 packets that have the DF bit set and IPv6
+ packets that are being forwarded and exceed the outgoing
+ link MTU.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for an unsuccessfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 28 }
+
+ipSystemStatsOutFragCreates OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of output datagram fragments that have been
+ generated as a result of IP fragmentation.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 29 }
+
+ipSystemStatsOutTransmits OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that this entity supplied
+ to the lower layers for transmission. This includes
+ datagrams generated locally and those forwarded by this
+ entity.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+
+
+
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 30 }
+
+ipSystemStatsHCOutTransmits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that this entity supplied
+ to the lower layers for transmission. This object counts
+ the same datagrams as ipSystemStatsOutTransmits, but allows
+ for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 31 }
+
+ipSystemStatsOutOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets in IP datagrams delivered to the
+ lower layers for transmission. Octets from datagrams
+ counted in ipSystemStatsOutTransmits MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 32 }
+
+ipSystemStatsHCOutOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets in IP datagrams delivered to the
+ lower layers for transmission. This objects counts the same
+ octets as ipSystemStatsOutOctets, but allows for larger
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+
+
+
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 33 }
+
+ipSystemStatsInMcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams received.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 34 }
+
+ipSystemStatsHCInMcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams received. This object
+ counts the same datagrams as ipSystemStatsInMcastPkts but
+ allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 35 }
+
+ipSystemStatsInMcastOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in IP multicast
+ datagrams. Octets from datagrams counted in
+ ipSystemStatsInMcastPkts MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 36 }
+
+ipSystemStatsHCInMcastOctets OBJECT-TYPE
+ SYNTAX Counter64
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in IP multicast
+ datagrams. This object counts the same octets as
+ ipSystemStatsInMcastOctets, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 37 }
+
+ipSystemStatsOutMcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams transmitted.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 38 }
+
+ipSystemStatsHCOutMcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams transmitted. This
+ object counts the same datagrams as
+ ipSystemStatsOutMcastPkts, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 39 }
+
+ipSystemStatsOutMcastOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted in IP multicast
+ datagrams. Octets from datagrams counted in
+
+
+
+ ipSystemStatsOutMcastPkts MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 40 }
+
+ipSystemStatsHCOutMcastOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted in IP multicast
+ datagrams. This object counts the same octets as
+ ipSystemStatsOutMcastOctets, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 41 }
+
+ipSystemStatsInBcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams received.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 42 }
+
+ipSystemStatsHCInBcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams received. This object
+ counts the same datagrams as ipSystemStatsInBcastPkts but
+ allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+
+
+
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 43 }
+
+ipSystemStatsOutBcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams transmitted.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 44 }
+
+ipSystemStatsHCOutBcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams transmitted. This
+ object counts the same datagrams as
+ ipSystemStatsOutBcastPkts, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipSystemStatsDiscontinuityTime."
+ ::= { ipSystemStatsEntry 45 }
+
+ipSystemStatsDiscontinuityTime OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+ any one or more of this entry's counters suffered a
+ discontinuity.
+
+ If no such discontinuities have occurred since the last re-
+ initialization of the local management subsystem, then this
+ object contains a zero value."
+ ::= { ipSystemStatsEntry 46 }
+
+ipSystemStatsRefreshRate OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milli-seconds"
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The minimum reasonable polling interval for this entry.
+ This object provides an indication of the minimum amount of
+ time required to update the counters in this entry."
+ ::= { ipSystemStatsEntry 47 }
+
+ipIfStatsTableLastChange OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+ a row in the ipIfStatsTable was added or deleted.
+
+ If new objects are added to the ipIfStatsTable that require
+ the ipIfStatsTableLastChange to be updated when they are
+ modified, they must specify that requirement in their
+ description clause."
+ ::= { ipTrafficStats 2 }
+
+ipIfStatsTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpIfStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing per-interface traffic statistics. This
+ table and the ipSystemStatsTable contain similar objects
+ whose difference is in their granularity. Where this table
+ contains per-interface statistics, the ipSystemStatsTable
+ contains the same statistics, but counted on a system wide
+ basis."
+ ::= { ipTrafficStats 3 }
+
+ipIfStatsEntry OBJECT-TYPE
+ SYNTAX IpIfStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An interface statistics entry containing objects for a
+ particular interface and version of IP."
+ INDEX { ipIfStatsIPVersion, ipIfStatsIfIndex }
+ ::= { ipIfStatsTable 1 }
+
+IpIfStatsEntry ::= SEQUENCE {
+ ipIfStatsIPVersion InetVersion,
+ ipIfStatsIfIndex InterfaceIndex,
+
+
+
+ ipIfStatsInReceives Counter32,
+ ipIfStatsHCInReceives Counter64,
+ ipIfStatsInOctets Counter32,
+ ipIfStatsHCInOctets Counter64,
+ ipIfStatsInHdrErrors Counter32,
+ ipIfStatsInNoRoutes Counter32,
+ ipIfStatsInAddrErrors Counter32,
+ ipIfStatsInUnknownProtos Counter32,
+ ipIfStatsInTruncatedPkts Counter32,
+ ipIfStatsInForwDatagrams Counter32,
+ ipIfStatsHCInForwDatagrams Counter64,
+ ipIfStatsReasmReqds Counter32,
+ ipIfStatsReasmOKs Counter32,
+ ipIfStatsReasmFails Counter32,
+ ipIfStatsInDiscards Counter32,
+ ipIfStatsInDelivers Counter32,
+ ipIfStatsHCInDelivers Counter64,
+ ipIfStatsOutRequests Counter32,
+ ipIfStatsHCOutRequests Counter64,
+ ipIfStatsOutForwDatagrams Counter32,
+ ipIfStatsHCOutForwDatagrams Counter64,
+ ipIfStatsOutDiscards Counter32,
+ ipIfStatsOutFragReqds Counter32,
+ ipIfStatsOutFragOKs Counter32,
+ ipIfStatsOutFragFails Counter32,
+ ipIfStatsOutFragCreates Counter32,
+ ipIfStatsOutTransmits Counter32,
+ ipIfStatsHCOutTransmits Counter64,
+ ipIfStatsOutOctets Counter32,
+ ipIfStatsHCOutOctets Counter64,
+ ipIfStatsInMcastPkts Counter32,
+ ipIfStatsHCInMcastPkts Counter64,
+ ipIfStatsInMcastOctets Counter32,
+ ipIfStatsHCInMcastOctets Counter64,
+ ipIfStatsOutMcastPkts Counter32,
+ ipIfStatsHCOutMcastPkts Counter64,
+ ipIfStatsOutMcastOctets Counter32,
+ ipIfStatsHCOutMcastOctets Counter64,
+ ipIfStatsInBcastPkts Counter32,
+ ipIfStatsHCInBcastPkts Counter64,
+ ipIfStatsOutBcastPkts Counter32,
+ ipIfStatsHCOutBcastPkts Counter64,
+ ipIfStatsDiscontinuityTime TimeStamp,
+ ipIfStatsRefreshRate Unsigned32
+ }
+
+ipIfStatsIPVersion OBJECT-TYPE
+ SYNTAX InetVersion
+
+
+
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP version of this row."
+ ::= { ipIfStatsEntry 1 }
+
+ipIfStatsIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipIfStatsEntry 2 }
+
+ipIfStatsInReceives OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of input IP datagrams received, including
+ those received in error.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 3 }
+
+ipIfStatsHCInReceives OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of input IP datagrams received, including
+ those received in error. This object counts the same
+ datagrams as ipIfStatsInReceives, but allows for larger
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 4 }
+
+ipIfStatsInOctets OBJECT-TYPE
+
+
+
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in input IP datagrams,
+ including those received in error. Octets from datagrams
+ counted in ipIfStatsInReceives MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 5 }
+
+ipIfStatsHCInOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in input IP datagrams,
+ including those received in error. This object counts the
+ same octets as ipIfStatsInOctets, but allows for larger
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 6 }
+
+ipIfStatsInHdrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded due to errors in
+ their IP headers, including version number mismatch, other
+ format errors, hop count exceeded, errors discovered in
+ processing their IP options, etc.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 7 }
+
+ipIfStatsInNoRoutes OBJECT-TYPE
+ SYNTAX Counter32
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because no route
+ could be found to transmit them to their destination.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 8 }
+
+ipIfStatsInAddrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because the IP
+ address in their IP header's destination field was not a
+ valid address to be received at this entity. This count
+ includes invalid addresses (e.g., ::0). For entities that
+ are not IP routers and therefore do not forward datagrams,
+ this counter includes datagrams discarded because the
+ destination address was not a local address.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 9 }
+
+ipIfStatsInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of locally-addressed IP datagrams received
+ successfully but discarded because of an unknown or
+ unsupported protocol.
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+
+
+
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 10 }
+
+ipIfStatsInTruncatedPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams discarded because the
+ datagram frame didn't carry enough data.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 11 }
+
+ipIfStatsInForwDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input datagrams for which this entity was not
+ their final IP destination and for which this entity
+ attempted to find a route to forward them to that final
+ destination. In entities that do not act as IP routers,
+ this counter will include only those datagrams that were
+ Source-Routed via this entity, and the Source-Route
+ processing was successful.
+
+ When tracking interface statistics, the counter of the
+ incoming interface is incremented for each datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 12 }
+
+ipIfStatsHCInForwDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input datagrams for which this entity was not
+ their final IP destination and for which this entity
+ attempted to find a route to forward them to that final
+ destination. This object counts the same packets as
+
+
+
+ ipIfStatsInForwDatagrams, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 13 }
+
+ipIfStatsReasmReqds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP fragments received that needed to be
+ reassembled at this interface.
+
+ When tracking interface statistics, the counter of the
+ interface to which these fragments were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the fragments.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 14 }
+
+ipIfStatsReasmOKs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams successfully reassembled.
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 15 }
+
+ipIfStatsReasmFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The number of failures detected by the IP re-assembly
+ algorithm (for whatever reason: timed out, errors, etc.).
+ Note that this is not necessarily a count of discarded IP
+ fragments since some algorithms (notably the algorithm in
+ RFC 815) can lose track of the number of fragments by
+ combining them as they are received.
+
+ When tracking interface statistics, the counter of the
+ interface to which these fragments were addressed is
+ incremented. This interface might not be the same as the
+ input interface for some of the fragments.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 16 }
+
+ipIfStatsInDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input IP datagrams for which no problems were
+ encountered to prevent their continued processing, but
+ were discarded (e.g., for lack of buffer space). Note that
+ this counter does not include any datagrams discarded while
+ awaiting re-assembly.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 17 }
+
+ipIfStatsInDelivers OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of datagrams successfully delivered to IP
+ user-protocols (including ICMP).
+
+ When tracking interface statistics, the counter of the
+ interface to which these datagrams were addressed is
+ incremented. This interface might not be the same as the
+
+
+
+ input interface for some of the datagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 18 }
+
+ipIfStatsHCInDelivers OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of datagrams successfully delivered to IP
+ user-protocols (including ICMP). This object counts the
+ same packets as ipIfStatsInDelivers, but allows for larger
+ values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 19 }
+
+ipIfStatsOutRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that local IP user-
+ protocols (including ICMP) supplied to IP in requests for
+ transmission. Note that this counter does not include any
+ datagrams counted in ipIfStatsOutForwDatagrams.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 20 }
+
+ipIfStatsHCOutRequests OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that local IP user-
+ protocols (including ICMP) supplied to IP in requests for
+ transmission. This object counts the same packets as
+
+
+
+ ipIfStatsOutRequests, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 21 }
+
+-- This object ID is reserved to allow the IDs for this table's objects
+-- to align with the objects in the ipSystemStatsTable.
+-- ::= {ipIfStatsEntry 22}
+
+ipIfStatsOutForwDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of datagrams for which this entity was not their
+ final IP destination and for which it was successful in
+ finding a path to their final destination. In entities
+ that do not act as IP routers, this counter will include
+ only those datagrams that were Source-Routed via this
+ entity, and the Source-Route processing was successful.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ forwarded datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 23 }
+
+ipIfStatsHCOutForwDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of datagrams for which this entity was not their
+ final IP destination and for which it was successful in
+ finding a path to their final destination. This object
+ counts the same packets as ipIfStatsOutForwDatagrams, but
+ allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+
+
+
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 24 }
+
+ipIfStatsOutDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of output IP datagrams for which no problem was
+ encountered to prevent their transmission to their
+ destination, but were discarded (e.g., for lack of
+ buffer space). Note that this counter would include
+ datagrams counted in ipIfStatsOutForwDatagrams if any such
+ datagrams met this (discretionary) discard criterion.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 25 }
+
+ipIfStatsOutFragReqds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that would require fragmentation
+ in order to be transmitted.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 26 }
+
+ipIfStatsOutFragOKs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that have been successfully
+ fragmented.
+
+ When tracking interface statistics, the counter of the
+
+
+
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 27 }
+
+ipIfStatsOutFragFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP datagrams that have been discarded because
+ they needed to be fragmented but could not be. This
+ includes IPv4 packets that have the DF bit set and IPv6
+ packets that are being forwarded and exceed the outgoing
+ link MTU.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for an unsuccessfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 28 }
+
+ipIfStatsOutFragCreates OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of output datagram fragments that have been
+ generated as a result of IP fragmentation.
+
+ When tracking interface statistics, the counter of the
+ outgoing interface is incremented for a successfully
+ fragmented datagram.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 29 }
+
+
+
+
+ipIfStatsOutTransmits OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that this entity supplied
+ to the lower layers for transmission. This includes
+ datagrams generated locally and those forwarded by this
+ entity.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 30 }
+
+ipIfStatsHCOutTransmits OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of IP datagrams that this entity supplied
+ to the lower layers for transmission. This object counts
+ the same datagrams as ipIfStatsOutTransmits, but allows for
+ larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 31 }
+
+ipIfStatsOutOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets in IP datagrams delivered to the
+ lower layers for transmission. Octets from datagrams
+ counted in ipIfStatsOutTransmits MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 32 }
+
+ipIfStatsHCOutOctets OBJECT-TYPE
+
+
+
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets in IP datagrams delivered to the
+ lower layers for transmission. This objects counts the same
+ octets as ipIfStatsOutOctets, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 33 }
+
+ipIfStatsInMcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams received.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 34 }
+
+ipIfStatsHCInMcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams received. This object
+ counts the same datagrams as ipIfStatsInMcastPkts, but
+ allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 35 }
+
+ipIfStatsInMcastOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in IP multicast
+
+
+
+ datagrams. Octets from datagrams counted in
+ ipIfStatsInMcastPkts MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 36 }
+
+ipIfStatsHCInMcastOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets received in IP multicast
+ datagrams. This object counts the same octets as
+ ipIfStatsInMcastOctets, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 37 }
+
+ipIfStatsOutMcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams transmitted.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 38 }
+
+ipIfStatsHCOutMcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP multicast datagrams transmitted. This
+ object counts the same datagrams as ipIfStatsOutMcastPkts,
+ but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+
+
+
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 39 }
+
+ipIfStatsOutMcastOctets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted in IP multicast
+ datagrams. Octets from datagrams counted in
+ ipIfStatsOutMcastPkts MUST be counted here.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 40 }
+
+ipIfStatsHCOutMcastOctets OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of octets transmitted in IP multicast
+ datagrams. This object counts the same octets as
+ ipIfStatsOutMcastOctets, but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 41 }
+
+ipIfStatsInBcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams received.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 42 }
+
+ipIfStatsHCInBcastPkts OBJECT-TYPE
+
+
+
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams received. This object
+ counts the same datagrams as ipIfStatsInBcastPkts, but
+ allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 43 }
+
+ipIfStatsOutBcastPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams transmitted.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 44 }
+
+ipIfStatsHCOutBcastPkts OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of IP broadcast datagrams transmitted. This
+ object counts the same datagrams as ipIfStatsOutBcastPkts,
+ but allows for larger values.
+
+ Discontinuities in the value of this counter can occur at
+ re-initialization of the management system, and at other
+ times as indicated by the value of
+ ipIfStatsDiscontinuityTime."
+ ::= { ipIfStatsEntry 45 }
+
+ipIfStatsDiscontinuityTime OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime on the most recent occasion at which
+
+
+
+ any one or more of this entry's counters suffered a
+ discontinuity.
+
+ If no such discontinuities have occurred since the last re-
+ initialization of the local management subsystem, then this
+ object contains a zero value."
+ ::= { ipIfStatsEntry 46 }
+
+ipIfStatsRefreshRate OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milli-seconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The minimum reasonable polling interval for this entry.
+ This object provides an indication of the minimum amount of
+ time required to update the counters in this entry."
+ ::= { ipIfStatsEntry 47 }
+
+--
+-- Internet Address Prefix table
+--
+
+ipAddressPrefixTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpAddressPrefixEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table allows the user to determine the source of an IP
+ address or set of IP addresses, and allows other tables to
+ share the information via pointer rather than by copying.
+
+ For example, when the node configures both a unicast and
+ anycast address for a prefix, the ipAddressPrefix objects
+ for those addresses will point to a single row in this
+ table.
+
+ This table primarily provides support for IPv6 prefixes, and
+ several of the objects are less meaningful for IPv4. The
+ table continues to allow IPv4 addresses to allow future
+ flexibility. In order to promote a common configuration,
+ this document includes suggestions for default values for
+ IPv4 prefixes. Each of these values may be overridden if an
+ object is meaningful to the node.
+
+ All prefixes used by this entity should be included in this
+ table independent of how the entity learned the prefix.
+ (This table isn't limited to prefixes learned from router
+
+
+
+ advertisements.)"
+ ::= { ip 32 }
+
+ipAddressPrefixEntry OBJECT-TYPE
+ SYNTAX IpAddressPrefixEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry in the ipAddressPrefixTable."
+ INDEX { ipAddressPrefixIfIndex, ipAddressPrefixType,
+ ipAddressPrefixPrefix, ipAddressPrefixLength }
+ ::= { ipAddressPrefixTable 1 }
+
+IpAddressPrefixEntry ::= SEQUENCE {
+ ipAddressPrefixIfIndex InterfaceIndex,
+ ipAddressPrefixType InetAddressType,
+ ipAddressPrefixPrefix InetAddress,
+ ipAddressPrefixLength InetAddressPrefixLength,
+ ipAddressPrefixOrigin IpAddressPrefixOriginTC,
+ ipAddressPrefixOnLinkFlag TruthValue,
+ ipAddressPrefixAutonomousFlag TruthValue,
+ ipAddressPrefixAdvPreferredLifetime Unsigned32,
+ ipAddressPrefixAdvValidLifetime Unsigned32
+ }
+
+ipAddressPrefixIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface on
+ which this prefix is configured. The interface identified
+ by a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipAddressPrefixEntry 1 }
+
+ipAddressPrefixType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of ipAddressPrefix."
+ ::= { ipAddressPrefixEntry 2 }
+
+ipAddressPrefixPrefix OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The address prefix. The address type of this object is
+ specified in ipAddressPrefixType. The length of this object
+ is the standard length for objects of that type (4 or 16
+ bytes). Any bits after ipAddressPrefixLength must be zero.
+
+ Implementors need to be aware that, if the size of
+ ipAddressPrefixPrefix exceeds 114 octets, then OIDS of
+ instances of columns in this row will have more than 128
+ sub-identifiers and cannot be accessed using SNMPv1,
+ SNMPv2c, or SNMPv3."
+ ::= { ipAddressPrefixEntry 3 }
+
+ipAddressPrefixLength OBJECT-TYPE
+ SYNTAX InetAddressPrefixLength
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The prefix length associated with this prefix.
+
+ The value 0 has no special meaning for this object. It
+ simply refers to address '::/0'."
+ ::= { ipAddressPrefixEntry 4 }
+
+ipAddressPrefixOrigin OBJECT-TYPE
+ SYNTAX IpAddressPrefixOriginTC
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The origin of this prefix."
+ ::= { ipAddressPrefixEntry 5 }
+
+ipAddressPrefixOnLinkFlag OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This object has the value 'true(1)', if this prefix can be
+ used for on-link determination; otherwise, the value is
+ 'false(2)'.
+
+ The default for IPv4 prefixes is 'true(1)'."
+ REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and
+ RFC 2462"
+ ::= { ipAddressPrefixEntry 6 }
+
+ipAddressPrefixAutonomousFlag OBJECT-TYPE
+ SYNTAX TruthValue
+
+
+
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Autonomous address configuration flag. When true(1),
+ indicates that this prefix can be used for autonomous
+ address configuration (i.e., can be used to form a local
+ interface address). If false(2), it is not used to auto-
+ configure a local interface address.
+
+ The default for IPv4 prefixes is 'false(2)'."
+ REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and
+ RFC 2462"
+ ::= { ipAddressPrefixEntry 7 }
+
+ipAddressPrefixAdvPreferredLifetime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "seconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The remaining length of time, in seconds, that this prefix
+ will continue to be preferred, i.e., time until deprecation.
+
+ A value of 4,294,967,295 represents infinity.
+
+ The address generated from a deprecated prefix should no
+ longer be used as a source address in new communications,
+ but packets received on such an interface are processed as
+ expected.
+
+ The default for IPv4 prefixes is 4,294,967,295 (infinity)."
+ REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and
+ RFC 2462"
+ ::= { ipAddressPrefixEntry 8 }
+
+ipAddressPrefixAdvValidLifetime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "seconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The remaining length of time, in seconds, that this prefix
+ will continue to be valid, i.e., time until invalidation. A
+ value of 4,294,967,295 represents infinity.
+
+ The address generated from an invalidated prefix should not
+ appear as the destination or source address of a packet.
+
+
+
+
+ The default for IPv4 prefixes is 4,294,967,295 (infinity)."
+ REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and
+ RFC 2462"
+ ::= { ipAddressPrefixEntry 9 }
+
+--
+-- Internet Address Table
+--
+
+ipAddressSpinLock OBJECT-TYPE
+ SYNTAX TestAndIncr
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "An advisory lock used to allow cooperating SNMP managers to
+ coordinate their use of the set operation in creating or
+ modifying rows within this table.
+
+ In order to use this lock to coordinate the use of set
+ operations, managers should first retrieve
+ ipAddressTableSpinLock. They should then determine the
+ appropriate row to create or modify. Finally, they should
+ issue the appropriate set command, including the retrieved
+ value of ipAddressSpinLock. If another manager has altered
+ the table in the meantime, then the value of
+ ipAddressSpinLock will have changed, and the creation will
+ fail as it will be specifying an incorrect value for
+ ipAddressSpinLock. It is suggested, but not required, that
+ the ipAddressSpinLock be the first var bind for each set of
+ objects representing a 'row' in a PDU."
+ ::= { ip 33 }
+
+ipAddressTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpAddressEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "This table contains addressing information relevant to the
+ entity's interfaces.
+
+ This table does not contain multicast address information.
+ Tables for such information should be contained in multicast
+ specific MIBs, such as RFC 3019.
+
+ While this table is writable, the user will note that
+ several objects, such as ipAddressOrigin, are not. The
+ intention in allowing a user to write to this table is to
+ allow them to add or remove any entry that isn't
+
+
+
+ permanent. The user should be allowed to modify objects
+ and entries when that would not cause inconsistencies
+ within the table. Allowing write access to objects, such
+ as ipAddressOrigin, could allow a user to insert an entry
+ and then label it incorrectly.
+
+ Note well: When including IPv6 link-local addresses in this
+ table, the entry must use an InetAddressType of 'ipv6z' in
+ order to differentiate between the possible interfaces."
+ ::= { ip 34 }
+
+ipAddressEntry OBJECT-TYPE
+ SYNTAX IpAddressEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An address mapping for a particular interface."
+ INDEX { ipAddressAddrType, ipAddressAddr }
+ ::= { ipAddressTable 1 }
+
+IpAddressEntry ::= SEQUENCE {
+ ipAddressAddrType InetAddressType,
+ ipAddressAddr InetAddress,
+ ipAddressIfIndex InterfaceIndex,
+ ipAddressType INTEGER,
+ ipAddressPrefix RowPointer,
+ ipAddressOrigin IpAddressOriginTC,
+ ipAddressStatus IpAddressStatusTC,
+ ipAddressCreated TimeStamp,
+ ipAddressLastChanged TimeStamp,
+ ipAddressRowStatus RowStatus,
+ ipAddressStorageType StorageType
+ }
+
+ipAddressAddrType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of ipAddressAddr."
+ ::= { ipAddressEntry 1 }
+
+ipAddressAddr OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP address to which this entry's addressing information
+
+
+
+ pertains. The address type of this object is specified in
+ ipAddressAddrType.
+
+ Implementors need to be aware that if the size of
+ ipAddressAddr exceeds 116 octets, then OIDS of instances of
+ columns in this row will have more than 128 sub-identifiers
+ and cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { ipAddressEntry 2 }
+
+ipAddressIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipAddressEntry 3 }
+
+ipAddressType OBJECT-TYPE
+ SYNTAX INTEGER {
+ unicast(1),
+ anycast(2),
+ broadcast(3)
+ }
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The type of address. broadcast(3) is not a valid value for
+ IPv6 addresses (RFC 3513)."
+ DEFVAL { unicast }
+ ::= { ipAddressEntry 4 }
+
+ipAddressPrefix OBJECT-TYPE
+ SYNTAX RowPointer
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A pointer to the row in the prefix table to which this
+ address belongs. May be { 0 0 } if there is no such row."
+ DEFVAL { zeroDotZero }
+ ::= { ipAddressEntry 5 }
+
+ipAddressOrigin OBJECT-TYPE
+ SYNTAX IpAddressOriginTC
+ MAX-ACCESS read-only
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The origin of the address."
+ ::= { ipAddressEntry 6 }
+
+ipAddressStatus OBJECT-TYPE
+ SYNTAX IpAddressStatusTC
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The status of the address, describing if the address can be
+ used for communication.
+
+ In the absence of other information, an IPv4 address is
+ always preferred(1)."
+ DEFVAL { preferred }
+ ::= { ipAddressEntry 7 }
+
+ipAddressCreated OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time this entry was created.
+ If this entry was created prior to the last re-
+ initialization of the local network management subsystem,
+ then this object contains a zero value."
+ ::= { ipAddressEntry 8 }
+
+ipAddressLastChanged OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time this entry was last
+ updated. If this entry was updated prior to the last re-
+ initialization of the local network management subsystem,
+ then this object contains a zero value."
+ ::= { ipAddressEntry 9 }
+
+ipAddressRowStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The status of this conceptual row.
+
+ The RowStatus TC requires that this DESCRIPTION clause
+ states under which circumstances other objects in this row
+
+
+
+ can be modified. The value of this object has no effect on
+ whether other objects in this conceptual row can be
+ modified.
+
+ A conceptual row can not be made active until the
+ ipAddressIfIndex has been set to a valid index."
+ ::= { ipAddressEntry 10 }
+
+ipAddressStorageType OBJECT-TYPE
+ SYNTAX StorageType
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The storage type for this conceptual row. If this object
+ has a value of 'permanent', then no other objects are
+ required to be able to be modified."
+ DEFVAL { volatile }
+ ::= { ipAddressEntry 11 }
+
+--
+-- the Internet Address Translation table
+--
+
+ipNetToPhysicalTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpNetToPhysicalEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP Address Translation table used for mapping from IP
+ addresses to physical addresses.
+
+ The Address Translation tables contain the IP address to
+ 'physical' address equivalences. Some interfaces do not use
+ translation tables for determining address equivalences
+ (e.g., DDN-X.25 has an algorithmic method); if all
+ interfaces are of this type, then the Address Translation
+ table is empty, i.e., has zero entries.
+
+ While many protocols may be used to populate this table, ARP
+ and Neighbor Discovery are the most likely
+ options."
+ REFERENCE "RFC 826 and RFC 2461"
+ ::= { ip 35 }
+
+ipNetToPhysicalEntry OBJECT-TYPE
+ SYNTAX IpNetToPhysicalEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+
+ DESCRIPTION
+ "Each entry contains one IP address to `physical' address
+ equivalence."
+ INDEX { ipNetToPhysicalIfIndex,
+ ipNetToPhysicalNetAddressType,
+ ipNetToPhysicalNetAddress }
+ ::= { ipNetToPhysicalTable 1 }
+
+IpNetToPhysicalEntry ::= SEQUENCE {
+ ipNetToPhysicalIfIndex InterfaceIndex,
+ ipNetToPhysicalNetAddressType InetAddressType,
+ ipNetToPhysicalNetAddress InetAddress,
+ ipNetToPhysicalPhysAddress PhysAddress,
+ ipNetToPhysicalLastUpdated TimeStamp,
+ ipNetToPhysicalType INTEGER,
+ ipNetToPhysicalState INTEGER,
+ ipNetToPhysicalRowStatus RowStatus
+ }
+
+ipNetToPhysicalIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipNetToPhysicalEntry 1 }
+
+ipNetToPhysicalNetAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The type of ipNetToPhysicalNetAddress."
+ ::= { ipNetToPhysicalEntry 2 }
+
+ipNetToPhysicalNetAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP Address corresponding to the media-dependent
+ `physical' address. The address type of this object is
+ specified in ipNetToPhysicalAddressType.
+
+ Implementors need to be aware that if the size of
+
+
+
+ ipNetToPhysicalNetAddress exceeds 115 octets, then OIDS of
+ instances of columns in this row will have more than 128
+ sub-identifiers and cannot be accessed using SNMPv1,
+ SNMPv2c, or SNMPv3."
+ ::= { ipNetToPhysicalEntry 3 }
+
+ipNetToPhysicalPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress (SIZE(0..65535))
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The media-dependent `physical' address.
+
+ As the entries in this table are typically not persistent
+ when this object is written the entity SHOULD NOT save the
+ change to non-volatile storage."
+ ::= { ipNetToPhysicalEntry 4 }
+
+ipNetToPhysicalLastUpdated OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time this entry was last
+ updated. If this entry was updated prior to the last re-
+ initialization of the local network management subsystem,
+ then this object contains a zero value."
+ ::= { ipNetToPhysicalEntry 5 }
+
+ipNetToPhysicalType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ invalid(2), -- an invalidated mapping
+ dynamic(3),
+ static(4),
+ local(5) -- local interface
+ }
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The type of mapping.
+
+ Setting this object to the value invalid(2) has the effect
+ of invalidating the corresponding entry in the
+ ipNetToPhysicalTable. That is, it effectively dis-
+ associates the interface identified with said entry from the
+ mapping identified with said entry. It is an
+ implementation-specific matter as to whether the agent
+
+
+
+ removes an invalidated entry from the table. Accordingly,
+ management stations must be prepared to receive tabular
+ information from agents that corresponds to entries not
+ currently in use. Proper interpretation of such entries
+ requires examination of the relevant ipNetToPhysicalType
+ object.
+
+ The 'dynamic(3)' type indicates that the IP address to
+ physical addresses mapping has been dynamically resolved
+ using e.g., IPv4 ARP or the IPv6 Neighbor Discovery
+ protocol.
+
+ The 'static(4)' type indicates that the mapping has been
+ statically configured. Both of these refer to entries that
+ provide mappings for other entities addresses.
+
+ The 'local(5)' type indicates that the mapping is provided
+ for an entity's own interface address.
+
+ As the entries in this table are typically not persistent
+ when this object is written the entity SHOULD NOT save the
+ change to non-volatile storage."
+ DEFVAL { static }
+ ::= { ipNetToPhysicalEntry 6 }
+
+ipNetToPhysicalState OBJECT-TYPE
+ SYNTAX INTEGER {
+ reachable(1), -- confirmed reachability
+
+ stale(2), -- unconfirmed reachability
+
+ delay(3), -- waiting for reachability
+ -- confirmation before entering
+ -- the probe state
+
+ probe(4), -- actively probing
+
+ invalid(5), -- an invalidated mapping
+
+ unknown(6), -- state can not be determined
+ -- for some reason.
+
+ incomplete(7) -- address resolution is being
+ -- performed.
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The Neighbor Unreachability Detection state for the
+ interface when the address mapping in this entry is used.
+ If Neighbor Unreachability Detection is not in use (e.g. for
+ IPv4), this object is always unknown(6)."
+ REFERENCE "RFC 2461"
+ ::= { ipNetToPhysicalEntry 7 }
+
+ipNetToPhysicalRowStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The status of this conceptual row.
+
+ The RowStatus TC requires that this DESCRIPTION clause
+ states under which circumstances other objects in this row
+ can be modified. The value of this object has no effect on
+ whether other objects in this conceptual row can be
+ modified.
+
+ A conceptual row can not be made active until the
+ ipNetToPhysicalPhysAddress object has been set.
+
+ Note that if the ipNetToPhysicalType is set to 'invalid',
+ the managed node may delete the entry independent of the
+ state of this object."
+ ::= { ipNetToPhysicalEntry 8 }
+
+--
+-- The IPv6 Scope Zone Index Table.
+--
+
+ipv6ScopeZoneIndexTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF Ipv6ScopeZoneIndexEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table used to describe IPv6 unicast and multicast scope
+ zones.
+
+ For those objects that have names rather than numbers, the
+ names were chosen to coincide with the names used in the
+ IPv6 address architecture document. "
+ REFERENCE "Section 2.7 of RFC 4291"
+ ::= { ip 36 }
+
+ipv6ScopeZoneIndexEntry OBJECT-TYPE
+ SYNTAX Ipv6ScopeZoneIndexEntry
+
+
+
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Each entry contains the list of scope identifiers on a given
+ interface."
+ INDEX { ipv6ScopeZoneIndexIfIndex }
+ ::= { ipv6ScopeZoneIndexTable 1 }
+
+Ipv6ScopeZoneIndexEntry ::= SEQUENCE {
+ ipv6ScopeZoneIndexIfIndex InterfaceIndex,
+ ipv6ScopeZoneIndexLinkLocal InetZoneIndex,
+ ipv6ScopeZoneIndex3 InetZoneIndex,
+ ipv6ScopeZoneIndexAdminLocal InetZoneIndex,
+ ipv6ScopeZoneIndexSiteLocal InetZoneIndex,
+ ipv6ScopeZoneIndex6 InetZoneIndex,
+ ipv6ScopeZoneIndex7 InetZoneIndex,
+ ipv6ScopeZoneIndexOrganizationLocal InetZoneIndex,
+ ipv6ScopeZoneIndex9 InetZoneIndex,
+ ipv6ScopeZoneIndexA InetZoneIndex,
+ ipv6ScopeZoneIndexB InetZoneIndex,
+ ipv6ScopeZoneIndexC InetZoneIndex,
+ ipv6ScopeZoneIndexD InetZoneIndex
+ }
+
+ipv6ScopeZoneIndexIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface to
+ which these scopes belong. The interface identified by a
+ particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipv6ScopeZoneIndexEntry 1 }
+
+ipv6ScopeZoneIndexLinkLocal OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for the link-local scope on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 2 }
+
+ipv6ScopeZoneIndex3 OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The zone index for scope 3 on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 3 }
+
+ipv6ScopeZoneIndexAdminLocal OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for the admin-local scope on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 4 }
+
+ipv6ScopeZoneIndexSiteLocal OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for the site-local scope on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 5 }
+
+ipv6ScopeZoneIndex6 OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope 6 on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 6 }
+
+ipv6ScopeZoneIndex7 OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope 7 on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 7 }
+
+ipv6ScopeZoneIndexOrganizationLocal OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for the organization-local scope on this
+ interface."
+ ::= { ipv6ScopeZoneIndexEntry 8 }
+
+ipv6ScopeZoneIndex9 OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The zone index for scope 9 on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 9 }
+
+ipv6ScopeZoneIndexA OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope A on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 10 }
+
+ipv6ScopeZoneIndexB OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope B on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 11 }
+
+ipv6ScopeZoneIndexC OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope C on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 12 }
+
+ipv6ScopeZoneIndexD OBJECT-TYPE
+ SYNTAX InetZoneIndex
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The zone index for scope D on this interface."
+ ::= { ipv6ScopeZoneIndexEntry 13 }
+
+--
+-- The Default Router Table
+-- This table simply lists the default routers; for more information
+-- about routing tables, see the routing MIBs
+--
+
+ipDefaultRouterTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpDefaultRouterEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table used to describe the default routers known to this
+
+
+
+ entity."
+ ::= { ip 37 }
+
+ipDefaultRouterEntry OBJECT-TYPE
+ SYNTAX IpDefaultRouterEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Each entry contains information about a default router known
+ to this entity."
+ INDEX {ipDefaultRouterAddressType, ipDefaultRouterAddress,
+ ipDefaultRouterIfIndex}
+ ::= { ipDefaultRouterTable 1 }
+
+IpDefaultRouterEntry ::= SEQUENCE {
+ ipDefaultRouterAddressType InetAddressType,
+ ipDefaultRouterAddress InetAddress,
+ ipDefaultRouterIfIndex InterfaceIndex,
+ ipDefaultRouterLifetime Unsigned32,
+ ipDefaultRouterPreference INTEGER
+ }
+
+ipDefaultRouterAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type for this row."
+ ::= { ipDefaultRouterEntry 1 }
+
+ipDefaultRouterAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP address of the default router represented by this
+ row. The address type of this object is specified in
+ ipDefaultRouterAddressType.
+
+ Implementers need to be aware that if the size of
+ ipDefaultRouterAddress exceeds 115 octets, then OIDS of
+ instances of columns in this row will have more than 128
+ sub-identifiers and cannot be accessed using SNMPv1,
+ SNMPv2c, or SNMPv3."
+ ::= { ipDefaultRouterEntry 2 }
+
+ipDefaultRouterIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+
+
+
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface by
+ which the router can be reached. The interface identified
+ by a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipDefaultRouterEntry 3 }
+
+ipDefaultRouterLifetime OBJECT-TYPE
+ SYNTAX Unsigned32 (0..65535)
+ UNITS "seconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The remaining length of time, in seconds, that this router
+ will continue to be useful as a default router. A value of
+ zero indicates that it is no longer useful as a default
+ router. It is left to the implementer of the MIB as to
+ whether a router with a lifetime of zero is removed from the
+ list.
+
+ For IPv6, this value should be extracted from the router
+ advertisement messages."
+ REFERENCE "For IPv6 RFC 2462 sections 4.2 and 6.3.4"
+ ::= { ipDefaultRouterEntry 4 }
+
+ipDefaultRouterPreference OBJECT-TYPE
+ SYNTAX INTEGER {
+ reserved (-2),
+ low (-1),
+ medium (0),
+ high (1)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An indication of preference given to this router as a
+ default router as described in he Default Router
+ Preferences document. Treating the value as a
+ 2 bit signed integer allows for simple arithmetic
+ comparisons.
+
+ For IPv4 routers or IPv6 routers that are not using the
+ updated router advertisement format, this object is set to
+ medium (0)."
+ REFERENCE "RFC 4291, section 2.1"
+ ::= { ipDefaultRouterEntry 5 }
+
+
+
+--
+-- Configuration information for constructing router advertisements
+--
+
+ipv6RouterAdvertSpinLock OBJECT-TYPE
+ SYNTAX TestAndIncr
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "An advisory lock used to allow cooperating SNMP managers to
+ coordinate their use of the set operation in creating or
+ modifying rows within this table.
+
+ In order to use this lock to coordinate the use of set
+ operations, managers should first retrieve
+ ipv6RouterAdvertSpinLock. They should then determine the
+ appropriate row to create or modify. Finally, they should
+ issue the appropriate set command including the retrieved
+ value of ipv6RouterAdvertSpinLock. If another manager has
+ altered the table in the meantime, then the value of
+ ipv6RouterAdvertSpinLock will have changed and the creation
+ will fail as it will be specifying an incorrect value for
+ ipv6RouterAdvertSpinLock. It is suggested, but not
+ required, that the ipv6RouterAdvertSpinLock be the first var
+ bind for each set of objects representing a 'row' in a PDU."
+ ::= { ip 38 }
+
+ipv6RouterAdvertTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF Ipv6RouterAdvertEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table containing information used to construct router
+ advertisements."
+ ::= { ip 39 }
+
+ipv6RouterAdvertEntry OBJECT-TYPE
+ SYNTAX Ipv6RouterAdvertEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry containing information used to construct router
+ advertisements.
+
+ Information in this table is persistent, and when this
+ object is written, the entity SHOULD save the change to
+ non-volatile storage."
+ INDEX { ipv6RouterAdvertIfIndex }
+
+
+
+ ::= { ipv6RouterAdvertTable 1 }
+
+Ipv6RouterAdvertEntry ::= SEQUENCE {
+ ipv6RouterAdvertIfIndex InterfaceIndex,
+ ipv6RouterAdvertSendAdverts TruthValue,
+ ipv6RouterAdvertMaxInterval Unsigned32,
+ ipv6RouterAdvertMinInterval Unsigned32,
+ ipv6RouterAdvertManagedFlag TruthValue,
+ ipv6RouterAdvertOtherConfigFlag TruthValue,
+ ipv6RouterAdvertLinkMTU Unsigned32,
+ ipv6RouterAdvertReachableTime Unsigned32,
+ ipv6RouterAdvertRetransmitTime Unsigned32,
+ ipv6RouterAdvertCurHopLimit Unsigned32,
+ ipv6RouterAdvertDefaultLifetime Unsigned32,
+ ipv6RouterAdvertRowStatus RowStatus
+ }
+
+ipv6RouterAdvertIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndex
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The index value that uniquely identifies the interface on
+ which router advertisements constructed with this
+ information will be transmitted. The interface identified
+ by a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipv6RouterAdvertEntry 1 }
+
+ipv6RouterAdvertSendAdverts OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "A flag indicating whether the router sends periodic
+ router advertisements and responds to router solicitations
+ on this interface."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { false }
+ ::= { ipv6RouterAdvertEntry 2 }
+
+ipv6RouterAdvertMaxInterval OBJECT-TYPE
+ SYNTAX Unsigned32 (4..1800)
+ UNITS "seconds"
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The maximum time allowed between sending unsolicited router
+
+
+
+ advertisements from this interface."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { 600 }
+ ::= { ipv6RouterAdvertEntry 3 }
+
+ipv6RouterAdvertMinInterval OBJECT-TYPE
+ SYNTAX Unsigned32 (3..1350)
+ UNITS "seconds"
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The minimum time allowed between sending unsolicited router
+ advertisements from this interface.
+
+ The default is 0.33 * ipv6RouterAdvertMaxInterval, however,
+ in the case of a low value for ipv6RouterAdvertMaxInterval,
+ the minimum value for this object is restricted to 3."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ ::= { ipv6RouterAdvertEntry 4 }
+
+ipv6RouterAdvertManagedFlag OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The true/false value to be placed into the 'managed address
+ configuration' flag field in router advertisements sent from
+ this interface."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { false }
+ ::= { ipv6RouterAdvertEntry 5 }
+
+ipv6RouterAdvertOtherConfigFlag OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The true/false value to be placed into the 'other stateful
+ configuration' flag field in router advertisements sent from
+ this interface."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { false }
+ ::= { ipv6RouterAdvertEntry 6 }
+
+ipv6RouterAdvertLinkMTU OBJECT-TYPE
+ SYNTAX Unsigned32
+ MAX-ACCESS read-create
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The value to be placed in MTU options sent by the router on
+ this interface.
+
+ A value of zero indicates that no MTU options are sent."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { 0 }
+ ::= { ipv6RouterAdvertEntry 7 }
+
+ipv6RouterAdvertReachableTime OBJECT-TYPE
+ SYNTAX Unsigned32 (0..3600000)
+ UNITS "milliseconds"
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The value to be placed in the reachable time field in router
+ advertisement messages sent from this interface.
+
+ A value of zero in the router advertisement indicates that
+ the advertisement isn't specifying a value for reachable
+ time."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { 0 }
+ ::= { ipv6RouterAdvertEntry 8 }
+
+ipv6RouterAdvertRetransmitTime OBJECT-TYPE
+ SYNTAX Unsigned32
+ UNITS "milliseconds"
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The value to be placed in the retransmit timer field in
+ router advertisements sent from this interface.
+
+ A value of zero in the router advertisement indicates that
+ the advertisement isn't specifying a value for retrans
+ time."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ DEFVAL { 0 }
+ ::= { ipv6RouterAdvertEntry 9 }
+
+ipv6RouterAdvertCurHopLimit OBJECT-TYPE
+ SYNTAX Unsigned32 (0..255)
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The default value to be placed in the current hop limit
+ field in router advertisements sent from this interface.
+
+
+
+ The value should be set to the current diameter of the
+ Internet.
+
+ A value of zero in the router advertisement indicates that
+ the advertisement isn't specifying a value for curHopLimit.
+
+ The default should be set to the value specified in the IANA
+ web pages (www.iana.org) at the time of implementation."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ ::= { ipv6RouterAdvertEntry 10 }
+
+ipv6RouterAdvertDefaultLifetime OBJECT-TYPE
+ SYNTAX Unsigned32 (0|4..9000)
+ UNITS "seconds"
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The value to be placed in the router lifetime field of
+ router advertisements sent from this interface. This value
+ MUST be either 0 or between ipv6RouterAdvertMaxInterval and
+ 9000 seconds.
+
+ A value of zero indicates that the router is not to be used
+ as a default router.
+
+ The default is 3 * ipv6RouterAdvertMaxInterval."
+ REFERENCE "RFC 2461 Section 6.2.1"
+ ::= { ipv6RouterAdvertEntry 11 }
+
+ipv6RouterAdvertRowStatus OBJECT-TYPE
+ SYNTAX RowStatus
+ MAX-ACCESS read-create
+ STATUS current
+ DESCRIPTION
+ "The status of this conceptual row.
+
+ As all objects in this conceptual row have default values, a
+ row can be created and made active by setting this object
+ appropriately.
+
+ The RowStatus TC requires that this DESCRIPTION clause
+ states under which circumstances other objects in this row
+ can be modified. The value of this object has no effect on
+ whether other objects in this conceptual row can be
+ modified."
+ ::= { ipv6RouterAdvertEntry 12 }
+
+--
+
+
+
+-- ICMP section
+--
+
+icmp OBJECT IDENTIFIER ::= { mib-2 5 }
+
+--
+-- ICMP non-message-specific counters
+--
+
+-- These object IDs are reserved, as they were used in earlier
+-- versions of the MIB module. In theory, OIDs are not assigned
+-- until the specification is released as an RFC; however, as some
+-- companies may have shipped code based on earlier versions of
+-- the MIB, it seems best to reserve these OIDs.
+-- ::= { icmp 27 }
+-- ::= { icmp 28 }
+
+icmpStatsTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IcmpStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table of generic system-wide ICMP counters."
+ ::= { icmp 29 }
+
+icmpStatsEntry OBJECT-TYPE
+ SYNTAX IcmpStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A conceptual row in the icmpStatsTable."
+ INDEX { icmpStatsIPVersion }
+ ::= { icmpStatsTable 1 }
+
+IcmpStatsEntry ::= SEQUENCE {
+ icmpStatsIPVersion InetVersion,
+ icmpStatsInMsgs Counter32,
+ icmpStatsInErrors Counter32,
+ icmpStatsOutMsgs Counter32,
+ icmpStatsOutErrors Counter32
+ }
+
+icmpStatsIPVersion OBJECT-TYPE
+ SYNTAX InetVersion
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP version of the statistics."
+
+
+
+ ::= { icmpStatsEntry 1 }
+
+icmpStatsInMsgs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of ICMP messages that the entity received.
+ Note that this counter includes all those counted by
+ icmpStatsInErrors."
+ ::= { icmpStatsEntry 2 }
+
+icmpStatsInErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of ICMP messages that the entity received but
+ determined as having ICMP-specific errors (bad ICMP
+ checksums, bad length, etc.)."
+ ::= { icmpStatsEntry 3 }
+
+icmpStatsOutMsgs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of ICMP messages that the entity attempted
+ to send. Note that this counter includes all those counted
+ by icmpStatsOutErrors."
+ ::= { icmpStatsEntry 4 }
+
+icmpStatsOutErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of ICMP messages that this entity did not send
+ due to problems discovered within ICMP, such as a lack of
+ buffers. This value should not include errors discovered
+ outside the ICMP layer, such as the inability of IP to route
+ the resultant datagram. In some implementations, there may
+ be no types of error that contribute to this counter's
+ value."
+ ::= { icmpStatsEntry 5 }
+
+--
+-- per-version, per-message type ICMP counters
+
+
+
+--
+
+icmpMsgStatsTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IcmpMsgStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The table of system-wide per-version, per-message type ICMP
+ counters."
+ ::= { icmp 30 }
+
+icmpMsgStatsEntry OBJECT-TYPE
+ SYNTAX IcmpMsgStatsEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A conceptual row in the icmpMsgStatsTable.
+
+ The system should track each ICMP type value, even if that
+ ICMP type is not supported by the system. However, a
+ given row need not be instantiated unless a message of that
+ type has been processed, i.e., the row for
+ icmpMsgStatsType=X MAY be instantiated before but MUST be
+ instantiated after the first message with Type=X is
+ received or transmitted. After receiving or transmitting
+ any succeeding messages with Type=X, the relevant counter
+ must be incremented."
+ INDEX { icmpMsgStatsIPVersion, icmpMsgStatsType }
+ ::= { icmpMsgStatsTable 1 }
+
+IcmpMsgStatsEntry ::= SEQUENCE {
+ icmpMsgStatsIPVersion InetVersion,
+ icmpMsgStatsType Integer32,
+ icmpMsgStatsInPkts Counter32,
+ icmpMsgStatsOutPkts Counter32
+ }
+
+icmpMsgStatsIPVersion OBJECT-TYPE
+ SYNTAX InetVersion
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The IP version of the statistics."
+ ::= { icmpMsgStatsEntry 1 }
+
+icmpMsgStatsType OBJECT-TYPE
+ SYNTAX Integer32 (0..255)
+ MAX-ACCESS not-accessible
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The ICMP type field of the message type being counted by
+ this row.
+
+ Note that ICMP message types are scoped by the address type
+ in use."
+ REFERENCE "http://www.iana.org/assignments/icmp-parameters and
+ http://www.iana.org/assignments/icmpv6-parameters"
+ ::= { icmpMsgStatsEntry 2 }
+
+icmpMsgStatsInPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of input packets for this AF and type."
+ ::= { icmpMsgStatsEntry 3 }
+
+icmpMsgStatsOutPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of output packets for this AF and type."
+ ::= { icmpMsgStatsEntry 4 }
+--
+-- conformance information
+--
+
+ipMIBConformance OBJECT IDENTIFIER ::= { ipMIB 2 }
+
+ipMIBCompliances OBJECT IDENTIFIER ::= { ipMIBConformance 1 }
+ipMIBGroups OBJECT IDENTIFIER ::= { ipMIBConformance 2 }
+
+-- compliance statements
+ipMIBCompliance2 MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for systems that implement IP -
+ either IPv4 or IPv6.
+
+ There are a number of INDEX objects that cannot be
+ represented in the form of OBJECT clauses in SMIv2, but
+ for which we have the following compliance requirements,
+ expressed in OBJECT clause form in this description
+ clause:
+
+
+
+
+ -- OBJECT ipSystemStatsIPVersion
+ -- SYNTAX InetVersion {ipv4(1), ipv6(2)}
+ -- DESCRIPTION
+ -- This MIB requires support for only IPv4 and IPv6
+ -- versions.
+ --
+ -- OBJECT ipIfStatsIPVersion
+ -- SYNTAX InetVersion {ipv4(1), ipv6(2)}
+ -- DESCRIPTION
+ -- This MIB requires support for only IPv4 and IPv6
+ -- versions.
+ --
+ -- OBJECT icmpStatsIPVersion
+ -- SYNTAX InetVersion {ipv4(1), ipv6(2)}
+ -- DESCRIPTION
+ -- This MIB requires support for only IPv4 and IPv6
+ -- versions.
+ --
+ -- OBJECT icmpMsgStatsIPVersion
+ -- SYNTAX InetVersion {ipv4(1), ipv6(2)}
+ -- DESCRIPTION
+ -- This MIB requires support for only IPv4 and IPv6
+ -- versions.
+ --
+ -- OBJECT ipAddressPrefixType
+ -- SYNTAX InetAddressType {ipv4(1), ipv6(2)}
+ -- DESCRIPTION
+ -- This MIB requires support for only global IPv4 and
+ -- IPv6 address types.
+ --
+ -- OBJECT ipAddressPrefixPrefix
+ -- SYNTAX InetAddress (Size(4 | 16))
+ -- DESCRIPTION
+ -- This MIB requires support for only global IPv4 and
+ -- IPv6 addresses and so the size can be either 4 or
+ -- 16 bytes.
+ --
+ -- OBJECT ipAddressAddrType
+ -- SYNTAX InetAddressType {ipv4(1), ipv6(2),
+ -- ipv4z(3), ipv6z(4)}
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+ -- non-global IPv4 and IPv6 address types.
+ --
+ -- OBJECT ipAddressAddr
+ -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20))
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+
+
+
+ -- non-global IPv4 and IPv6 addresses and so the size
+ -- can be 4, 8, 16, or 20 bytes.
+ --
+ -- OBJECT ipNetToPhysicalNetAddressType
+ -- SYNTAX InetAddressType {ipv4(1), ipv6(2),
+ -- ipv4z(3), ipv6z(4)}
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+ -- non-global IPv4 and IPv6 address types.
+ --
+ -- OBJECT ipNetToPhysicalNetAddress
+ -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20))
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+ -- non-global IPv4 and IPv6 addresses and so the size
+ -- can be 4, 8, 16, or 20 bytes.
+ --
+ -- OBJECT ipDefaultRouterAddressType
+ -- SYNTAX InetAddressType {ipv4(1), ipv6(2),
+ -- ipv4z(3), ipv6z(4)}
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+ -- non-global IPv4 and IPv6 address types.
+ --
+ -- OBJECT ipDefaultRouterAddress
+ -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20))
+ -- DESCRIPTION
+ -- This MIB requires support for only global and
+ -- non-global IPv4 and IPv6 addresses and so the size
+ -- can be 4, 8, 16, or 20 bytes."
+
+ MODULE -- this module
+
+ MANDATORY-GROUPS { ipSystemStatsGroup, ipAddressGroup,
+ ipNetToPhysicalGroup, ipDefaultRouterGroup,
+ icmpStatsGroup }
+
+ GROUP ipSystemStatsHCOctetGroup
+ DESCRIPTION
+ "This group is mandatory for systems that have an aggregate
+ bandwidth of greater than 20MB. Including this group does
+ not allow an entity to neglect the 32 bit versions of these
+ objects."
+
+ GROUP ipSystemStatsHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory for systems that have an aggregate
+ bandwidth of greater than 650MB. Including this group
+
+
+
+ does not allow an entity to neglect the 32 bit versions of
+ these objects."
+
+ GROUP ipIfStatsGroup
+ DESCRIPTION
+ "This group is optional for all systems."
+
+ GROUP ipIfStatsHCOctetGroup
+ DESCRIPTION
+ "This group is mandatory for systems that include the
+ ipIfStatsGroup and include links with bandwidths of greater
+ than 20MB. Including this group does not allow an entity to
+ neglect the 32 bit versions of these objects."
+
+ GROUP ipIfStatsHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory for systems that include the
+ ipIfStatsGroup and include links with bandwidths of greater
+ than 650MB. Including this group does not allow an entity
+ to neglect the 32 bit versions of these objects."
+
+ GROUP ipv4GeneralGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4."
+
+ GROUP ipv4IfGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4."
+
+ GROUP ipv4SystemStatsGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4."
+
+ GROUP ipv4SystemStatsHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4 and
+ that have an aggregate bandwidth of greater than 650MB.
+ Including this group does not allow an entity to neglect the
+ 32 bit versions of these objects."
+
+ GROUP ipv4IfStatsGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4 and
+ including the ipIfStatsGroup."
+
+ GROUP ipv4IfStatsHCPacketGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv4 and
+
+
+
+ including the ipIfStatsHCPacketGroup. Including this group
+ does not allow an entity to neglect the 32 bit versions of
+ these objects."
+
+ GROUP ipv6GeneralGroup2
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv6."
+
+ GROUP ipv6IfGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv6."
+
+ GROUP ipAddressPrefixGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv6."
+
+ GROUP ipv6ScopeGroup
+ DESCRIPTION
+ "This group is mandatory for all systems supporting IPv6."
+
+ GROUP ipv6RouterAdvertGroup
+ DESCRIPTION
+ "This group is mandatory for all IPv6 routers."
+
+ GROUP ipLastChangeGroup
+ DESCRIPTION
+ "This group is optional for all agents."
+
+ OBJECT ipv6IpForwarding
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6IpDefaultHopLimit
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv4InterfaceEnableStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6InterfaceEnableStatus
+ MIN-ACCESS read-only
+
+
+
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6InterfaceForwarding
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipAddressSpinLock
+ MIN-ACCESS not-accessible
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object. However, if an agent provides write access to any
+ of the other objects in the ipAddressGroup, it SHOULD
+ provide write access to this object as well."
+
+ OBJECT ipAddressIfIndex
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipAddressType
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipAddressStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipAddressRowStatus
+ SYNTAX RowStatus { active(1) }
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipAddressStorageType
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object.
+
+
+
+ If an agent allows this object to be written or created, it
+ is not required to allow this object to be set to readOnly,
+ permanent, or nonVolatile."
+
+ OBJECT ipNetToPhysicalPhysAddress
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipNetToPhysicalType
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ OBJECT ipv6RouterAdvertSpinLock
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object. However, if an agent provides write access to
+ any of the other objects in the ipv6RouterAdvertGroup, it
+ SHOULD provide write access to this object as well."
+
+ OBJECT ipv6RouterAdvertSendAdverts
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertMaxInterval
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertMinInterval
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertManagedFlag
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+
+
+
+ OBJECT ipv6RouterAdvertOtherConfigFlag
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertLinkMTU
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertReachableTime
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertRetransmitTime
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertCurHopLimit
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertDefaultLifetime
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write access to this
+ object."
+
+ OBJECT ipv6RouterAdvertRowStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "An agent is not required to provide write or create access
+ to this object."
+
+ ::= { ipMIBCompliances 2 }
+
+-- units of conformance
+
+ipv4GeneralGroup OBJECT-GROUP
+ OBJECTS { ipForwarding, ipDefaultTTL, ipReasmTimeout }
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The group of IPv4-specific objects for basic management of
+ IPv4 entities."
+ ::= { ipMIBGroups 3 }
+
+ipv4IfGroup OBJECT-GROUP
+ OBJECTS { ipv4InterfaceReasmMaxSize, ipv4InterfaceEnableStatus,
+ ipv4InterfaceRetransmitTime }
+ STATUS current
+ DESCRIPTION
+ "The group of IPv4-specific objects for basic management of
+ IPv4 interfaces."
+ ::= { ipMIBGroups 4 }
+
+ipv6GeneralGroup2 OBJECT-GROUP
+ OBJECTS { ipv6IpForwarding, ipv6IpDefaultHopLimit }
+ STATUS current
+ DESCRIPTION
+ "The IPv6 group of objects providing for basic management of
+ IPv6 entities."
+ ::= { ipMIBGroups 5 }
+
+ipv6IfGroup OBJECT-GROUP
+ OBJECTS { ipv6InterfaceReasmMaxSize, ipv6InterfaceIdentifier,
+ ipv6InterfaceEnableStatus, ipv6InterfaceReachableTime,
+ ipv6InterfaceRetransmitTime, ipv6InterfaceForwarding }
+ STATUS current
+ DESCRIPTION
+ "The group of IPv6-specific objects for basic management of
+ IPv6 interfaces."
+ ::= { ipMIBGroups 6 }
+
+ipLastChangeGroup OBJECT-GROUP
+ OBJECTS { ipv4InterfaceTableLastChange,
+ ipv6InterfaceTableLastChange,
+ ipIfStatsTableLastChange }
+ STATUS current
+ DESCRIPTION
+ "The last change objects associated with this MIB. These
+ objects are optional for all agents. They SHOULD be
+ implemented on agents where it is possible to determine the
+ proper values. Where it is not possible to determine the
+ proper values, for example when the tables are split amongst
+ several sub-agents using AgentX, the agent MUST NOT
+ implement these objects to return an incorrect or static
+ value."
+ ::= { ipMIBGroups 7 }
+
+
+
+ipSystemStatsGroup OBJECT-GROUP
+ OBJECTS { ipSystemStatsInReceives,
+ ipSystemStatsInOctets,
+ ipSystemStatsInHdrErrors,
+ ipSystemStatsInNoRoutes,
+ ipSystemStatsInAddrErrors,
+ ipSystemStatsInUnknownProtos,
+ ipSystemStatsInTruncatedPkts,
+ ipSystemStatsInForwDatagrams,
+ ipSystemStatsReasmReqds,
+ ipSystemStatsReasmOKs,
+ ipSystemStatsReasmFails,
+ ipSystemStatsInDiscards,
+ ipSystemStatsInDelivers,
+ ipSystemStatsOutRequests,
+ ipSystemStatsOutNoRoutes,
+ ipSystemStatsOutForwDatagrams,
+ ipSystemStatsOutDiscards,
+ ipSystemStatsOutFragReqds,
+ ipSystemStatsOutFragOKs,
+ ipSystemStatsOutFragFails,
+ ipSystemStatsOutFragCreates,
+ ipSystemStatsOutTransmits,
+ ipSystemStatsOutOctets,
+ ipSystemStatsInMcastPkts,
+ ipSystemStatsInMcastOctets,
+ ipSystemStatsOutMcastPkts,
+ ipSystemStatsOutMcastOctets,
+ ipSystemStatsDiscontinuityTime,
+ ipSystemStatsRefreshRate }
+ STATUS current
+ DESCRIPTION
+ "IP system wide statistics."
+ ::= { ipMIBGroups 8 }
+
+ipv4SystemStatsGroup OBJECT-GROUP
+ OBJECTS { ipSystemStatsInBcastPkts, ipSystemStatsOutBcastPkts }
+ STATUS current
+ DESCRIPTION
+ "IPv4 only system wide statistics."
+ ::= { ipMIBGroups 9 }
+
+ipSystemStatsHCOctetGroup OBJECT-GROUP
+ OBJECTS { ipSystemStatsHCInOctets,
+ ipSystemStatsHCOutOctets,
+ ipSystemStatsHCInMcastOctets,
+ ipSystemStatsHCOutMcastOctets
+}
+
+
+
+ STATUS current
+ DESCRIPTION
+ "IP system wide statistics for systems that may overflow the
+ standard octet counters within 1 hour."
+ ::= { ipMIBGroups 10 }
+
+ipSystemStatsHCPacketGroup OBJECT-GROUP
+ OBJECTS { ipSystemStatsHCInReceives,
+ ipSystemStatsHCInForwDatagrams,
+ ipSystemStatsHCInDelivers,
+ ipSystemStatsHCOutRequests,
+ ipSystemStatsHCOutForwDatagrams,
+ ipSystemStatsHCOutTransmits,
+ ipSystemStatsHCInMcastPkts,
+ ipSystemStatsHCOutMcastPkts
+}
+ STATUS current
+ DESCRIPTION
+ "IP system wide statistics for systems that may overflow the
+ standard packet counters within 1 hour."
+ ::= { ipMIBGroups 11 }
+
+ipv4SystemStatsHCPacketGroup OBJECT-GROUP
+ OBJECTS { ipSystemStatsHCInBcastPkts,
+ ipSystemStatsHCOutBcastPkts }
+ STATUS current
+ DESCRIPTION
+ "IPv4 only system wide statistics for systems that may
+ overflow the standard packet counters within 1 hour."
+ ::= { ipMIBGroups 12 }
+
+ipIfStatsGroup OBJECT-GROUP
+ OBJECTS { ipIfStatsInReceives, ipIfStatsInOctets,
+ ipIfStatsInHdrErrors, ipIfStatsInNoRoutes,
+ ipIfStatsInAddrErrors, ipIfStatsInUnknownProtos,
+ ipIfStatsInTruncatedPkts, ipIfStatsInForwDatagrams,
+ ipIfStatsReasmReqds, ipIfStatsReasmOKs,
+ ipIfStatsReasmFails, ipIfStatsInDiscards,
+ ipIfStatsInDelivers, ipIfStatsOutRequests,
+ ipIfStatsOutForwDatagrams, ipIfStatsOutDiscards,
+ ipIfStatsOutFragReqds, ipIfStatsOutFragOKs,
+ ipIfStatsOutFragFails, ipIfStatsOutFragCreates,
+ ipIfStatsOutTransmits, ipIfStatsOutOctets,
+ ipIfStatsInMcastPkts, ipIfStatsInMcastOctets,
+ ipIfStatsOutMcastPkts, ipIfStatsOutMcastOctets,
+ ipIfStatsDiscontinuityTime, ipIfStatsRefreshRate }
+ STATUS current
+ DESCRIPTION
+
+
+
+ "IP per-interface statistics."
+ ::= { ipMIBGroups 13 }
+
+ipv4IfStatsGroup OBJECT-GROUP
+ OBJECTS { ipIfStatsInBcastPkts, ipIfStatsOutBcastPkts }
+ STATUS current
+ DESCRIPTION
+ "IPv4 only per-interface statistics."
+ ::= { ipMIBGroups 14 }
+
+ipIfStatsHCOctetGroup OBJECT-GROUP
+ OBJECTS { ipIfStatsHCInOctets, ipIfStatsHCOutOctets,
+ ipIfStatsHCInMcastOctets, ipIfStatsHCOutMcastOctets }
+ STATUS current
+ DESCRIPTION
+ "IP per-interfaces statistics for systems that include
+ interfaces that may overflow the standard octet
+ counters within 1 hour."
+ ::= { ipMIBGroups 15 }
+
+ipIfStatsHCPacketGroup OBJECT-GROUP
+ OBJECTS { ipIfStatsHCInReceives, ipIfStatsHCInForwDatagrams,
+ ipIfStatsHCInDelivers, ipIfStatsHCOutRequests,
+ ipIfStatsHCOutForwDatagrams, ipIfStatsHCOutTransmits,
+ ipIfStatsHCInMcastPkts, ipIfStatsHCOutMcastPkts }
+ STATUS current
+ DESCRIPTION
+ "IP per-interfaces statistics for systems that include
+ interfaces that may overflow the standard packet counters
+ within 1 hour."
+ ::= { ipMIBGroups 16 }
+
+ipv4IfStatsHCPacketGroup OBJECT-GROUP
+ OBJECTS { ipIfStatsHCInBcastPkts, ipIfStatsHCOutBcastPkts }
+ STATUS current
+ DESCRIPTION
+ "IPv4 only per-interface statistics for systems that include
+ interfaces that may overflow the standard packet counters
+ within 1 hour."
+ ::= { ipMIBGroups 17 }
+
+ipAddressPrefixGroup OBJECT-GROUP
+ OBJECTS { ipAddressPrefixOrigin,
+ ipAddressPrefixOnLinkFlag,
+ ipAddressPrefixAutonomousFlag,
+ ipAddressPrefixAdvPreferredLifetime,
+ ipAddressPrefixAdvValidLifetime }
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The group of objects for providing information about address
+ prefixes used by this node."
+ ::= { ipMIBGroups 18 }
+
+ipAddressGroup OBJECT-GROUP
+ OBJECTS { ipAddressSpinLock, ipAddressIfIndex,
+ ipAddressType, ipAddressPrefix,
+ ipAddressOrigin, ipAddressStatus,
+ ipAddressCreated, ipAddressLastChanged,
+ ipAddressRowStatus, ipAddressStorageType }
+ STATUS current
+ DESCRIPTION
+ "The group of objects for providing information about the
+ addresses relevant to this entity's interfaces."
+ ::= { ipMIBGroups 19 }
+
+ipNetToPhysicalGroup OBJECT-GROUP
+ OBJECTS { ipNetToPhysicalPhysAddress, ipNetToPhysicalLastUpdated,
+ ipNetToPhysicalType, ipNetToPhysicalState,
+ ipNetToPhysicalRowStatus }
+ STATUS current
+ DESCRIPTION
+ "The group of objects for providing information about the
+ mappings of network address to physical address known to
+ this node."
+ ::= { ipMIBGroups 20 }
+
+ipv6ScopeGroup OBJECT-GROUP
+ OBJECTS { ipv6ScopeZoneIndexLinkLocal,
+ ipv6ScopeZoneIndex3,
+ ipv6ScopeZoneIndexAdminLocal,
+ ipv6ScopeZoneIndexSiteLocal,
+ ipv6ScopeZoneIndex6,
+ ipv6ScopeZoneIndex7,
+ ipv6ScopeZoneIndexOrganizationLocal,
+ ipv6ScopeZoneIndex9,
+ ipv6ScopeZoneIndexA,
+ ipv6ScopeZoneIndexB,
+ ipv6ScopeZoneIndexC,
+ ipv6ScopeZoneIndexD }
+ STATUS current
+ DESCRIPTION
+ "The group of objects for managing IPv6 scope zones."
+ ::= { ipMIBGroups 21 }
+
+ipDefaultRouterGroup OBJECT-GROUP
+ OBJECTS { ipDefaultRouterLifetime, ipDefaultRouterPreference }
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The group of objects for providing information about default
+ routers known to this node."
+ ::= { ipMIBGroups 22 }
+
+ipv6RouterAdvertGroup OBJECT-GROUP
+ OBJECTS { ipv6RouterAdvertSpinLock,
+ ipv6RouterAdvertSendAdverts,
+ ipv6RouterAdvertMaxInterval,
+ ipv6RouterAdvertMinInterval,
+ ipv6RouterAdvertManagedFlag,
+ ipv6RouterAdvertOtherConfigFlag,
+ ipv6RouterAdvertLinkMTU,
+ ipv6RouterAdvertReachableTime,
+ ipv6RouterAdvertRetransmitTime,
+ ipv6RouterAdvertCurHopLimit,
+ ipv6RouterAdvertDefaultLifetime,
+ ipv6RouterAdvertRowStatus
+}
+ STATUS current
+ DESCRIPTION
+ "The group of objects for controlling information advertised
+ by IPv6 routers."
+ ::= { ipMIBGroups 23 }
+
+icmpStatsGroup OBJECT-GROUP
+ OBJECTS {icmpStatsInMsgs, icmpStatsInErrors,
+ icmpStatsOutMsgs, icmpStatsOutErrors,
+ icmpMsgStatsInPkts, icmpMsgStatsOutPkts }
+ STATUS current
+ DESCRIPTION
+ "The group of objects providing ICMP statistics."
+ ::= { ipMIBGroups 24 }
+
+--
+-- Deprecated objects
+--
+
+ipInReceives OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of input datagrams received from
+ interfaces, including those received in error.
+
+ This object has been deprecated, as a new IP version-neutral
+
+
+
+ table has been added. It is loosely replaced by
+ ipSystemStatsInRecieves."
+ ::= { ip 3 }
+
+ipInHdrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of input datagrams discarded due to errors in
+ their IPv4 headers, including bad checksums, version number
+ mismatch, other format errors, time-to-live exceeded, errors
+ discovered in processing their IPv4 options, etc.
+
+ This object has been deprecated as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsInHdrErrors."
+ ::= { ip 4 }
+
+ipInAddrErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of input datagrams discarded because the IPv4
+ address in their IPv4 header's destination field was not a
+ valid address to be received at this entity. This count
+ includes invalid addresses (e.g., 0.0.0.0) and addresses of
+ unsupported Classes (e.g., Class E). For entities which are
+ not IPv4 routers, and therefore do not forward datagrams,
+ this counter includes datagrams discarded because the
+ destination address was not a local address.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsInAddrErrors."
+ ::= { ip 5 }
+
+ipForwDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of input datagrams for which this entity was not
+ their final IPv4 destination, as a result of which an
+ attempt was made to find a route to forward them to that
+ final destination. In entities which do not act as IPv4
+ routers, this counter will include only those packets which
+
+
+
+ were Source-Routed via this entity, and the Source-Route
+ option processing was successful.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsInForwDatagrams."
+ ::= { ip 6 }
+
+ipInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of locally-addressed datagrams received
+ successfully but discarded because of an unknown or
+ unsupported protocol.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsInUnknownProtos."
+ ::= { ip 7 }
+
+ipInDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of input IPv4 datagrams for which no problems
+ were encountered to prevent their continued processing, but
+ which were discarded (e.g., for lack of buffer space). Note
+ that this counter does not include any datagrams discarded
+ while awaiting re-assembly.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsInDiscards."
+ ::= { ip 8 }
+
+ipInDelivers OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of input datagrams successfully delivered
+ to IPv4 user-protocols (including ICMP).
+
+ This object has been deprecated as a new IP version neutral
+ table has been added. It is loosely replaced by
+
+
+
+ ipSystemStatsIndelivers."
+ ::= { ip 9 }
+
+ipOutRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of IPv4 datagrams which local IPv4 user
+ protocols (including ICMP) supplied to IPv4 in requests for
+ transmission. Note that this counter does not include any
+ datagrams counted in ipForwDatagrams.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutRequests."
+ ::= { ip 10 }
+
+ipOutDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of output IPv4 datagrams for which no problem was
+ encountered to prevent their transmission to their
+ destination, but which were discarded (e.g., for lack of
+ buffer space). Note that this counter would include
+ datagrams counted in ipForwDatagrams if any such packets met
+ this (discretionary) discard criterion.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutDiscards."
+ ::= { ip 11 }
+
+ipOutNoRoutes OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 datagrams discarded because no route
+ could be found to transmit them to their destination. Note
+ that this counter includes any packets counted in
+ ipForwDatagrams which meet this `no-route' criterion. Note
+ that this includes any datagrams which a host cannot route
+ because all of its default routers are down.
+
+ This object has been deprecated, as a new IP version-neutral
+
+
+
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutNoRoutes."
+ ::= { ip 12 }
+
+ipReasmReqds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 fragments received which needed to be
+ reassembled at this entity.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsReasmReqds."
+ ::= { ip 14 }
+
+ipReasmOKs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 datagrams successfully re-assembled.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsReasmOKs."
+ ::= { ip 15 }
+
+ipReasmFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of failures detected by the IPv4 re-assembly
+ algorithm (for whatever reason: timed out, errors, etc).
+ Note that this is not necessarily a count of discarded IPv4
+ fragments since some algorithms (notably the algorithm in
+ RFC 815) can lose track of the number of fragments by
+ combining them as they are received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsReasmFails."
+ ::= { ip 16 }
+
+ipFragOKs OBJECT-TYPE
+ SYNTAX Counter32
+
+
+
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 datagrams that have been successfully
+ fragmented at this entity.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutFragOKs."
+ ::= { ip 17 }
+
+ipFragFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 datagrams that have been discarded
+ because they needed to be fragmented at this entity but
+ could not be, e.g., because their Don't Fragment flag was
+ set.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutFragFails."
+ ::= { ip 18 }
+
+ipFragCreates OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of IPv4 datagram fragments that have been
+ generated as a result of fragmentation at this entity.
+
+ This object has been deprecated as a new IP version neutral
+ table has been added. It is loosely replaced by
+ ipSystemStatsOutFragCreates."
+ ::= { ip 19 }
+
+ipRoutingDiscards OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of routing entries which were chosen to be
+ discarded even though they are valid. One possible reason
+ for discarding such an entry could be to free-up buffer
+ space for other routing entries.
+
+
+
+ This object was defined in pre-IPv6 versions of the IP MIB.
+ It was implicitly IPv4 only, but the original specifications
+ did not indicate this protocol restriction. In order to
+ clarify the specifications, this object has been deprecated
+ and a similar, but more thoroughly clarified, object has
+ been added to the IP-FORWARD-MIB."
+ ::= { ip 23 }
+
+-- the deprecated IPv4 address table
+
+ipAddrTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpAddrEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "The table of addressing information relevant to this
+ entity's IPv4 addresses.
+
+ This table has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by the
+ ipAddressTable although several objects that weren't deemed
+ useful weren't carried forward while another
+ (ipAdEntReasmMaxSize) was moved to the ipv4InterfaceTable."
+ ::= { ip 20 }
+
+ipAddrEntry OBJECT-TYPE
+ SYNTAX IpAddrEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "The addressing information for one of this entity's IPv4
+ addresses."
+ INDEX { ipAdEntAddr }
+ ::= { ipAddrTable 1 }
+
+IpAddrEntry ::= SEQUENCE {
+ ipAdEntAddr IpAddress,
+ ipAdEntIfIndex INTEGER,
+ ipAdEntNetMask IpAddress,
+ ipAdEntBcastAddr INTEGER,
+ ipAdEntReasmMaxSize INTEGER
+ }
+
+ipAdEntAddr OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+
+
+
+ "The IPv4 address to which this entry's addressing
+ information pertains."
+ ::= { ipAddrEntry 1 }
+
+ipAdEntIfIndex OBJECT-TYPE
+ SYNTAX INTEGER (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The index value which uniquely identifies the interface to
+ which this entry is applicable. The interface identified by
+ a particular value of this index is the same interface as
+ identified by the same value of the IF-MIB's ifIndex."
+ ::= { ipAddrEntry 2 }
+
+ipAdEntNetMask OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The subnet mask associated with the IPv4 address of this
+ entry. The value of the mask is an IPv4 address with all
+ the network bits set to 1 and all the hosts bits set to 0."
+ ::= { ipAddrEntry 3 }
+
+ipAdEntBcastAddr OBJECT-TYPE
+ SYNTAX INTEGER (0..1)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The value of the least-significant bit in the IPv4 broadcast
+ address used for sending datagrams on the (logical)
+ interface associated with the IPv4 address of this entry.
+ For example, when the Internet standard all-ones broadcast
+ address is used, the value will be 1. This value applies to
+ both the subnet and network broadcast addresses used by the
+ entity on this (logical) interface."
+ ::= { ipAddrEntry 4 }
+
+ipAdEntReasmMaxSize OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The size of the largest IPv4 datagram which this entity can
+ re-assemble from incoming IPv4 fragmented datagrams received
+ on this interface."
+ ::= { ipAddrEntry 5 }
+
+
+
+-- the deprecated IPv4 Address Translation table
+
+-- The Address Translation tables contain the IpAddress to
+-- "physical" address equivalences. Some interfaces do not
+-- use translation tables for determining address
+-- equivalences (e.g., DDN-X.25 has an algorithmic method);
+-- if all interfaces are of this type, then the Address
+-- Translation table is empty, i.e., has zero entries.
+
+ipNetToMediaTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpNetToMediaEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "The IPv4 Address Translation table used for mapping from
+ IPv4 addresses to physical addresses.
+
+ This table has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by the
+ ipNetToPhysicalTable."
+ ::= { ip 22 }
+
+ipNetToMediaEntry OBJECT-TYPE
+ SYNTAX IpNetToMediaEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "Each entry contains one IpAddress to `physical' address
+ equivalence."
+ INDEX { ipNetToMediaIfIndex,
+ ipNetToMediaNetAddress }
+ ::= { ipNetToMediaTable 1 }
+
+IpNetToMediaEntry ::= SEQUENCE {
+ ipNetToMediaIfIndex INTEGER,
+ ipNetToMediaPhysAddress PhysAddress,
+ ipNetToMediaNetAddress IpAddress,
+ ipNetToMediaType INTEGER
+ }
+
+ipNetToMediaIfIndex OBJECT-TYPE
+ SYNTAX INTEGER (1..2147483647)
+ MAX-ACCESS read-create
+ STATUS deprecated
+ DESCRIPTION
+ "The interface on which this entry's equivalence is
+ effective. The interface identified by a particular value
+ of this index is the same interface as identified by the
+
+
+
+ same value of the IF-MIB's ifIndex.
+
+ This object predates the rule limiting index objects to a
+ max access value of 'not-accessible' and so continues to use
+ a value of 'read-create'."
+ ::= { ipNetToMediaEntry 1 }
+
+ipNetToMediaPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress (SIZE(0..65535))
+ MAX-ACCESS read-create
+ STATUS deprecated
+ DESCRIPTION
+ "The media-dependent `physical' address. This object should
+ return 0 when this entry is in the 'incomplete' state.
+
+ As the entries in this table are typically not persistent
+ when this object is written the entity should not save the
+ change to non-volatile storage. Note: a stronger
+ requirement is not used because this object was previously
+ defined."
+ ::= { ipNetToMediaEntry 2 }
+
+ipNetToMediaNetAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-create
+ STATUS deprecated
+ DESCRIPTION
+ "The IpAddress corresponding to the media-dependent
+ `physical' address.
+
+ This object predates the rule limiting index objects to a
+ max access value of 'not-accessible' and so continues to use
+ a value of 'read-create'."
+ ::= { ipNetToMediaEntry 3 }
+
+ipNetToMediaType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ invalid(2), -- an invalidated mapping
+ dynamic(3),
+ static(4)
+ }
+ MAX-ACCESS read-create
+ STATUS deprecated
+ DESCRIPTION
+ "The type of mapping.
+
+ Setting this object to the value invalid(2) has the effect
+
+
+
+ of invalidating the corresponding entry in the
+ ipNetToMediaTable. That is, it effectively dis-associates
+ the interface identified with said entry from the mapping
+ identified with said entry. It is an implementation-
+ specific matter as to whether the agent removes an
+ invalidated entry from the table. Accordingly, management
+ stations must be prepared to receive tabular information
+ from agents that corresponds to entries not currently in
+ use. Proper interpretation of such entries requires
+ examination of the relevant ipNetToMediaType object.
+
+ As the entries in this table are typically not persistent
+ when this object is written the entity should not save the
+ change to non-volatile storage. Note: a stronger
+ requirement is not used because this object was previously
+ defined."
+ ::= { ipNetToMediaEntry 4 }
+
+-- the deprecated ICMP group
+
+icmpInMsgs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of ICMP messages which the entity received.
+ Note that this counter includes all those counted by
+ icmpInErrors.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ icmpStatsInMsgs."
+ ::= { icmp 1 }
+
+icmpInErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP messages which the entity received but
+ determined as having ICMP-specific errors (bad ICMP
+ checksums, bad length, etc.).
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ icmpStatsInErrors."
+ ::= { icmp 2 }
+
+
+
+
+icmpInDestUnreachs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Destination Unreachable messages
+ received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 3 }
+
+icmpInTimeExcds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Time Exceeded messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 4 }
+
+icmpInParmProbs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Parameter Problem messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 5 }
+
+icmpInSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Source Quench messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 6 }
+
+
+
+icmpInRedirects OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Redirect messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 7 }
+
+icmpInEchos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Echo (request) messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 8 }
+
+icmpInEchoReps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Echo Reply messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 9 }
+
+icmpInTimestamps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Timestamp (request) messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 10 }
+
+
+
+
+icmpInTimestampReps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Timestamp Reply messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 11 }
+
+icmpInAddrMasks OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Address Mask Request messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 12 }
+
+icmpInAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Address Mask Reply messages received.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 13 }
+
+icmpOutMsgs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The total number of ICMP messages which this entity
+ attempted to send. Note that this counter includes all
+ those counted by icmpOutErrors.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ icmpStatsOutMsgs."
+
+
+
+ ::= { icmp 14 }
+
+icmpOutErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP messages which this entity did not send
+ due to problems discovered within ICMP, such as a lack of
+ buffers. This value should not include errors discovered
+ outside the ICMP layer, such as the inability of IP to route
+ the resultant datagram. In some implementations, there may
+ be no types of error which contribute to this counter's
+ value.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by
+ icmpStatsOutErrors."
+ ::= { icmp 15 }
+
+icmpOutDestUnreachs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Destination Unreachable messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 16 }
+
+icmpOutTimeExcds OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Time Exceeded messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 17 }
+
+icmpOutParmProbs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+
+
+
+ DESCRIPTION
+ "The number of ICMP Parameter Problem messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 18 }
+
+icmpOutSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Source Quench messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 19 }
+
+icmpOutRedirects OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Redirect messages sent. For a host, this
+ object will always be zero, since hosts do not send
+ redirects.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 20 }
+
+icmpOutEchos OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Echo (request) messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 21 }
+
+icmpOutEchoReps OBJECT-TYPE
+ SYNTAX Counter32
+
+
+
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Echo Reply messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 22 }
+
+icmpOutTimestamps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Timestamp (request) messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 23 }
+
+icmpOutTimestampReps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Timestamp Reply messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 24 }
+
+icmpOutAddrMasks OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Address Mask Request messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 25 }
+
+icmpOutAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter32
+
+
+
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The number of ICMP Address Mask Reply messages sent.
+
+ This object has been deprecated, as a new IP version-neutral
+ table has been added. It is loosely replaced by a column in
+ the icmpMsgStatsTable."
+ ::= { icmp 26 }
+
+-- deprecated conformance information
+-- deprecated compliance statements
+
+ipMIBCompliance MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "The compliance statement for systems that implement only
+ IPv4. For version-independence, this compliance statement
+ is deprecated in favor of ipMIBCompliance2."
+ MODULE -- this module
+ MANDATORY-GROUPS { ipGroup,
+ icmpGroup }
+ ::= { ipMIBCompliances 1 }
+
+-- deprecated units of conformance
+
+ipGroup OBJECT-GROUP
+ OBJECTS { ipForwarding, ipDefaultTTL,
+ ipInReceives, ipInHdrErrors,
+ ipInAddrErrors, ipForwDatagrams,
+ ipInUnknownProtos, ipInDiscards,
+ ipInDelivers, ipOutRequests,
+ ipOutDiscards, ipOutNoRoutes,
+ ipReasmTimeout, ipReasmReqds,
+ ipReasmOKs, ipReasmFails,
+ ipFragOKs, ipFragFails,
+ ipFragCreates, ipAdEntAddr,
+ ipAdEntIfIndex, ipAdEntNetMask,
+ ipAdEntBcastAddr, ipAdEntReasmMaxSize,
+ ipNetToMediaIfIndex, ipNetToMediaPhysAddress,
+ ipNetToMediaNetAddress, ipNetToMediaType,
+ ipRoutingDiscards
+}
+ STATUS deprecated
+ DESCRIPTION
+ "The ip group of objects providing for basic management of IP
+ entities, exclusive of the management of IP routes.
+
+
+
+
+ As part of the version independence, this group has been
+ deprecated. "
+ ::= { ipMIBGroups 1 }
+
+icmpGroup OBJECT-GROUP
+ OBJECTS { icmpInMsgs, icmpInErrors,
+ icmpInDestUnreachs, icmpInTimeExcds,
+ icmpInParmProbs, icmpInSrcQuenchs,
+ icmpInRedirects, icmpInEchos,
+ icmpInEchoReps, icmpInTimestamps,
+ icmpInTimestampReps, icmpInAddrMasks,
+ icmpInAddrMaskReps, icmpOutMsgs,
+ icmpOutErrors, icmpOutDestUnreachs,
+ icmpOutTimeExcds, icmpOutParmProbs,
+ icmpOutSrcQuenchs, icmpOutRedirects,
+ icmpOutEchos, icmpOutEchoReps,
+ icmpOutTimestamps, icmpOutTimestampReps,
+ icmpOutAddrMasks, icmpOutAddrMaskReps }
+ STATUS deprecated
+ DESCRIPTION
+ "The icmp group of objects providing ICMP statistics.
+
+ As part of the version independence, this group has been
+ deprecated. "
+ ::= { ipMIBGroups 2 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC-1212 b/contrib/apps/LwipMibCompiler/Mibs/RFC-1212
new file mode 100644
index 0000000..4b1bdcf
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC-1212
@@ -0,0 +1,75 @@
+RFC-1212 DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ ObjectName
+ FROM RFC1155-SMI;
+-- DisplayString
+-- FROM RFC1158-MIB;
+
+ OBJECT-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::=
+ -- must conform to
+ -- RFC1155's ObjectSyntax
+ "SYNTAX" type(ObjectSyntax)
+ "ACCESS" Access
+ "STATUS" Status
+ DescrPart
+ ReferPart
+ IndexPart
+ DefValPart
+ VALUE NOTATION ::= value (VALUE ObjectName)
+
+ Access ::= "read-only"
+ | "read-write"
+ | "write-only"
+ | "not-accessible"
+ Status ::= "mandatory"
+ | "optional"
+ | "obsolete"
+ | "deprecated"
+
+ DescrPart ::=
+ "DESCRIPTION" value (description DisplayString)
+ | empty
+
+ ReferPart ::=
+ "REFERENCE" value (reference DisplayString)
+ | empty
+
+ IndexPart ::=
+ "INDEX" "{" IndexTypes "}"
+ | empty
+ IndexTypes ::=
+ IndexType | IndexTypes "," IndexType
+ IndexType ::=
+ -- if indexobject, use the SYNTAX
+ -- value of the correspondent
+ -- OBJECT-TYPE invocation
+ value (indexobject ObjectName)
+ -- otherwise use named SMI type
+ -- must conform to IndexSyntax below
+ | type (indextype)
+
+ DefValPart ::=
+ "DEFVAL" "{" value (defvalue ObjectSyntax) "}"
+ | empty
+
+ END
+
+ IndexSyntax ::=
+ CHOICE {
+ number
+ INTEGER (0..MAX),
+ string
+ OCTET STRING,
+ object
+ OBJECT IDENTIFIER,
+ address
+ NetworkAddress,
+ ipAddress
+ IpAddress
+ }
+
+END
+
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC-1215 b/contrib/apps/LwipMibCompiler/Mibs/RFC-1215
new file mode 100644
index 0000000..3cdcfdf
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC-1215
@@ -0,0 +1,34 @@
+RFC-1215 DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ ObjectName
+ FROM RFC1155-SMI;
+
+ TRAP-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::= "ENTERPRISE" value
+ (enterprise OBJECT IDENTIFIER)
+ VarPart
+ DescrPart
+ ReferPart
+ VALUE NOTATION ::= value (VALUE INTEGER)
+
+ VarPart ::=
+ "VARIABLES" "{" VarTypes "}"
+ | empty
+ VarTypes ::=
+ VarType | VarTypes "," VarType
+ VarType ::=
+ value (vartype ObjectName)
+
+ DescrPart ::=
+ "DESCRIPTION" value (description DisplayString)
+ | empty
+
+ ReferPart ::=
+ "REFERENCE" value (reference DisplayString)
+ | empty
+
+ END
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC1065-SMI b/contrib/apps/LwipMibCompiler/Mibs/RFC1065-SMI
new file mode 100644
index 0000000..40e55d7
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC1065-SMI
@@ -0,0 +1,132 @@
+RFC1065-SMI DEFINITIONS ::= BEGIN
+
+EXPORTS -- EVERYTHING
+ internet, directory, mgmt,
+ experimental, private, enterprises,
+ OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax,
+ ApplicationSyntax, NetworkAddress, IpAddress,
+ Counter, Gauge, TimeTicks, Opaque;
+
+ -- the path to the root
+
+ internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+ directory OBJECT IDENTIFIER ::= { internet 1 }
+
+ mgmt OBJECT IDENTIFIER ::= { internet 2 }
+
+ experimental OBJECT IDENTIFIER ::= { internet 3 }
+
+ private OBJECT IDENTIFIER ::= { internet 4 }
+ enterprises OBJECT IDENTIFIER ::= { private 1 }
+
+
+ -- definition of object types
+
+ OBJECT-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+ "ACCESS" Access
+ "STATUS" Status
+ VALUE NOTATION ::= value (VALUE ObjectName)
+
+ Access ::= "read-only"
+ | "read-write"
+ | "write-only"
+ | "not-accessible"
+ Status ::= "mandatory"
+ | "optional"
+ | "obsolete"
+ END
+
+ -- names of objects in the MIB
+
+ ObjectName ::=
+ OBJECT IDENTIFIER
+
+
+
+ -- syntax of objects in the MIB
+
+ ObjectSyntax ::=
+ CHOICE {
+ simple
+ SimpleSyntax,
+
+ -- note that simple SEQUENCEs are not directly
+ -- mentioned here to keep things simple (i.e.,
+ -- prevent mis-use). However, application-wide
+ -- types which are IMPLICITly encoded simple
+ -- SEQUENCEs may appear in the following CHOICE
+
+ application-wide
+ ApplicationSyntax
+ }
+
+ SimpleSyntax ::=
+ CHOICE {
+ number
+ INTEGER,
+
+ string
+ OCTET STRING,
+
+ object
+ OBJECT IDENTIFIER,
+
+ empty
+ NULL
+ }
+
+ ApplicationSyntax ::=
+ CHOICE {
+ address
+ NetworkAddress,
+
+ counter
+ Counter,
+
+ gauge
+ Gauge,
+
+ ticks
+ TimeTicks,
+
+ arbitrary
+ Opaque
+
+
+ -- other application-wide types, as they are
+ -- defined, will be added here
+ }
+
+
+ -- application-wide types
+
+ NetworkAddress ::=
+ CHOICE {
+ internet
+ IpAddress
+ }
+
+ IpAddress ::=
+ [APPLICATION 0] -- in network-byte order
+ IMPLICIT OCTET STRING (SIZE (4))
+
+ Counter ::=
+ [APPLICATION 1]
+ IMPLICIT INTEGER (0..4294967295)
+
+ Gauge ::=
+ [APPLICATION 2]
+ IMPLICIT INTEGER (0..4294967295)
+
+ TimeTicks ::=
+ [APPLICATION 3]
+ IMPLICIT INTEGER
+
+ Opaque ::=
+ [APPLICATION 4] -- arbitrary ASN.1 value,
+ IMPLICIT OCTET STRING -- "double-wrapped"
+
+ END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC1155-SMI b/contrib/apps/LwipMibCompiler/Mibs/RFC1155-SMI
new file mode 100644
index 0000000..a6c3bf6
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC1155-SMI
@@ -0,0 +1,129 @@
+RFC1155-SMI DEFINITIONS ::= BEGIN
+
+EXPORTS -- EVERYTHING
+ internet, directory, mgmt,
+ experimental, private, enterprises,
+ OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax,
+ ApplicationSyntax, NetworkAddress, IpAddress,
+ Counter, Gauge, TimeTicks, Opaque;
+
+ -- the path to the root
+
+ internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+ directory OBJECT IDENTIFIER ::= { internet 1 }
+
+ mgmt OBJECT IDENTIFIER ::= { internet 2 }
+
+ experimental OBJECT IDENTIFIER ::= { internet 3 }
+
+ private OBJECT IDENTIFIER ::= { internet 4 }
+ enterprises OBJECT IDENTIFIER ::= { private 1 }
+
+
+ -- definition of object types
+
+ OBJECT-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+ "ACCESS" Access
+ "STATUS" Status
+ VALUE NOTATION ::= value (VALUE ObjectName)
+
+ Access ::= "read-only"
+ | "read-write"
+ | "write-only"
+ | "not-accessible"
+ Status ::= "mandatory"
+ | "optional"
+ | "obsolete"
+ END
+
+ -- names of objects in the MIB
+
+ ObjectName ::=
+ OBJECT IDENTIFIER
+
+ -- syntax of objects in the MIB
+
+ ObjectSyntax ::=
+ CHOICE {
+ simple
+ SimpleSyntax,
+
+ -- note that simple SEQUENCEs are not directly
+ -- mentioned here to keep things simple (i.e.,
+ -- prevent mis-use). However, application-wide
+ -- types which are IMPLICITly encoded simple
+ -- SEQUENCEs may appear in the following CHOICE
+
+ application-wide
+ ApplicationSyntax
+ }
+
+ SimpleSyntax ::=
+ CHOICE {
+ number
+ INTEGER,
+
+ string
+ OCTET STRING,
+
+ object
+ OBJECT IDENTIFIER,
+
+ empty
+ NULL
+ }
+
+ ApplicationSyntax ::=
+ CHOICE {
+ address
+ NetworkAddress,
+
+ counter
+ Counter,
+
+ gauge
+ Gauge,
+
+ ticks
+ TimeTicks,
+
+ arbitrary
+ Opaque
+
+ -- other application-wide types, as they are
+ -- defined, will be added here
+ }
+
+
+ -- application-wide types
+
+ NetworkAddress ::=
+ CHOICE {
+ internet
+ IpAddress
+ }
+
+ IpAddress ::=
+ [APPLICATION 0] -- in network-byte order
+ IMPLICIT OCTET STRING (SIZE (4))
+
+ Counter ::=
+ [APPLICATION 1]
+ IMPLICIT INTEGER (0..4294967295)
+
+ Gauge ::=
+ [APPLICATION 2]
+ IMPLICIT INTEGER (0..4294967295)
+
+ TimeTicks ::=
+ [APPLICATION 3]
+ IMPLICIT INTEGER (0..4294967295)
+
+ Opaque ::=
+ [APPLICATION 4] -- arbitrary ASN.1 value,
+ IMPLICIT OCTET STRING -- "double-wrapped"
+
+ END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC1158-MIB b/contrib/apps/LwipMibCompiler/Mibs/RFC1158-MIB
new file mode 100644
index 0000000..4acf34a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC1158-MIB
@@ -0,0 +1,1493 @@
+RFC1158-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ mgmt, OBJECT-TYPE, NetworkAddress, IpAddress,
+ Counter, Gauge, TimeTicks
+ FROM RFC1155-SMI;
+
+DisplayString ::=
+ OCTET STRING
+
+mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } -- MIB-II
+ -- (same prefix as MIB-I)
+
+system OBJECT IDENTIFIER ::= { mib-2 1 }
+interfaces OBJECT IDENTIFIER ::= { mib-2 2 }
+at OBJECT IDENTIFIER ::= { mib-2 3 }
+ip OBJECT IDENTIFIER ::= { mib-2 4 }
+icmp OBJECT IDENTIFIER ::= { mib-2 5 }
+tcp OBJECT IDENTIFIER ::= { mib-2 6 }
+udp OBJECT IDENTIFIER ::= { mib-2 7 }
+egp OBJECT IDENTIFIER ::= { mib-2 8 }
+-- cmot OBJECT IDENTIFIER ::= { mib-2 9 }
+transmission OBJECT IDENTIFIER ::= { mib-2 10 }
+snmp OBJECT IDENTIFIER ::= { mib-2 11 }
+
+
+-- object types
+
+-- the System group
+
+sysDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-only
+ STATUS mandatory
+ ::= { system 1 }
+
+sysObjectID OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { system 2 }
+
+sysUpTime OBJECT-TYPE
+ SYNTAX TimeTicks
+ ACCESS read-only
+ STATUS mandatory
+ ::= { system 3 }
+
+sysContact OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-write
+ STATUS mandatory
+ ::= { system 4 }
+
+sysName OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-write
+ STATUS mandatory
+ ::= { system 5 }
+
+sysLocation OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-only
+ STATUS mandatory
+ ::= { system 6 }
+
+sysServices OBJECT-TYPE
+ SYNTAX INTEGER (0..127)
+ ACCESS read-only
+ STATUS mandatory
+ ::= { system 7 }
+
+
+-- the Interfaces group
+
+ifNumber OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { interfaces 1 }
+
+-- the Interfaces table
+
+ifTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { interfaces 2 }
+
+ifEntry OBJECT-TYPE
+ SYNTAX IfEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifTable 1 }
+
+IfEntry ::= SEQUENCE {
+ ifIndex
+ INTEGER,
+ ifDescr
+ DisplayString,
+ ifType
+ INTEGER,
+ ifMtu
+ INTEGER,
+ ifSpeed
+ Gauge,
+ ifPhysAddress
+ OCTET STRING,
+ ifAdminStatus
+ INTEGER,
+ ifOperStatus
+ INTEGER,
+ ifLastChange
+ TimeTicks,
+ ifInOctets
+ Counter,
+ ifInUcastPkts
+ Counter,
+ ifInNUcastPkts
+ Counter,
+ ifInDiscards
+ Counter,
+ ifInErrors
+ Counter,
+ ifInUnknownProtos
+ Counter,
+ ifOutOctets
+ Counter,
+ ifOutUcastPkts
+ Counter,
+ ifOutNUcastPkts
+ Counter,
+ ifOutDiscards
+ Counter,
+ ifOutErrors
+ Counter,
+ ifOutQLen
+ Gauge,
+ ifSpecific
+ OBJECT IDENTIFIER
+}
+
+ifIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 1 }
+
+ifDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 2 }
+
+ifType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the
+ -- following
+ regular1822(2),
+ hdh1822(3),
+ ddn-x25(4),
+ rfc877-x25(5),
+ ethernet-csmacd(6),
+ iso88023-csmacd(7),
+ iso88024-tokenBus(8),
+ iso88025-tokenRing(9),
+ iso88026-man(10),
+ starLan(11),
+ proteon-10Mbit(12),
+ proteon-80Mbit(13),
+ hyperchannel(14),
+ fddi(15),
+ lapb(16),
+ sdlc(17),
+ t1-carrier(18),
+ cept(19), -- european
+ --equivalent of T-1
+ basicISDN(20),
+ primaryISDN(21),
+ -- proprietary
+ -- serial
+ propPointToPointSerial(22),
+ terminalServer-asyncPort(23),
+ softwareLoopback(24),
+ eon(25), -- CLNP over IP
+ ethernet-3Mbit(26),
+ nsip(27), -- XNS over IP
+ slip(28) -- generic SLIP
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 3 }
+
+ifMtu OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 4 }
+
+ifSpeed OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 5 }
+
+ifPhysAddress OBJECT-TYPE
+ SYNTAX OCTET STRING
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 6 }
+
+ifAdminStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3) -- in some test mode
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ifEntry 7 }
+
+ifOperStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3) -- in some test mode
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 8 }
+
+ifLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 9 }
+
+ifInOctets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 10 }
+
+ifInUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 11 }
+
+ifInNUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 12 }
+
+ifInDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 13 }
+
+ifInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 14 }
+
+ifInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 15 }
+
+ifOutOctets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 16 }
+
+ifOutUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 17 }
+
+ifOutNUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 18 }
+
+ifOutDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 19 }
+
+ifOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 20 }
+
+ifOutQLen OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 21 }
+
+ifSpecific OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ifEntry 22 }
+
+nullSpecific OBJECT IDENTIFIER ::= { 0 0 }
+
+-- the Address Translation group (deprecated)
+
+atTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF AtEntry
+ ACCESS read-write
+ STATUS deprecated
+ ::= { at 1 }
+
+atEntry OBJECT-TYPE
+ SYNTAX AtEntry
+ ACCESS read-write
+ STATUS deprecated
+ ::= { atTable 1 }
+
+AtEntry ::= SEQUENCE {
+ atIfIndex
+ INTEGER,
+ atPhysAddress
+ OCTET STRING,
+ atNetAddress
+ NetworkAddress
+}
+
+atIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS deprecated
+ ::= { atEntry 1 }
+
+atPhysAddress OBJECT-TYPE
+ SYNTAX OCTET STRING
+ ACCESS read-write
+ STATUS deprecated
+ ::= { atEntry 2 }
+
+atNetAddress OBJECT-TYPE
+ SYNTAX NetworkAddress
+ ACCESS read-write
+ STATUS deprecated
+ ::= { atEntry 3 }
+
+
+-- the IP group
+
+ipForwarding OBJECT-TYPE
+ SYNTAX INTEGER {
+ gateway(1), -- entity forwards
+ -- datagrams
+ host(2) -- entity does NOT
+ -- forward datagrams
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ip 1 }
+
+ipDefaultTTL OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ip 2 }
+
+ipInReceives OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 3 }
+
+ipInHdrErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 4 }
+
+ipInAddrErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 5 }
+
+ipForwDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 6 }
+
+ipInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 7 }
+
+ipInDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 8 }
+
+ipInDelivers OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 9 }
+
+ipOutRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 10 }
+
+ipOutDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 11 }
+
+ipOutNoRoutes OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 12 }
+
+ipReasmTimeout OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 13 }
+
+ipReasmReqds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 14 }
+
+ipReasmOKs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 15 }
+
+ipReasmFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 16 }
+
+ipFragOKs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 17 }
+
+ipFragFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 18 }
+
+ipFragCreates OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 19 }
+
+-- the IP Interface table
+
+ipAddrTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpAddrEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ip 20 }
+
+ipAddrEntry OBJECT-TYPE
+ SYNTAX IpAddrEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrTable 1 }
+
+IpAddrEntry ::= SEQUENCE {
+ ipAdEntAddr
+ IpAddress,
+ ipAdEntIfIndex
+ INTEGER,
+ ipAdEntNetMask
+ IpAddress,
+ ipAdEntBcastAddr
+ INTEGER,
+ ipAdEntReasmMaxSize
+ INTEGER (0..65535)
+}
+
+ipAdEntAddr OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrEntry 1 }
+
+ipAdEntIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrEntry 2 }
+
+ipAdEntNetMask OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrEntry 3 }
+
+ipAdEntBcastAddr OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrEntry 4 }
+
+ipAdEntReasmMaxSize OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipAddrEntry 5 }
+
+-- the IP Routing table
+
+ipRoutingTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpRouteEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ip 21 }
+
+ipRouteEntry OBJECT-TYPE
+ SYNTAX IpRouteEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRoutingTable 1 }
+
+IpRouteEntry ::= SEQUENCE {
+ ipRouteDest
+ IpAddress,
+ ipRouteIfIndex
+ INTEGER,
+ ipRouteMetric1
+ INTEGER,
+ ipRouteMetric2
+ INTEGER,
+ ipRouteMetric3
+ INTEGER,
+ ipRouteMetric4
+ INTEGER,
+ ipRouteNextHop
+ IpAddress,
+ ipRouteType
+ INTEGER,
+ ipRouteProto
+ INTEGER,
+ ipRouteAge
+ INTEGER,
+ ipRouteMask
+ IpAddress
+}
+
+ipRouteDest OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 1 }
+
+ipRouteIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 2 }
+
+ipRouteMetric1 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 3 }
+
+ipRouteMetric2 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 4 }
+
+ipRouteMetric3 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 5 }
+
+ipRouteMetric4 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 6 }
+
+ipRouteNextHop OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 7 }
+
+ipRouteType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ invalid(2), -- an invalidated route
+
+ -- route to directly
+ direct(3), -- connected
+ -- (sub-)network
+
+ -- route to a non-local
+ remote(4) -- host/network/
+ -- sub-network
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 8 }
+
+ipRouteProto OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ -- non-protocol
+ -- information
+
+ -- e.g., manually
+ local(2), -- configured entries
+
+ -- set via a network
+ netmgmt(3), -- management protocol
+
+ -- obtained via ICMP,
+ icmp(4), -- e.g., Redirect
+
+ -- the following are
+ -- gateway routing
+ -- protocols
+ egp(5),
+ ggp(6),
+ hello(7),
+ rip(8),
+ is-is(9),
+ es-is(10),
+ ciscoIgrp(11),
+ bbnSpfIgp(12),
+ ospf(13),
+ bgp(14)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { ipRouteEntry 9 }
+
+ipRouteAge OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 10 }
+
+ipRouteMask OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipRouteEntry 11 }
+
+-- the IP Address Translation tables
+
+ipNetToMediaTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpNetToMediaEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ip 22 }
+
+ipNetToMediaEntry OBJECT-TYPE
+ SYNTAX IpNetToMediaEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipNetToMediaTable 1 }
+
+IpNetToMediaEntry ::= SEQUENCE {
+ ipNetToMediaIfIndex
+ INTEGER,
+ ipNetToMediaPhysAddress
+ OCTET STRING,
+ ipNetToMediaNetAddress
+ IpAddress,
+ ipNetToMediaType
+ INTEGER
+}
+
+ipNetToMediaIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipNetToMediaEntry 1 }
+
+ipNetToMediaPhysAddress OBJECT-TYPE
+ SYNTAX OCTET STRING
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipNetToMediaEntry 2 }
+
+ipNetToMediaNetAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipNetToMediaEntry 3 }
+
+ipNetToMediaType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ invalid(2), -- an invalidated mapping
+ dynamic(3), -- connected (sub-)network
+
+ static(4)
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { ipNetToMediaEntry 4 }
+
+-- the ICMP group
+
+icmpInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 1 }
+
+icmpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 2 }
+
+icmpInDestUnreachs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 3 }
+
+icmpInTimeExcds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 4 }
+
+icmpInParmProbs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 5 }
+
+icmpInSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 6 }
+
+icmpInRedirects OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 7 }
+
+icmpInEchos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 8 }
+
+icmpInEchoReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 9 }
+
+icmpInTimestamps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 10 }
+
+icmpInTimestampReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 11 }
+
+icmpInAddrMasks OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 12 }
+
+icmpInAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 13 }
+
+icmpOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 14 }
+
+icmpOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 15 }
+
+icmpOutDestUnreachs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 16 }
+
+icmpOutTimeExcds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 17 }
+
+icmpOutParmProbs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 18 }
+
+icmpOutSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 19 }
+
+icmpOutRedirects OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 20 }
+
+icmpOutEchos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 21 }
+
+icmpOutEchoReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 22 }
+
+icmpOutTimestamps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 23 }
+
+icmpOutTimestampReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 24 }
+
+icmpOutAddrMasks OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 25 }
+
+icmpOutAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { icmp 26 }
+
+
+-- the TCP group
+
+tcpRtoAlgorithm OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ constant(2), -- a constant rto
+ rsre(3), -- MIL-STD-1778,
+ -- Appendix B
+ vanj(4) -- Van Jacobson's
+ -- algorithm
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 1 }
+
+tcpRtoMin OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 2 }
+
+tcpRtoMax OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 3 }
+
+tcpMaxConn OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 4 }
+
+tcpActiveOpens OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 5 }
+
+tcpPassiveOpens OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 6 }
+
+tcpAttemptFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 7 }
+
+tcpEstabResets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 8 }
+
+tcpCurrEstab OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 9 }
+
+tcpInSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 10 }
+
+tcpOutSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 11 }
+
+tcpRetransSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 12 }
+
+-- the TCP connections table
+
+tcpConnTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF TcpConnEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 13 }
+
+tcpConnEntry OBJECT-TYPE
+ SYNTAX TcpConnEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnTable 1 }
+
+TcpConnEntry ::= SEQUENCE {
+ tcpConnState
+ INTEGER,
+ tcpConnLocalAddress
+ IpAddress,
+ tcpConnLocalPort
+ INTEGER (0..65535),
+ tcpConnRemAddress
+ IpAddress,
+ tcpConnRemPort
+ INTEGER (0..65535)
+}
+
+tcpConnState OBJECT-TYPE
+ SYNTAX INTEGER {
+ closed(1),
+ listen(2),
+ synSent(3),
+ synReceived(4),
+ established(5),
+ finWait1(6),
+ finWait2(7),
+ closeWait(8),
+ lastAck(9),
+ closing(10),
+ timeWait(11)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnEntry 1 }
+
+tcpConnLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnEntry 2 }
+
+tcpConnLocalPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnEntry 3 }
+
+tcpConnRemAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnEntry 4 }
+
+tcpConnRemPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcpConnEntry 5 }
+
+-- additional TCP variables
+
+tcpInErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 14 }
+
+tcpOutRsts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { tcp 15 }
+
+
+-- the UDP group
+
+udpInDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udp 1 }
+
+udpNoPorts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udp 2 }
+
+udpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udp 3 }
+
+udpOutDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udp 4 }
+
+-- the UDP listener table
+
+udpTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF UdpEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udp 5 }
+
+udpEntry OBJECT-TYPE
+ SYNTAX UdpEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udpTable 1 }
+
+UdpEntry ::= SEQUENCE {
+ udpLocalAddress
+ IpAddress,
+ udpLocalPort
+ INTEGER (0..65535)
+}
+
+udpLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udpEntry 1 }
+
+udpLocalPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ ::= { udpEntry 2 }
+
+-- the EGP group
+
+egpInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 1 }
+
+egpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 2 }
+
+egpOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 3 }
+
+egpOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 4 }
+
+-- the EGP Neighbor table
+
+egpNeighTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF EgpNeighEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 5 }
+
+egpNeighEntry OBJECT-TYPE
+ SYNTAX EgpNeighEntry
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighTable 1 }
+
+EgpNeighEntry ::= SEQUENCE {
+ egpNeighState
+ INTEGER,
+ egpNeighAddr
+ IpAddress,
+ egpNeighAs
+ INTEGER,
+ egpNeighInMsgs
+ Counter,
+ egpNeighInErrs
+ Counter,
+ egpNeighOutMsgs
+ Counter,
+ egpNeighOutErrs
+ Counter,
+ egpNeighInErrMsgs
+ Counter,
+ egpNeighOutErrMsgs
+ Counter,
+ egpNeighStateUps
+ Counter,
+ egpNeighStateDowns
+ Counter,
+ egpNeighIntervalHello
+ INTEGER,
+ egpNeighIntervalPoll
+ INTEGER,
+ egpNeighMode
+ INTEGER,
+ egpNeighEventTrigger
+ INTEGER
+}
+
+egpNeighState OBJECT-TYPE
+ SYNTAX INTEGER {
+ idle(1),
+ acquisition(2),
+ down(3),
+ up(4),
+ cease(5)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 1 }
+
+egpNeighAddr OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 2 }
+
+egpNeighAs OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 3 }
+
+egpNeighInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 4 }
+
+egpNeighInErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 5 }
+
+egpNeighOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 6 }
+
+egpNeighOutErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 7 }
+
+egpNeighInErrMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 8 }
+
+egpNeighOutErrMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 9 }
+
+egpNeighStateUps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 10 }
+
+egpNeighStateDowns OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 11 }
+
+egpNeighIntervalHello OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 12 }
+
+egpNeighIntervalPoll OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 13 }
+
+egpNeighMode OBJECT-TYPE
+ SYNTAX INTEGER {
+ active(1),
+ passive(2)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egpNeighEntry 14 }
+
+egpNeighEventTrigger OBJECT-TYPE
+ SYNTAX INTEGER {
+ start(1),
+ stop(2)
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { egpNeighEntry 15 }
+
+-- additional EGP variables
+
+egpAs OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ ::= { egp 6 }
+
+
+-- the Transmission group (empty at present)
+
+-- the SNMP group
+
+snmpInPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 1 }
+
+snmpOutPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 2 }
+
+snmpInBadVersions OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 3 }
+
+snmpInBadCommunityNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 4 }
+
+snmpInBadCommunityUses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 5 }
+
+snmpInASNParseErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 6 }
+
+snmpInBadTypes OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 7 }
+
+snmpInTooBigs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 8 }
+
+snmpInNoSuchNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 9 }
+
+snmpInBadValues OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 10 }
+
+snmpInReadOnlys OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 11 }
+
+snmpInGenErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 12 }
+
+snmpInTotalReqVars OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 13 }
+
+snmpInTotalSetVars OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 14 }
+
+snmpInGetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 15 }
+
+snmpInGetNexts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 16 }
+
+snmpInSetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 17 }
+
+snmpInGetResponses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 18 }
+
+snmpInTraps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 19 }
+
+snmpOutTooBigs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 20 }
+
+snmpOutNoSuchNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 21 }
+
+snmpOutBadValues OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 22 }
+
+snmpOutReadOnlys OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 23 }
+
+snmpOutGenErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 24 }
+
+snmpOutGetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 25 }
+
+snmpOutGetNexts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 26 }
+
+snmpOutSetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 27 }
+
+snmpOutGetResponses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 28 }
+
+snmpOutTraps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ ::= { snmp 29 }
+
+snmpEnableAuthTraps OBJECT-TYPE
+ SYNTAX INTEGER {
+ enabled(1),
+ disabled(2)
+ }
+ ACCESS read-write
+ STATUS mandatory
+ ::= { snmp 30 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/RFC1213-MIB b/contrib/apps/LwipMibCompiler/Mibs/RFC1213-MIB
new file mode 100644
index 0000000..2a849de
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/RFC1213-MIB
@@ -0,0 +1,2621 @@
+RFC1213-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ mgmt, NetworkAddress, IpAddress, Counter, Gauge,
+ TimeTicks
+ FROM RFC1155-SMI
+ OBJECT-TYPE
+ FROM RFC-1212;
+
+-- This MIB module uses the extended OBJECT-TYPE macro as
+-- defined in [14];
+
+
+-- MIB-II (same prefix as MIB-I)
+
+mib-2 OBJECT IDENTIFIER ::= { mgmt 1 }
+
+-- textual conventions
+
+DisplayString ::=
+ OCTET STRING
+-- This data type is used to model textual information taken
+-- from the NVT ASCII character set. By convention, objects
+-- with this syntax are declared as having
+
+--
+-- SIZE (0..255)
+
+PhysAddress ::=
+ OCTET STRING
+-- This data type is used to model media addresses. For many
+-- types of media, this will be in a binary representation.
+-- For example, an ethernet address would be represented as
+-- a string of 6 octets.
+
+
+-- groups in MIB-II
+
+system OBJECT IDENTIFIER ::= { mib-2 1 }
+
+interfaces OBJECT IDENTIFIER ::= { mib-2 2 }
+
+at OBJECT IDENTIFIER ::= { mib-2 3 }
+
+ip OBJECT IDENTIFIER ::= { mib-2 4 }
+
+icmp OBJECT IDENTIFIER ::= { mib-2 5 }
+
+tcp OBJECT IDENTIFIER ::= { mib-2 6 }
+
+udp OBJECT IDENTIFIER ::= { mib-2 7 }
+
+egp OBJECT IDENTIFIER ::= { mib-2 8 }
+
+-- historical (some say hysterical)
+-- cmot OBJECT IDENTIFIER ::= { mib-2 9 }
+
+transmission OBJECT IDENTIFIER ::= { mib-2 10 }
+
+snmp OBJECT IDENTIFIER ::= { mib-2 11 }
+
+
+-- the System group
+
+-- Implementation of the System group is mandatory for all
+-- systems. If an agent is not configured to have a value
+-- for any of these variables, a string of length 0 is
+-- returned.
+
+sysDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A textual description of the entity. This value
+ should include the full name and version
+ identification of the system's hardware type,
+ software operating-system, and networking
+ software. It is mandatory that this only contain
+ printable ASCII characters."
+ ::= { system 1 }
+
+sysObjectID OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The vendor's authoritative identification of the
+ network management subsystem contained in the
+ entity. This value is allocated within the SMI
+ enterprises subtree (1.3.6.1.4.1) and provides an
+ easy and unambiguous means for determining `what
+ kind of box' is being managed. For example, if
+ vendor `Flintstones, Inc.' was assigned the
+ subtree 1.3.6.1.4.1.4242, it could assign the
+ identifier 1.3.6.1.4.1.4242.1.1 to its `Fred
+ Router'."
+ ::= { system 2 }
+
+sysUpTime OBJECT-TYPE
+ SYNTAX TimeTicks
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The time (in hundredths of a second) since the
+ network management portion of the system was last
+ re-initialized."
+ ::= { system 3 }
+
+sysContact OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The textual identification of the contact person
+ for this managed node, together with information
+ on how to contact this person."
+ ::= { system 4 }
+
+sysName OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "An administratively-assigned name for this
+ managed node. By convention, this is the node's
+ fully-qualified domain name."
+ ::= { system 5 }
+
+sysLocation OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The physical location of this node (e.g.,
+ `telephone closet, 3rd floor')."
+ ::= { system 6 }
+
+sysServices OBJECT-TYPE
+ SYNTAX INTEGER (0..127)
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A value which indicates the set of services that
+ this entity primarily offers.
+
+ The value is a sum. This sum initially takes the
+ value zero, Then, for each layer, L, in the range
+ 1 through 7, that this node performs transactions
+ for, 2 raised to (L - 1) is added to the sum. For
+ example, a node which performs primarily routing
+ functions would have a value of 4 (2^(3-1)). In
+ contrast, a node which is a host offering
+ application services would have a value of 72
+ (2^(4-1) + 2^(7-1)). Note that in the context of
+ the Internet suite of protocols, values should be
+ calculated accordingly:
+
+ layer functionality
+ 1 physical (e.g., repeaters)
+ 2 datalink/subnetwork (e.g., bridges)
+ 3 internet (e.g., IP gateways)
+ 4 end-to-end (e.g., IP hosts)
+ 7 applications (e.g., mail relays)
+
+ For systems including OSI protocols, layers 5 and
+ 6 may also be counted."
+ ::= { system 7 }
+
+-- the Interfaces group
+
+-- Implementation of the Interfaces group is mandatory for
+-- all systems.
+
+ifNumber OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of network interfaces (regardless of
+ their current state) present on this system."
+ ::= { interfaces 1 }
+
+
+-- the Interfaces table
+
+-- The Interfaces table contains information on the entity's
+-- interfaces. Each interface is thought of as being
+-- attached to a `subnetwork'. Note that this term should
+-- not be confused with `subnet' which refers to an
+-- addressing partitioning scheme used in the Internet suite
+-- of protocols.
+
+ifTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IfEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "A list of interface entries. The number of
+ entries is given by the value of ifNumber."
+ ::= { interfaces 2 }
+
+ifEntry OBJECT-TYPE
+ SYNTAX IfEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "An interface entry containing objects at the
+ subnetwork layer and below for a particular
+ interface."
+ INDEX { ifIndex }
+ ::= { ifTable 1 }
+
+IfEntry ::=
+ SEQUENCE {
+ ifIndex
+ INTEGER,
+ ifDescr
+ DisplayString,
+ ifType
+ INTEGER,
+ ifMtu
+ INTEGER,
+ ifSpeed
+ Gauge,
+ ifPhysAddress
+ PhysAddress,
+ ifAdminStatus
+ INTEGER,
+ ifOperStatus
+ INTEGER,
+ ifLastChange
+ TimeTicks,
+ ifInOctets
+ Counter,
+ ifInUcastPkts
+ Counter,
+ ifInNUcastPkts
+ Counter,
+ ifInDiscards
+ Counter,
+ ifInErrors
+ Counter,
+ ifInUnknownProtos
+ Counter,
+ ifOutOctets
+ Counter,
+ ifOutUcastPkts
+ Counter,
+ ifOutNUcastPkts
+ Counter,
+ ifOutDiscards
+ Counter,
+ ifOutErrors
+ Counter,
+ ifOutQLen
+ Gauge,
+ ifSpecific
+ OBJECT IDENTIFIER
+ }
+
+ifIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A unique value for each interface. Its value
+ ranges between 1 and the value of ifNumber. The
+ value for each interface must remain constant at
+ least from one re-initialization of the entity's
+ network management system to the next re-
+ initialization."
+ ::= { ifEntry 1 }
+
+ifDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A textual string containing information about the
+ interface. This string should include the name of
+ the manufacturer, the product name and the version
+ of the hardware interface."
+ ::= { ifEntry 2 }
+
+ifType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ regular1822(2),
+ hdh1822(3),
+ ddn-x25(4),
+ rfc877-x25(5),
+ ethernet-csmacd(6),
+ iso88023-csmacd(7),
+ iso88024-tokenBus(8),
+ iso88025-tokenRing(9),
+ iso88026-man(10),
+ starLan(11),
+ proteon-10Mbit(12),
+ proteon-80Mbit(13),
+ hyperchannel(14),
+ fddi(15),
+ lapb(16),
+ sdlc(17),
+ ds1(18), -- T-1
+ e1(19), -- european equiv. of T-1
+ basicISDN(20),
+ primaryISDN(21), -- proprietary serial
+ propPointToPointSerial(22),
+ ppp(23),
+ softwareLoopback(24),
+ eon(25), -- CLNP over IP [11]
+ ethernet-3Mbit(26),
+ nsip(27), -- XNS over IP
+ slip(28), -- generic SLIP
+ ultra(29), -- ULTRA technologies
+ ds3(30), -- T-3
+ sip(31), -- SMDS
+ frame-relay(32)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The type of interface, distinguished according to
+ the physical/link protocol(s) immediately `below'
+ the network layer in the protocol stack."
+ ::= { ifEntry 3 }
+
+ifMtu OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The size of the largest datagram which can be
+ sent/received on the interface, specified in
+ octets. For interfaces that are used for
+ transmitting network datagrams, this is the size
+ of the largest network datagram that can be sent
+ on the interface."
+ ::= { ifEntry 4 }
+
+ifSpeed OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "An estimate of the interface's current bandwidth
+ in bits per second. For interfaces which do not
+ vary in bandwidth or for those where no accurate
+ estimation can be made, this object should contain
+ the nominal bandwidth."
+ ::= { ifEntry 5 }
+
+ifPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The interface's address at the protocol layer
+ immediately `below' the network layer in the
+ protocol stack. For interfaces which do not have
+ such an address (e.g., a serial line), this object
+ should contain an octet string of zero length."
+ ::= { ifEntry 6 }
+
+ifAdminStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3) -- in some test mode
+ }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The desired state of the interface. The
+ testing(3) state indicates that no operational
+ packets can be passed."
+ ::= { ifEntry 7 }
+
+ifOperStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ up(1), -- ready to pass packets
+ down(2),
+ testing(3) -- in some test mode
+ }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The current operational state of the interface.
+ The testing(3) state indicates that no operational
+ packets can be passed."
+ ::= { ifEntry 8 }
+
+ifLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The value of sysUpTime at the time the interface
+ entered its current operational state. If the
+ current state was entered prior to the last re-
+ initialization of the local network management
+ subsystem, then this object contains a zero
+ value."
+ ::= { ifEntry 9 }
+
+ifInOctets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of octets received on the
+ interface, including framing characters."
+ ::= { ifEntry 10 }
+
+ifInUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of subnetwork-unicast packets
+ delivered to a higher-layer protocol."
+ ::= { ifEntry 11 }
+
+ifInNUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of non-unicast (i.e., subnetwork-
+ broadcast or subnetwork-multicast) packets
+ delivered to a higher-layer protocol."
+ ::= { ifEntry 12 }
+
+ifInDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of inbound packets which were chosen
+ to be discarded even though no errors had been
+ detected to prevent their being deliverable to a
+ higher-layer protocol. One possible reason for
+ discarding such a packet could be to free up
+ buffer space."
+ ::= { ifEntry 13 }
+
+ifInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of inbound packets that contained
+ errors preventing them from being deliverable to a
+ higher-layer protocol."
+ ::= { ifEntry 14 }
+
+ifInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of packets received via the interface
+ which were discarded because of an unknown or
+ unsupported protocol."
+ ::= { ifEntry 15 }
+
+ifOutOctets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of octets transmitted out of the
+ interface, including framing characters."
+ ::= { ifEntry 16 }
+
+ifOutUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of packets that higher-level
+ protocols requested be transmitted to a
+ subnetwork-unicast address, including those that
+ were discarded or not sent."
+ ::= { ifEntry 17 }
+
+ifOutNUcastPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of packets that higher-level
+ protocols requested be transmitted to a non-
+ unicast (i.e., a subnetwork-broadcast or
+ subnetwork-multicast) address, including those
+ that were discarded or not sent."
+ ::= { ifEntry 18 }
+
+ifOutDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of outbound packets which were chosen
+ to be discarded even though no errors had been
+ detected to prevent their being transmitted. One
+ possible reason for discarding such a packet could
+ be to free up buffer space."
+ ::= { ifEntry 19 }
+
+ifOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of outbound packets that could not be
+ transmitted because of errors."
+ ::= { ifEntry 20 }
+
+ifOutQLen OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The length of the output packet queue (in
+ packets)."
+ ::= { ifEntry 21 }
+
+ifSpecific OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A reference to MIB definitions specific to the
+ particular media being used to realize the
+ interface. For example, if the interface is
+ realized by an ethernet, then the value of this
+ object refers to a document defining objects
+ specific to ethernet. If this information is not
+ present, its value should be set to the OBJECT
+ IDENTIFIER { 0 0 }, which is a syntatically valid
+ object identifier, and any conformant
+ implementation of ASN.1 and BER must be able to
+ generate and recognize this value."
+ ::= { ifEntry 22 }
+
+
+-- the Address Translation group
+
+-- Implementation of the Address Translation group is
+-- mandatory for all systems. Note however that this group
+-- is deprecated by MIB-II. That is, it is being included
+
+-- solely for compatibility with MIB-I nodes, and will most
+-- likely be excluded from MIB-III nodes. From MIB-II and
+-- onwards, each network protocol group contains its own
+-- address translation tables.
+
+-- The Address Translation group contains one table which is
+-- the union across all interfaces of the translation tables
+-- for converting a NetworkAddress (e.g., an IP address) into
+-- a subnetwork-specific address. For lack of a better term,
+-- this document refers to such a subnetwork-specific address
+-- as a `physical' address.
+
+-- Examples of such translation tables are: for broadcast
+-- media where ARP is in use, the translation table is
+-- equivalent to the ARP cache; or, on an X.25 network where
+-- non-algorithmic translation to X.121 addresses is
+-- required, the translation table contains the
+-- NetworkAddress to X.121 address equivalences.
+
+atTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF AtEntry
+ ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "The Address Translation tables contain the
+ NetworkAddress to `physical' address equivalences.
+ Some interfaces do not use translation tables for
+ determining address equivalences (e.g., DDN-X.25
+ has an algorithmic method); if all interfaces are
+ of this type, then the Address Translation table
+ is empty, i.e., has zero entries."
+ ::= { at 1 }
+
+atEntry OBJECT-TYPE
+ SYNTAX AtEntry
+ ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "Each entry contains one NetworkAddress to
+ `physical' address equivalence."
+ INDEX { atIfIndex,
+ atNetAddress }
+ ::= { atTable 1 }
+
+AtEntry ::=
+ SEQUENCE {
+ atIfIndex
+ INTEGER,
+ atPhysAddress
+ PhysAddress,
+ atNetAddress
+ NetworkAddress
+ }
+
+atIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "The interface on which this entry's equivalence
+ is effective. The interface identified by a
+ particular value of this index is the same
+ interface as identified by the same value of
+ ifIndex."
+ ::= { atEntry 1 }
+
+atPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress
+ ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "The media-dependent `physical' address.
+
+ Setting this object to a null string (one of zero
+ length) has the effect of invaliding the
+ corresponding entry in the atTable object. That
+ is, it effectively dissasociates the interface
+ identified with said entry from the mapping
+ identified with said entry. It is an
+ implementation-specific matter as to whether the
+ agent removes an invalidated entry from the table.
+ Accordingly, management stations must be prepared
+ to receive tabular information from agents that
+ corresponds to entries not currently in use.
+ Proper interpretation of such entries requires
+ examination of the relevant atPhysAddress object."
+ ::= { atEntry 2 }
+
+atNetAddress OBJECT-TYPE
+ SYNTAX NetworkAddress
+ ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "The NetworkAddress (e.g., the IP address)
+ corresponding to the media-dependent `physical'
+ address."
+ ::= { atEntry 3 }
+
+
+-- the IP group
+
+-- Implementation of the IP group is mandatory for all
+-- systems.
+
+ipForwarding OBJECT-TYPE
+ SYNTAX INTEGER {
+ forwarding(1), -- acting as a gateway
+ not-forwarding(2) -- NOT acting as a gateway
+ }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The indication of whether this entity is acting
+ as an IP gateway in respect to the forwarding of
+ datagrams received by, but not addressed to, this
+ entity. IP gateways forward datagrams. IP hosts
+ do not (except those source-routed via the host).
+
+ Note that for some managed nodes, this object may
+ take on only a subset of the values possible.
+ Accordingly, it is appropriate for an agent to
+ return a `badValue' response if a management
+ station attempts to change this object to an
+ inappropriate value."
+ ::= { ip 1 }
+
+ipDefaultTTL OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The default value inserted into the Time-To-Live
+ field of the IP header of datagrams originated at
+ this entity, whenever a TTL value is not supplied
+ by the transport layer protocol."
+ ::= { ip 2 }
+
+ipInReceives OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of input datagrams received from
+ interfaces, including those received in error."
+ ::= { ip 3 }
+
+ipInHdrErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of input datagrams discarded due to
+ errors in their IP headers, including bad
+ checksums, version number mismatch, other format
+ errors, time-to-live exceeded, errors discovered
+ in processing their IP options, etc."
+ ::= { ip 4 }
+
+ipInAddrErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of input datagrams discarded because
+ the IP address in their IP header's destination
+ field was not a valid address to be received at
+ this entity. This count includes invalid
+ addresses (e.g., 0.0.0.0) and addresses of
+ unsupported Classes (e.g., Class E). For entities
+ which are not IP Gateways and therefore do not
+ forward datagrams, this counter includes datagrams
+ discarded because the destination address was not
+ a local address."
+ ::= { ip 5 }
+
+ipForwDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of input datagrams for which this
+ entity was not their final IP destination, as a
+ result of which an attempt was made to find a
+ route to forward them to that final destination.
+ In entities which do not act as IP Gateways, this
+ counter will include only those packets which were
+ Source-Routed via this entity, and the Source-
+ Route option processing was successful."
+ ::= { ip 6 }
+
+ipInUnknownProtos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of locally-addressed datagrams
+ received successfully but discarded because of an
+ unknown or unsupported protocol."
+ ::= { ip 7 }
+
+ipInDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of input IP datagrams for which no
+ problems were encountered to prevent their
+ continued processing, but which were discarded
+ (e.g., for lack of buffer space). Note that this
+ counter does not include any datagrams discarded
+ while awaiting re-assembly."
+ ::= { ip 8 }
+
+ipInDelivers OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of input datagrams successfully
+ delivered to IP user-protocols (including ICMP)."
+ ::= { ip 9 }
+
+ipOutRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of IP datagrams which local IP
+ user-protocols (including ICMP) supplied to IP in
+ requests for transmission. Note that this counter
+ does not include any datagrams counted in
+ ipForwDatagrams."
+ ::= { ip 10 }
+
+ipOutDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of output IP datagrams for which no
+ problem was encountered to prevent their
+ transmission to their destination, but which were
+ discarded (e.g., for lack of buffer space). Note
+ that this counter would include datagrams counted
+ in ipForwDatagrams if any such packets met this
+ (discretionary) discard criterion."
+ ::= { ip 11 }
+
+ipOutNoRoutes OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP datagrams discarded because no
+ route could be found to transmit them to their
+ destination. Note that this counter includes any
+ packets counted in ipForwDatagrams which meet this
+ `no-route' criterion. Note that this includes any
+ datagarms which a host cannot route because all of
+ its default gateways are down."
+ ::= { ip 12 }
+
+ipReasmTimeout OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The maximum number of seconds which received
+ fragments are held while they are awaiting
+ reassembly at this entity."
+ ::= { ip 13 }
+
+ipReasmReqds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP fragments received which needed
+ to be reassembled at this entity."
+ ::= { ip 14 }
+
+ipReasmOKs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP datagrams successfully re-
+ assembled."
+ ::= { ip 15 }
+
+ipReasmFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of failures detected by the IP re-
+ assembly algorithm (for whatever reason: timed
+ out, errors, etc). Note that this is not
+ necessarily a count of discarded IP fragments
+ since some algorithms (notably the algorithm in
+ RFC 815) can lose track of the number of fragments
+ by combining them as they are received."
+ ::= { ip 16 }
+
+ipFragOKs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP datagrams that have been
+ successfully fragmented at this entity."
+ ::= { ip 17 }
+
+ipFragFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP datagrams that have been
+ discarded because they needed to be fragmented at
+ this entity but could not be, e.g., because their
+ Don't Fragment flag was set."
+ ::= { ip 18 }
+
+ipFragCreates OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of IP datagram fragments that have
+ been generated as a result of fragmentation at
+ this entity."
+ ::= { ip 19 }
+
+-- the IP address table
+
+-- The IP address table contains this entity's IP addressing
+-- information.
+
+ipAddrTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpAddrEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "The table of addressing information relevant to
+ this entity's IP addresses."
+ ::= { ip 20 }
+
+ipAddrEntry OBJECT-TYPE
+ SYNTAX IpAddrEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "The addressing information for one of this
+ entity's IP addresses."
+ INDEX { ipAdEntAddr }
+ ::= { ipAddrTable 1 }
+
+IpAddrEntry ::=
+ SEQUENCE {
+ ipAdEntAddr
+ IpAddress,
+ ipAdEntIfIndex
+ INTEGER,
+ ipAdEntNetMask
+ IpAddress,
+ ipAdEntBcastAddr
+ INTEGER,
+ ipAdEntReasmMaxSize
+ INTEGER (0..65535)
+ }
+
+ipAdEntAddr OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The IP address to which this entry's addressing
+ information pertains."
+ ::= { ipAddrEntry 1 }
+
+ipAdEntIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The index value which uniquely identifies the
+ interface to which this entry is applicable. The
+ interface identified by a particular value of this
+ index is the same interface as identified by the
+ same value of ifIndex."
+ ::= { ipAddrEntry 2 }
+
+ipAdEntNetMask OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The subnet mask associated with the IP address of
+ this entry. The value of the mask is an IP
+ address with all the network bits set to 1 and all
+ the hosts bits set to 0."
+ ::= { ipAddrEntry 3 }
+
+ipAdEntBcastAddr OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The value of the least-significant bit in the IP
+ broadcast address used for sending datagrams on
+ the (logical) interface associated with the IP
+ address of this entry. For example, when the
+ Internet standard all-ones broadcast address is
+ used, the value will be 1. This value applies to
+ both the subnet and network broadcasts addresses
+ used by the entity on this (logical) interface."
+ ::= { ipAddrEntry 4 }
+
+ipAdEntReasmMaxSize OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The size of the largest IP datagram which this
+ entity can re-assemble from incoming IP fragmented
+ datagrams received on this interface."
+ ::= { ipAddrEntry 5 }
+
+-- the IP routing table
+
+-- The IP routing table contains an entry for each route
+-- presently known to this entity.
+
+ipRouteTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpRouteEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "This entity's IP Routing table."
+ ::= { ip 21 }
+
+ipRouteEntry OBJECT-TYPE
+ SYNTAX IpRouteEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "A route to a particular destination."
+ INDEX { ipRouteDest }
+ ::= { ipRouteTable 1 }
+
+IpRouteEntry ::=
+ SEQUENCE {
+ ipRouteDest
+ IpAddress,
+ ipRouteIfIndex
+ INTEGER,
+ ipRouteMetric1
+ INTEGER,
+ ipRouteMetric2
+ INTEGER,
+ ipRouteMetric3
+ INTEGER,
+ ipRouteMetric4
+ INTEGER,
+ ipRouteNextHop
+ IpAddress,
+ ipRouteType
+ INTEGER,
+ ipRouteProto
+ INTEGER,
+ ipRouteAge
+ INTEGER,
+ ipRouteMask
+ IpAddress,
+ ipRouteMetric5
+ INTEGER,
+ ipRouteInfo
+ OBJECT IDENTIFIER
+ }
+
+ipRouteDest OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The destination IP address of this route. An
+ entry with a value of 0.0.0.0 is considered a
+ default route. Multiple routes to a single
+ destination can appear in the table, but access to
+ such multiple entries is dependent on the table-
+ access mechanisms defined by the network
+ management protocol in use."
+ ::= { ipRouteEntry 1 }
+
+ipRouteIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The index value which uniquely identifies the
+ local interface through which the next hop of this
+ route should be reached. The interface identified
+ by a particular value of this index is the same
+ interface as identified by the same value of
+ ifIndex."
+ ::= { ipRouteEntry 2 }
+
+ipRouteMetric1 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The primary routing metric for this route. The
+ semantics of this metric are determined by the
+ routing-protocol specified in the route's
+ ipRouteProto value. If this metric is not used,
+ its value should be set to -1."
+ ::= { ipRouteEntry 3 }
+
+ipRouteMetric2 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "An alternate routing metric for this route. The
+ semantics of this metric are determined by the
+ routing-protocol specified in the route's
+ ipRouteProto value. If this metric is not used,
+ its value should be set to -1."
+ ::= { ipRouteEntry 4 }
+
+ipRouteMetric3 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "An alternate routing metric for this route. The
+ semantics of this metric are determined by the
+ routing-protocol specified in the route's
+ ipRouteProto value. If this metric is not used,
+ its value should be set to -1."
+ ::= { ipRouteEntry 5 }
+
+ipRouteMetric4 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "An alternate routing metric for this route. The
+ semantics of this metric are determined by the
+ routing-protocol specified in the route's
+ ipRouteProto value. If this metric is not used,
+ its value should be set to -1."
+ ::= { ipRouteEntry 6 }
+
+ipRouteNextHop OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The IP address of the next hop of this route.
+ (In the case of a route bound to an interface
+ which is realized via a broadcast media, the value
+ of this field is the agent's IP address on that
+ interface.)"
+ ::= { ipRouteEntry 7 }
+
+ipRouteType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ invalid(2), -- an invalidated route
+
+ -- route to directly
+ direct(3), -- connected (sub-)network
+
+ -- route to a non-local
+ indirect(4) -- host/network/sub-network
+ }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The type of route. Note that the values
+ direct(3) and indirect(4) refer to the notion of
+ direct and indirect routing in the IP
+ architecture.
+
+ Setting this object to the value invalid(2) has
+ the effect of invalidating the corresponding entry
+ in the ipRouteTable object. That is, it
+ effectively dissasociates the destination
+ identified with said entry from the route
+ identified with said entry. It is an
+ implementation-specific matter as to whether the
+ agent removes an invalidated entry from the table.
+ Accordingly, management stations must be prepared
+ to receive tabular information from agents that
+ corresponds to entries not currently in use.
+ Proper interpretation of such entries requires
+ examination of the relevant ipRouteType object."
+ ::= { ipRouteEntry 8 }
+
+ipRouteProto OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ -- non-protocol information,
+ -- e.g., manually configured
+ local(2), -- entries
+
+ -- set via a network
+ netmgmt(3), -- management protocol
+
+ -- obtained via ICMP,
+ icmp(4), -- e.g., Redirect
+
+ -- the remaining values are
+ -- all gateway routing
+ -- protocols
+ egp(5),
+ ggp(6),
+ hello(7),
+ rip(8),
+ is-is(9),
+ es-is(10),
+ ciscoIgrp(11),
+ bbnSpfIgp(12),
+ ospf(13),
+ bgp(14)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The routing mechanism via which this route was
+ learned. Inclusion of values for gateway routing
+ protocols is not intended to imply that hosts
+ should support those protocols."
+ ::= { ipRouteEntry 9 }
+
+ipRouteAge OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The number of seconds since this route was last
+ updated or otherwise determined to be correct.
+ Note that no semantics of `too old' can be implied
+ except through knowledge of the routing protocol
+ by which the route was learned."
+ ::= { ipRouteEntry 10 }
+
+ipRouteMask OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "Indicate the mask to be logical-ANDed with the
+ destination address before being compared to the
+ value in the ipRouteDest field. For those systems
+ that do not support arbitrary subnet masks, an
+ agent constructs the value of the ipRouteMask by
+ determining whether the value of the correspondent
+ ipRouteDest field belong to a class-A, B, or C
+ network, and then using one of:
+
+ mask network
+ 255.0.0.0 class-A
+ 255.255.0.0 class-B
+ 255.255.255.0 class-C
+ If the value of the ipRouteDest is 0.0.0.0 (a
+ default route), then the mask value is also
+ 0.0.0.0. It should be noted that all IP routing
+ subsystems implicitly use this mechanism."
+ ::= { ipRouteEntry 11 }
+
+ipRouteMetric5 OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "An alternate routing metric for this route. The
+ semantics of this metric are determined by the
+ routing-protocol specified in the route's
+ ipRouteProto value. If this metric is not used,
+ its value should be set to -1."
+ ::= { ipRouteEntry 12 }
+
+ipRouteInfo OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "A reference to MIB definitions specific to the
+ particular routing protocol which is responsible
+ for this route, as determined by the value
+ specified in the route's ipRouteProto value. If
+ this information is not present, its value should
+ be set to the OBJECT IDENTIFIER { 0 0 }, which is
+ a syntatically valid object identifier, and any
+ conformant implementation of ASN.1 and BER must be
+ able to generate and recognize this value."
+ ::= { ipRouteEntry 13 }
+
+
+-- the IP Address Translation table
+
+-- The IP address translation table contain the IpAddress to
+-- `physical' address equivalences. Some interfaces do not
+-- use translation tables for determining address
+-- equivalences (e.g., DDN-X.25 has an algorithmic method);
+-- if all interfaces are of this type, then the Address
+-- Translation table is empty, i.e., has zero entries.
+
+ipNetToMediaTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF IpNetToMediaEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "The IP Address Translation table used for mapping
+ from IP addresses to physical addresses."
+ ::= { ip 22 }
+
+ipNetToMediaEntry OBJECT-TYPE
+ SYNTAX IpNetToMediaEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "Each entry contains one IpAddress to `physical'
+ address equivalence."
+ INDEX { ipNetToMediaIfIndex,
+ ipNetToMediaNetAddress }
+ ::= { ipNetToMediaTable 1 }
+
+IpNetToMediaEntry ::=
+ SEQUENCE {
+ ipNetToMediaIfIndex
+ INTEGER,
+ ipNetToMediaPhysAddress
+ PhysAddress,
+ ipNetToMediaNetAddress
+ IpAddress,
+ ipNetToMediaType
+ INTEGER
+ }
+
+ipNetToMediaIfIndex OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The interface on which this entry's equivalence
+ is effective. The interface identified by a
+ particular value of this index is the same
+ interface as identified by the same value of
+ ifIndex."
+ ::= { ipNetToMediaEntry 1 }
+
+ipNetToMediaPhysAddress OBJECT-TYPE
+ SYNTAX PhysAddress
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The media-dependent `physical' address."
+ ::= { ipNetToMediaEntry 2 }
+
+ipNetToMediaNetAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The IpAddress corresponding to the media-
+ dependent `physical' address."
+ ::= { ipNetToMediaEntry 3 }
+
+ipNetToMediaType OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ invalid(2), -- an invalidated mapping
+ dynamic(3),
+ static(4)
+ }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The type of mapping.
+
+ Setting this object to the value invalid(2) has
+ the effect of invalidating the corresponding entry
+ in the ipNetToMediaTable. That is, it effectively
+ dissasociates the interface identified with said
+ entry from the mapping identified with said entry.
+ It is an implementation-specific matter as to
+ whether the agent removes an invalidated entry
+ from the table. Accordingly, management stations
+ must be prepared to receive tabular information
+ from agents that corresponds to entries not
+ currently in use. Proper interpretation of such
+ entries requires examination of the relevant
+ ipNetToMediaType object."
+ ::= { ipNetToMediaEntry 4 }
+
+
+-- additional IP objects
+
+ipRoutingDiscards OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of routing entries which were chosen
+ to be discarded even though they are valid. One
+ possible reason for discarding such an entry could
+ be to free-up buffer space for other routing
+ entries."
+ ::= { ip 23 }
+
+
+-- the ICMP group
+
+-- Implementation of the ICMP group is mandatory for all
+-- systems.
+
+icmpInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of ICMP messages which the
+ entity received. Note that this counter includes
+ all those counted by icmpInErrors."
+ ::= { icmp 1 }
+
+icmpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP messages which the entity
+ received but determined as having ICMP-specific
+ errors (bad ICMP checksums, bad length, etc.)."
+ ::= { icmp 2 }
+
+icmpInDestUnreachs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Destination Unreachable
+ messages received."
+ ::= { icmp 3 }
+
+icmpInTimeExcds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Time Exceeded messages
+ received."
+ ::= { icmp 4 }
+
+icmpInParmProbs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Parameter Problem messages
+ received."
+ ::= { icmp 5 }
+
+icmpInSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Source Quench messages
+ received."
+ ::= { icmp 6 }
+
+icmpInRedirects OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Redirect messages received."
+ ::= { icmp 7 }
+
+icmpInEchos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Echo (request) messages
+ received."
+ ::= { icmp 8 }
+
+icmpInEchoReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Echo Reply messages received."
+ ::= { icmp 9 }
+
+icmpInTimestamps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Timestamp (request) messages
+ received."
+ ::= { icmp 10 }
+
+icmpInTimestampReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Timestamp Reply messages
+ received."
+ ::= { icmp 11 }
+
+icmpInAddrMasks OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Address Mask Request messages
+ received."
+ ::= { icmp 12 }
+
+icmpInAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Address Mask Reply messages
+ received."
+ ::= { icmp 13 }
+
+icmpOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of ICMP messages which this
+ entity attempted to send. Note that this counter
+ includes all those counted by icmpOutErrors."
+ ::= { icmp 14 }
+
+icmpOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP messages which this entity did
+ not send due to problems discovered within ICMP
+ such as a lack of buffers. This value should not
+ include errors discovered outside the ICMP layer
+ such as the inability of IP to route the resultant
+ datagram. In some implementations there may be no
+ types of error which contribute to this counter's
+ value."
+ ::= { icmp 15 }
+
+icmpOutDestUnreachs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Destination Unreachable
+ messages sent."
+ ::= { icmp 16 }
+
+icmpOutTimeExcds OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Time Exceeded messages sent."
+ ::= { icmp 17 }
+
+icmpOutParmProbs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Parameter Problem messages
+ sent."
+ ::= { icmp 18 }
+
+icmpOutSrcQuenchs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Source Quench messages sent."
+ ::= { icmp 19 }
+
+icmpOutRedirects OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Redirect messages sent. For a
+ host, this object will always be zero, since hosts
+ do not send redirects."
+ ::= { icmp 20 }
+
+icmpOutEchos OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Echo (request) messages sent."
+ ::= { icmp 21 }
+
+icmpOutEchoReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Echo Reply messages sent."
+ ::= { icmp 22 }
+
+icmpOutTimestamps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Timestamp (request) messages
+ sent."
+ ::= { icmp 23 }
+
+icmpOutTimestampReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Timestamp Reply messages
+ sent."
+ ::= { icmp 24 }
+
+icmpOutAddrMasks OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Address Mask Request messages
+ sent."
+ ::= { icmp 25 }
+
+icmpOutAddrMaskReps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of ICMP Address Mask Reply messages
+ sent."
+ ::= { icmp 26 }
+
+
+-- the TCP group
+
+-- Implementation of the TCP group is mandatory for all
+-- systems that implement the TCP.
+
+-- Note that instances of object types that represent
+-- information about a particular TCP connection are
+-- transient; they persist only as long as the connection
+-- in question.
+
+tcpRtoAlgorithm OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+
+ constant(2), -- a constant rto
+ rsre(3), -- MIL-STD-1778, Appendix B
+ vanj(4) -- Van Jacobson's algorithm [10]
+ }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The algorithm used to determine the timeout value
+ used for retransmitting unacknowledged octets."
+ ::= { tcp 1 }
+
+tcpRtoMin OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The minimum value permitted by a TCP
+ implementation for the retransmission timeout,
+ measured in milliseconds. More refined semantics
+ for objects of this type depend upon the algorithm
+ used to determine the retransmission timeout. In
+ particular, when the timeout algorithm is rsre(3),
+ an object of this type has the semantics of the
+ LBOUND quantity described in RFC 793."
+ ::= { tcp 2 }
+
+
+tcpRtoMax OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The maximum value permitted by a TCP
+ implementation for the retransmission timeout,
+ measured in milliseconds. More refined semantics
+ for objects of this type depend upon the algorithm
+ used to determine the retransmission timeout. In
+ particular, when the timeout algorithm is rsre(3),
+ an object of this type has the semantics of the
+ UBOUND quantity described in RFC 793."
+ ::= { tcp 3 }
+
+tcpMaxConn OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The limit on the total number of TCP connections
+ the entity can support. In entities where the
+ maximum number of connections is dynamic, this
+ object should contain the value -1."
+ ::= { tcp 4 }
+
+tcpActiveOpens OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of times TCP connections have made a
+ direct transition to the SYN-SENT state from the
+ CLOSED state."
+ ::= { tcp 5 }
+
+tcpPassiveOpens OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of times TCP connections have made a
+ direct transition to the SYN-RCVD state from the
+ LISTEN state."
+ ::= { tcp 6 }
+
+tcpAttemptFails OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of times TCP connections have made a
+ direct transition to the CLOSED state from either
+ the SYN-SENT state or the SYN-RCVD state, plus the
+ number of times TCP connections have made a direct
+ transition to the LISTEN state from the SYN-RCVD
+ state."
+ ::= { tcp 7 }
+
+tcpEstabResets OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of times TCP connections have made a
+ direct transition to the CLOSED state from either
+ the ESTABLISHED state or the CLOSE-WAIT state."
+ ::= { tcp 8 }
+
+tcpCurrEstab OBJECT-TYPE
+ SYNTAX Gauge
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of TCP connections for which the
+ current state is either ESTABLISHED or CLOSE-
+ WAIT."
+ ::= { tcp 9 }
+
+tcpInSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of segments received, including
+ those received in error. This count includes
+ segments received on currently established
+ connections."
+ ::= { tcp 10 }
+
+tcpOutSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of segments sent, including
+ those on current connections but excluding those
+ containing only retransmitted octets."
+ ::= { tcp 11 }
+
+tcpRetransSegs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of segments retransmitted - that
+ is, the number of TCP segments transmitted
+ containing one or more previously transmitted
+ octets."
+ ::= { tcp 12 }
+
+
+-- the TCP Connection table
+
+-- The TCP connection table contains information about this
+-- entity's existing TCP connections.
+
+tcpConnTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF TcpConnEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "A table containing TCP connection-specific
+ information."
+ ::= { tcp 13 }
+
+tcpConnEntry OBJECT-TYPE
+ SYNTAX TcpConnEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "Information about a particular current TCP
+ connection. An object of this type is transient,
+ in that it ceases to exist when (or soon after)
+ the connection makes the transition to the CLOSED
+ state."
+ INDEX { tcpConnLocalAddress,
+ tcpConnLocalPort,
+ tcpConnRemAddress,
+ tcpConnRemPort }
+ ::= { tcpConnTable 1 }
+
+TcpConnEntry ::=
+ SEQUENCE {
+ tcpConnState
+ INTEGER,
+ tcpConnLocalAddress
+ IpAddress,
+ tcpConnLocalPort
+ INTEGER (0..65535),
+ tcpConnRemAddress
+ IpAddress,
+ tcpConnRemPort
+ INTEGER (0..65535)
+ }
+
+tcpConnState OBJECT-TYPE
+ SYNTAX INTEGER {
+ closed(1),
+ listen(2),
+ synSent(3),
+ synReceived(4),
+ established(5),
+ finWait1(6),
+ finWait2(7),
+ closeWait(8),
+ lastAck(9),
+ closing(10),
+ timeWait(11),
+ deleteTCB(12)
+ }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "The state of this TCP connection.
+
+ The only value which may be set by a management
+ station is deleteTCB(12). Accordingly, it is
+ appropriate for an agent to return a `badValue'
+ response if a management station attempts to set
+ this object to any other value.
+
+ If a management station sets this object to the
+ value deleteTCB(12), then this has the effect of
+ deleting the TCB (as defined in RFC 793) of the
+ corresponding connection on the managed node,
+ resulting in immediate termination of the
+ connection.
+
+ As an implementation-specific option, a RST
+ segment may be sent from the managed node to the
+ other TCP endpoint (note however that RST segments
+ are not sent reliably)."
+ ::= { tcpConnEntry 1 }
+
+tcpConnLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The local IP address for this TCP connection. In
+ the case of a connection in the listen state which
+ is willing to accept connections for any IP
+ interface associated with the node, the value
+ 0.0.0.0 is used."
+ ::= { tcpConnEntry 2 }
+
+tcpConnLocalPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The local port number for this TCP connection."
+ ::= { tcpConnEntry 3 }
+
+tcpConnRemAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The remote IP address for this TCP connection."
+ ::= { tcpConnEntry 4 }
+
+tcpConnRemPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The remote port number for this TCP connection."
+ ::= { tcpConnEntry 5 }
+
+
+-- additional TCP objects
+
+tcpInErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of segments received in error
+ (e.g., bad TCP checksums)."
+ ::= { tcp 14 }
+
+tcpOutRsts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of TCP segments sent containing the
+ RST flag."
+ ::= { tcp 15 }
+
+
+-- the UDP group
+
+-- Implementation of the UDP group is mandatory for all
+-- systems which implement the UDP.
+
+udpInDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of UDP datagrams delivered to
+ UDP users."
+ ::= { udp 1 }
+
+udpNoPorts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of received UDP datagrams for
+ which there was no application at the destination
+ port."
+ ::= { udp 2 }
+
+udpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of received UDP datagrams that could
+ not be delivered for reasons other than the lack
+ of an application at the destination port."
+ ::= { udp 3 }
+
+udpOutDatagrams OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of UDP datagrams sent from this
+ entity."
+ ::= { udp 4 }
+
+
+-- the UDP Listener table
+
+-- The UDP listener table contains information about this
+-- entity's UDP end-points on which a local application is
+-- currently accepting datagrams.
+
+udpTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF UdpEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "A table containing UDP listener information."
+ ::= { udp 5 }
+
+udpEntry OBJECT-TYPE
+ SYNTAX UdpEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "Information about a particular current UDP
+ listener."
+ INDEX { udpLocalAddress, udpLocalPort }
+ ::= { udpTable 1 }
+
+UdpEntry ::=
+ SEQUENCE {
+ udpLocalAddress
+ IpAddress,
+ udpLocalPort
+ INTEGER (0..65535)
+ }
+
+udpLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The local IP address for this UDP listener. In
+ the case of a UDP listener which is willing to
+ accept datagrams for any IP interface associated
+ with the node, the value 0.0.0.0 is used."
+ ::= { udpEntry 1 }
+
+udpLocalPort OBJECT-TYPE
+ SYNTAX INTEGER (0..65535)
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The local port number for this UDP listener."
+ ::= { udpEntry 2 }
+
+
+-- the EGP group
+
+-- Implementation of the EGP group is mandatory for all
+-- systems which implement the EGP.
+
+egpInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP messages received without
+ error."
+ ::= { egp 1 }
+
+egpInErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP messages received that proved
+ to be in error."
+ ::= { egp 2 }
+
+egpOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of locally generated EGP
+ messages."
+ ::= { egp 3 }
+
+egpOutErrors OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of locally generated EGP messages not
+ sent due to resource limitations within an EGP
+ entity."
+ ::= { egp 4 }
+
+
+-- the EGP Neighbor table
+
+-- The EGP neighbor table contains information about this
+-- entity's EGP neighbors.
+
+egpNeighTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF EgpNeighEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "The EGP neighbor table."
+ ::= { egp 5 }
+
+egpNeighEntry OBJECT-TYPE
+ SYNTAX EgpNeighEntry
+ ACCESS not-accessible
+ STATUS mandatory
+ DESCRIPTION
+ "Information about this entity's relationship with
+ a particular EGP neighbor."
+ INDEX { egpNeighAddr }
+ ::= { egpNeighTable 1 }
+
+EgpNeighEntry ::=
+ SEQUENCE {
+ egpNeighState
+ INTEGER,
+ egpNeighAddr
+ IpAddress,
+ egpNeighAs
+ INTEGER,
+ egpNeighInMsgs
+ Counter,
+ egpNeighInErrs
+ Counter,
+ egpNeighOutMsgs
+ Counter,
+ egpNeighOutErrs
+ Counter,
+ egpNeighInErrMsgs
+ Counter,
+ egpNeighOutErrMsgs
+ Counter,
+ egpNeighStateUps
+ Counter,
+ egpNeighStateDowns
+ Counter,
+ egpNeighIntervalHello
+ INTEGER,
+ egpNeighIntervalPoll
+ INTEGER,
+ egpNeighMode
+ INTEGER,
+ egpNeighEventTrigger
+ INTEGER
+ }
+
+egpNeighState OBJECT-TYPE
+ SYNTAX INTEGER {
+ idle(1),
+ acquisition(2),
+ down(3),
+ up(4),
+ cease(5)
+ }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The EGP state of the local system with respect to
+ this entry's EGP neighbor. Each EGP state is
+ represented by a value that is one greater than
+ the numerical value associated with said state in
+ RFC 904."
+ ::= { egpNeighEntry 1 }
+
+egpNeighAddr OBJECT-TYPE
+ SYNTAX IpAddress
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The IP address of this entry's EGP neighbor."
+ ::= { egpNeighEntry 2 }
+
+egpNeighAs OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The autonomous system of this EGP peer. Zero
+ should be specified if the autonomous system
+ number of the neighbor is not yet known."
+ ::= { egpNeighEntry 3 }
+
+egpNeighInMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP messages received without error
+ from this EGP peer."
+ ::= { egpNeighEntry 4 }
+
+egpNeighInErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP messages received from this EGP
+ peer that proved to be in error (e.g., bad EGP
+ checksum)."
+ ::= { egpNeighEntry 5 }
+
+egpNeighOutMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of locally generated EGP messages to
+ this EGP peer."
+ ::= { egpNeighEntry 6 }
+
+egpNeighOutErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of locally generated EGP messages not
+ sent to this EGP peer due to resource limitations
+ within an EGP entity."
+ ::= { egpNeighEntry 7 }
+
+egpNeighInErrMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP-defined error messages received
+ from this EGP peer."
+ ::= { egpNeighEntry 8 }
+
+egpNeighOutErrMsgs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP-defined error messages sent to
+ this EGP peer."
+ ::= { egpNeighEntry 9 }
+
+egpNeighStateUps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP state transitions to the UP
+ state with this EGP peer."
+ ::= { egpNeighEntry 10 }
+
+egpNeighStateDowns OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The number of EGP state transitions from the UP
+ state to any other state with this EGP peer."
+ ::= { egpNeighEntry 11 }
+
+egpNeighIntervalHello OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The interval between EGP Hello command
+ retransmissions (in hundredths of a second). This
+ represents the t1 timer as defined in RFC 904."
+ ::= { egpNeighEntry 12 }
+
+egpNeighIntervalPoll OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The interval between EGP poll command
+ retransmissions (in hundredths of a second). This
+ represents the t3 timer as defined in RFC 904."
+ ::= { egpNeighEntry 13 }
+
+egpNeighMode OBJECT-TYPE
+ SYNTAX INTEGER { active(1), passive(2) }
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The polling mode of this EGP entity, either
+ passive or active."
+ ::= { egpNeighEntry 14 }
+
+egpNeighEventTrigger OBJECT-TYPE
+ SYNTAX INTEGER { start(1), stop(2) }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "A control variable used to trigger operator-
+ initiated Start and Stop events. When read, this
+ variable always returns the most recent value that
+ egpNeighEventTrigger was set to. If it has not
+ been set since the last initialization of the
+ network management subsystem on the node, it
+ returns a value of `stop'.
+
+ When set, this variable causes a Start or Stop
+ event on the specified neighbor, as specified on
+ pages 8-10 of RFC 904. Briefly, a Start event
+ causes an Idle peer to begin neighbor acquisition
+ and a non-Idle peer to reinitiate neighbor
+ acquisition. A stop event causes a non-Idle peer
+ to return to the Idle state until a Start event
+ occurs, either via egpNeighEventTrigger or
+ otherwise."
+ ::= { egpNeighEntry 15 }
+
+
+-- additional EGP objects
+
+egpAs OBJECT-TYPE
+ SYNTAX INTEGER
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The autonomous system number of this EGP entity."
+ ::= { egp 6 }
+
+-- the Transmission group
+
+-- Based on the transmission media underlying each interface
+-- on a system, the corresponding portion of the Transmission
+-- group is mandatory for that system.
+
+-- When Internet-standard definitions for managing
+-- transmission media are defined, the transmission group is
+-- used to provide a prefix for the names of those objects.
+
+-- Typically, such definitions reside in the experimental
+-- portion of the MIB until they are "proven", then as a
+-- part of the Internet standardization process, the
+-- definitions are accordingly elevated and a new object
+-- identifier, under the transmission group is defined. By
+-- convention, the name assigned is:
+--
+-- type OBJECT IDENTIFIER ::= { transmission number }
+--
+-- where "type" is the symbolic value used for the media in
+-- the ifType column of the ifTable object, and "number" is
+-- the actual integer value corresponding to the symbol.
+
+
+-- the SNMP group
+
+-- Implementation of the SNMP group is mandatory for all
+-- systems which support an SNMP protocol entity. Some of
+-- the objects defined below will be zero-valued in those
+-- SNMP implementations that are optimized to support only
+-- those functions specific to either a management agent or
+-- a management station. In particular, it should be
+-- observed that the objects below refer to an SNMP entity,
+-- and there may be several SNMP entities residing on a
+-- managed node (e.g., if the node is hosting acting as
+-- a management station).
+
+snmpInPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of Messages delivered to the
+ SNMP entity from the transport service."
+ ::= { snmp 1 }
+
+snmpOutPkts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Messages which were
+ passed from the SNMP protocol entity to the
+ transport service."
+ ::= { snmp 2 }
+
+snmpInBadVersions OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Messages which were
+ delivered to the SNMP protocol entity and were for
+ an unsupported SNMP version."
+ ::= { snmp 3 }
+
+snmpInBadCommunityNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Messages delivered to
+ the SNMP protocol entity which used a SNMP
+ community name not known to said entity."
+ ::= { snmp 4 }
+
+snmpInBadCommunityUses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Messages delivered to
+ the SNMP protocol entity which represented an SNMP
+ operation which was not allowed by the SNMP
+ community named in the Message."
+ ::= { snmp 5 }
+
+snmpInASNParseErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of ASN.1 or BER errors
+ encountered by the SNMP protocol entity when
+ decoding received SNMP Messages."
+ ::= { snmp 6 }
+
+-- { snmp 7 } is not used
+
+snmpInTooBigs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field is
+ `tooBig'."
+ ::= { snmp 8 }
+
+snmpInNoSuchNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field is
+ `noSuchName'."
+ ::= { snmp 9 }
+
+snmpInBadValues OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field is
+ `badValue'."
+ ::= { snmp 10 }
+
+snmpInReadOnlys OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number valid SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field is
+ `readOnly'. It should be noted that it is a
+ protocol error to generate an SNMP PDU which
+ contains the value `readOnly' in the error-status
+ field, as such this object is provided as a means
+ of detecting incorrect implementations of the
+ SNMP."
+ ::= { snmp 11 }
+
+snmpInGenErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field is
+ `genErr'."
+ ::= { snmp 12 }
+
+snmpInTotalReqVars OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of MIB objects which have been
+ retrieved successfully by the SNMP protocol entity
+ as the result of receiving valid SNMP Get-Request
+ and Get-Next PDUs."
+ ::= { snmp 13 }
+
+snmpInTotalSetVars OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of MIB objects which have been
+ altered successfully by the SNMP protocol entity
+ as the result of receiving valid SNMP Set-Request
+ PDUs."
+ ::= { snmp 14 }
+
+snmpInGetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Request PDUs which
+ have been accepted and processed by the SNMP
+ protocol entity."
+ ::= { snmp 15 }
+
+snmpInGetNexts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Next PDUs which have
+ been accepted and processed by the SNMP protocol
+ entity."
+ ::= { snmp 16 }
+
+snmpInSetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Set-Request PDUs which
+ have been accepted and processed by the SNMP
+ protocol entity."
+ ::= { snmp 17 }
+
+snmpInGetResponses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Response PDUs which
+ have been accepted and processed by the SNMP
+ protocol entity."
+ ::= { snmp 18 }
+
+snmpInTraps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Trap PDUs which have
+ been accepted and processed by the SNMP protocol
+ entity."
+ ::= { snmp 19 }
+
+snmpOutTooBigs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ generated by the SNMP protocol entity and for
+ which the value of the error-status field is
+ `tooBig.'"
+ ::= { snmp 20 }
+
+snmpOutNoSuchNames OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ generated by the SNMP protocol entity and for
+ which the value of the error-status is
+ `noSuchName'."
+ ::= { snmp 21 }
+
+snmpOutBadValues OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ generated by the SNMP protocol entity and for
+ which the value of the error-status field is
+ `badValue'."
+ ::= { snmp 22 }
+
+-- { snmp 23 } is not used
+
+snmpOutGenErrs OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ generated by the SNMP protocol entity and for
+ which the value of the error-status field is
+ `genErr'."
+ ::= { snmp 24 }
+
+snmpOutGetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Request PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 25 }
+
+snmpOutGetNexts OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Next PDUs which have
+ been generated by the SNMP protocol entity."
+ ::= { snmp 26 }
+
+snmpOutSetRequests OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Set-Request PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 27 }
+
+snmpOutGetResponses OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Get-Response PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 28 }
+
+snmpOutTraps OBJECT-TYPE
+ SYNTAX Counter
+ ACCESS read-only
+ STATUS mandatory
+ DESCRIPTION
+ "The total number of SNMP Trap PDUs which have
+ been generated by the SNMP protocol entity."
+ ::= { snmp 29 }
+
+snmpEnableAuthenTraps OBJECT-TYPE
+ SYNTAX INTEGER { enabled(1), disabled(2) }
+ ACCESS read-write
+ STATUS mandatory
+ DESCRIPTION
+ "Indicates whether the SNMP agent process is
+ permitted to generate authentication-failure
+ traps. The value of this object overrides any
+ configuration information; as such, it provides a
+ means whereby all authentication-failure traps may
+ be disabled.
+
+ Note that it is strongly recommended that this
+ object be stored in non-volatile memory so that it
+ remains constant between re-initializations of the
+ network management system."
+ ::= { snmp 30 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-CONF b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-CONF
new file mode 100644
index 0000000..904dbbb
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-CONF
@@ -0,0 +1,318 @@
+SNMPv2-CONF DEFINITIONS ::= BEGIN
+
+IMPORTS ObjectName, NotificationName, ObjectSyntax
+ FROM SNMPv2-SMI;
+
+-- definitions for conformance groups
+
+OBJECT-GROUP MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ ObjectsPart
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ ObjectsPart ::=
+ "OBJECTS" "{" Objects "}"
+ Objects ::=
+ Object
+ | Objects "," Object
+ Object ::=
+ value(ObjectName)
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ -- a character string as defined in [2]
+ Text ::= value(IA5String)
+END
+
+-- more definitions for conformance groups
+
+NOTIFICATION-GROUP MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ NotificationsPart
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ NotificationsPart ::=
+ "NOTIFICATIONS" "{" Notifications "}"
+ Notifications ::=
+ Notification
+ | Notifications "," Notification
+ Notification ::=
+ value(NotificationName)
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ -- a character string as defined in [2]
+ Text ::= value(IA5String)
+END
+
+-- definitions for compliance statements
+
+MODULE-COMPLIANCE MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+ ModulePart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ ModulePart ::=
+ Modules
+ Modules ::=
+ Module
+ | Modules Module
+ Module ::=
+ -- name of module --
+ "MODULE" ModuleName
+ MandatoryPart
+ CompliancePart
+
+ ModuleName ::=
+ -- identifier must start with uppercase letter
+ identifier ModuleIdentifier
+ -- must not be empty unless contained
+ -- in MIB Module
+ | empty
+ ModuleIdentifier ::=
+ value(OBJECT IDENTIFIER)
+ | empty
+
+ MandatoryPart ::=
+ "MANDATORY-GROUPS" "{" Groups "}"
+ | empty
+
+ Groups ::=
+ Group
+ | Groups "," Group
+ Group ::=
+ value(OBJECT IDENTIFIER)
+
+ CompliancePart ::=
+ Compliances
+ | empty
+
+ Compliances ::=
+ Compliance
+ | Compliances Compliance
+ Compliance ::=
+ ComplianceGroup
+ | Object
+
+ ComplianceGroup ::=
+ "GROUP" value(OBJECT IDENTIFIER)
+ "DESCRIPTION" Text
+
+ Object ::=
+ "OBJECT" value(ObjectName)
+ SyntaxPart
+ WriteSyntaxPart
+ AccessPart
+ "DESCRIPTION" Text
+
+ -- must be a refinement for object's SYNTAX clause
+ SyntaxPart ::= "SYNTAX" Syntax
+ | empty
+
+ -- must be a refinement for object's SYNTAX clause
+ WriteSyntaxPart ::= "WRITE-SYNTAX" Syntax
+ | empty
+
+ Syntax ::= -- Must be one of the following:
+ -- a base type (or its refinement),
+ -- a textual convention (or its refinement), or
+ -- a BITS pseudo-type
+ type
+ | "BITS" "{" NamedBits "}"
+
+ NamedBits ::= NamedBit
+ | NamedBits "," NamedBit
+
+ NamedBit ::= identifier "(" number ")" -- number is nonnegative
+
+ AccessPart ::=
+ "MIN-ACCESS" Access
+ | empty
+ Access ::=
+ "not-accessible"
+ | "accessible-for-notify"
+ | "read-only"
+ | "read-write"
+ | "read-create"
+
+ -- a character string as defined in [2]
+ Text ::= value(IA5String)
+END
+
+-- definitions for capabilities statements
+
+AGENT-CAPABILITIES MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ "PRODUCT-RELEASE" Text
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+ ModulePart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ Status ::=
+ "current"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ ModulePart ::=
+ Modules
+ | empty
+ Modules ::=
+ Module
+ | Modules Module
+ Module ::=
+ -- name of module --
+ "SUPPORTS" ModuleName
+ "INCLUDES" "{" Groups "}"
+ VariationPart
+
+ ModuleName ::=
+ -- identifier must start with uppercase letter
+ identifier ModuleIdentifier
+ ModuleIdentifier ::=
+ value(OBJECT IDENTIFIER)
+ | empty
+
+ Groups ::=
+ Group
+ | Groups "," Group
+ Group ::=
+ value(OBJECT IDENTIFIER)
+
+ VariationPart ::=
+ Variations
+ | empty
+ Variations ::=
+ Variation
+ | Variations Variation
+
+ Variation ::=
+ ObjectVariation
+ | NotificationVariation
+
+ NotificationVariation ::=
+ "VARIATION" value(NotificationName)
+ AccessPart
+ "DESCRIPTION" Text
+
+ ObjectVariation ::=
+ "VARIATION" value(ObjectName)
+ SyntaxPart
+ WriteSyntaxPart
+ AccessPart
+ CreationPart
+ DefValPart
+ "DESCRIPTION" Text
+
+ -- must be a refinement for object's SYNTAX clause
+ SyntaxPart ::= "SYNTAX" Syntax
+ | empty
+
+ WriteSyntaxPart ::= "WRITE-SYNTAX" Syntax
+ | empty
+
+ Syntax ::= -- Must be one of the following:
+ -- a base type (or its refinement),
+ -- a textual convention (or its refinement), or
+ -- a BITS pseudo-type
+ type
+ | "BITS" "{" NamedBits "}"
+
+ NamedBits ::= NamedBit
+ | NamedBits "," NamedBit
+
+ NamedBit ::= identifier "(" number ")" -- number is nonnegative
+
+ AccessPart ::=
+ "ACCESS" Access
+ | empty
+
+ Access ::=
+ "not-implemented"
+ -- only "not-implemented" for notifications
+ | "accessible-for-notify"
+ | "read-only"
+ | "read-write"
+ | "read-create"
+ -- following is for backward-compatibility only
+ | "write-only"
+
+ CreationPart ::=
+ "CREATION-REQUIRES" "{" Cells "}"
+ | empty
+ Cells ::=
+ Cell
+ | Cells "," Cell
+ Cell ::=
+ value(ObjectName)
+
+ DefValPart ::= "DEFVAL" "{" Defvalue "}"
+ | empty
+
+ Defvalue ::= -- must be valid for the object's syntax
+ -- in this macro's SYNTAX clause, if present,
+ -- or if not, in object's OBJECT-TYPE macro
+ value(ObjectSyntax)
+ | "{" BitsValue "}"
+
+ BitsValue ::= BitNames
+ | empty
+
+ BitNames ::= BitName
+ | BitNames "," BitName
+
+ BitName ::= identifier
+
+ -- a character string as defined in [2]
+ Text ::= value(IA5String)
+END
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-MIB b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-MIB
new file mode 100644
index 0000000..9494e42
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-MIB
@@ -0,0 +1,903 @@
+SNMPv2-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
+ TimeTicks, Counter32, snmpModules, mib-2
+ FROM SNMPv2-SMI
+ DisplayString, TestAndIncr, TimeStamp
+
+
+
+ FROM SNMPv2-TC
+ MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
+ FROM SNMPv2-CONF;
+
+snmpMIB MODULE-IDENTITY
+ LAST-UPDATED "200210160000Z"
+ ORGANIZATION "IETF SNMPv3 Working Group"
+ CONTACT-INFO
+ "WG-EMail: snmpv3@lists.tislabs.com
+ Subscribe: snmpv3-request@lists.tislabs.com
+
+ Co-Chair: Russ Mundy
+ Network Associates Laboratories
+ postal: 15204 Omega Drive, Suite 300
+ Rockville, MD 20850-4601
+ USA
+ EMail: mundy@tislabs.com
+ phone: +1 301 947-7107
+
+ Co-Chair: David Harrington
+ Enterasys Networks
+ postal: 35 Industrial Way
+ P. O. Box 5005
+ Rochester, NH 03866-5005
+ USA
+ EMail: dbh@enterasys.com
+ phone: +1 603 337-2614
+
+ Editor: Randy Presuhn
+ BMC Software, Inc.
+ postal: 2141 North First Street
+ San Jose, CA 95131
+ USA
+ EMail: randy_presuhn@bmc.com
+ phone: +1 408 546-1006"
+ DESCRIPTION
+ "The MIB module for SNMP entities.
+
+ Copyright (C) The Internet Society (2002). This
+ version of this MIB module is part of RFC 3418;
+ see the RFC itself for full legal notices.
+ "
+ REVISION "200210160000Z"
+ DESCRIPTION
+ "This revision of this MIB module was published as
+ RFC 3418."
+ REVISION "199511090000Z"
+ DESCRIPTION
+
+
+
+ "This revision of this MIB module was published as
+ RFC 1907."
+ REVISION "199304010000Z"
+ DESCRIPTION
+ "The initial revision of this MIB module was published
+ as RFC 1450."
+ ::= { snmpModules 1 }
+
+snmpMIBObjects OBJECT IDENTIFIER ::= { snmpMIB 1 }
+
+-- ::= { snmpMIBObjects 1 } this OID is obsolete
+-- ::= { snmpMIBObjects 2 } this OID is obsolete
+-- ::= { snmpMIBObjects 3 } this OID is obsolete
+
+-- the System group
+--
+-- a collection of objects common to all managed systems.
+
+system OBJECT IDENTIFIER ::= { mib-2 1 }
+
+sysDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual description of the entity. This value should
+ include the full name and version identification of
+ the system's hardware type, software operating-system,
+ and networking software."
+ ::= { system 1 }
+
+sysObjectID OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The vendor's authoritative identification of the
+ network management subsystem contained in the entity.
+ This value is allocated within the SMI enterprises
+ subtree (1.3.6.1.4.1) and provides an easy and
+ unambiguous means for determining `what kind of box' is
+ being managed. For example, if vendor `Flintstones,
+ Inc.' was assigned the subtree 1.3.6.1.4.1.424242,
+ it could assign the identifier 1.3.6.1.4.1.424242.1.1
+ to its `Fred Router'."
+ ::= { system 2 }
+
+sysUpTime OBJECT-TYPE
+
+
+
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The time (in hundredths of a second) since the
+ network management portion of the system was last
+ re-initialized."
+ ::= { system 3 }
+
+sysContact OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The textual identification of the contact person for
+ this managed node, together with information on how
+ to contact this person. If no contact information is
+ known, the value is the zero-length string."
+ ::= { system 4 }
+
+sysName OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "An administratively-assigned name for this managed
+ node. By convention, this is the node's fully-qualified
+ domain name. If the name is unknown, the value is
+ the zero-length string."
+ ::= { system 5 }
+
+sysLocation OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..255))
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The physical location of this node (e.g., 'telephone
+ closet, 3rd floor'). If the location is unknown, the
+ value is the zero-length string."
+ ::= { system 6 }
+
+sysServices OBJECT-TYPE
+ SYNTAX INTEGER (0..127)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A value which indicates the set of services that this
+ entity may potentially offer. The value is a sum.
+
+
+
+ This sum initially takes the value zero. Then, for
+ each layer, L, in the range 1 through 7, that this node
+ performs transactions for, 2 raised to (L - 1) is added
+ to the sum. For example, a node which performs only
+ routing functions would have a value of 4 (2^(3-1)).
+ In contrast, a node which is a host offering application
+ services would have a value of 72 (2^(4-1) + 2^(7-1)).
+ Note that in the context of the Internet suite of
+ protocols, values should be calculated accordingly:
+
+ layer functionality
+ 1 physical (e.g., repeaters)
+ 2 datalink/subnetwork (e.g., bridges)
+ 3 internet (e.g., supports the IP)
+ 4 end-to-end (e.g., supports the TCP)
+ 7 applications (e.g., supports the SMTP)
+
+ For systems including OSI protocols, layers 5 and 6
+ may also be counted."
+ ::= { system 7 }
+
+-- object resource information
+--
+-- a collection of objects which describe the SNMP entity's
+-- (statically and dynamically configurable) support of
+-- various MIB modules.
+
+sysORLastChange OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time of the most recent
+ change in state or value of any instance of sysORID."
+ ::= { system 8 }
+
+sysORTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF SysOREntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table listing the capabilities of
+ the local SNMP application acting as a command
+ responder with respect to various MIB modules.
+ SNMP entities having dynamically-configurable support
+ of MIB modules will have a dynamically-varying number
+ of conceptual rows."
+ ::= { system 9 }
+
+
+
+sysOREntry OBJECT-TYPE
+ SYNTAX SysOREntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "An entry (conceptual row) in the sysORTable."
+ INDEX { sysORIndex }
+ ::= { sysORTable 1 }
+
+SysOREntry ::= SEQUENCE {
+ sysORIndex INTEGER,
+ sysORID OBJECT IDENTIFIER,
+ sysORDescr DisplayString,
+ sysORUpTime TimeStamp
+}
+
+sysORIndex OBJECT-TYPE
+ SYNTAX INTEGER (1..2147483647)
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The auxiliary variable used for identifying instances
+ of the columnar objects in the sysORTable."
+ ::= { sysOREntry 1 }
+
+sysORID OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An authoritative identification of a capabilities
+ statement with respect to various MIB modules supported
+ by the local SNMP application acting as a command
+ responder."
+ ::= { sysOREntry 2 }
+
+sysORDescr OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual description of the capabilities identified
+ by the corresponding instance of sysORID."
+ ::= { sysOREntry 3 }
+
+sysORUpTime OBJECT-TYPE
+ SYNTAX TimeStamp
+ MAX-ACCESS read-only
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime at the time this conceptual
+ row was last instantiated."
+ ::= { sysOREntry 4 }
+
+
+-- the SNMP group
+--
+-- a collection of objects providing basic instrumentation and
+-- control of an SNMP entity.
+
+snmp OBJECT IDENTIFIER ::= { mib-2 11 }
+
+snmpInPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of messages delivered to the SNMP
+ entity from the transport service."
+ ::= { snmp 1 }
+
+snmpInBadVersions OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of SNMP messages which were delivered
+ to the SNMP entity and were for an unsupported SNMP
+ version."
+ ::= { snmp 3 }
+
+snmpInBadCommunityNames OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of community-based SNMP messages (for
+ example, SNMPv1) delivered to the SNMP entity which
+ used an SNMP community name not known to said entity.
+ Also, implementations which authenticate community-based
+ SNMP messages using check(s) in addition to matching
+ the community name (for example, by also checking
+ whether the message originated from a transport address
+ allowed to use a specified community name) MAY include
+ in this value the number of messages which failed the
+ additional check(s). It is strongly RECOMMENDED that
+
+
+
+ the documentation for any security model which is used
+ to authenticate community-based SNMP messages specify
+ the precise conditions that contribute to this value."
+ ::= { snmp 4 }
+
+snmpInBadCommunityUses OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of community-based SNMP messages (for
+ example, SNMPv1) delivered to the SNMP entity which
+ represented an SNMP operation that was not allowed for
+ the SNMP community named in the message. The precise
+ conditions under which this counter is incremented
+ (if at all) depend on how the SNMP entity implements
+ its access control mechanism and how its applications
+ interact with that access control mechanism. It is
+ strongly RECOMMENDED that the documentation for any
+ access control mechanism which is used to control access
+ to and visibility of MIB instrumentation specify the
+ precise conditions that contribute to this value."
+ ::= { snmp 5 }
+
+snmpInASNParseErrs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of ASN.1 or BER errors encountered by
+ the SNMP entity when decoding received SNMP messages."
+ ::= { snmp 6 }
+
+snmpEnableAuthenTraps OBJECT-TYPE
+ SYNTAX INTEGER { enabled(1), disabled(2) }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "Indicates whether the SNMP entity is permitted to
+ generate authenticationFailure traps. The value of this
+ object overrides any configuration information; as such,
+ it provides a means whereby all authenticationFailure
+ traps may be disabled.
+
+ Note that it is strongly recommended that this object
+ be stored in non-volatile memory so that it remains
+ constant across re-initializations of the network
+ management system."
+
+
+
+ ::= { snmp 30 }
+
+snmpSilentDrops OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of Confirmed Class PDUs (such as
+ GetRequest-PDUs, GetNextRequest-PDUs,
+ GetBulkRequest-PDUs, SetRequest-PDUs, and
+ InformRequest-PDUs) delivered to the SNMP entity which
+ were silently dropped because the size of a reply
+ containing an alternate Response Class PDU (such as a
+ Response-PDU) with an empty variable-bindings field
+ was greater than either a local constraint or the
+ maximum message size associated with the originator of
+ the request."
+ ::= { snmp 31 }
+
+snmpProxyDrops OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of Confirmed Class PDUs
+ (such as GetRequest-PDUs, GetNextRequest-PDUs,
+ GetBulkRequest-PDUs, SetRequest-PDUs, and
+ InformRequest-PDUs) delivered to the SNMP entity which
+ were silently dropped because the transmission of
+ the (possibly translated) message to a proxy target
+ failed in a manner (other than a time-out) such that
+ no Response Class PDU (such as a Response-PDU) could
+ be returned."
+ ::= { snmp 32 }
+
+-- information for notifications
+--
+-- a collection of objects which allow the SNMP entity, when
+-- supporting a notification originator application,
+-- to be configured to generate SNMPv2-Trap-PDUs.
+
+snmpTrap OBJECT IDENTIFIER ::= { snmpMIBObjects 4 }
+
+snmpTrapOID OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The authoritative identification of the notification
+ currently being sent. This variable occurs as
+ the second varbind in every SNMPv2-Trap-PDU and
+ InformRequest-PDU."
+ ::= { snmpTrap 1 }
+
+-- ::= { snmpTrap 2 } this OID is obsolete
+
+snmpTrapEnterprise OBJECT-TYPE
+ SYNTAX OBJECT IDENTIFIER
+ MAX-ACCESS accessible-for-notify
+ STATUS current
+ DESCRIPTION
+ "The authoritative identification of the enterprise
+ associated with the trap currently being sent. When an
+ SNMP proxy agent is mapping an RFC1157 Trap-PDU
+ into a SNMPv2-Trap-PDU, this variable occurs as the
+ last varbind."
+ ::= { snmpTrap 3 }
+
+-- ::= { snmpTrap 4 } this OID is obsolete
+
+
+-- well-known traps
+
+snmpTraps OBJECT IDENTIFIER ::= { snmpMIBObjects 5 }
+
+coldStart NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "A coldStart trap signifies that the SNMP entity,
+ supporting a notification originator application, is
+ reinitializing itself and that its configuration may
+ have been altered."
+ ::= { snmpTraps 1 }
+
+warmStart NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "A warmStart trap signifies that the SNMP entity,
+ supporting a notification originator application,
+ is reinitializing itself such that its configuration
+ is unaltered."
+ ::= { snmpTraps 2 }
+
+-- Note the linkDown NOTIFICATION-TYPE ::= { snmpTraps 3 }
+-- and the linkUp NOTIFICATION-TYPE ::= { snmpTraps 4 }
+-- are defined in RFC 2863 [RFC2863]
+
+
+
+authenticationFailure NOTIFICATION-TYPE
+ STATUS current
+ DESCRIPTION
+ "An authenticationFailure trap signifies that the SNMP
+ entity has received a protocol message that is not
+ properly authenticated. While all implementations
+ of SNMP entities MAY be capable of generating this
+ trap, the snmpEnableAuthenTraps object indicates
+ whether this trap will be generated."
+ ::= { snmpTraps 5 }
+
+-- Note the egpNeighborLoss notification is defined
+-- as { snmpTraps 6 } in RFC 1213
+
+-- the set group
+--
+-- a collection of objects which allow several cooperating
+-- command generator applications to coordinate their use of the
+-- set operation.
+
+snmpSet OBJECT IDENTIFIER ::= { snmpMIBObjects 6 }
+
+snmpSetSerialNo OBJECT-TYPE
+ SYNTAX TestAndIncr
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "An advisory lock used to allow several cooperating
+ command generator applications to coordinate their
+ use of the SNMP set operation.
+
+ This object is used for coarse-grain coordination.
+ To achieve fine-grain coordination, one or more similar
+ objects might be defined within each MIB group, as
+ appropriate."
+ ::= { snmpSet 1 }
+
+-- conformance information
+
+snmpMIBConformance
+ OBJECT IDENTIFIER ::= { snmpMIB 2 }
+
+snmpMIBCompliances
+ OBJECT IDENTIFIER ::= { snmpMIBConformance 1 }
+snmpMIBGroups OBJECT IDENTIFIER ::= { snmpMIBConformance 2 }
+
+-- compliance statements
+
+
+
+
+-- ::= { snmpMIBCompliances 1 } this OID is obsolete
+snmpBasicCompliance MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "The compliance statement for SNMPv2 entities which
+ implement the SNMPv2 MIB.
+
+ This compliance statement is replaced by
+ snmpBasicComplianceRev2."
+ MODULE -- this module
+ MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup,
+ snmpBasicNotificationsGroup }
+
+ GROUP snmpCommunityGroup
+ DESCRIPTION
+ "This group is mandatory for SNMPv2 entities which
+ support community-based authentication."
+
+ ::= { snmpMIBCompliances 2 }
+
+snmpBasicComplianceRev2 MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for SNMP entities which
+ implement this MIB module."
+ MODULE -- this module
+ MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup,
+ snmpBasicNotificationsGroup }
+
+ GROUP snmpCommunityGroup
+ DESCRIPTION
+ "This group is mandatory for SNMP entities which
+ support community-based authentication."
+
+ GROUP snmpWarmStartNotificationGroup
+ DESCRIPTION
+ "This group is mandatory for an SNMP entity which
+ supports command responder applications, and is
+ able to reinitialize itself such that its
+ configuration is unaltered."
+
+ ::= { snmpMIBCompliances 3 }
+
+-- units of conformance
+
+-- ::= { snmpMIBGroups 1 } this OID is obsolete
+-- ::= { snmpMIBGroups 2 } this OID is obsolete
+-- ::= { snmpMIBGroups 3 } this OID is obsolete
+
+
+
+-- ::= { snmpMIBGroups 4 } this OID is obsolete
+
+snmpGroup OBJECT-GROUP
+ OBJECTS { snmpInPkts,
+ snmpInBadVersions,
+ snmpInASNParseErrs,
+ snmpSilentDrops,
+ snmpProxyDrops,
+ snmpEnableAuthenTraps }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing basic instrumentation
+ and control of an SNMP entity."
+ ::= { snmpMIBGroups 8 }
+
+snmpCommunityGroup OBJECT-GROUP
+ OBJECTS { snmpInBadCommunityNames,
+ snmpInBadCommunityUses }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects providing basic instrumentation
+ of a SNMP entity which supports community-based
+ authentication."
+ ::= { snmpMIBGroups 9 }
+
+snmpSetGroup OBJECT-GROUP
+ OBJECTS { snmpSetSerialNo }
+ STATUS current
+ DESCRIPTION
+ "A collection of objects which allow several cooperating
+ command generator applications to coordinate their
+ use of the set operation."
+ ::= { snmpMIBGroups 5 }
+
+systemGroup OBJECT-GROUP
+ OBJECTS { sysDescr, sysObjectID, sysUpTime,
+ sysContact, sysName, sysLocation,
+ sysServices,
+ sysORLastChange, sysORID,
+ sysORUpTime, sysORDescr }
+ STATUS current
+ DESCRIPTION
+ "The system group defines objects which are common to all
+ managed systems."
+ ::= { snmpMIBGroups 6 }
+
+snmpBasicNotificationsGroup NOTIFICATION-GROUP
+ NOTIFICATIONS { coldStart, authenticationFailure }
+
+
+
+ STATUS current
+ DESCRIPTION
+ "The basic notifications implemented by an SNMP entity
+ supporting command responder applications."
+ ::= { snmpMIBGroups 7 }
+
+snmpWarmStartNotificationGroup NOTIFICATION-GROUP
+ NOTIFICATIONS { warmStart }
+ STATUS current
+ DESCRIPTION
+ "An additional notification for an SNMP entity supporting
+ command responder applications, if it is able to reinitialize
+ itself such that its configuration is unaltered."
+ ::= { snmpMIBGroups 11 }
+
+snmpNotificationGroup OBJECT-GROUP
+ OBJECTS { snmpTrapOID, snmpTrapEnterprise }
+ STATUS current
+ DESCRIPTION
+ "These objects are required for entities
+ which support notification originator applications."
+ ::= { snmpMIBGroups 12 }
+
+-- definitions in RFC 1213 made obsolete by the inclusion of a
+-- subset of the snmp group in this MIB
+
+snmpOutPkts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Messages which were
+ passed from the SNMP protocol entity to the
+ transport service."
+ ::= { snmp 2 }
+
+-- { snmp 7 } is not used
+
+snmpInTooBigs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field was
+ `tooBig'."
+ ::= { snmp 8 }
+
+
+
+snmpInNoSuchNames OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field was
+ `noSuchName'."
+ ::= { snmp 9 }
+
+snmpInBadValues OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were
+ delivered to the SNMP protocol entity and for
+ which the value of the error-status field was
+ `badValue'."
+ ::= { snmp 10 }
+
+snmpInReadOnlys OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number valid SNMP PDUs which were delivered
+ to the SNMP protocol entity and for which the value
+ of the error-status field was `readOnly'. It should
+ be noted that it is a protocol error to generate an
+ SNMP PDU which contains the value `readOnly' in the
+ error-status field, as such this object is provided
+ as a means of detecting incorrect implementations of
+ the SNMP."
+ ::= { snmp 11 }
+
+snmpInGenErrs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were delivered
+ to the SNMP protocol entity and for which the value
+ of the error-status field was `genErr'."
+ ::= { snmp 12 }
+
+snmpInTotalReqVars OBJECT-TYPE
+
+
+
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of MIB objects which have been
+ retrieved successfully by the SNMP protocol entity
+ as the result of receiving valid SNMP Get-Request
+ and Get-Next PDUs."
+ ::= { snmp 13 }
+
+snmpInTotalSetVars OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of MIB objects which have been
+ altered successfully by the SNMP protocol entity as
+ the result of receiving valid SNMP Set-Request PDUs."
+ ::= { snmp 14 }
+
+snmpInGetRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Request PDUs which
+ have been accepted and processed by the SNMP
+ protocol entity."
+ ::= { snmp 15 }
+
+snmpInGetNexts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Next PDUs which have been
+ accepted and processed by the SNMP protocol entity."
+ ::= { snmp 16 }
+
+snmpInSetRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Set-Request PDUs which
+ have been accepted and processed by the SNMP protocol
+ entity."
+ ::= { snmp 17 }
+
+
+
+snmpInGetResponses OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Response PDUs which
+ have been accepted and processed by the SNMP protocol
+ entity."
+ ::= { snmp 18 }
+
+snmpInTraps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Trap PDUs which have been
+ accepted and processed by the SNMP protocol entity."
+ ::= { snmp 19 }
+
+snmpOutTooBigs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were generated
+ by the SNMP protocol entity and for which the value
+ of the error-status field was `tooBig.'"
+ ::= { snmp 20 }
+
+snmpOutNoSuchNames OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were generated
+ by the SNMP protocol entity and for which the value
+ of the error-status was `noSuchName'."
+ ::= { snmp 21 }
+
+snmpOutBadValues OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were generated
+ by the SNMP protocol entity and for which the value
+ of the error-status field was `badValue'."
+ ::= { snmp 22 }
+
+
+
+-- { snmp 23 } is not used
+
+snmpOutGenErrs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP PDUs which were generated
+ by the SNMP protocol entity and for which the value
+ of the error-status field was `genErr'."
+ ::= { snmp 24 }
+
+snmpOutGetRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Request PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 25 }
+
+snmpOutGetNexts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Next PDUs which have
+ been generated by the SNMP protocol entity."
+ ::= { snmp 26 }
+
+snmpOutSetRequests OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Set-Request PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 27 }
+
+snmpOutGetResponses OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Get-Response PDUs which
+ have been generated by the SNMP protocol entity."
+ ::= { snmp 28 }
+
+
+
+
+snmpOutTraps OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS obsolete
+ DESCRIPTION
+ "The total number of SNMP Trap PDUs which have
+ been generated by the SNMP protocol entity."
+ ::= { snmp 29 }
+
+snmpObsoleteGroup OBJECT-GROUP
+ OBJECTS { snmpOutPkts, snmpInTooBigs, snmpInNoSuchNames,
+ snmpInBadValues, snmpInReadOnlys, snmpInGenErrs,
+ snmpInTotalReqVars, snmpInTotalSetVars,
+ snmpInGetRequests, snmpInGetNexts, snmpInSetRequests,
+ snmpInGetResponses, snmpInTraps, snmpOutTooBigs,
+ snmpOutNoSuchNames, snmpOutBadValues,
+ snmpOutGenErrs, snmpOutGetRequests, snmpOutGetNexts,
+ snmpOutSetRequests, snmpOutGetResponses, snmpOutTraps
+ }
+ STATUS obsolete
+ DESCRIPTION
+ "A collection of objects from RFC 1213 made obsolete
+ by this MIB module."
+ ::= { snmpMIBGroups 10 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-SMI b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-SMI
new file mode 100644
index 0000000..2132646
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-SMI
@@ -0,0 +1,352 @@
+SNMPv2-SMI DEFINITIONS ::= BEGIN
+
+
+-- the path to the root
+
+org OBJECT IDENTIFIER ::= { iso 3 } -- "iso" = 1
+dod OBJECT IDENTIFIER ::= { org 6 }
+internet OBJECT IDENTIFIER ::= { dod 1 }
+
+directory OBJECT IDENTIFIER ::= { internet 1 }
+
+mgmt OBJECT IDENTIFIER ::= { internet 2 }
+mib-2 OBJECT IDENTIFIER ::= { mgmt 1 }
+transmission OBJECT IDENTIFIER ::= { mib-2 10 }
+
+experimental OBJECT IDENTIFIER ::= { internet 3 }
+
+private OBJECT IDENTIFIER ::= { internet 4 }
+enterprises OBJECT IDENTIFIER ::= { private 1 }
+
+security OBJECT IDENTIFIER ::= { internet 5 }
+
+snmpV2 OBJECT IDENTIFIER ::= { internet 6 }
+
+-- transport domains
+snmpDomains OBJECT IDENTIFIER ::= { snmpV2 1 }
+
+-- transport proxies
+snmpProxys OBJECT IDENTIFIER ::= { snmpV2 2 }
+
+-- module identities
+snmpModules OBJECT IDENTIFIER ::= { snmpV2 3 }
+
+-- Extended UTCTime, to allow dates with four-digit years
+-- (Note that this definition of ExtUTCTime is not to be IMPORTed
+-- by MIB modules.)
+ExtUTCTime ::= OCTET STRING(SIZE(11 | 13))
+ -- format is YYMMDDHHMMZ or YYYYMMDDHHMMZ
+ -- where: YY - last two digits of year (only years
+ -- between 1900-1999)
+ -- YYYY - last four digits of the year (any year)
+ -- MM - month (01 through 12)
+ -- DD - day of month (01 through 31)
+ -- HH - hours (00 through 23)
+ -- MM - minutes (00 through 59)
+ -- Z - denotes GMT (the ASCII character Z)
+ --
+ -- For example, "9502192015Z" and "199502192015Z" represent
+ -- 8:15pm GMT on 19 February 1995. Years after 1999 must use
+ -- the four digit year format. Years 1900-1999 may use the
+ -- two or four digit format.
+
+-- definitions for information modules
+
+MODULE-IDENTITY MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ "LAST-UPDATED" value(Update ExtUTCTime)
+ "ORGANIZATION" Text
+ "CONTACT-INFO" Text
+ "DESCRIPTION" Text
+ RevisionPart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ RevisionPart ::=
+ Revisions
+ | empty
+ Revisions ::=
+ Revision
+ | Revisions Revision
+ Revision ::=
+ "REVISION" value(Update ExtUTCTime)
+ "DESCRIPTION" Text
+
+ -- a character string as defined in section 3.1.1
+ Text ::= value(IA5String)
+END
+
+
+OBJECT-IDENTITY MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+
+ VALUE NOTATION ::=
+ value(VALUE OBJECT IDENTIFIER)
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ -- a character string as defined in section 3.1.1
+ Text ::= value(IA5String)
+END
+
+
+-- names of objects
+-- (Note that these definitions of ObjectName and NotificationName
+-- are not to be IMPORTed by MIB modules.)
+
+ObjectName ::=
+ OBJECT IDENTIFIER
+
+NotificationName ::=
+ OBJECT IDENTIFIER
+
+-- syntax of objects
+
+-- the "base types" defined here are:
+-- 3 built-in ASN.1 types: INTEGER, OCTET STRING, OBJECT IDENTIFIER
+-- 8 application-defined types: Integer32, IpAddress, Counter32,
+-- Gauge32, Unsigned32, TimeTicks, Opaque, and Counter64
+
+ObjectSyntax ::=
+ CHOICE {
+ simple
+ SimpleSyntax,
+
+ -- note that SEQUENCEs for conceptual tables and
+ -- rows are not mentioned here...
+
+ application-wide
+ ApplicationSyntax
+ }
+
+-- built-in ASN.1 types
+
+SimpleSyntax ::=
+ CHOICE {
+ -- INTEGERs with a more restrictive range
+ -- may also be used
+ integer-value -- includes Integer32
+ INTEGER (-2147483648..2147483647),
+
+ -- OCTET STRINGs with a more restrictive size
+ -- may also be used
+ string-value
+ OCTET STRING (SIZE (0..65535)),
+
+ objectID-value
+ OBJECT IDENTIFIER
+ }
+
+-- indistinguishable from INTEGER, but never needs more than
+-- 32-bits for a two's complement representation
+Integer32 ::=
+ INTEGER (-2147483648..2147483647)
+
+
+-- application-wide types
+
+ApplicationSyntax ::=
+ CHOICE {
+ ipAddress-value
+ IpAddress,
+
+ counter-value
+ Counter32,
+
+ timeticks-value
+ TimeTicks,
+
+ arbitrary-value
+ Opaque,
+
+ big-counter-value
+ Counter64,
+
+ unsigned-integer-value -- includes Gauge32
+ Unsigned32
+ }
+
+-- in network-byte order
+-- (this is a tagged type for historical reasons)
+IpAddress ::=
+ [APPLICATION 0]
+ IMPLICIT OCTET STRING (SIZE (4))
+
+-- this wraps
+Counter32 ::=
+ [APPLICATION 1]
+ IMPLICIT INTEGER (0..4294967295)
+
+-- this doesn't wrap
+Gauge32 ::=
+ [APPLICATION 2]
+ IMPLICIT INTEGER (0..4294967295)
+
+-- an unsigned 32-bit quantity
+-- indistinguishable from Gauge32
+Unsigned32 ::=
+ [APPLICATION 2]
+ IMPLICIT INTEGER (0..4294967295)
+
+-- hundredths of seconds since an epoch
+TimeTicks ::=
+ [APPLICATION 3]
+ IMPLICIT INTEGER (0..4294967295)
+
+-- for backward-compatibility only
+Opaque ::=
+ [APPLICATION 4]
+ IMPLICIT OCTET STRING
+
+-- for counters that wrap in less than one hour with only 32 bits
+Counter64 ::=
+ [APPLICATION 6]
+ IMPLICIT INTEGER (0..18446744073709551615)
+
+
+-- definition for objects
+
+OBJECT-TYPE MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ "SYNTAX" Syntax
+ UnitsPart
+ "MAX-ACCESS" Access
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+ IndexPart
+ DefValPart
+
+ VALUE NOTATION ::=
+ value(VALUE ObjectName)
+
+ Syntax ::= -- Must be one of the following:
+ -- a base type (or its refinement),
+ -- a textual convention (or its refinement), or
+ -- a BITS pseudo-type
+ type
+ | "BITS" "{" NamedBits "}"
+
+ NamedBits ::= NamedBit
+ | NamedBits "," NamedBit
+
+ NamedBit ::= identifier "(" number ")" -- number is nonnegative
+
+ UnitsPart ::=
+ "UNITS" Text
+ | empty
+
+ Access ::=
+ "not-accessible"
+ | "accessible-for-notify"
+ | "read-only"
+ | "read-write"
+ | "read-create"
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ IndexPart ::=
+ "INDEX" "{" IndexTypes "}"
+ | "AUGMENTS" "{" Entry "}"
+ | empty
+ IndexTypes ::=
+ IndexType
+ | IndexTypes "," IndexType
+ IndexType ::=
+ "IMPLIED" Index
+ | Index
+ Index ::=
+ -- use the SYNTAX value of the
+ -- correspondent OBJECT-TYPE invocation
+ value(ObjectName)
+ Entry ::=
+ -- use the INDEX value of the
+ -- correspondent OBJECT-TYPE invocation
+ value(ObjectName)
+
+ DefValPart ::= "DEFVAL" "{" Defvalue "}"
+ | empty
+
+ Defvalue ::= -- must be valid for the type specified in
+ -- SYNTAX clause of same OBJECT-TYPE macro
+ value(ObjectSyntax)
+ | "{" BitsValue "}"
+
+ BitsValue ::= BitNames
+ | empty
+
+ BitNames ::= BitName
+ | BitNames "," BitName
+
+ BitName ::= identifier
+
+ -- a character string as defined in section 3.1.1
+ Text ::= value(IA5String)
+END
+
+
+-- definitions for notifications
+
+NOTIFICATION-TYPE MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ ObjectsPart
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+
+ VALUE NOTATION ::=
+ value(VALUE NotificationName)
+
+ ObjectsPart ::=
+ "OBJECTS" "{" Objects "}"
+ | empty
+ Objects ::=
+ Object
+ | Objects "," Object
+ Object ::=
+ value(ObjectName)
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ -- a character string as defined in section 3.1.1
+ Text ::= value(IA5String)
+END
+
+-- definitions of administrative identifiers
+
+zeroDotZero OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "A value used for null identifiers."
+ ::= { 0 0 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TC b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TC
new file mode 100644
index 0000000..a68f969
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TC
@@ -0,0 +1,786 @@
+SNMPv2-TC DEFINITIONS ::= BEGIN
+
+IMPORTS
+ TimeTicks FROM SNMPv2-SMI;
+
+
+-- definition of textual conventions
+
+TEXTUAL-CONVENTION MACRO ::=
+BEGIN
+ TYPE NOTATION ::=
+ DisplayPart
+ "STATUS" Status
+ "DESCRIPTION" Text
+ ReferPart
+ "SYNTAX" Syntax
+
+ VALUE NOTATION ::=
+ value(VALUE Syntax) -- adapted ASN.1
+
+ DisplayPart ::=
+ "DISPLAY-HINT" Text
+ | empty
+
+ Status ::=
+ "current"
+ | "deprecated"
+ | "obsolete"
+
+ ReferPart ::=
+ "REFERENCE" Text
+ | empty
+
+ -- a character string as defined in [2]
+ Text ::= value(IA5String)
+
+ Syntax ::= -- Must be one of the following:
+ -- a base type (or its refinement), or
+ -- a BITS pseudo-type
+ type
+ | "BITS" "{" NamedBits "}"
+
+ NamedBits ::= NamedBit
+ | NamedBits "," NamedBit
+
+ NamedBit ::= identifier "(" number ")" -- number is nonnegative
+
+END
+
+
+
+
+DisplayString ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "255a"
+ STATUS current
+ DESCRIPTION
+ "Represents textual information taken from the NVT ASCII
+ character set, as defined in pages 4, 10-11 of RFC 854.
+
+ To summarize RFC 854, the NVT ASCII repertoire specifies:
+
+ - the use of character codes 0-127 (decimal)
+
+ - the graphics characters (32-126) are interpreted as
+ US ASCII
+
+ - NUL, LF, CR, BEL, BS, HT, VT and FF have the special
+ meanings specified in RFC 854
+
+ - the other 25 codes have no standard interpretation
+
+ - the sequence 'CR LF' means newline
+
+ - the sequence 'CR NUL' means carriage-return
+
+ - an 'LF' not preceded by a 'CR' means moving to the
+ same column on the next line.
+
+ - the sequence 'CR x' for any x other than LF or NUL is
+ illegal. (Note that this also means that a string may
+ end with either 'CR LF' or 'CR NUL', but not with CR.)
+
+ Any object defined using this syntax may not exceed 255
+ characters in length."
+ SYNTAX OCTET STRING (SIZE (0..255))
+
+PhysAddress ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "1x:"
+ STATUS current
+ DESCRIPTION
+ "Represents media- or physical-level addresses."
+ SYNTAX OCTET STRING
+
+
+MacAddress ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "1x:"
+ STATUS current
+ DESCRIPTION
+ "Represents an 802 MAC address represented in the
+ `canonical' order defined by IEEE 802.1a, i.e., as if it
+ were transmitted least significant bit first, even though
+ 802.5 (in contrast to other 802.x protocols) requires MAC
+ addresses to be transmitted most significant bit first."
+ SYNTAX OCTET STRING (SIZE (6))
+
+TruthValue ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents a boolean value."
+ SYNTAX INTEGER { true(1), false(2) }
+
+TestAndIncr ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents integer-valued information used for atomic
+ operations. When the management protocol is used to specify
+ that an object instance having this syntax is to be
+ modified, the new value supplied via the management protocol
+ must precisely match the value presently held by the
+ instance. If not, the management protocol set operation
+ fails with an error of `inconsistentValue'. Otherwise, if
+ the current value is the maximum value of 2^31-1 (2147483647
+ decimal), then the value held by the instance is wrapped to
+ zero; otherwise, the value held by the instance is
+ incremented by one. (Note that regardless of whether the
+ management protocol set operation succeeds, the variable-
+ binding in the request and response PDUs are identical.)
+
+ The value of the ACCESS clause for objects having this
+ syntax is either `read-write' or `read-create'. When an
+ instance of a columnar object having this syntax is created,
+ any value may be supplied via the management protocol.
+
+ When the network management portion of the system is re-
+ initialized, the value of every object instance having this
+ syntax must either be incremented from its value prior to
+ the re-initialization, or (if the value prior to the re-
+ initialization is unknown) be set to a pseudo-randomly
+ generated value."
+ SYNTAX INTEGER (0..2147483647)
+
+AutonomousType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents an independently extensible type identification
+ value. It may, for example, indicate a particular sub-tree
+ with further MIB definitions, or define a particular type of
+ protocol or hardware."
+ SYNTAX OBJECT IDENTIFIER
+
+
+InstancePointer ::= TEXTUAL-CONVENTION
+ STATUS obsolete
+ DESCRIPTION
+ "A pointer to either a specific instance of a MIB object or
+ a conceptual row of a MIB table in the managed device. In
+ the latter case, by convention, it is the name of the
+ particular instance of the first accessible columnar object
+ in the conceptual row.
+
+ The two uses of this textual convention are replaced by
+ VariablePointer and RowPointer, respectively."
+ SYNTAX OBJECT IDENTIFIER
+
+
+VariablePointer ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "A pointer to a specific object instance. For example,
+ sysContact.0 or ifInOctets.3."
+ SYNTAX OBJECT IDENTIFIER
+
+
+RowPointer ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents a pointer to a conceptual row. The value is the
+ name of the instance of the first accessible columnar object
+ in the conceptual row.
+
+ For example, ifIndex.3 would point to the 3rd row in the
+ ifTable (note that if ifIndex were not-accessible, then
+ ifDescr.3 would be used instead)."
+ SYNTAX OBJECT IDENTIFIER
+
+RowStatus ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The RowStatus textual convention is used to manage the
+ creation and deletion of conceptual rows, and is used as the
+ value of the SYNTAX clause for the status column of a
+ conceptual row (as described in Section 7.7.1 of [2].)
+ The status column has six defined values:
+
+ - `active', which indicates that the conceptual row is
+ available for use by the managed device;
+
+ - `notInService', which indicates that the conceptual
+ row exists in the agent, but is unavailable for use by
+ the managed device (see NOTE below); 'notInService' has
+ no implication regarding the internal consistency of
+ the row, availability of resources, or consistency with
+ the current state of the managed device;
+
+ - `notReady', which indicates that the conceptual row
+ exists in the agent, but is missing information
+ necessary in order to be available for use by the
+ managed device (i.e., one or more required columns in
+ the conceptual row have not been instanciated);
+
+ - `createAndGo', which is supplied by a management
+ station wishing to create a new instance of a
+ conceptual row and to have its status automatically set
+ to active, making it available for use by the managed
+ device;
+
+ - `createAndWait', which is supplied by a management
+ station wishing to create a new instance of a
+ conceptual row (but not make it available for use by
+ the managed device); and,
+
+ - `destroy', which is supplied by a management station
+ wishing to delete all of the instances associated with
+ an existing conceptual row.
+
+ Whereas five of the six values (all except `notReady') may
+ be specified in a management protocol set operation, only
+ three values will be returned in response to a management
+ protocol retrieval operation: `notReady', `notInService' or
+ `active'. That is, when queried, an existing conceptual row
+ has only three states: it is either available for use by
+ the managed device (the status column has value `active');
+ it is not available for use by the managed device, though
+ the agent has sufficient information to attempt to make it
+ so (the status column has value `notInService'); or, it is
+ not available for use by the managed device, and an attempt
+ to make it so would fail because the agent has insufficient
+ information (the state column has value `notReady').
+
+ NOTE WELL
+
+ This textual convention may be used for a MIB table,
+ irrespective of whether the values of that table's
+ conceptual rows are able to be modified while it is
+ active, or whether its conceptual rows must be taken
+ out of service in order to be modified. That is, it is
+ the responsibility of the DESCRIPTION clause of the
+ status column to specify whether the status column must
+ not be `active' in order for the value of some other
+ column of the same conceptual row to be modified. If
+ such a specification is made, affected columns may be
+ changed by an SNMP set PDU if the RowStatus would not
+ be equal to `active' either immediately before or after
+ processing the PDU. In other words, if the PDU also
+ contained a varbind that would change the RowStatus
+ value, the column in question may be changed if the
+ RowStatus was not equal to `active' as the PDU was
+ received, or if the varbind sets the status to a value
+ other than 'active'.
+
+
+ Also note that whenever any elements of a row exist, the
+ RowStatus column must also exist.
+
+ To summarize the effect of having a conceptual row with a
+ status column having a SYNTAX clause value of RowStatus,
+ consider the following state diagram:
+
+
+ STATE
+ +--------------+-----------+-------------+-------------
+ | A | B | C | D
+ | |status col.|status column|
+ |status column | is | is |status column
+ ACTION |does not exist| notReady | notInService| is active
+--------------+--------------+-----------+-------------+-------------
+set status |noError ->D|inconsist- |inconsistent-|inconsistent-
+column to | or | entValue| Value| Value
+createAndGo |inconsistent- | | |
+ | Value| | |
+--------------+--------------+-----------+-------------+-------------
+set status |noError see 1|inconsist- |inconsistent-|inconsistent-
+column to | or | entValue| Value| Value
+createAndWait |wrongValue | | |
+--------------+--------------+-----------+-------------+-------------
+set status |inconsistent- |inconsist- |noError |noError
+column to | Value| entValue| |
+active | | | |
+ | | or | |
+ | | | |
+ | |see 2 ->D|see 8 ->D| ->D
+--------------+--------------+-----------+-------------+-------------
+set status |inconsistent- |inconsist- |noError |noError ->C
+column to | Value| entValue| |
+notInService | | | |
+ | | or | | or
+ | | | |
+ | |see 3 ->C| ->C|see 6
+--------------+--------------+-----------+-------------+-------------
+set status |noError |noError |noError |noError ->A
+column to | | | | or
+destroy | ->A| ->A| ->A|see 7
+--------------+--------------+-----------+-------------+-------------
+set any other |see 4 |noError |noError |see 5
+column to some| | | |
+value | | see 1| ->C| ->D
+--------------+--------------+-----------+-------------+-------------
+
+ (1) goto B or C, depending on information available to the
+ agent.
+
+ (2) if other variable bindings included in the same PDU,
+ provide values for all columns which are missing but
+ required, and all columns have acceptable values, then
+ return noError and goto D.
+
+ (3) if other variable bindings included in the same PDU,
+ provide legal values for all columns which are missing but
+ required, then return noError and goto C.
+
+ (4) at the discretion of the agent, the return value may be
+ either:
+
+ inconsistentName: because the agent does not choose to
+ create such an instance when the corresponding
+ RowStatus instance does not exist, or
+
+ inconsistentValue: if the supplied value is
+ inconsistent with the state of some other MIB object's
+ value, or
+
+ noError: because the agent chooses to create the
+ instance.
+
+ If noError is returned, then the instance of the status
+ column must also be created, and the new state is B or C,
+ depending on the information available to the agent. If
+ inconsistentName or inconsistentValue is returned, the row
+ remains in state A.
+
+ (5) depending on the MIB definition for the column/table,
+ either noError or inconsistentValue may be returned.
+
+ (6) the return value can indicate one of the following
+ errors:
+
+ wrongValue: because the agent does not support
+ notInService (e.g., an agent which does not support
+ createAndWait), or
+
+ inconsistentValue: because the agent is unable to take
+ the row out of service at this time, perhaps because it
+ is in use and cannot be de-activated.
+
+ (7) the return value can indicate the following error:
+
+ inconsistentValue: because the agent is unable to
+ remove the row at this time, perhaps because it is in
+ use and cannot be de-activated.
+
+ (8) the transition to D can fail, e.g., if the values of the
+ conceptual row are inconsistent, then the error code would
+ be inconsistentValue.
+
+ NOTE: Other processing of (this and other varbinds of) the
+ set request may result in a response other than noError
+ being returned, e.g., wrongValue, noCreation, etc.
+
+
+ Conceptual Row Creation
+
+ There are four potential interactions when creating a
+ conceptual row: selecting an instance-identifier which is
+ not in use; creating the conceptual row; initializing any
+ objects for which the agent does not supply a default; and,
+ making the conceptual row available for use by the managed
+ device.
+
+ Interaction 1: Selecting an Instance-Identifier
+
+ The algorithm used to select an instance-identifier varies
+ for each conceptual row. In some cases, the instance-
+ identifier is semantically significant, e.g., the
+ destination address of a route, and a management station
+ selects the instance-identifier according to the semantics.
+
+ In other cases, the instance-identifier is used solely to
+ distinguish conceptual rows, and a management station
+ without specific knowledge of the conceptual row might
+ examine the instances present in order to determine an
+ unused instance-identifier. (This approach may be used, but
+ it is often highly sub-optimal; however, it is also a
+ questionable practice for a naive management station to
+ attempt conceptual row creation.)
+
+ Alternately, the MIB module which defines the conceptual row
+ might provide one or more objects which provide assistance
+ in determining an unused instance-identifier. For example,
+ if the conceptual row is indexed by an integer-value, then
+ an object having an integer-valued SYNTAX clause might be
+ defined for such a purpose, allowing a management station to
+ issue a management protocol retrieval operation. In order
+ to avoid unnecessary collisions between competing management
+ stations, `adjacent' retrievals of this object should be
+ different.
+
+ Finally, the management station could select a pseudo-random
+ number to use as the index. In the event that this index
+ was already in use and an inconsistentValue was returned in
+ response to the management protocol set operation, the
+ management station should simply select a new pseudo-random
+ number and retry the operation.
+
+ A MIB designer should choose between the two latter
+ algorithms based on the size of the table (and therefore the
+ efficiency of each algorithm). For tables in which a large
+ number of entries are expected, it is recommended that a MIB
+ object be defined that returns an acceptable index for
+ creation. For tables with small numbers of entries, it is
+ recommended that the latter pseudo-random index mechanism be
+ used.
+
+ Interaction 2: Creating the Conceptual Row
+
+ Once an unused instance-identifier has been selected, the
+ management station determines if it wishes to create and
+ activate the conceptual row in one transaction or in a
+ negotiated set of interactions.
+
+ Interaction 2a: Creating and Activating the Conceptual Row
+
+ The management station must first determine the column
+ requirements, i.e., it must determine those columns for
+ which it must or must not provide values. Depending on the
+ complexity of the table and the management station's
+ knowledge of the agent's capabilities, this determination
+ can be made locally by the management station. Alternately,
+ the management station issues a management protocol get
+ operation to examine all columns in the conceptual row that
+ it wishes to create. In response, for each column, there
+ are three possible outcomes:
+
+ - a value is returned, indicating that some other
+ management station has already created this conceptual
+ row. We return to interaction 1.
+
+ - the exception `noSuchInstance' is returned,
+ indicating that the agent implements the object-type
+ associated with this column, and that this column in at
+ least one conceptual row would be accessible in the MIB
+ view used by the retrieval were it to exist. For those
+ columns to which the agent provides read-create access,
+ the `noSuchInstance' exception tells the management
+ station that it should supply a value for this column
+ when the conceptual row is to be created.
+
+ - the exception `noSuchObject' is returned, indicating
+ that the agent does not implement the object-type
+ associated with this column or that there is no
+ conceptual row for which this column would be
+ accessible in the MIB view used by the retrieval. As
+ such, the management station can not issue any
+ management protocol set operations to create an
+ instance of this column.
+
+ Once the column requirements have been determined, a
+ management protocol set operation is accordingly issued.
+ This operation also sets the new instance of the status
+ column to `createAndGo'.
+
+ When the agent processes the set operation, it verifies that
+ it has sufficient information to make the conceptual row
+ available for use by the managed device. The information
+ available to the agent is provided by two sources: the
+ management protocol set operation which creates the
+ conceptual row, and, implementation-specific defaults
+ supplied by the agent (note that an agent must provide
+ implementation-specific defaults for at least those objects
+ which it implements as read-only). If there is sufficient
+ information available, then the conceptual row is created, a
+ `noError' response is returned, the status column is set to
+ `active', and no further interactions are necessary (i.e.,
+ interactions 3 and 4 are skipped). If there is insufficient
+ information, then the conceptual row is not created, and the
+ set operation fails with an error of `inconsistentValue'.
+ On this error, the management station can issue a management
+ protocol retrieval operation to determine if this was
+ because it failed to specify a value for a required column,
+ or, because the selected instance of the status column
+ already existed. In the latter case, we return to
+ interaction 1. In the former case, the management station
+ can re-issue the set operation with the additional
+ information, or begin interaction 2 again using
+ `createAndWait' in order to negotiate creation of the
+ conceptual row.
+
+ NOTE WELL
+
+ Regardless of the method used to determine the column
+ requirements, it is possible that the management
+ station might deem a column necessary when, in fact,
+ the agent will not allow that particular columnar
+ instance to be created or written. In this case, the
+ management protocol set operation will fail with an
+ error such as `noCreation' or `notWritable'. In this
+ case, the management station decides whether it needs
+ to be able to set a value for that particular columnar
+ instance. If not, the management station re-issues the
+ management protocol set operation, but without setting
+ a value for that particular columnar instance;
+ otherwise, the management station aborts the row
+ creation algorithm.
+
+ Interaction 2b: Negotiating the Creation of the Conceptual
+ Row
+
+ The management station issues a management protocol set
+ operation which sets the desired instance of the status
+ column to `createAndWait'. If the agent is unwilling to
+ process a request of this sort, the set operation fails with
+ an error of `wrongValue'. (As a consequence, such an agent
+ must be prepared to accept a single management protocol set
+ operation, i.e., interaction 2a above, containing all of the
+ columns indicated by its column requirements.) Otherwise,
+ the conceptual row is created, a `noError' response is
+ returned, and the status column is immediately set to either
+ `notInService' or `notReady', depending on whether it has
+ sufficient information to (attempt to) make the conceptual
+ row available for use by the managed device. If there is
+ sufficient information available, then the status column is
+ set to `notInService'; otherwise, if there is insufficient
+ information, then the status column is set to `notReady'.
+ Regardless, we proceed to interaction 3.
+
+ Interaction 3: Initializing non-defaulted Objects
+
+ The management station must now determine the column
+ requirements. It issues a management protocol get operation
+ to examine all columns in the created conceptual row. In
+ the response, for each column, there are three possible
+ outcomes:
+
+ - a value is returned, indicating that the agent
+ implements the object-type associated with this column
+ and had sufficient information to provide a value. For
+ those columns to which the agent provides read-create
+ access (and for which the agent allows their values to
+ be changed after their creation), a value return tells
+ the management station that it may issue additional
+ management protocol set operations, if it desires, in
+ order to change the value associated with this column.
+
+ - the exception `noSuchInstance' is returned,
+ indicating that the agent implements the object-type
+ associated with this column, and that this column in at
+ least one conceptual row would be accessible in the MIB
+ view used by the retrieval were it to exist. However,
+ the agent does not have sufficient information to
+ provide a value, and until a value is provided, the
+ conceptual row may not be made available for use by the
+ managed device. For those columns to which the agent
+ provides read-create access, the `noSuchInstance'
+ exception tells the management station that it must
+ issue additional management protocol set operations, in
+ order to provide a value associated with this column.
+
+ - the exception `noSuchObject' is returned, indicating
+ that the agent does not implement the object-type
+ associated with this column or that there is no
+ conceptual row for which this column would be
+ accessible in the MIB view used by the retrieval. As
+ such, the management station can not issue any
+ management protocol set operations to create an
+ instance of this column.
+
+ If the value associated with the status column is
+ `notReady', then the management station must first deal with
+ all `noSuchInstance' columns, if any. Having done so, the
+ value of the status column becomes `notInService', and we
+ proceed to interaction 4.
+
+ Interaction 4: Making the Conceptual Row Available
+
+ Once the management station is satisfied with the values
+ associated with the columns of the conceptual row, it issues
+ a management protocol set operation to set the status column
+ to `active'. If the agent has sufficient information to
+ make the conceptual row available for use by the managed
+ device, the management protocol set operation succeeds (a
+ `noError' response is returned). Otherwise, the management
+ protocol set operation fails with an error of
+ `inconsistentValue'.
+
+ NOTE WELL
+
+ A conceptual row having a status column with value
+ `notInService' or `notReady' is unavailable to the
+ managed device. As such, it is possible for the
+ managed device to create its own instances during the
+ time between the management protocol set operation
+ which sets the status column to `createAndWait' and the
+ management protocol set operation which sets the status
+ column to `active'. In this case, when the management
+ protocol set operation is issued to set the status
+ column to `active', the values held in the agent
+ supersede those used by the managed device.
+
+ If the management station is prevented from setting the
+ status column to `active' (e.g., due to management station
+ or network failure) the conceptual row will be left in the
+ `notInService' or `notReady' state, consuming resources
+ indefinitely. The agent must detect conceptual rows that
+ have been in either state for an abnormally long period of
+ time and remove them. It is the responsibility of the
+ DESCRIPTION clause of the status column to indicate what an
+ abnormally long period of time would be. This period of
+ time should be long enough to allow for human response time
+ (including `think time') between the creation of the
+ conceptual row and the setting of the status to `active'.
+ In the absence of such information in the DESCRIPTION
+ clause, it is suggested that this period be approximately 5
+ minutes in length. This removal action applies not only to
+ newly-created rows, but also to previously active rows which
+ are set to, and left in, the notInService state for a
+ prolonged period exceeding that which is considered normal
+ for such a conceptual row.
+
+ Conceptual Row Suspension
+
+ When a conceptual row is `active', the management station
+ may issue a management protocol set operation which sets the
+ instance of the status column to `notInService'. If the
+ agent is unwilling to do so, the set operation fails with an
+ error of `wrongValue' or `inconsistentValue'. Otherwise,
+ the conceptual row is taken out of service, and a `noError'
+ response is returned. It is the responsibility of the
+ DESCRIPTION clause of the status column to indicate under
+ what circumstances the status column should be taken out of
+ service (e.g., in order for the value of some other column
+ of the same conceptual row to be modified).
+
+
+ Conceptual Row Deletion
+
+ For deletion of conceptual rows, a management protocol set
+ operation is issued which sets the instance of the status
+ column to `destroy'. This request may be made regardless of
+ the current value of the status column (e.g., it is possible
+ to delete conceptual rows which are either `notReady',
+ `notInService' or `active'.) If the operation succeeds,
+ then all instances associated with the conceptual row are
+ immediately removed."
+ SYNTAX INTEGER {
+ -- the following two values are states:
+ -- these values may be read or written
+ active(1),
+ notInService(2),
+
+ -- the following value is a state:
+ -- this value may be read, but not written
+ notReady(3),
+
+ -- the following three values are
+ -- actions: these values may be written,
+ -- but are never read
+ createAndGo(4),
+ createAndWait(5),
+ destroy(6)
+ }
+
+TimeStamp ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "The value of the sysUpTime object at which a specific
+ occurrence happened. The specific occurrence must be
+ defined in the description of any object defined using this
+ type.
+
+ If sysUpTime is reset to zero as a result of a re-
+ initialization of the network management (sub)system, then
+ the values of all TimeStamp objects are also reset.
+ However, after approximately 497 days without a re-
+ initialization, the sysUpTime object will reach 2^^32-1 and
+ then increment around to zero; in this case, existing values
+ of TimeStamp objects do not change. This can lead to
+ ambiguities in the value of TimeStamp objects."
+ SYNTAX TimeTicks
+
+
+TimeInterval ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "A period of time, measured in units of 0.01 seconds."
+ SYNTAX INTEGER (0..2147483647)
+
+DateAndTime ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d,1a1d:1d"
+ STATUS current
+ DESCRIPTION
+ "A date-time specification.
+
+ field octets contents range
+ ----- ------ -------- -----
+ 1 1-2 year* 0..65536
+ 2 3 month 1..12
+ 3 4 day 1..31
+ 4 5 hour 0..23
+ 5 6 minutes 0..59
+ 6 7 seconds 0..60
+ (use 60 for leap-second)
+ 7 8 deci-seconds 0..9
+ 8 9 direction from UTC '+' / '-'
+ 9 10 hours from UTC* 0..13
+ 10 11 minutes from UTC 0..59
+
+ * Notes:
+ - the value of year is in network-byte order
+ - daylight saving time in New Zealand is +13
+
+ For example, Tuesday May 26, 1992 at 1:30:15 PM EDT would be
+ displayed as:
+
+ 1992-5-26,13:30:15.0,-4:0
+
+ Note that if only local time is known, then timezone
+ information (fields 8-10) is not present."
+ SYNTAX OCTET STRING (SIZE (8 | 11))
+
+
+StorageType ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Describes the memory realization of a conceptual row. A
+ row which is volatile(2) is lost upon reboot. A row which
+ is either nonVolatile(3), permanent(4) or readOnly(5), is
+ backed up by stable storage. A row which is permanent(4)
+ can be changed but not deleted. A row which is readOnly(5)
+ cannot be changed nor deleted.
+
+ If the value of an object with this syntax is either
+ permanent(4) or readOnly(5), it cannot be written.
+ Conversely, if the value is either other(1), volatile(2) or
+ nonVolatile(3), it cannot be modified to be permanent(4) or
+ readOnly(5). (All illegal modifications result in a
+ 'wrongValue' error.)
+
+ Every usage of this textual convention is required to
+ specify the columnar objects which a permanent(4) row must
+ at a minimum allow to be writable."
+ SYNTAX INTEGER {
+ other(1), -- eh?
+ volatile(2), -- e.g., in RAM
+ nonVolatile(3), -- e.g., in NVRAM
+ permanent(4), -- e.g., partially in ROM
+ readOnly(5) -- e.g., completely in ROM
+ }
+
+TDomain ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Denotes a kind of transport service.
+
+ Some possible values, such as snmpUDPDomain, are defined in
+ the SNMPv2-TM MIB module. Other possible values are defined
+ in other MIB modules."
+ REFERENCE "The SNMPv2-TM MIB module is defined in RFC 1906."
+ SYNTAX OBJECT IDENTIFIER
+
+
+TAddress ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Denotes a transport service address.
+
+ A TAddress value is always interpreted within the context of a
+ TDomain value. Thus, each definition of a TDomain value must
+ be accompanied by a definition of a textual convention for use
+ with that TDomain. Some possible textual conventions, such as
+ SnmpUDPAddress for snmpUDPDomain, are defined in the SNMPv2-TM
+ MIB module. Other possible textual conventions are defined in
+ other MIB modules."
+ REFERENCE "The SNMPv2-TM MIB module is defined in RFC 1906."
+ SYNTAX OCTET STRING (SIZE (1..255))
+
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TM b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TM
new file mode 100644
index 0000000..dadbc4a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/SNMPv2-TM
@@ -0,0 +1,194 @@
+SNMPv2-TM DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-IDENTITY,
+ snmpModules, snmpDomains, snmpProxys
+ FROM SNMPv2-SMI
+ TEXTUAL-CONVENTION
+ FROM SNMPv2-TC;
+
+snmpv2tm MODULE-IDENTITY
+ LAST-UPDATED "200210160000Z"
+ ORGANIZATION "IETF SNMPv3 Working Group"
+ CONTACT-INFO
+ "WG-EMail: snmpv3@lists.tislabs.com
+ Subscribe: snmpv3-request@lists.tislabs.com
+
+ Co-Chair: Russ Mundy
+ Network Associates Laboratories
+ postal: 15204 Omega Drive, Suite 300
+ Rockville, MD 20850-4601
+ USA
+ EMail: mundy@tislabs.com
+ phone: +1 301 947-7107
+
+
+
+ Co-Chair: David Harrington
+ Enterasys Networks
+ postal: 35 Industrial Way
+ P. O. Box 5005
+ Rochester, NH 03866-5005
+ USA
+ EMail: dbh@enterasys.com
+ phone: +1 603 337-2614
+
+ Editor: Randy Presuhn
+ BMC Software, Inc.
+ postal: 2141 North First Street
+ San Jose, CA 95131
+ USA
+ EMail: randy_presuhn@bmc.com
+ phone: +1 408 546-1006"
+ DESCRIPTION
+ "The MIB module for SNMP transport mappings.
+
+ Copyright (C) The Internet Society (2002). This
+ version of this MIB module is part of RFC 3417;
+ see the RFC itself for full legal notices.
+ "
+ REVISION "200210160000Z"
+ DESCRIPTION
+ "Clarifications, published as RFC 3417."
+ REVISION "199601010000Z"
+ DESCRIPTION
+ "Clarifications, published as RFC 1906."
+ REVISION "199304010000Z"
+ DESCRIPTION
+ "The initial version, published as RFC 1449."
+ ::= { snmpModules 19 }
+
+-- SNMP over UDP over IPv4
+
+snmpUDPDomain OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP over UDP over IPv4 transport domain.
+ The corresponding transport address is of type
+ SnmpUDPAddress."
+ ::= { snmpDomains 1 }
+
+
+
+
+
+
+
+
+SnmpUDPAddress ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "1d.1d.1d.1d/2d"
+ STATUS current
+ DESCRIPTION
+ "Represents a UDP over IPv4 address:
+
+ octets contents encoding
+ 1-4 IP-address network-byte order
+ 5-6 UDP-port network-byte order
+ "
+ SYNTAX OCTET STRING (SIZE (6))
+
+-- SNMP over OSI
+
+snmpCLNSDomain OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP over CLNS transport domain.
+ The corresponding transport address is of type
+ SnmpOSIAddress."
+ ::= { snmpDomains 2 }
+
+snmpCONSDomain OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP over CONS transport domain.
+ The corresponding transport address is of type
+ SnmpOSIAddress."
+ ::= { snmpDomains 3 }
+
+SnmpOSIAddress ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "*1x:/1x:"
+ STATUS current
+ DESCRIPTION
+ "Represents an OSI transport-address:
+
+ octets contents encoding
+ 1 length of NSAP 'n' as an unsigned-integer
+ (either 0 or from 3 to 20)
+ 2..(n+1) NSAP concrete binary representation
+ (n+2)..m TSEL string of (up to 64) octets
+ "
+ SYNTAX OCTET STRING (SIZE (1 | 4..85))
+
+
+
+
+
+
+
+
+-- SNMP over DDP
+
+snmpDDPDomain OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP over DDP transport domain. The corresponding
+ transport address is of type SnmpNBPAddress."
+ ::= { snmpDomains 4 }
+
+SnmpNBPAddress ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Represents an NBP name:
+
+ octets contents encoding
+ 1 length of object 'n' as an unsigned integer
+ 2..(n+1) object string of (up to 32) octets
+ n+2 length of type 'p' as an unsigned integer
+ (n+3)..(n+2+p) type string of (up to 32) octets
+ n+3+p length of zone 'q' as an unsigned integer
+ (n+4+p)..(n+3+p+q) zone string of (up to 32) octets
+
+ For comparison purposes, strings are
+ case-insensitive. All strings may contain any octet
+ other than 255 (hex ff)."
+ SYNTAX OCTET STRING (SIZE (3..99))
+
+-- SNMP over IPX
+
+snmpIPXDomain OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The SNMP over IPX transport domain. The corresponding
+ transport address is of type SnmpIPXAddress."
+ ::= { snmpDomains 5 }
+
+SnmpIPXAddress ::= TEXTUAL-CONVENTION
+ DISPLAY-HINT "4x.1x:1x:1x:1x:1x:1x.2d"
+ STATUS current
+ DESCRIPTION
+ "Represents an IPX address:
+
+ octets contents encoding
+ 1-4 network-number network-byte order
+ 5-10 physical-address network-byte order
+ 11-12 socket-number network-byte order
+ "
+ SYNTAX OCTET STRING (SIZE (12))
+
+
+
+-- for proxy to SNMPv1 (RFC 1157)
+
+rfc1157Proxy OBJECT IDENTIFIER ::= { snmpProxys 1 }
+
+rfc1157Domain OBJECT-IDENTITY
+ STATUS deprecated
+ DESCRIPTION
+ "The transport domain for SNMPv1 over UDP over IPv4.
+ The corresponding transport address is of type
+ SnmpUDPAddress."
+ ::= { rfc1157Proxy 1 }
+
+-- ::= { rfc1157Proxy 2 } this OID is obsolete
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/TCP-MIB b/contrib/apps/LwipMibCompiler/Mibs/TCP-MIB
new file mode 100644
index 0000000..5b9e0bf
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/TCP-MIB
@@ -0,0 +1,829 @@
+TCP-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, Unsigned32,
+ Gauge32, Counter32, Counter64, IpAddress, mib-2
+ FROM SNMPv2-SMI
+ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+ InetAddress, InetAddressType,
+ InetPortNumber FROM INET-ADDRESS-MIB;
+
+tcpMIB MODULE-IDENTITY
+ LAST-UPDATED "200502180000Z" -- 18 February 2005
+ ORGANIZATION
+ "IETF IPv6 MIB Revision Team
+ http://www.ietf.org/html.charters/ipv6-charter.html"
+ CONTACT-INFO
+ "Rajiv Raghunarayan (editor)
+
+ Cisco Systems Inc.
+ 170 West Tasman Drive
+ San Jose, CA 95134
+
+ Phone: +1 408 853 9612
+ Email: <raraghun@cisco.com>
+
+ Send comments to <ipv6@ietf.org>"
+ DESCRIPTION
+ "The MIB module for managing TCP implementations.
+
+ Copyright (C) The Internet Society (2005). This version
+ of this MIB module is a part of RFC 4022; see the RFC
+ itself for full legal notices."
+ REVISION "200502180000Z" -- 18 February 2005
+ DESCRIPTION
+ "IP version neutral revision, published as RFC 4022."
+ REVISION "9411010000Z"
+ DESCRIPTION
+ "Initial SMIv2 version, published as RFC 2012."
+ REVISION "9103310000Z"
+ DESCRIPTION
+ "The initial revision of this MIB module was part of
+ MIB-II."
+ ::= { mib-2 49 }
+
+-- the TCP base variables group
+
+
+
+
+tcp OBJECT IDENTIFIER ::= { mib-2 6 }
+
+-- Scalars
+
+tcpRtoAlgorithm OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1), -- none of the following
+ constant(2), -- a constant rto
+ rsre(3), -- MIL-STD-1778, Appendix B
+ vanj(4), -- Van Jacobson's algorithm
+ rfc2988(5) -- RFC 2988
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The algorithm used to determine the timeout value used for
+ retransmitting unacknowledged octets."
+ ::= { tcp 1 }
+
+tcpRtoMin OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ UNITS "milliseconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The minimum value permitted by a TCP implementation for
+ the retransmission timeout, measured in milliseconds.
+ More refined semantics for objects of this type depend
+ on the algorithm used to determine the retransmission
+ timeout; in particular, the IETF standard algorithm
+ rfc2988(5) provides a minimum value."
+ ::= { tcp 2 }
+
+tcpRtoMax OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ UNITS "milliseconds"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The maximum value permitted by a TCP implementation for
+ the retransmission timeout, measured in milliseconds.
+ More refined semantics for objects of this type depend
+ on the algorithm used to determine the retransmission
+ timeout; in particular, the IETF standard algorithm
+ rfc2988(5) provides an upper bound (as part of an
+ adaptive backoff algorithm)."
+ ::= { tcp 3 }
+
+
+
+
+tcpMaxConn OBJECT-TYPE
+ SYNTAX Integer32 (-1 | 0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The limit on the total number of TCP connections the entity
+ can support. In entities where the maximum number of
+ connections is dynamic, this object should contain the
+ value -1."
+ ::= { tcp 4 }
+
+tcpActiveOpens OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of times that TCP connections have made a direct
+ transition to the SYN-SENT state from the CLOSED state.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 5 }
+
+tcpPassiveOpens OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of times TCP connections have made a direct
+ transition to the SYN-RCVD state from the LISTEN state.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 6 }
+
+tcpAttemptFails OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of times that TCP connections have made a direct
+ transition to the CLOSED state from either the SYN-SENT
+ state or the SYN-RCVD state, plus the number of times that
+ TCP connections have made a direct transition to the
+ LISTEN state from the SYN-RCVD state.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+
+
+
+ ::= { tcp 7 }
+
+tcpEstabResets OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of times that TCP connections have made a direct
+ transition to the CLOSED state from either the ESTABLISHED
+ state or the CLOSE-WAIT state.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 8 }
+
+tcpCurrEstab OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of TCP connections for which the current state
+ is either ESTABLISHED or CLOSE-WAIT."
+ ::= { tcp 9 }
+
+tcpInSegs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments received, including those
+ received in error. This count includes segments received
+ on currently established connections.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 10 }
+
+tcpOutSegs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments sent, including those on
+ current connections but excluding those containing only
+ retransmitted octets.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+
+
+
+ ::= { tcp 11 }
+
+tcpRetransSegs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments retransmitted; that is, the
+ number of TCP segments transmitted containing one or more
+ previously transmitted octets.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 12 }
+
+tcpInErrs OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments received in error (e.g., bad
+ TCP checksums).
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 14 }
+
+tcpOutRsts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of TCP segments sent containing the RST flag.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 15 }
+
+-- { tcp 16 } was used to represent the ipv6TcpConnTable in RFC 2452,
+-- which has since been obsoleted. It MUST not be used.
+
+tcpHCInSegs OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments received, including those
+ received in error. This count includes segments received
+
+
+
+ on currently established connections. This object is
+ the 64-bit equivalent of tcpInSegs.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 17 }
+
+tcpHCOutSegs OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of segments sent, including those on
+ current connections but excluding those containing only
+ retransmitted octets. This object is the 64-bit
+ equivalent of tcpOutSegs.
+
+ Discontinuities in the value of this counter are
+ indicated via discontinuities in the value of sysUpTime."
+ ::= { tcp 18 }
+
+
+-- The TCP Connection table
+
+tcpConnectionTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF TcpConnectionEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A table containing information about existing TCP
+ connections. Note that unlike earlier TCP MIBs, there
+ is a separate table for connections in the LISTEN state."
+ ::= { tcp 19 }
+
+tcpConnectionEntry OBJECT-TYPE
+ SYNTAX TcpConnectionEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A conceptual row of the tcpConnectionTable containing
+ information about a particular current TCP connection.
+ Each row of this table is transient in that it ceases to
+ exist when (or soon after) the connection makes the
+ transition to the CLOSED state."
+ INDEX { tcpConnectionLocalAddressType,
+ tcpConnectionLocalAddress,
+ tcpConnectionLocalPort,
+ tcpConnectionRemAddressType,
+
+
+
+ tcpConnectionRemAddress,
+ tcpConnectionRemPort }
+ ::= { tcpConnectionTable 1 }
+
+TcpConnectionEntry ::= SEQUENCE {
+ tcpConnectionLocalAddressType InetAddressType,
+ tcpConnectionLocalAddress InetAddress,
+ tcpConnectionLocalPort InetPortNumber,
+ tcpConnectionRemAddressType InetAddressType,
+ tcpConnectionRemAddress InetAddress,
+ tcpConnectionRemPort InetPortNumber,
+ tcpConnectionState INTEGER,
+ tcpConnectionProcess Unsigned32
+ }
+
+tcpConnectionLocalAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of tcpConnectionLocalAddress."
+ ::= { tcpConnectionEntry 1 }
+
+tcpConnectionLocalAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local IP address for this TCP connection. The type
+ of this address is determined by the value of
+ tcpConnectionLocalAddressType.
+
+ As this object is used in the index for the
+ tcpConnectionTable, implementors should be
+ careful not to create entries that would result in OIDs
+ with more than 128 subidentifiers; otherwise the information
+ cannot be accessed by using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { tcpConnectionEntry 2 }
+
+tcpConnectionLocalPort OBJECT-TYPE
+ SYNTAX InetPortNumber
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local port number for this TCP connection."
+ ::= { tcpConnectionEntry 3 }
+
+tcpConnectionRemAddressType OBJECT-TYPE
+
+
+
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of tcpConnectionRemAddress."
+ ::= { tcpConnectionEntry 4 }
+
+tcpConnectionRemAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The remote IP address for this TCP connection. The type
+ of this address is determined by the value of
+ tcpConnectionRemAddressType.
+
+ As this object is used in the index for the
+ tcpConnectionTable, implementors should be
+ careful not to create entries that would result in OIDs
+ with more than 128 subidentifiers; otherwise the information
+ cannot be accessed by using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { tcpConnectionEntry 5 }
+
+tcpConnectionRemPort OBJECT-TYPE
+ SYNTAX InetPortNumber
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The remote port number for this TCP connection."
+ ::= { tcpConnectionEntry 6 }
+
+tcpConnectionState OBJECT-TYPE
+ SYNTAX INTEGER {
+ closed(1),
+ listen(2),
+ synSent(3),
+ synReceived(4),
+ established(5),
+ finWait1(6),
+ finWait2(7),
+ closeWait(8),
+ lastAck(9),
+ closing(10),
+ timeWait(11),
+ deleteTCB(12)
+ }
+ MAX-ACCESS read-write
+ STATUS current
+
+
+
+ DESCRIPTION
+ "The state of this TCP connection.
+
+ The value listen(2) is included only for parallelism to the
+ old tcpConnTable and should not be used. A connection in
+ LISTEN state should be present in the tcpListenerTable.
+
+ The only value that may be set by a management station is
+ deleteTCB(12). Accordingly, it is appropriate for an agent
+ to return a `badValue' response if a management station
+ attempts to set this object to any other value.
+
+ If a management station sets this object to the value
+ deleteTCB(12), then the TCB (as defined in [RFC793]) of
+ the corresponding connection on the managed node is
+ deleted, resulting in immediate termination of the
+ connection.
+
+ As an implementation-specific option, a RST segment may be
+ sent from the managed node to the other TCP endpoint (note,
+ however, that RST segments are not sent reliably)."
+ ::= { tcpConnectionEntry 7 }
+
+tcpConnectionProcess OBJECT-TYPE
+ SYNTAX Unsigned32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The system's process ID for the process associated with
+ this connection, or zero if there is no such process. This
+ value is expected to be the same as HOST-RESOURCES-MIB::
+ hrSWRunIndex or SYSAPPL-MIB::sysApplElmtRunIndex for some
+ row in the appropriate tables."
+ ::= { tcpConnectionEntry 8 }
+
+-- The TCP Listener table
+
+tcpListenerTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF TcpListenerEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A table containing information about TCP listeners. A
+ listening application can be represented in three
+ possible ways:
+
+ 1. An application that is willing to accept both IPv4 and
+ IPv6 datagrams is represented by
+
+
+
+ a tcpListenerLocalAddressType of unknown (0) and
+ a tcpListenerLocalAddress of ''h (a zero-length
+ octet-string).
+
+ 2. An application that is willing to accept only IPv4 or
+ IPv6 datagrams is represented by a
+ tcpListenerLocalAddressType of the appropriate address
+ type and a tcpListenerLocalAddress of '0.0.0.0' or '::'
+ respectively.
+
+ 3. An application that is listening for data destined
+ only to a specific IP address, but from any remote
+ system, is represented by a tcpListenerLocalAddressType
+ of an appropriate address type, with
+ tcpListenerLocalAddress as the specific local address.
+
+ NOTE: The address type in this table represents the
+ address type used for the communication, irrespective
+ of the higher-layer abstraction. For example, an
+ application using IPv6 'sockets' to communicate via
+ IPv4 between ::ffff:10.0.0.1 and ::ffff:10.0.0.2 would
+ use InetAddressType ipv4(1))."
+ ::= { tcp 20 }
+
+tcpListenerEntry OBJECT-TYPE
+ SYNTAX TcpListenerEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A conceptual row of the tcpListenerTable containing
+ information about a particular TCP listener."
+ INDEX { tcpListenerLocalAddressType,
+ tcpListenerLocalAddress,
+ tcpListenerLocalPort }
+ ::= { tcpListenerTable 1 }
+
+TcpListenerEntry ::= SEQUENCE {
+ tcpListenerLocalAddressType InetAddressType,
+ tcpListenerLocalAddress InetAddress,
+ tcpListenerLocalPort InetPortNumber,
+ tcpListenerProcess Unsigned32
+ }
+
+tcpListenerLocalAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+
+
+
+ "The address type of tcpListenerLocalAddress. The value
+ should be unknown (0) if connection initiations to all
+ local IP addresses are accepted."
+ ::= { tcpListenerEntry 1 }
+
+tcpListenerLocalAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local IP address for this TCP connection.
+
+ The value of this object can be represented in three
+ possible ways, depending on the characteristics of the
+ listening application:
+
+ 1. For an application willing to accept both IPv4 and
+ IPv6 datagrams, the value of this object must be
+ ''h (a zero-length octet-string), with the value
+ of the corresponding tcpListenerLocalAddressType
+ object being unknown (0).
+
+ 2. For an application willing to accept only IPv4 or
+ IPv6 datagrams, the value of this object must be
+ '0.0.0.0' or '::' respectively, with
+ tcpListenerLocalAddressType representing the
+ appropriate address type.
+
+ 3. For an application which is listening for data
+ destined only to a specific IP address, the value
+ of this object is the specific local address, with
+ tcpListenerLocalAddressType representing the
+ appropriate address type.
+
+ As this object is used in the index for the
+ tcpListenerTable, implementors should be
+ careful not to create entries that would result in OIDs
+ with more than 128 subidentifiers; otherwise the information
+ cannot be accessed, using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { tcpListenerEntry 2 }
+
+tcpListenerLocalPort OBJECT-TYPE
+ SYNTAX InetPortNumber
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local port number for this TCP connection."
+ ::= { tcpListenerEntry 3 }
+
+
+
+tcpListenerProcess OBJECT-TYPE
+ SYNTAX Unsigned32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The system's process ID for the process associated with
+ this listener, or zero if there is no such process. This
+ value is expected to be the same as HOST-RESOURCES-MIB::
+ hrSWRunIndex or SYSAPPL-MIB::sysApplElmtRunIndex for some
+ row in the appropriate tables."
+ ::= { tcpListenerEntry 4 }
+
+
+-- The deprecated TCP Connection table
+
+tcpConnTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF TcpConnEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "A table containing information about existing IPv4-specific
+ TCP connections or listeners. This table has been
+ deprecated in favor of the version neutral
+ tcpConnectionTable."
+ ::= { tcp 13 }
+
+tcpConnEntry OBJECT-TYPE
+ SYNTAX TcpConnEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "A conceptual row of the tcpConnTable containing information
+ about a particular current IPv4 TCP connection. Each row
+ of this table is transient in that it ceases to exist when
+ (or soon after) the connection makes the transition to the
+ CLOSED state."
+ INDEX { tcpConnLocalAddress,
+ tcpConnLocalPort,
+ tcpConnRemAddress,
+ tcpConnRemPort }
+ ::= { tcpConnTable 1 }
+
+TcpConnEntry ::= SEQUENCE {
+ tcpConnState INTEGER,
+ tcpConnLocalAddress IpAddress,
+ tcpConnLocalPort Integer32,
+ tcpConnRemAddress IpAddress,
+ tcpConnRemPort Integer32
+
+
+
+ }
+
+tcpConnState OBJECT-TYPE
+ SYNTAX INTEGER {
+ closed(1),
+ listen(2),
+ synSent(3),
+ synReceived(4),
+ established(5),
+ finWait1(6),
+ finWait2(7),
+ closeWait(8),
+ lastAck(9),
+ closing(10),
+ timeWait(11),
+ deleteTCB(12)
+ }
+ MAX-ACCESS read-write
+ STATUS deprecated
+ DESCRIPTION
+ "The state of this TCP connection.
+
+ The only value that may be set by a management station is
+ deleteTCB(12). Accordingly, it is appropriate for an agent
+ to return a `badValue' response if a management station
+ attempts to set this object to any other value.
+
+ If a management station sets this object to the value
+ deleteTCB(12), then the TCB (as defined in [RFC793]) of
+ the corresponding connection on the managed node is
+ deleted, resulting in immediate termination of the
+ connection.
+
+ As an implementation-specific option, a RST segment may be
+ sent from the managed node to the other TCP endpoint (note,
+ however, that RST segments are not sent reliably)."
+ ::= { tcpConnEntry 1 }
+
+tcpConnLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The local IP address for this TCP connection. In the case
+ of a connection in the listen state willing to
+ accept connections for any IP interface associated with the
+ node, the value 0.0.0.0 is used."
+ ::= { tcpConnEntry 2 }
+
+
+
+tcpConnLocalPort OBJECT-TYPE
+ SYNTAX Integer32 (0..65535)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The local port number for this TCP connection."
+ ::= { tcpConnEntry 3 }
+
+tcpConnRemAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The remote IP address for this TCP connection."
+ ::= { tcpConnEntry 4 }
+
+tcpConnRemPort OBJECT-TYPE
+ SYNTAX Integer32 (0..65535)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The remote port number for this TCP connection."
+ ::= { tcpConnEntry 5 }
+
+-- conformance information
+
+tcpMIBConformance OBJECT IDENTIFIER ::= { tcpMIB 2 }
+
+tcpMIBCompliances OBJECT IDENTIFIER ::= { tcpMIBConformance 1 }
+tcpMIBGroups OBJECT IDENTIFIER ::= { tcpMIBConformance 2 }
+
+-- compliance statements
+
+tcpMIBCompliance2 MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for systems that implement TCP.
+
+ A number of INDEX objects cannot be
+ represented in the form of OBJECT clauses in SMIv2 but
+ have the following compliance requirements,
+ expressed in OBJECT clause form in this description
+ clause:
+
+ -- OBJECT tcpConnectionLocalAddressType
+ -- SYNTAX InetAddressType { ipv4(1), ipv6(2) }
+ -- DESCRIPTION
+ -- This MIB requires support for only global IPv4
+
+
+
+ -- and IPv6 address types.
+ --
+ -- OBJECT tcpConnectionRemAddressType
+ -- SYNTAX InetAddressType { ipv4(1), ipv6(2) }
+ -- DESCRIPTION
+ -- This MIB requires support for only global IPv4
+ -- and IPv6 address types.
+ --
+ -- OBJECT tcpListenerLocalAddressType
+ -- SYNTAX InetAddressType { unknown(0), ipv4(1),
+ -- ipv6(2) }
+ -- DESCRIPTION
+ -- This MIB requires support for only global IPv4
+ -- and IPv6 address types. The type unknown also
+ -- needs to be supported to identify a special
+ -- case in the listener table: a listen using
+ -- both IPv4 and IPv6 addresses on the device.
+ --
+ "
+ MODULE -- this module
+ MANDATORY-GROUPS { tcpBaseGroup, tcpConnectionGroup,
+ tcpListenerGroup }
+ GROUP tcpHCGroup
+ DESCRIPTION
+ "This group is mandatory for systems that are capable
+ of receiving or transmitting more than 1 million TCP
+ segments per second. 1 million segments per second will
+ cause a Counter32 to wrap in just over an hour."
+ OBJECT tcpConnectionState
+ SYNTAX INTEGER { closed(1), listen(2), synSent(3),
+ synReceived(4), established(5),
+ finWait1(6), finWait2(7), closeWait(8),
+ lastAck(9), closing(10), timeWait(11) }
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required, nor is support for the value
+ deleteTCB (12)."
+ ::= { tcpMIBCompliances 2 }
+
+tcpMIBCompliance MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "The compliance statement for IPv4-only systems that
+ implement TCP. In order to be IP version independent, this
+ compliance statement is deprecated in favor of
+ tcpMIBCompliance2. However, agents are still encouraged
+ to implement these objects in order to interoperate with
+ the deployed base of managers."
+
+
+
+ MODULE -- this module
+ MANDATORY-GROUPS { tcpGroup }
+ OBJECT tcpConnState
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+ ::= { tcpMIBCompliances 1 }
+
+
+-- units of conformance
+
+tcpGroup OBJECT-GROUP
+ OBJECTS { tcpRtoAlgorithm, tcpRtoMin, tcpRtoMax,
+ tcpMaxConn, tcpActiveOpens,
+ tcpPassiveOpens, tcpAttemptFails,
+ tcpEstabResets, tcpCurrEstab, tcpInSegs,
+ tcpOutSegs, tcpRetransSegs, tcpConnState,
+ tcpConnLocalAddress, tcpConnLocalPort,
+ tcpConnRemAddress, tcpConnRemPort,
+ tcpInErrs, tcpOutRsts }
+ STATUS deprecated
+ DESCRIPTION
+ "The tcp group of objects providing for management of TCP
+ entities."
+ ::= { tcpMIBGroups 1 }
+
+tcpBaseGroup OBJECT-GROUP
+ OBJECTS { tcpRtoAlgorithm, tcpRtoMin, tcpRtoMax,
+ tcpMaxConn, tcpActiveOpens,
+ tcpPassiveOpens, tcpAttemptFails,
+ tcpEstabResets, tcpCurrEstab, tcpInSegs,
+ tcpOutSegs, tcpRetransSegs,
+ tcpInErrs, tcpOutRsts }
+ STATUS current
+ DESCRIPTION
+ "The group of counters common to TCP entities."
+ ::= { tcpMIBGroups 2 }
+
+tcpConnectionGroup OBJECT-GROUP
+ OBJECTS { tcpConnectionState, tcpConnectionProcess }
+ STATUS current
+ DESCRIPTION
+ "The group provides general information about TCP
+ connections."
+ ::= { tcpMIBGroups 3 }
+
+tcpListenerGroup OBJECT-GROUP
+ OBJECTS { tcpListenerProcess }
+
+
+
+ STATUS current
+ DESCRIPTION
+ "This group has objects providing general information about
+ TCP listeners."
+ ::= { tcpMIBGroups 4 }
+
+tcpHCGroup OBJECT-GROUP
+ OBJECTS { tcpHCInSegs, tcpHCOutSegs }
+ STATUS current
+ DESCRIPTION
+ "The group of objects providing for counters of high speed
+ TCP implementations."
+ ::= { tcpMIBGroups 5 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/Mibs/UDP-MIB b/contrib/apps/LwipMibCompiler/Mibs/UDP-MIB
new file mode 100644
index 0000000..b947b81
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/Mibs/UDP-MIB
@@ -0,0 +1,579 @@
+UDP-MIB DEFINITIONS ::= BEGIN
+
+IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter32, Counter64,
+ Unsigned32, IpAddress, mib-2 FROM SNMPv2-SMI
+ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+ InetAddress, InetAddressType,
+ InetPortNumber FROM INET-ADDRESS-MIB;
+
+udpMIB MODULE-IDENTITY
+ LAST-UPDATED "200505200000Z" -- May 20, 2005
+ ORGANIZATION
+ "IETF IPv6 Working Group
+ http://www.ietf.org/html.charters/ipv6-charter.html"
+ CONTACT-INFO
+ "Bill Fenner (editor)
+
+ AT&T Labs -- Research
+ 75 Willow Rd.
+ Menlo Park, CA 94025
+
+ Phone: +1 650 330-7893
+ Email: <fenner@research.att.com>
+
+ John Flick (editor)
+
+ Hewlett-Packard Company
+ 8000 Foothills Blvd. M/S 5557
+ Roseville, CA 95747
+
+ Phone: +1 916 785 4018
+ Email: <john.flick@hp.com>
+
+ Send comments to <ipv6@ietf.org>"
+
+
+
+ DESCRIPTION
+ "The MIB module for managing UDP implementations.
+ Copyright (C) The Internet Society (2005). This
+ version of this MIB module is part of RFC 4113;
+ see the RFC itself for full legal notices."
+ REVISION "200505200000Z" -- May 20, 2005
+ DESCRIPTION
+ "IP version neutral revision, incorporating the
+ following revisions:
+
+ - Added udpHCInDatagrams and udpHCOutDatagrams in order
+ to provide high-capacity counters for fast networks.
+ - Added text to the descriptions of all counter objects
+ to indicate how discontinuities are detected.
+ - Deprecated the IPv4-specific udpTable and replaced it
+ with the version neutral udpEndpointTable. This
+ table includes support for connected UDP endpoints
+ and support for identification of the operating
+ system process associated with a UDP endpoint.
+ - Deprecated the udpGroup and replaced it with object
+ groups representing the current set of objects.
+ - Deprecated udpMIBCompliance and replaced it with
+ udpMIBCompliance2, which includes the compliance
+ information for the new object groups.
+
+ This version published as RFC 4113."
+ REVISION "199411010000Z" -- November 1, 1994
+ DESCRIPTION
+ "Initial SMIv2 version, published as RFC 2013."
+ REVISION "199103310000Z" -- March 31, 1991
+ DESCRIPTION
+ "The initial revision of this MIB module was part of
+ MIB-II, published as RFC 1213."
+ ::= { mib-2 50 }
+
+-- the UDP group
+
+udp OBJECT IDENTIFIER ::= { mib-2 7 }
+
+udpInDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of UDP datagrams delivered to UDP
+ users.
+
+
+
+
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 1 }
+
+udpNoPorts OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of received UDP datagrams for which
+ there was no application at the destination port.
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 2 }
+
+udpInErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of received UDP datagrams that could not be
+ delivered for reasons other than the lack of an
+ application at the destination port.
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 3 }
+
+udpOutDatagrams OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of UDP datagrams sent from this
+ entity.
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 4 }
+
+
+
+udpHCInDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of UDP datagrams delivered to UDP
+ users, for devices that can receive more than 1
+ million UDP datagrams per second.
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 8 }
+
+udpHCOutDatagrams OBJECT-TYPE
+ SYNTAX Counter64
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total number of UDP datagrams sent from this
+ entity, for devices that can transmit more than 1
+ million UDP datagrams per second.
+
+ Discontinuities in the value of this counter can occur
+ at re-initialization of the management system, and at
+ other times as indicated by discontinuities in the
+ value of sysUpTime."
+ ::= { udp 9 }
+
+--
+-- { udp 6 } was defined as the ipv6UdpTable in RFC2454's
+-- IPV6-UDP-MIB. This RFC obsoletes RFC 2454, so { udp 6 } is
+-- obsoleted.
+--
+
+-- The UDP "Endpoint" table.
+
+udpEndpointTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF UdpEndpointEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A table containing information about this entity's UDP
+ endpoints on which a local application is currently
+ accepting or sending datagrams.
+
+
+
+
+
+ The address type in this table represents the address
+ type used for the communication, irrespective of the
+ higher-layer abstraction. For example, an application
+ using IPv6 'sockets' to communicate via IPv4 between
+ ::ffff:10.0.0.1 and ::ffff:10.0.0.2 would use
+ InetAddressType ipv4(1).
+
+ Unlike the udpTable in RFC 2013, this table also allows
+ the representation of an application that completely
+ specifies both local and remote addresses and ports. A
+ listening application is represented in three possible
+ ways:
+
+ 1) An application that is willing to accept both IPv4
+ and IPv6 datagrams is represented by a
+ udpEndpointLocalAddressType of unknown(0) and a
+ udpEndpointLocalAddress of ''h (a zero-length
+ octet-string).
+
+ 2) An application that is willing to accept only IPv4
+ or only IPv6 datagrams is represented by a
+ udpEndpointLocalAddressType of the appropriate
+ address type and a udpEndpointLocalAddress of
+ '0.0.0.0' or '::' respectively.
+
+ 3) An application that is listening for datagrams only
+ for a specific IP address but from any remote
+ system is represented by a
+ udpEndpointLocalAddressType of the appropriate
+ address type, with udpEndpointLocalAddress
+ specifying the local address.
+
+ In all cases where the remote is a wildcard, the
+ udpEndpointRemoteAddressType is unknown(0), the
+ udpEndpointRemoteAddress is ''h (a zero-length
+ octet-string), and the udpEndpointRemotePort is 0.
+
+ If the operating system is demultiplexing UDP packets
+ by remote address and port, or if the application has
+ 'connected' the socket specifying a default remote
+ address and port, the udpEndpointRemote* values should
+ be used to reflect this."
+ ::= { udp 7 }
+
+udpEndpointEntry OBJECT-TYPE
+ SYNTAX UdpEndpointEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+
+ DESCRIPTION
+ "Information about a particular current UDP endpoint.
+
+ Implementers need to be aware that if the total number
+ of elements (octets or sub-identifiers) in
+ udpEndpointLocalAddress and udpEndpointRemoteAddress
+ exceeds 111, then OIDs of column instances in this table
+ will have more than 128 sub-identifiers and cannot be
+ accessed using SNMPv1, SNMPv2c, or SNMPv3."
+ INDEX { udpEndpointLocalAddressType,
+ udpEndpointLocalAddress,
+ udpEndpointLocalPort,
+ udpEndpointRemoteAddressType,
+ udpEndpointRemoteAddress,
+ udpEndpointRemotePort,
+ udpEndpointInstance }
+ ::= { udpEndpointTable 1 }
+
+UdpEndpointEntry ::= SEQUENCE {
+ udpEndpointLocalAddressType InetAddressType,
+ udpEndpointLocalAddress InetAddress,
+ udpEndpointLocalPort InetPortNumber,
+ udpEndpointRemoteAddressType InetAddressType,
+ udpEndpointRemoteAddress InetAddress,
+ udpEndpointRemotePort InetPortNumber,
+ udpEndpointInstance Unsigned32,
+ udpEndpointProcess Unsigned32
+ }
+
+udpEndpointLocalAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of udpEndpointLocalAddress. Only
+ IPv4, IPv4z, IPv6, and IPv6z addresses are expected, or
+ unknown(0) if datagrams for all local IP addresses are
+ accepted."
+ ::= { udpEndpointEntry 1 }
+
+udpEndpointLocalAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local IP address for this UDP endpoint.
+
+ The value of this object can be represented in three
+
+
+
+ possible ways, depending on the characteristics of the
+ listening application:
+
+ 1. For an application that is willing to accept both
+ IPv4 and IPv6 datagrams, the value of this object
+ must be ''h (a zero-length octet-string), with
+ the value of the corresponding instance of the
+ udpEndpointLocalAddressType object being unknown(0).
+
+ 2. For an application that is willing to accept only IPv4
+ or only IPv6 datagrams, the value of this object
+ must be '0.0.0.0' or '::', respectively, while the
+ corresponding instance of the
+ udpEndpointLocalAddressType object represents the
+ appropriate address type.
+
+ 3. For an application that is listening for data
+ destined only to a specific IP address, the value
+ of this object is the specific IP address for which
+ this node is receiving packets, with the
+ corresponding instance of the
+ udpEndpointLocalAddressType object representing the
+ appropriate address type.
+
+ As this object is used in the index for the
+ udpEndpointTable, implementors of this table should be
+ careful not to create entries that would result in OIDs
+ with more than 128 subidentifiers; else the information
+ cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { udpEndpointEntry 2 }
+
+udpEndpointLocalPort OBJECT-TYPE
+ SYNTAX InetPortNumber
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The local port number for this UDP endpoint."
+ ::= { udpEndpointEntry 3 }
+
+udpEndpointRemoteAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The address type of udpEndpointRemoteAddress. Only
+ IPv4, IPv4z, IPv6, and IPv6z addresses are expected, or
+ unknown(0) if datagrams for all remote IP addresses are
+ accepted. Also, note that some combinations of
+
+
+
+ udpEndpointLocalAdressType and
+ udpEndpointRemoteAddressType are not supported. In
+ particular, if the value of this object is not
+ unknown(0), it is expected to always refer to the
+ same IP version as udpEndpointLocalAddressType."
+ ::= { udpEndpointEntry 4 }
+
+udpEndpointRemoteAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The remote IP address for this UDP endpoint. If
+ datagrams from any remote system are to be accepted,
+ this value is ''h (a zero-length octet-string).
+ Otherwise, it has the type described by
+ udpEndpointRemoteAddressType and is the address of the
+ remote system from which datagrams are to be accepted
+ (or to which all datagrams will be sent).
+
+ As this object is used in the index for the
+ udpEndpointTable, implementors of this table should be
+ careful not to create entries that would result in OIDs
+ with more than 128 subidentifiers; else the information
+ cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3."
+ ::= { udpEndpointEntry 5 }
+
+udpEndpointRemotePort OBJECT-TYPE
+ SYNTAX InetPortNumber
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The remote port number for this UDP endpoint. If
+ datagrams from any remote system are to be accepted,
+ this value is zero."
+ ::= { udpEndpointEntry 6 }
+
+udpEndpointInstance OBJECT-TYPE
+ SYNTAX Unsigned32 (1..'ffffffff'h)
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The instance of this tuple. This object is used to
+ distinguish among multiple processes 'connected' to
+ the same UDP endpoint. For example, on a system
+ implementing the BSD sockets interface, this would be
+ used to support the SO_REUSEADDR and SO_REUSEPORT
+ socket options."
+
+
+
+ ::= { udpEndpointEntry 7 }
+
+udpEndpointProcess OBJECT-TYPE
+ SYNTAX Unsigned32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The system's process ID for the process associated with
+ this endpoint, or zero if there is no such process.
+ This value is expected to be the same as
+ HOST-RESOURCES-MIB::hrSWRunIndex or SYSAPPL-MIB::
+ sysApplElmtRunIndex for some row in the appropriate
+ tables."
+ ::= { udpEndpointEntry 8 }
+
+-- The deprecated UDP Listener table
+
+-- The deprecated UDP listener table only contains information
+-- about this entity's IPv4 UDP end-points on which a local
+-- application is currently accepting datagrams. It does not
+-- provide more detailed connection information, or information
+-- about IPv6 endpoints.
+
+udpTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF UdpEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "A table containing IPv4-specific UDP listener
+ information. It contains information about all local
+ IPv4 UDP end-points on which an application is
+ currently accepting datagrams. This table has been
+ deprecated in favor of the version neutral
+ udpEndpointTable."
+ ::= { udp 5 }
+
+udpEntry OBJECT-TYPE
+ SYNTAX UdpEntry
+ MAX-ACCESS not-accessible
+ STATUS deprecated
+ DESCRIPTION
+ "Information about a particular current UDP listener."
+ INDEX { udpLocalAddress, udpLocalPort }
+ ::= { udpTable 1 }
+
+UdpEntry ::= SEQUENCE {
+ udpLocalAddress IpAddress,
+ udpLocalPort Integer32
+
+
+
+}
+
+udpLocalAddress OBJECT-TYPE
+ SYNTAX IpAddress
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The local IP address for this UDP listener. In the
+ case of a UDP listener that is willing to accept
+ datagrams for any IP interface associated with the
+ node, the value 0.0.0.0 is used."
+ ::= { udpEntry 1 }
+
+udpLocalPort OBJECT-TYPE
+ SYNTAX Integer32 (0..65535)
+ MAX-ACCESS read-only
+ STATUS deprecated
+ DESCRIPTION
+ "The local port number for this UDP listener."
+ ::= { udpEntry 2 }
+
+-- conformance information
+
+udpMIBConformance OBJECT IDENTIFIER ::= { udpMIB 2 }
+udpMIBCompliances OBJECT IDENTIFIER ::= { udpMIBConformance 1 }
+udpMIBGroups OBJECT IDENTIFIER ::= { udpMIBConformance 2 }
+
+-- compliance statements
+
+udpMIBCompliance2 MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The compliance statement for systems that implement
+ UDP.
+
+ There are a number of INDEX objects that cannot be
+ represented in the form of OBJECT clauses in SMIv2, but
+ for which we have the following compliance
+ requirements, expressed in OBJECT clause form in this
+ description clause:
+
+ -- OBJECT udpEndpointLocalAddressType
+ -- SYNTAX InetAddressType { unknown(0), ipv4(1),
+ -- ipv6(2), ipv4z(3),
+ -- ipv6z(4) }
+ -- DESCRIPTION
+ -- Support for dns(5) is not required.
+ -- OBJECT udpEndpointLocalAddress
+
+
+
+ -- SYNTAX InetAddress (SIZE(0|4|8|16|20))
+ -- DESCRIPTION
+ -- Support is only required for zero-length
+ -- octet-strings, and for scoped and unscoped
+ -- IPv4 and IPv6 addresses.
+ -- OBJECT udpEndpointRemoteAddressType
+ -- SYNTAX InetAddressType { unknown(0), ipv4(1),
+ -- ipv6(2), ipv4z(3),
+ -- ipv6z(4) }
+ -- DESCRIPTION
+ -- Support for dns(5) is not required.
+ -- OBJECT udpEndpointRemoteAddress
+ -- SYNTAX InetAddress (SIZE(0|4|8|16|20))
+ -- DESCRIPTION
+ -- Support is only required for zero-length
+ -- octet-strings, and for scoped and unscoped
+ -- IPv4 and IPv6 addresses.
+ "
+ MODULE -- this module
+ MANDATORY-GROUPS { udpBaseGroup, udpEndpointGroup }
+ GROUP udpHCGroup
+ DESCRIPTION
+ "This group is mandatory for systems that
+ are capable of receiving or transmitting more than
+ 1 million UDP datagrams per second. 1 million
+ datagrams per second will cause a Counter32 to
+ wrap in just over an hour."
+ ::= { udpMIBCompliances 2 }
+
+udpMIBCompliance MODULE-COMPLIANCE
+ STATUS deprecated
+ DESCRIPTION
+ "The compliance statement for IPv4-only systems that
+ implement UDP. For IP version independence, this
+ compliance statement is deprecated in favor of
+ udpMIBCompliance2. However, agents are still
+ encouraged to implement these objects in order to
+ interoperate with the deployed base of managers."
+ MODULE -- this module
+ MANDATORY-GROUPS { udpGroup }
+ ::= { udpMIBCompliances 1 }
+
+-- units of conformance
+
+udpGroup OBJECT-GROUP
+ OBJECTS { udpInDatagrams, udpNoPorts,
+ udpInErrors, udpOutDatagrams,
+ udpLocalAddress, udpLocalPort }
+
+
+
+ STATUS deprecated
+ DESCRIPTION
+ "The deprecated group of objects providing for
+ management of UDP over IPv4."
+ ::= { udpMIBGroups 1 }
+
+udpBaseGroup OBJECT-GROUP
+ OBJECTS { udpInDatagrams, udpNoPorts, udpInErrors,
+ udpOutDatagrams }
+ STATUS current
+ DESCRIPTION
+ "The group of objects providing for counters of UDP
+ statistics."
+ ::= { udpMIBGroups 2 }
+
+udpHCGroup OBJECT-GROUP
+ OBJECTS { udpHCInDatagrams, udpHCOutDatagrams }
+ STATUS current
+ DESCRIPTION
+ "The group of objects providing for counters of high
+ speed UDP implementations."
+ ::= { udpMIBGroups 3 }
+
+udpEndpointGroup OBJECT-GROUP
+ OBJECTS { udpEndpointProcess }
+ STATUS current
+ DESCRIPTION
+ "The group of objects providing for the IP version
+ independent management of UDP 'endpoints'."
+ ::= { udpMIBGroups 4 }
+
+END
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs
new file mode 100644
index 0000000..831f117
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.Collections;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public class DisplayHint
+ {
+ private enum NumType {
+ dec,
+ hex,
+ oct,
+ bin,
+ str
+ }
+
+ private string _str;
+ private NumType _type;
+ private int _decimalPoints = 0;
+
+ public DisplayHint(string str)
+ {
+ _str = str;
+ if (str.StartsWith("d"))
+ {
+ _type = NumType.dec;
+ if (str.StartsWith("d-"))
+ {
+ _decimalPoints = Convert.ToInt32(str.Substring(2));
+ }
+ }
+ else if (str.StartsWith("o"))
+ {
+ _type = NumType.oct;
+ }
+ else if (str.StartsWith("h"))
+ {
+ _type = NumType.hex;
+ }
+ else if (str.StartsWith("b"))
+ {
+ _type = NumType.bin;
+ }
+ else
+ {
+ _type = NumType.str;
+ foreach (char c in str)
+ {
+
+ }
+ }
+
+ }
+
+ public override string ToString()
+ {
+ return _str;
+ }
+
+ internal object Decode(int i)
+ {
+ switch (_type)
+ {
+ case NumType.dec:
+ if (_decimalPoints == 0)
+ {
+ return i;
+ }
+ else
+ {
+ return i / Math.Pow(10.0, _decimalPoints);
+ }
+ case NumType.hex:
+ return System.Convert.ToString(i, 16);
+ case NumType.oct:
+ return System.Convert.ToString(i, 8);
+ case NumType.bin:
+ return System.Convert.ToString(i, 2);
+ default:
+ return null;
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs
new file mode 100644
index 0000000..2f79cce
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs
@@ -0,0 +1,29 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/31
+ * Time: 13:18
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// The AGENT-CAPABILITIES construct is used to specify implementation characteristics of an SNMP agent sub-system with respect to object types and events.
+ /// </summary>
+ public sealed class AgentCapabilities : EntityBase
+ {
+ /// <summary>
+ /// Creates an <see cref="AgentCapabilities"/> instance.
+ /// </summary>
+ /// <param name="module"></param>
+ /// <param name="header"></param>
+ /// <param name="lexer"></param>
+ public AgentCapabilities(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs
new file mode 100644
index 0000000..6da9b18
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs
@@ -0,0 +1,46 @@
+using System;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ public abstract class EntityBase: IEntity
+ {
+ private readonly IModule _module;
+ private string _parent;
+ private readonly uint _value;
+ private readonly string _name;
+
+ public EntityBase(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ {
+ _module = module;
+ _name = preAssignSymbols[0].ToString();
+
+ Lexer.ParseOidValue(symbols, out _parent, out _value);
+ }
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ public string Parent
+ {
+ get { return _parent; }
+ set { _parent = value; }
+ }
+
+ public uint Value
+ {
+ get { return _value; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ public virtual string Description
+ {
+ get { return string.Empty; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs
new file mode 100644
index 0000000..7360a47
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs
@@ -0,0 +1,62 @@
+// Entity interface.
+// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/19
+ * Time: 20:10
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Basic interface for all elements building up the MIB tree, thus having an OID as value.
+ /// </summary>
+ public interface IEntity : IDeclaration
+ {
+ /// <summary>
+ /// Parent name.
+ /// </summary>
+ string Parent
+ {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Value.
+ /// </summary>
+ uint Value
+ {
+ get;
+ }
+
+ /// <summary>
+ /// Gets the description.
+ /// </summary>
+ /// <value>The description.</value>
+ string Description
+ {
+ get;
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs
new file mode 100644
index 0000000..008c354
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs
@@ -0,0 +1,23 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/21
+ * Time: 19:35
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Description of ModuleComplianceNode.
+ /// </summary>
+ public sealed class ModuleCompliance : EntityBase
+ {
+ public ModuleCompliance(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs
new file mode 100644
index 0000000..6de28ce
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs
@@ -0,0 +1,10 @@
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ public sealed class ModuleIdentity : EntityBase
+ {
+ public ModuleIdentity(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs
new file mode 100644
index 0000000..27d3e4c
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs
@@ -0,0 +1,22 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/21
+ * Time: 19:34
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Description of NotificationGroupNode.
+ /// </summary>
+ public sealed class NotificationGroup : EntityBase
+ {
+ public NotificationGroup(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs
new file mode 100644
index 0000000..7386e21
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs
@@ -0,0 +1,11 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ public sealed class NotificationType : EntityBase
+ {
+ public NotificationType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs
new file mode 100644
index 0000000..d846cdb
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs
@@ -0,0 +1,22 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/21
+ * Time: 19:27
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Description of ObjectGroupNode.
+ /// </summary>
+ public sealed class ObjectGroup : EntityBase
+ {
+ public ObjectGroup(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs
new file mode 100644
index 0000000..9c1e084
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs
@@ -0,0 +1,21 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Object identifier node.
+ /// </summary>
+ public sealed class ObjectIdentity : EntityBase
+ {
+
+ /// <summary>
+ /// Creates a <see cref="ObjectIdentity"/>.
+ /// </summary>
+ /// <param name="module">Module name</param>
+ /// <param name="header">Header</param>
+ /// <param name="lexer">Lexer</param>
+ public ObjectIdentity(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs
new file mode 100644
index 0000000..3a8b567
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs
@@ -0,0 +1,336 @@
+using System;
+using System.Collections.Generic;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ public sealed class ObjectType : EntityBase, ITypeReferrer
+ {
+ private ITypeAssignment _syntax;
+ private string _units;
+ private MaxAccess _access;
+ private Status _status;
+ private string _description;
+ private string _reference;
+ private IList<string> _indices;
+ private string _augments;
+ private string _defVal;
+
+ public ObjectType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ ParseProperties(preAssignSymbols);
+ }
+
+ private void ParseProperties(SymbolList header)
+ {
+ ISymbolEnumerator headerSymbols = header.GetSymbolEnumerator();
+ Symbol temp = headerSymbols.NextNonEOLSymbol();
+
+ // Skip name
+ temp = headerSymbols.NextNonEOLSymbol();
+ temp.Expect(Symbol.ObjectType);
+
+ _syntax = ParseSyntax (Module, headerSymbols);
+ _units = ParseUnits (headerSymbols);
+ _access = ParseAccess (headerSymbols);
+ _status = ParseStatus (headerSymbols);
+ _description = ParseDescription (headerSymbols);
+ _reference = ParseReference (headerSymbols);
+ _indices = ParseIndices (headerSymbols);
+ _augments = ParseAugments (headerSymbols);
+ _defVal = ParseDefVal (headerSymbols);
+ }
+
+ private static string ParseAugments(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Augments)
+ {
+ string augment = null;
+
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenBracket);
+
+ current = symbols.NextNonEOLSymbol();
+ augment = current.ToString();
+
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseBracket);
+
+ return augment;
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static string ParseDefVal(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.DefVal)
+ {
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenBracket);
+
+ string defVal = null;
+ current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.OpenBracket)
+ {
+ int depth = 1;
+ // TODO: decode this.
+ while (depth > 0)
+ {
+ current = symbols.NextNonEOLSymbol();
+ if (current == Symbol.OpenBracket)
+ {
+ depth++;
+ }
+ else if (current == Symbol.CloseBracket)
+ {
+ depth--;
+ }
+ }
+ }
+ else
+ {
+ defVal = current.ToString();
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseBracket);
+ }
+
+ return defVal;
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static IList<string> ParseIndices(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Index)
+ {
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenBracket);
+
+ List<string> indices = new List<string>();
+
+ while (current != Symbol.CloseBracket)
+ {
+ current = symbols.NextNonEOLSymbol();
+
+ bool lastIndex = false;
+ if (current == Symbol.Implied)
+ {
+ current = symbols.NextNonEOLSymbol();
+ lastIndex = true; // 'IMPLIED' may only be used for last index
+ }
+
+ current.Assert((current != Symbol.Comma) && (current != Symbol.CloseBracket), "Expected index name but found symbol!");
+ indices.Add(current.ToString());
+
+ current = symbols.NextNonEOLSymbol();
+ if (lastIndex)
+ {
+ current.Expect(Symbol.CloseBracket);
+ }
+ else
+ {
+ current.Expect(Symbol.Comma, Symbol.CloseBracket);
+ }
+ }
+
+ return indices;
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static string ParseReference(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Reference)
+ {
+ return symbols.NextNonEOLSymbol().ToString();
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static string ParseDescription(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Description)
+ {
+ return symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' });
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static Status ParseStatus(ISymbolEnumerator symbols)
+ {
+ Status status = Status.obsolete;
+
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.Status);
+
+ current = symbols.NextNonEOLSymbol();
+ try
+ {
+ status = (Status)Enum.Parse(typeof(Status), current.ToString());
+ }
+ catch (ArgumentException)
+ {
+ current.Assert(false, "Invalid/Unknown status");
+ }
+
+ return status;
+ }
+
+ private static MaxAccess ParseAccess(ISymbolEnumerator symbols)
+ {
+ MaxAccess access = MaxAccess.notAccessible;
+
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.MaxAccess, Symbol.Access);
+
+ current = symbols.NextNonEOLSymbol();
+ switch (current.ToString())
+ {
+ case "not-accessible":
+ access = MaxAccess.notAccessible;
+ break;
+ case "accessible-for-notify":
+ access = MaxAccess.accessibleForNotify;
+ break;
+ case "read-only":
+ access = MaxAccess.readOnly;
+ break;
+ case "read-write":
+ access = MaxAccess.readWrite;
+ break;
+ case "read-create":
+ access = MaxAccess.readCreate;
+ break;
+ case "write-only":
+ access = MaxAccess.readWrite;
+ break;
+ default:
+ current.Assert(false, "Invalid/Unknown access");
+ break;
+ }
+
+ return access;
+ }
+
+ private static string ParseUnits(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Units)
+ {
+ return symbols.NextNonEOLSymbol().ToString();
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+
+ return null;
+ }
+
+ private static ITypeAssignment ParseSyntax(IModule module, ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.Syntax);
+
+ return Lexer.ParseBasicTypeDef(module, String.Empty, symbols, isMacroSyntax: true);
+ }
+
+ private static bool IsProperty(Symbol sym)
+ {
+ string s = sym.ToString();
+ return s == "SYNTAX" || s == "MAX-ACCESS" || s == "STATUS" || s == "DESCRIPTION";
+ }
+
+ public ITypeAssignment Syntax
+ {
+ get { return _syntax; }
+ internal set { _syntax = value; }
+ }
+
+ public override string Description
+ {
+ get { return _description; }
+ }
+
+ public MaxAccess Access
+ {
+ get { return _access; }
+ }
+
+ public IList<string> Indices
+ {
+ get { return _indices; }
+ }
+
+ public string Augments
+ {
+ get { return _augments; }
+ }
+
+ #region ITypeReferrer Member
+
+ public ITypeAssignment ReferredType
+ {
+ get { return _syntax; }
+ set { _syntax = value; }
+ }
+
+ public ITypeAssignment BaseType
+ {
+ get
+ {
+ ITypeReferrer tr = this;
+ ITypeAssignment result = null;
+
+ while ((tr != null) && (tr.ReferredType != null))
+ {
+ result = tr.ReferredType;
+ tr = tr.ReferredType as ITypeReferrer;
+ }
+
+ return result;
+ }
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs
new file mode 100644
index 0000000..3c65940
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs
@@ -0,0 +1,30 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 20:49
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Entities
+{
+ /// <summary>
+ /// Object identifier node.
+ /// </summary>
+ public sealed class OidValueAssignment : EntityBase
+ {
+ /// <summary>
+ /// Creates a <see cref="OidValueAssignment"/>.
+ /// </summary>
+ /// <param name="module">Module</param>
+ /// <param name="name">Name</param>
+ /// <param name="lexer">Lexer</param>
+ public OidValueAssignment(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ : base(module, preAssignSymbols, symbols)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs
new file mode 100644
index 0000000..c1e66e3
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs
@@ -0,0 +1,56 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/6/7
+ * Time: 17:34
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ /// <summary>
+ /// Description of Exports.
+ /// </summary>
+ public sealed class Exports: IElement
+ {
+ private IModule _module;
+ private readonly IList<string> _types = new List<string>();
+
+ public Exports(IModule module, ISymbolEnumerator s)
+ {
+ _module = module;
+
+ Symbol previous = null;
+ Symbol current;
+ do
+ {
+ current = s.NextSymbol();
+
+ if (current == Symbol.EOL)
+ {
+ continue;
+ }
+ else if (((current == Symbol.Comma) || (current == Symbol.Semicolon)) && (previous != null))
+ {
+ previous.AssertIsValidIdentifier();
+ _types.Add(previous.ToString());
+ }
+
+ previous = current;
+ }
+ while (current != Symbol.Semicolon);
+ }
+
+ #region IElement Member
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs
new file mode 100644
index 0000000..0958ac6
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ public interface IDeclaration: IElement
+ {
+ /// <summary>
+ /// Name.
+ /// </summary>
+ string Name
+ {
+ get;
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs
new file mode 100644
index 0000000..e2db7fd
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs
@@ -0,0 +1,35 @@
+// Construct interface.
+// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ /// <summary>
+ /// Construct interface.
+ /// </summary>
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1040:AvoidEmptyInterfaces")]
+ public interface IElement
+ {
+ /// <summary>
+ /// Containing module.
+ /// </summary>
+ IModule Module
+ {
+ get;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs
new file mode 100644
index 0000000..f0f5705
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs
@@ -0,0 +1,10 @@
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ public interface ITypeReferrer
+ {
+ ITypeAssignment ReferredType { get; set; }
+ ITypeAssignment BaseType { get; }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs
new file mode 100644
index 0000000..3a4ec6e
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs
@@ -0,0 +1,81 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/31
+ * Time: 12:07
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ /// <summary>
+ /// The IMPORTS construct is used to specify items used in the current MIB module which are defined in another MIB module or ASN.1 module.
+ /// </summary>
+ public sealed class Imports : List<ImportsFrom>, IElement
+ {
+ private IModule _module;
+
+ /// <summary>
+ /// Creates an <see cref="Imports"/> instance.
+ /// </summary>
+ /// <param name="lexer"></param>
+ public Imports(IModule module, ISymbolEnumerator symbols)
+ {
+ _module = module;
+
+ Symbol current;
+ while ((current = symbols.NextSymbol()) != Symbol.Semicolon)
+ {
+ if (current == Symbol.EOL)
+ {
+ continue;
+ }
+
+ ImportsFrom imports = new ImportsFrom(current, symbols);
+
+ this.Add(imports);
+ }
+ }
+
+ public IList<string> Dependents
+ {
+ get
+ {
+ List<string> result = new List<string>();
+
+ foreach (ImportsFrom import in this)
+ {
+ result.Add(import.Module);
+ }
+
+ return result;
+ }
+ }
+
+ public ImportsFrom GetImportFromType(string type)
+ {
+ foreach (ImportsFrom import in this)
+ {
+ if (import.Types.Contains(type))
+ {
+ return import;
+ }
+ }
+
+ return null;
+ }
+
+ #region IElement Member
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs
new file mode 100644
index 0000000..cd5154b
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs
@@ -0,0 +1,60 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/31
+ * Time: 12:07
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ public sealed class ImportsFrom
+ {
+ private readonly string _module;
+ private readonly List<string> _types = new List<string>();
+
+ public ImportsFrom(Symbol last, ISymbolEnumerator symbols)
+ {
+ Symbol previous = last;
+ Symbol current;
+ while ((current = symbols.NextSymbol()) != Symbol.From)
+ {
+ if (current == Symbol.EOL)
+ {
+ continue;
+ }
+
+ if (current == Symbol.Comma)
+ {
+ previous.AssertIsValidIdentifier();
+ _types.Add(previous.ToString());
+ }
+
+ previous = current;
+ }
+
+ previous.AssertIsValidIdentifier();
+ _types.Add(previous.ToString());
+
+ _module = symbols.NextSymbol().ToString().ToUpperInvariant(); // module names are uppercase
+ }
+
+ public string Module
+ {
+ get { return _module; }
+ }
+
+ public IList<string> Types
+ {
+ get { return _types; }
+ }
+
+ public override string ToString()
+ {
+ return string.Join(", ", _types.ToArray()) + " FROM " + _module;
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs
new file mode 100644
index 0000000..9c5ca45
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs
@@ -0,0 +1,48 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/31
+ * Time: 12:20
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements
+{
+ public sealed class TrapType : IDeclaration
+ {
+ private readonly IModule _module;
+ private readonly string _name;
+ private readonly int _value;
+
+ public TrapType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ {
+ _module = module;
+ _name = preAssignSymbols[0].ToString();
+
+ Symbol valueSymbol = symbols.NextNonEOLSymbol();
+
+ bool succeeded = int.TryParse(valueSymbol.ToString(), out _value);
+ valueSymbol.Assert(succeeded, "not a decimal");
+ }
+
+ public int Value
+ {
+ get { return _value; }
+ }
+
+ #region IDeclaration Member
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs
new file mode 100644
index 0000000..a441281
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs
@@ -0,0 +1,54 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public abstract class BaseType : ITypeAssignment
+ {
+ private IModule _module;
+ private string _name;
+
+ protected BaseType(IModule module, string name)
+ {
+ _module = module;
+ _name = name;
+ }
+
+ public virtual IModule Module
+ {
+ // differentiate between:
+ // FddiTimeNano ::= INTEGER (0..2147483647)
+ // which is an IntegerType which appears under Types in a MibModule and therefore has a name and module
+ // and
+ // SYNTAX INTEGER (0..2147483647)
+ // which is also an IntegerType but not defined as a separate type and therefore has NO name and NO module
+ get
+ {
+ if (!string.IsNullOrEmpty(_name))
+ {
+ return _module;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ protected set { _module = value; }
+ }
+
+ public virtual string Name
+ {
+ get
+ {
+ if (!string.IsNullOrEmpty(_name))
+ {
+ return _name;
+ }
+ else
+ {
+ return "{ Implicit Base Type }";
+ }
+ }
+ protected set { _name = value; }
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs
new file mode 100644
index 0000000..a64c8db
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public class BitsType : BaseType
+ {
+ private ValueMap _map;
+
+ public BitsType(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ _map = Lexer.DecodeEnumerations(symbols);
+ }
+
+ public ValueMap Map
+ {
+ get { return _map; }
+ }
+
+ public string this[int value]
+ {
+ get { return _map[value]; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs
new file mode 100644
index 0000000..c66d1f3
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs
@@ -0,0 +1,35 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/31
+ * Time: 11:39
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /// <summary>
+ /// The CHOICE type represents a list of alternatives..
+ /// </summary>
+ public sealed class Choice : BaseType
+ {
+ /// <summary>
+ /// Creates a <see cref="Choice"/> instance.
+ /// </summary>
+ /// <param name="module"></param>
+ /// <param name="name"></param>
+ /// <param name="lexer"></param>
+ public Choice(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ while (symbols.NextNonEOLSymbol() != Symbol.OpenBracket)
+ {
+ }
+
+ while (symbols.NextNonEOLSymbol() != Symbol.CloseBracket)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs
new file mode 100644
index 0000000..e962f9d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs
@@ -0,0 +1,6 @@
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public interface ITypeAssignment : IDeclaration
+ {
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs
new file mode 100644
index 0000000..4841ad5
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs
@@ -0,0 +1,117 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/7/25
+ * Time: 20:41
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /// <summary>
+ /// The INTEGER type represents a list of alternatives, or a range of numbers..
+ /// Includes Integer32 as it's indistinguishable from INTEGER.
+ /// </summary>
+ /**
+ * As this type is used for Integer32 as well as INTEGER it incorrectly
+ * allows enumeration sub-typing of Integer32. This is ok as currently we
+ * do not care about detecting incorrect MIBs and this doesn't block the
+ * decoding of correct MIBs.
+ */
+ public sealed class IntegerType : BaseType
+ {
+ public enum Types
+ {
+ Integer,
+ Integer32
+ }
+
+ private Types _type;
+ private bool _isEnumeration;
+ private ValueMap _map;
+ private ValueRanges _ranges;
+
+ /// <summary>
+ /// Creates an <see cref="IntegerType"/> instance.
+ /// </summary>
+ /// <param name="module"></param>
+ /// <param name="name"></param>
+ /// <param name="enumerator"></param>
+ public IntegerType(IModule module, string name, Symbol type, ISymbolEnumerator symbols)
+ : base (module, name)
+ {
+ Types? t = GetExactType(type);
+ type.Assert(t.HasValue, "Unknown symbol for unsigned type!");
+ _type = t.Value;
+
+ _isEnumeration = false;
+
+ Symbol current = symbols.NextNonEOLSymbol();
+ if (current == Symbol.OpenBracket)
+ {
+ _isEnumeration = true;
+ symbols.PutBack(current);
+ _map = Lexer.DecodeEnumerations(symbols);
+ }
+ else if (current == Symbol.OpenParentheses)
+ {
+ symbols.PutBack(current);
+ _ranges = Lexer.DecodeRanges(symbols);
+ current.Assert(!_ranges.IsSizeDeclaration, "SIZE keyword is not allowed for ranges of integer types!");
+ }
+ else
+ {
+ symbols.PutBack(current);
+ }
+ }
+
+ public Types Type
+ {
+ get { return _type; }
+ }
+
+ public ValueRanges Ranges
+ {
+ get { return _ranges; }
+ }
+
+ public bool IsEnumeration
+ {
+ get
+ {
+ return _isEnumeration;
+ }
+ }
+
+ public ValueMap Enumeration
+ {
+ get { return _isEnumeration ? _map : null; }
+ }
+
+ internal static Types? GetExactType(Symbol symbol)
+ {
+ if (symbol == Symbol.Integer)
+ {
+ // represents the ASN.1 builtin INTEGER type:
+ // may be represent any arbitrary (signed/unsigned) integer (in theory may have any size)
+ return Types.Integer;
+ }
+ else if (symbol == Symbol.Integer32)
+ {
+ // Integer32 ::= INTEGER (-2147483648..2147483647) // from SNMPv2-SMI
+ return Types.Integer32;
+ }
+
+ return null;
+ }
+
+ internal static bool IsIntegerType(Symbol symbol)
+ {
+ return GetExactType(symbol).HasValue;
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs
new file mode 100644
index 0000000..84d78d6
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs
@@ -0,0 +1,21 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public class IpAddressType : OctetStringType
+ {
+ public IpAddressType(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name, symbols)
+ {
+ if (this.Size.Count != 0)
+ {
+ throw new MibException("Size definition not allowed for IpAddress type!");
+ }
+
+ // IpAddress type is defined as:
+ // IpAddress ::=
+ // [APPLICATION 0]
+ // IMPLICIT OCTET STRING (SIZE (4))
+ this.Size.Add(new ValueRange(4, null));
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs
new file mode 100644
index 0000000..9f911ac
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs
@@ -0,0 +1,34 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public sealed class Macro : ITypeAssignment
+ {
+ private IModule _module;
+ private string _name;
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "temp")]
+ public Macro(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ {
+ _module = module;
+ _name = preAssignSymbols[0].ToString();
+
+ while (symbols.NextNonEOLSymbol() != Symbol.Begin)
+ {
+ }
+
+ while (symbols.NextNonEOLSymbol() != Symbol.End)
+ {
+ }
+ }
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs
new file mode 100644
index 0000000..cacd415
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs
@@ -0,0 +1,11 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public class ObjectIdentifierType : BaseType
+ {
+ public ObjectIdentifierType(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs
new file mode 100644
index 0000000..f6453ce
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public class OctetStringType : BaseType
+ {
+ private ValueRanges _size;
+
+ public OctetStringType(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ if (current == Symbol.OpenParentheses)
+ {
+ symbols.PutBack(current);
+ _size = Lexer.DecodeRanges(symbols);
+ current.Assert(_size.IsSizeDeclaration, "SIZE keyword is required for ranges of octet string!");
+ }
+ else
+ {
+ symbols.PutBack(current);
+ _size = new ValueRanges(isSizeDecl: true);
+ }
+ }
+
+ public ValueRanges Size
+ {
+ get { return _size; }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs
new file mode 100644
index 0000000..5a7eda3
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs
@@ -0,0 +1,11 @@
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public class OpaqueType : OctetStringType
+ {
+ public OpaqueType(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name, symbols)
+ {
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs
new file mode 100644
index 0000000..62912a5
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs
@@ -0,0 +1,46 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/21
+ * Time: 19:43
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /// <summary>
+ /// The SEQUENCE type represents a set of specified types. This is roughly analogous to a <code>struct</code> in C.
+ /// </summary>
+ public sealed class Sequence : BaseType
+ {
+ /// <summary>
+ /// Creates a <see cref="Sequence" /> instance.
+ /// </summary>
+ /// <param name="module">The module.</param>
+ /// <param name="name">The name.</param>
+ /// <param name="symbols">The enumerator.</param>
+ public Sequence(IModule module, string name, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ // parse between ( )
+ Symbol temp = symbols.NextNonEOLSymbol();
+ int bracketSection = 0;
+ temp.Expect(Symbol.OpenBracket);
+ bracketSection++;
+ while (bracketSection > 0)
+ {
+ temp = symbols.NextNonEOLSymbol();
+ if (temp == Symbol.OpenBracket)
+ {
+ bracketSection++;
+ }
+ else if (temp == Symbol.CloseBracket)
+ {
+ bracketSection--;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs
new file mode 100644
index 0000000..4160ca4
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /// <summary>
+ /// The SEQUENCE OF type represents a list of data sets..
+ /// </summary>
+ public sealed class SequenceOf : BaseType
+ {
+ private string _type;
+
+ public SequenceOf(IModule module, string name, ISymbolEnumerator sym)
+ : base(module, name)
+ {
+ _type = sym.NextNonEOLSymbol().ToString();
+ }
+
+ public string Type
+ {
+ get { return _type; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs
new file mode 100644
index 0000000..ab47731
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs
@@ -0,0 +1,238 @@
+using System;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ public sealed class TextualConvention : ITypeAssignment, ITypeReferrer
+ {
+ private IModule _module;
+ private string _name;
+ private DisplayHint _displayHint;
+ private Status _status;
+ private string _description;
+ private string _reference;
+ private ITypeAssignment _syntax;
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "module")]
+ public TextualConvention(IModule module, string name, ISymbolEnumerator symbols)
+ {
+ _module = module;
+ _name = name;
+
+ _displayHint = ParseDisplayHint(symbols);
+ _status = ParseStatus(symbols);
+ _description = ParseDescription(symbols);
+ _reference = ParseReference(symbols);
+ _syntax = ParseSyntax(module, symbols);
+ }
+
+ private static DisplayHint ParseDisplayHint(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.DisplayHint)
+ {
+ return new DisplayHint(symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' }));
+ }
+
+ symbols.PutBack(current);
+ return null;
+ }
+
+ private static Status ParseStatus(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.Status);
+
+ try
+ {
+ return (Status)Enum.Parse(typeof(Status), symbols.NextNonEOLSymbol().ToString());
+ }
+ catch (ArgumentException)
+ {
+ current.Assert(false, "Invalid/Unknown status");
+ }
+
+ return Status.current;
+ }
+
+ private static string ParseDescription(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.Description);
+
+ return symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' });
+ }
+
+ private static string ParseReference(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Reference)
+ {
+ string reference = symbols.NextNonEOLSymbol().ToString();
+ if ((reference.Length >= 2) && reference.StartsWith("\"") && reference.EndsWith("\""))
+ {
+ return reference.Substring(1, reference.Length-2);
+ }
+
+ return reference;
+ }
+
+ symbols.PutBack(current);
+ return null;
+ }
+
+ private static ITypeAssignment ParseSyntax(IModule module, ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.Syntax);
+
+ /*
+ * RFC2579 definition:
+ * Syntax ::= -- Must be one of the following:
+ * -- a base type (or its refinement), or
+ * -- a BITS pseudo-type
+ * type
+ * | "BITS" "{" NamedBits "}"
+ *
+ * From section 3.5:
+ * The data structure must be one of the alternatives defined
+ * in the ObjectSyntax CHOICE or the BITS construct. Note
+ * that this means that the SYNTAX clause of a Textual
+ * Convention can not refer to a previously defined Textual
+ * Convention.
+ *
+ * The SYNTAX clause of a TEXTUAL CONVENTION macro may be
+ * sub-typed in the same way as the SYNTAX clause of an
+ * OBJECT-TYPE macro.
+ *
+ * Therefore the possible values are (grouped by underlying type):
+ * INTEGER, Integer32
+ * OCTET STRING, Opaque
+ * OBJECT IDENTIFIER
+ * IpAddress
+ * Counter64
+ * Unsigned32, Counter32, Gauge32, TimeTicks
+ * BITS
+ * With appropriate sub-typing.
+ */
+
+ return Lexer.ParseBasicTypeDef(module, String.Empty, symbols, isMacroSyntax: true);
+ }
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ public string DisplayHint
+ {
+ get { return _displayHint == null ? null : _displayHint.ToString(); }
+ }
+
+ public Status Status
+ {
+ get { return _status; }
+ }
+
+ public string Description
+ {
+ get { return _description; }
+ }
+
+ public string Reference
+ {
+ get { return _reference; }
+ }
+
+ public ITypeAssignment Syntax
+ {
+ get { return _syntax; }
+ }
+
+ //internal object Decode(Variable v)
+ //{
+ // if (_syntax is IntegerType)
+ // {
+ // Integer32 i = v.Data as Integer32;
+ // if (i == null || (_syntax as IntegerType).IsEnumeration)
+ // {
+ // return null;
+ // }
+ // else if (_displayHint != null)
+ // {
+ // return _displayHint.Decode(i.ToInt32());
+ // }
+ // else
+ // {
+ // return i.ToInt32();
+ // }
+ // }
+ // else if (_syntax is UnsignedType)
+ // {
+ // Integer32 i = v.Data as Integer32;
+ // if (i == null)
+ // {
+ // return null;
+ // }
+ // else if (_displayHint != null)
+ // {
+ // return _displayHint.Decode(i.ToInt32());
+ // }
+ // else
+ // {
+ // return i.ToInt32();
+ // }
+ // }
+ // else if (_syntax is OctetStringType)
+ // {
+ // OctetString o = v.Data as OctetString;
+ // if (o == null)
+ // {
+ // return null;
+ // }
+ // else
+ // {
+ // // TODO: Follow the format specifier for octet strings.
+ // return null;
+ // }
+ // }
+ // else
+ // {
+ // return null;
+ // }
+ //}
+
+ #region ITypeReferrer Member
+
+ public ITypeAssignment ReferredType
+ {
+ get { return _syntax; }
+ set { _syntax = value; }
+ }
+
+ public ITypeAssignment BaseType
+ {
+ get
+ {
+ ITypeReferrer tr = this;
+ ITypeAssignment result = this;
+
+ while ((tr != null) && (tr.ReferredType != null))
+ {
+ result = tr.ReferredType;
+ tr = tr.ReferredType as ITypeReferrer;
+ }
+
+ return result;
+ }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs
new file mode 100644
index 0000000..b074ef6
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs
@@ -0,0 +1,147 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/18
+ * Time: 13:24
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /* Please be aware of the following possible constructs:
+ *
+ * isnsRegEntityIndex OBJECT-TYPE
+ * SYNTAX IsnsEntityIndexIdOrZero
+ * ( 1 .. 4294967295 )
+ * MAX-ACCESS not-accessible
+ *
+ *
+ */
+
+ /// <summary/>
+ /// </summary>
+ public sealed class TypeAssignment : ITypeAssignment
+ {
+ private IModule _module;
+ private string _name;
+ private string _type;
+ private ValueRanges _ranges;
+ private ValueMap _map;
+
+ /// <summary>
+ /// Creates an <see cref="TypeAssignment" />.
+ /// </summary>
+ /// <param name="module">The module.</param>
+ /// <param name="name">The name.</param>
+ /// <param name="type">The type.</param>
+ /// <param name="symbols">The symbols.</param>
+ /// <param name="isMacroSyntax">if set to <c>true</c> indicates that the syntax clause of a macro is parsed (e.g. OBJECT-TYPE, TEXTUAL-CONVENTION).</param>
+ public TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax)
+ {
+ _module = module;
+ _name = name;
+
+ SymbolList typeSymbols = new SymbolList();
+ typeSymbols.Add(type);
+
+ Symbol current = symbols.NextSymbol();
+ while (current != Symbol.EOL)
+ {
+ if (current == Symbol.OpenParentheses)
+ {
+ // parse range of unknown type
+ symbols.PutBack(current);
+ _ranges = Lexer.DecodeRanges(symbols);
+ break;
+ }
+ else if (current == Symbol.OpenBracket)
+ {
+ symbols.PutBack(current);
+ _map = Lexer.DecodeEnumerations(symbols);
+ break;
+ }
+
+ typeSymbols.Add(current);
+ current = symbols.NextSymbol();
+ }
+
+ _type = typeSymbols.Join(" ");
+
+ if ((_ranges == null) && (_map == null))
+ {
+ current = symbols.NextNonEOLSymbol();
+ if (current == Symbol.OpenParentheses)
+ {
+ // parse range of unknown type
+ symbols.PutBack(current);
+ _ranges = Lexer.DecodeRanges(symbols);
+ }
+ else if (current == Symbol.OpenBracket)
+ {
+ symbols.PutBack(current);
+ _map = Lexer.DecodeEnumerations(symbols);
+ }
+ else if (current != null)
+ {
+ symbols.PutBack(current);
+ }
+ }
+
+ if (isMacroSyntax)
+ {
+ // inside a macro the syntax is limited to one line, except there are brackets used for ranges/enums
+ return;
+ }
+
+ // outside macro Syntax clause we wait for two consecutive linebreaks with a following valid identifier as end condition
+ Symbol previous = current;
+ Symbol veryPrevious = null;
+
+ while ((current = symbols.NextSymbol()) != null)
+ {
+ if ((veryPrevious == Symbol.EOL) && (previous == Symbol.EOL) && current.IsValidIdentifier())
+ {
+ symbols.PutBack(current);
+ return;
+ }
+
+ veryPrevious = previous;
+ previous = current;
+ }
+
+ previous.Assert(false, "end of file reached");
+ }
+
+ public string Type
+ {
+ get { return _type; }
+ }
+
+ public ValueRanges Ranges
+ {
+ get { return _ranges; }
+ }
+
+ public IDictionary<long, string> Map
+ {
+ get { return _map; }
+ }
+
+ #region ITypeAssignment Member
+
+ public IModule Module
+ {
+ get { return _module; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs
new file mode 100644
index 0000000..4866fc9
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs
@@ -0,0 +1,103 @@
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib.Elements.Types
+{
+ /**
+ * As this type is used for Counter32 and TimeTicks as well as Unsigned32
+ * and Gauge32 it incorrectly allows range restrictions of Counter32 and
+ * TimeTicks. This is ok as currently we do not care about detecting
+ * incorrect MIBs and this doesn't block the decoding of correct MIBs.
+ */
+ public class UnsignedType : BaseType
+ {
+ public enum Types
+ {
+ Unsigned32,
+ Gauge32,
+ Counter32,
+ TimeTicks,
+ Counter64,
+ }
+
+ private Types _type;
+ private ValueRanges _ranges;
+
+ public UnsignedType(IModule module, string name, Symbol type, ISymbolEnumerator symbols)
+ : base(module, name)
+ {
+ Types? t = GetExactType(type);
+ type.Assert(t.HasValue, "Unknown symbol for unsigned type!");
+ _type = t.Value;
+
+ Symbol current = symbols.NextNonEOLSymbol();
+ if (current == Symbol.OpenParentheses)
+ {
+ current.Assert((_type != Types.Counter64), "Ranges are not supported for Counter64 type!"); // our internal struct can only hold int64 values
+
+ symbols.PutBack(current);
+ _ranges = Lexer.DecodeRanges(symbols);
+ current.Assert(!_ranges.IsSizeDeclaration, "SIZE keyword is not allowed for ranges of unsigned types!");
+ }
+ else
+ {
+ symbols.PutBack(current);
+ }
+ }
+
+ public Types Type
+ {
+ get { return _type; }
+ }
+
+ public ValueRanges Ranges
+ {
+ get { return _ranges; }
+ }
+
+ internal static Types? GetExactType(Symbol symbol)
+ {
+ if (symbol == Symbol.Unsigned32)
+ {
+ // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI
+ return Types.Unsigned32;
+ }
+ else if (symbol == Symbol.Gauge32)
+ {
+ // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI
+ return Types.Gauge32;
+ }
+ else if (symbol == Symbol.Counter32)
+ {
+ // [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI
+ return Types.Counter32;
+ }
+ else if (symbol == Symbol.TimeTicks)
+ {
+ // [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI + RFC1155-SMI
+ return Types.TimeTicks;
+ }
+ else if (symbol == Symbol.Gauge)
+ {
+ // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from RFC1155-SMI
+ return Types.Gauge32;
+ }
+ else if (symbol == Symbol.Counter)
+ {
+ // [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) // from RFC1155-SMI
+ return Types.Counter32;
+ }
+ else if (symbol == Symbol.Counter64)
+ {
+ // [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) // from SNMPv2-SMI
+ return Types.Counter64;
+ }
+
+ return null;
+ }
+
+ internal static bool IsUnsignedType(Symbol symbol)
+ {
+ return GetExactType(symbol).HasValue;
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs
new file mode 100644
index 0000000..d41ab12
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs
@@ -0,0 +1,81 @@
+// Module interface.
+// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 5/1/2009
+ * Time: 10:40 AM
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System.Collections.Generic;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+using Lextm.SharpSnmpLib.Mib.Elements;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// MIB Module interface.
+ /// </summary>
+ public interface IModule
+ {
+ /// <summary>
+ /// Module name.
+ /// </summary>
+ string Name
+ {
+ get;
+ }
+
+ Exports Exports
+ {
+ get;
+ }
+
+ Imports Imports
+ {
+ get;
+ }
+
+ /// <summary>
+ /// Entities + Types + all other elements implementing IDeclaration
+ /// </summary>
+ IList<IDeclaration> Declarations
+ {
+ get;
+ }
+
+ /// <summary>
+ /// Entities.
+ /// </summary>
+ IList<IEntity> Entities
+ {
+ get;
+ }
+
+ /// <summary>
+ /// Known types.
+ /// </summary>
+ IList<ITypeAssignment> Types
+ {
+ get;
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs
new file mode 100644
index 0000000..e9dd592
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public interface ISymbolEnumerator: IEnumerator<Symbol>
+ {
+ bool PutBack(Symbol item);
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs
new file mode 100644
index 0000000..5bf2844
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs
@@ -0,0 +1,581 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 16:50
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// Lexer class that parses MIB files into symbol list.
+ /// </summary>
+ public sealed class Lexer
+ {
+ private readonly SymbolList _symbols = new SymbolList();
+
+ public Lexer(string file)
+ : this(file, new StreamReader(file))
+ {
+ }
+
+ public Lexer(string file, TextReader stream)
+ {
+ this.Parse(file, stream);
+ }
+
+
+ public ISymbolEnumerator GetEnumerator()
+ {
+ return _symbols.GetSymbolEnumerator();
+ }
+
+
+ #region Parsing of MIB File
+
+ private class ParseParams
+ {
+ public string File;
+ public StringBuilder Temp = new StringBuilder();
+ public bool StringSection = false;
+ public bool AssignSection = false;
+ public bool AssignAhead = false;
+ public bool DotSection = false;
+
+ }
+
+ /// <summary>
+ /// Parses MIB file to symbol list.
+ /// </summary>
+ /// <param name="file">File</param>
+ /// <param name="stream">File stream</param>
+ private void Parse(string file, TextReader stream)
+ {
+ if (stream == null)
+ {
+ throw new ArgumentNullException("stream");
+ }
+
+ ParseParams pp = new ParseParams();
+ pp.File = file;
+
+ string line;
+ int row = 0;
+ while ((line = stream.ReadLine()) != null)
+ {
+ if (!pp.StringSection && line.TrimStart().StartsWith("--", StringComparison.Ordinal))
+ {
+ row++;
+ continue; // commented line
+ }
+
+ ParseLine(pp, line, row);
+ row++;
+ }
+ }
+
+ private void ParseLine(ParseParams pp, string line, int row)
+ {
+ line = line + "\n";
+ int count = line.Length;
+ for (int i = 0; i < count; i++)
+ {
+ char current = line[i];
+ bool moveNext = Parse(pp, current, row, i);
+ if (moveNext)
+ {
+ break;
+ }
+ }
+ }
+
+ private bool Parse(ParseParams pp, char current, int row, int column)
+ {
+ switch (current)
+ {
+ case '\n':
+ case '{':
+ case '}':
+ case '(':
+ case ')':
+ case '[':
+ case ']':
+ case ';':
+ case ',':
+ case '|':
+ if (!pp.StringSection)
+ {
+ bool moveNext = ParseLastSymbol(pp, row, column);
+ if (moveNext)
+ {
+ _symbols.Add(CreateSpecialSymbol(pp.File, '\n', row, column));
+ return true;
+ }
+
+ _symbols.Add(CreateSpecialSymbol(pp.File, current, row, column));
+ return false;
+ }
+
+ break;
+ case '"':
+ pp.StringSection = !pp.StringSection;
+ break;
+ case '\r':
+ return false;
+ default:
+ if ((int)current == 0x1A)
+ {
+ // IMPORTANT: ignore invisible characters such as SUB.
+ return false;
+ }
+
+ if (Char.IsWhiteSpace(current) && !pp.AssignSection && !pp.StringSection)
+ {
+ bool moveNext = ParseLastSymbol(pp, row, column);
+ if (moveNext)
+ {
+ _symbols.Add(CreateSpecialSymbol(pp.File, '\n', row, column));
+ return true;
+ }
+
+ return false;
+ }
+
+ if (pp.AssignAhead)
+ {
+ pp.AssignAhead = false;
+ ParseLastSymbol(pp, row, column);
+ break;
+ }
+
+ if (pp.DotSection && current != '.')
+ {
+ ParseLastSymbol(pp, row, column);
+ pp.DotSection = false;
+ }
+
+ if (current == '.' && !pp.StringSection)
+ {
+ if (!pp.DotSection)
+ {
+ ParseLastSymbol(pp, row, column);
+ pp.DotSection = true;
+ }
+ }
+
+ if (current == ':' && !pp.StringSection)
+ {
+ if (!pp.AssignSection)
+ {
+ ParseLastSymbol(pp, row, column);
+ }
+
+ pp.AssignSection = true;
+ }
+
+ if (current == '=' && !pp.StringSection)
+ {
+ pp.AssignSection = false;
+ pp.AssignAhead = true;
+ }
+
+ break;
+ }
+
+ pp.Temp.Append(current);
+ return false;
+ }
+
+ private bool ParseLastSymbol(ParseParams pp, int row, int column)
+ {
+ if (pp.Temp.Length > 0)
+ {
+ Symbol s = new Symbol(pp.File, pp.Temp.ToString(), row, column);
+
+ pp.Temp.Length = 0;
+
+ if (s.ToString().StartsWith(Symbol.Comment.ToString()))
+ {
+ // ignore the rest symbols on this line because they are in comment.
+ return true;
+ }
+
+ _symbols.Add(s);
+ }
+
+ return false;
+ }
+
+ private static Symbol CreateSpecialSymbol(string file, char value, int row, int column)
+ {
+ string str;
+ switch (value)
+ {
+ case '\n':
+ str = Environment.NewLine;
+ break;
+ case '{':
+ str = "{";
+ break;
+ case '}':
+ str = "}";
+ break;
+ case '(':
+ str = "(";
+ break;
+ case ')':
+ str = ")";
+ break;
+ case '[':
+ str = "[";
+ break;
+ case ']':
+ str = "]";
+ break;
+ case ';':
+ str = ";";
+ break;
+ case ',':
+ str = ",";
+ break;
+ case '|':
+ str = "|";
+ break;
+ default:
+ throw new ArgumentException("value is not a special character");
+ }
+
+ return new Symbol(file, str, row, column);
+ }
+
+ #endregion
+
+ #region Static Parse Helper
+
+ public static ITypeAssignment ParseBasicTypeDef(IModule module, string name, ISymbolEnumerator symbols, bool isMacroSyntax = false)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.Bits)
+ {
+ return new BitsType(module, name, symbols);
+ }
+ if (IntegerType.IsIntegerType(current))
+ {
+ return new IntegerType(module, name, current, symbols);
+ }
+ if (UnsignedType.IsUnsignedType(current))
+ {
+ return new UnsignedType(module, name, current, symbols);
+ }
+ if (current == Symbol.Opaque)
+ {
+ return new OpaqueType(module, name, symbols);
+ }
+ if (current == Symbol.IpAddress)
+ {
+ return new IpAddressType(module, name, symbols);
+ }
+ if (current == Symbol.TextualConvention)
+ {
+ return new TextualConvention(module, name, symbols);
+ }
+ if (current == Symbol.Octet)
+ {
+ Symbol next = symbols.NextNonEOLSymbol();
+
+ if (next == Symbol.String)
+ {
+ return new OctetStringType(module, name, symbols);
+ }
+
+ symbols.PutBack(next);
+ }
+ if (current == Symbol.Object)
+ {
+ Symbol next = symbols.NextNonEOLSymbol();
+
+ if (next == Symbol.Identifier)
+ {
+ return new ObjectIdentifierType(module, name, symbols);
+ }
+
+ symbols.PutBack(next);
+ }
+ if (current == Symbol.Sequence)
+ {
+ Symbol next = symbols.NextNonEOLSymbol();
+
+ if (next == Symbol.Of)
+ {
+ return new SequenceOf(module, name, symbols);
+ }
+ else
+ {
+ symbols.PutBack(next);
+ return new Sequence(module, name, symbols);
+ }
+ }
+ if (current == Symbol.Choice)
+ {
+ return new Choice(module, name, symbols);
+ }
+
+
+ return new TypeAssignment(module, name, current, symbols, isMacroSyntax);
+ }
+
+ public static void ParseOidValue(ISymbolEnumerator symbols, out string parent, out uint value)
+ {
+ parent = null;
+ value = 0;
+
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenBracket);
+
+ Symbol previous = null;
+ StringBuilder longParent = new StringBuilder();
+
+ current = symbols.NextNonEOLSymbol();
+ longParent.Append(current);
+
+ while ((current = symbols.NextNonEOLSymbol()) != null)
+ {
+ bool succeeded;
+
+ if (current == Symbol.OpenParentheses)
+ {
+ longParent.Append(current);
+
+ current = symbols.NextNonEOLSymbol();
+ succeeded = UInt32.TryParse(current.ToString(), out value);
+ current.Assert(succeeded, "not a decimal");
+ longParent.Append(current);
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseParentheses);
+ longParent.Append(current);
+ continue;
+ }
+
+ if (current == Symbol.CloseBracket)
+ {
+ parent = longParent.ToString();
+ return;
+ }
+
+ succeeded = UInt32.TryParse(current.ToString(), out value);
+ if (succeeded)
+ {
+ // numerical way
+ while ((current = symbols.NextNonEOLSymbol()) != Symbol.CloseBracket)
+ {
+ longParent.Append(".").Append(value);
+ succeeded = UInt32.TryParse(current.ToString(), out value);
+ current.Assert(succeeded, "not a decimal");
+ }
+
+ current.Expect(Symbol.CloseBracket);
+ parent = longParent.ToString();
+ return;
+ }
+
+ longParent.Append(".");
+ longParent.Append(current);
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenParentheses);
+ longParent.Append(current);
+ current = symbols.NextNonEOLSymbol();
+ succeeded = UInt32.TryParse(current.ToString(), out value);
+ current.Assert(succeeded, "not a decimal");
+ longParent.Append(current);
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseParentheses);
+ longParent.Append(current);
+ previous = current;
+ }
+
+ throw MibException.Create("end of file reached", previous);
+ }
+
+
+ public static ValueRanges DecodeRanges(ISymbolEnumerator symbols)
+ {
+ ValueRanges result = new ValueRanges();
+
+ Symbol startSymbol = symbols.NextNonEOLSymbol();
+ Symbol current = startSymbol;
+ current.Expect(Symbol.OpenParentheses);
+
+ while (current != Symbol.CloseParentheses)
+ {
+ Symbol value1Symbol = symbols.NextNonEOLSymbol();
+
+ if ((value1Symbol == Symbol.Size) && !result.IsSizeDeclaration)
+ {
+ result.IsSizeDeclaration = true;
+ symbols.NextNonEOLSymbol().Expect(Symbol.OpenParentheses);
+ continue;
+ }
+
+ // check for valid number
+ Int64? value1 = DecodeNumber(value1Symbol);
+ if (!value1.HasValue)
+ {
+ value1Symbol.Assert(false, "Invalid range declaration!");
+ }
+
+ // process next symbol
+ ValueRange range;
+ current = symbols.NextNonEOLSymbol();
+
+ if (current == Symbol.DoubleDot)
+ {
+ // its a continuous range
+ Symbol value2Symbol = symbols.NextNonEOLSymbol();
+ Int64? value2 = DecodeNumber(value2Symbol);
+ value2Symbol.Assert(value2.HasValue && (value2.Value >= value1.Value), "Invalid range declaration!");
+
+ if (value2.Value == value1.Value)
+ {
+ range = new ValueRange(value1.Value, null);
+ }
+ else
+ {
+ range = new ValueRange(value1.Value, value2.Value);
+ }
+
+ current = symbols.NextNonEOLSymbol();
+ }
+ else
+ {
+ // its a single number
+ range = new ValueRange(value1.Value, null);
+ }
+
+ // validate range
+ if (result.IsSizeDeclaration)
+ {
+ value1Symbol.Assert(range.Start >= 0, "Invalid range declaration! Size must be greater than 0");
+ }
+
+ result.Add(range);
+
+ // check next symbol
+ current.Expect(Symbol.Pipe, Symbol.CloseParentheses);
+ }
+
+ if (result.IsSizeDeclaration)
+ {
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseParentheses);
+ }
+
+ // validate ranges in between
+ for (int i=0; i<result.Count; i++)
+ {
+ for (int k=i+1; k<result.Count; k++)
+ {
+ startSymbol.Assert(!result[i].IntersectsWith(result[k]), "Invalid range declaration! Overlapping of ranges!");
+ }
+ }
+
+ return result;
+ }
+
+ public static Int64? DecodeNumber(Symbol number)
+ {
+ Int64 result;
+ string numString = (number != null) ? number.ToString() : null;
+
+ if (!String.IsNullOrEmpty(numString))
+ {
+ if (numString.StartsWith("'") && (numString.Length > 3))
+ {
+ // search second apostrophe
+ int end = numString.IndexOf('\'', 1);
+ if (end == (numString.Length - 2))
+ {
+ try
+ {
+ switch (numString[numString.Length - 1])
+ {
+ case 'b':
+ case 'B':
+ result = Convert.ToInt64(numString.Substring(1, numString.Length - 3), 2);
+ return result;
+ case 'h':
+ case 'H':
+ result = Convert.ToInt64(numString.Substring(1, numString.Length - 3), 16);
+ return result;
+ }
+ }
+ catch
+ {
+ }
+ }
+ }
+ else if (Int64.TryParse(numString, out result))
+ {
+ return result;
+ }
+ }
+
+ return null;
+ }
+
+ public static ValueMap DecodeEnumerations(ISymbolEnumerator symbols)
+ {
+ Symbol current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenBracket);
+
+ ValueMap map = new ValueMap();
+ do
+ {
+ current = symbols.NextNonEOLSymbol();
+ string identifier = current.ToString();
+
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.OpenParentheses);
+
+ current = symbols.NextNonEOLSymbol();
+ Int64 enumValue;
+ if (Int64.TryParse(current.ToString(), out enumValue))
+ {
+ try
+ {
+ // Have to include the number as it seems repeated identifiers are allowed ??
+ map.Add(enumValue, String.Format("{0}({1})", identifier, enumValue));
+ }
+ catch (ArgumentException ex)
+ {
+ current.Assert(false, ex.Message);
+ }
+ }
+ else
+ {
+ // Need to get "DefinedValue".
+ }
+
+ current = symbols.NextNonEOLSymbol();
+ current.Expect(Symbol.CloseParentheses);
+
+ current = symbols.NextNonEOLSymbol();
+ } while (current == Symbol.Comma);
+
+ current.Expect(Symbol.CloseBracket);
+
+ return map;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs
new file mode 100644
index 0000000..f802990
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public enum MaxAccess
+ {
+ notAccessible,
+ accessibleForNotify,
+ readOnly,
+ readWrite,
+ readCreate
+ }
+
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs
new file mode 100644
index 0000000..aac3b28
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs
@@ -0,0 +1,57 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 17:38
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// MIB document.
+ /// </summary>
+ public sealed class MibDocument
+ {
+ private readonly List<IModule> _modules = new List<IModule>();
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MibDocument" /> class.
+ /// </summary>
+ /// <param name="file">The file.</param>
+ public MibDocument(string file)
+ : this(new Lexer(file))
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MibDocument"/> class.
+ /// </summary>
+ /// <param name="lexer">The lexer.</param>
+ public MibDocument(Lexer lexer)
+ {
+ ISymbolEnumerator symbols = lexer.GetEnumerator();
+
+ Symbol current;
+ while ((current = symbols.NextNonEOLSymbol()) != null)
+ {
+ symbols.PutBack(current);
+ _modules.Add(new MibModule(symbols));
+ }
+ }
+
+ /// <summary>
+ /// <see cref="MibModule"/> containing in this document.
+ /// </summary>
+ public IList<IModule> Modules
+ {
+ get
+ {
+ return _modules;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs
new file mode 100644
index 0000000..efd89b3
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs
@@ -0,0 +1,113 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 16:33
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+using System.Globalization;
+#if (!SILVERLIGHT)
+using System.Runtime.Serialization;
+using System.Security.Permissions;
+#endif
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// Description of MibException.
+ /// </summary>
+ [Serializable]
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mib")]
+ public sealed class MibException : Exception
+ {
+ /// <summary>
+ /// Symbol.
+ /// </summary>
+ public Symbol Symbol { get; private set; }
+
+ /// <summary>
+ /// Creates a <see cref="MibException"/>.
+ /// </summary>
+ public MibException()
+ {
+ }
+
+ /// <summary>
+ /// Creates a <see cref="SnmpException"/> instance with a specific <see cref="string"/>.
+ /// </summary>
+ /// <param name="message">Message</param>
+ public MibException(string message) : base(message)
+ {
+ }
+
+ /// <summary>
+ /// Creates a <see cref="MibException"/> instance with a specific <see cref="string"/> and an <see cref="Exception"/>.
+ /// </summary>
+ /// <param name="message">Message</param>
+ /// <param name="inner">Inner exception</param>
+ public MibException(string message, Exception inner)
+ : base(message, inner)
+ {
+ }
+#if (!SILVERLIGHT)
+ /// <summary>
+ /// Creates a <see cref="MibException"/> instance.
+ /// </summary>
+ /// <param name="info">Info</param>
+ /// <param name="context">Context</param>
+ private MibException(SerializationInfo info, StreamingContext context) : base(info, context)
+ {
+ if (info == null)
+ {
+ throw new ArgumentNullException("info");
+ }
+
+ Symbol = (Symbol)info.GetValue("Symbol", typeof(Symbol));
+ }
+
+ /// <summary>
+ /// Gets object data.
+ /// </summary>
+ /// <param name="info">Info</param>
+ /// <param name="context">Context</param>
+ [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
+ public override void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ base.GetObjectData(info, context);
+ info.AddValue("Symbol", Symbol);
+ }
+#endif
+
+ /// <summary>
+ /// Creates a <see cref="MibException"/> with a specific <see cref="Symbol"/>.
+ /// </summary>
+ /// <param name="message">Message</param>
+ /// <param name="symbol">Symbol</param>
+ /// <returns></returns>
+ public static MibException Create(string message, Symbol symbol)
+ {
+ if (symbol == null)
+ {
+ throw new ArgumentNullException("symbol");
+ }
+
+ if (String.IsNullOrEmpty(message))
+ {
+ message = "Unknown MIB Exception";
+ }
+
+ message = String.Format(
+ "{0} (file: \"{1}\"; row: {2}; column: {3})",
+ message,
+ symbol.File,
+ symbol.Row + 1,
+ symbol.Column + 1);
+
+ MibException ex = new MibException(message) { Symbol = symbol };
+ return ex;
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs
new file mode 100644
index 0000000..cacfd04
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs
@@ -0,0 +1,294 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 17:38
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+using System.Collections.Generic;
+using Lextm.SharpSnmpLib.Mib.Elements;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// MIB module class.
+ /// </summary>
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mib")]
+ public sealed class MibModule : IModule
+ {
+ private readonly string _name;
+ private readonly Imports _imports;
+ private readonly Exports _exports;
+ private readonly List<IElement> _tokens = new List<IElement>();
+
+ /// <summary>
+ /// Creates a <see cref="MibModule"/> with a specific <see cref="Lexer"/>.
+ /// </summary>
+ /// <param name="name">Module name</param>
+ /// <param name="symbols">Lexer</param>
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "lexer")]
+ public MibModule(ISymbolEnumerator symbols)
+ {
+ if (symbols == null)
+ {
+ throw new ArgumentNullException("lexer");
+ }
+
+ Symbol temp = symbols.NextNonEOLSymbol();
+ temp.AssertIsValidIdentifier();
+ _name = temp.ToString().ToUpperInvariant(); // all module names are uppercase
+
+ temp = symbols.NextNonEOLSymbol();
+ temp.Expect(Symbol.Definitions);
+
+ temp = symbols.NextNonEOLSymbol();
+ temp.Expect(Symbol.Assign);
+
+ temp = symbols.NextSymbol();
+ temp.Expect(Symbol.Begin);
+
+ temp = symbols.NextNonEOLSymbol();
+ if (temp == Symbol.Imports)
+ {
+ _imports = ParseDependents(symbols);
+ }
+ else if (temp == Symbol.Exports)
+ {
+ _exports = ParseExports(symbols);
+ }
+ else
+ {
+ symbols.PutBack(temp);
+ }
+
+ ParseEntities(symbols);
+ }
+
+ #region Accessors
+
+ /// <summary>
+ /// Module name.
+ /// </summary>
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ public Exports Exports
+ {
+ get { return _exports; }
+ }
+
+ public Imports Imports
+ {
+ get { return _imports; }
+ }
+
+ public List<IElement> Tokens
+ {
+ get { return this._tokens; }
+ }
+
+ /// <summary>
+ /// Entities + Types + all other elements implementing IDeclaration
+ /// </summary>
+ public IList<IDeclaration> Declarations
+ {
+ get
+ {
+ IList<IDeclaration> result = new List<IDeclaration>();
+ foreach (IElement e in _tokens)
+ {
+ IDeclaration decl = e as IDeclaration;
+ if (decl != null)
+ {
+ result.Add(decl);
+ }
+ }
+
+ return result;
+ }
+ }
+
+ /// <summary>
+ /// OID nodes.
+ /// </summary>
+ public IList<IEntity> Entities
+ {
+ get
+ {
+ IList<IEntity> result = new List<IEntity>();
+ foreach (IElement e in _tokens)
+ {
+ IEntity entity = e as IEntity;
+ if (entity != null)
+ {
+ result.Add(entity);
+ }
+ }
+
+ return result;
+ }
+ }
+
+ public IList<ITypeAssignment> Types
+ {
+ get
+ {
+ IList<ITypeAssignment> result = new List<ITypeAssignment>();
+ foreach (IElement e in _tokens)
+ {
+ ITypeAssignment type = e as ITypeAssignment;
+ if (type != null)
+ {
+ result.Add(type);
+ }
+ }
+
+ return result;
+ }
+ }
+
+ #endregion
+
+ #region Parsing of Symbols
+
+ private Exports ParseExports(ISymbolEnumerator symbols)
+ {
+ return new Exports(this, symbols);
+ }
+
+ private Imports ParseDependents(ISymbolEnumerator symbols)
+ {
+ return new Imports(this, symbols);
+ }
+
+ private void ParseEntities(ISymbolEnumerator symbols)
+ {
+ Symbol temp = symbols.NextNonEOLSymbol();
+ SymbolList buffer = new SymbolList();
+
+ while (temp != Symbol.End)
+ {
+ if (temp == Symbol.Assign)
+ {
+ ParseEntity(buffer, symbols);
+ buffer.Clear();
+ // skip linebreaks behind an entity
+ temp = symbols.NextNonEOLSymbol();
+ }
+ else
+ {
+ buffer.Add(temp);
+ temp = symbols.NextSymbol();
+ }
+ }
+ }
+
+ private void ParseEntity(SymbolList preAssignSymbols, ISymbolEnumerator symbols)
+ {
+ if ((preAssignSymbols == null) || (preAssignSymbols.Count == 0))
+ {
+ Symbol s = symbols.NextSymbol();
+ if (s != null)
+ {
+ s.Assert(false, "Invalid Entity declaration");
+ }
+ else
+ {
+ throw new MibException("Invalid Entity declaration");
+ }
+ }
+
+ // check for a valid identifier
+ preAssignSymbols[0].AssertIsValidIdentifier();
+
+ if (preAssignSymbols.Count == 1)
+ {
+ // its a typedef
+ _tokens.Add(Lexer.ParseBasicTypeDef(this, preAssignSymbols[0].ToString(), symbols, isMacroSyntax: false));
+ return;
+ }
+
+ ISymbolEnumerator preAssignSymbolsEnumerator = preAssignSymbols.GetSymbolEnumerator();
+ preAssignSymbolsEnumerator.NextNonEOLSymbol(); // returns identifier
+ Symbol type = preAssignSymbolsEnumerator.NextNonEOLSymbol();
+
+ // parse declarations
+ if (type == Symbol.Object)
+ {
+ Symbol next = preAssignSymbolsEnumerator.NextNonEOLSymbol();
+
+ if (next == Symbol.Identifier)
+ {
+ _tokens.Add(new OidValueAssignment(this, preAssignSymbols, symbols));
+ return;
+ }
+ else if (next != null)
+ {
+ preAssignSymbolsEnumerator.PutBack(next);
+ }
+ }
+ if (type == Symbol.ModuleIdentity)
+ {
+ _tokens.Add(new ModuleIdentity(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.ObjectType)
+ {
+ _tokens.Add(new ObjectType(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.ObjectGroup)
+ {
+ _tokens.Add(new ObjectGroup(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.NotificationGroup)
+ {
+ _tokens.Add(new NotificationGroup(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.ModuleCompliance)
+ {
+ _tokens.Add(new ModuleCompliance(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.NotificationType)
+ {
+ _tokens.Add(new NotificationType(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.ObjectIdentity)
+ {
+ _tokens.Add(new ObjectIdentity(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.Macro)
+ {
+ _tokens.Add(new Macro(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.TrapType)
+ {
+ _tokens.Add(new TrapType(this, preAssignSymbols, symbols));
+ return;
+ }
+ if (type == Symbol.AgentCapabilities)
+ {
+ _tokens.Add(new AgentCapabilities(this, preAssignSymbols, symbols));
+ return;
+ }
+
+ preAssignSymbols[1].Assert(false, "Unknown/Invalid declaration");
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs
new file mode 100644
index 0000000..96978e1
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Reflection;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public interface IMibResolver
+ {
+ IModule Resolve(string moduleName);
+ }
+
+ public class FileSystemMibResolver : IMibResolver
+ {
+ private string _path;
+ private bool _recursive;
+
+ public FileSystemMibResolver(string path, bool recursive)
+ {
+ _path = path;
+ _recursive = recursive;
+ }
+
+ #region IMibResolver Member
+
+ public IModule Resolve(string moduleName)
+ {
+ if (Directory.Exists(_path))
+ {
+ string[] matchedFiles = Directory.GetFiles(
+ _path,
+ "*",
+ (_recursive) ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
+
+ if ((matchedFiles != null) && (matchedFiles.Length >= 1))
+ {
+ foreach (string matchedFile in matchedFiles)
+ {
+ if (Path.GetFileNameWithoutExtension(matchedFile.ToLowerInvariant()) == moduleName.ToLowerInvariant())
+ {
+ try
+ {
+ MibDocument md = new MibDocument (matchedFile);
+ if (md.Modules.Count > 0)
+ {
+ return md.Modules [0];
+ }
+ } catch
+ {
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ #endregion
+
+ }
+
+ // earlier code for search of versioned MIBs:
+ //
+ //private const string Pattern = "-V[0-9]+$";
+ //public static bool AllDependentsAvailable(MibModule module, IDictionary<string, MibModule> modules)
+ //{
+ // foreach (string dependent in module.Dependents)
+ // {
+ // if (!DependentFound(dependent, modules))
+ // {
+ // return false;
+ // }
+ // }
+
+ // return true;
+ //}
+
+ //private static bool DependentFound(string dependent, IDictionary<string, MibModule> modules)
+ //{
+ // if (!Regex.IsMatch(dependent, Pattern))
+ // {
+ // return modules.ContainsKey(dependent);
+ // }
+
+ // if (modules.ContainsKey(dependent))
+ // {
+ // return true;
+ // }
+
+ // string dependentNonVersion = Regex.Replace(dependent, Pattern, string.Empty);
+ // return modules.ContainsKey(dependentNonVersion);
+ //}
+
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs
new file mode 100644
index 0000000..a5174bc
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs
@@ -0,0 +1,130 @@
+using System.Collections.Generic;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// Builds up a tree from a single MIB
+ /// </summary>
+ public class MibTree
+ {
+ private readonly List<MibTreeNode> _root = new List<MibTreeNode>();
+
+ public MibTree(MibModule module)
+ {
+ IList<IEntity> entities = module.Entities;
+
+ if (entities.Count > 0)
+ {
+ // try to find module identity as root
+ foreach (IEntity element in entities)
+ {
+ ModuleIdentity mi = element as ModuleIdentity;
+
+ if (mi != null)
+ {
+ _root.Add(new MibTreeNode(null, mi));
+ }
+ }
+
+ // find OID assignments as root, if there are any that are not below ModuleIdentity
+ foreach (IEntity element in entities)
+ {
+ OidValueAssignment oa = element as OidValueAssignment;
+
+ if (oa != null)
+ {
+ _root.Add(new MibTreeNode(null, oa));
+ }
+ }
+
+ FilterRealRoots (entities);
+
+ foreach (MibTreeNode mibTreeNode in _root)
+ {
+ entities.Remove (mibTreeNode.Entity);
+ }
+
+ if (_root.Count == 0)
+ {
+ //no module identity, assume first entity is root
+ _root.Add(new MibTreeNode(null, entities[0]));
+ }
+
+ foreach (MibTreeNode mibTreeNode in _root)
+ {
+ if (entities.Contains (mibTreeNode.Entity))
+ {
+ entities.Remove (mibTreeNode.Entity);
+ }
+ BuildTree(mibTreeNode, entities);
+ UpdateTreeNodeTypes(mibTreeNode);
+ }
+ }
+ }
+
+ public IList<MibTreeNode> Root
+ {
+ get { return _root; }
+ }
+
+ private bool EntityExists(IList<IEntity> entities, string name)
+ {
+ foreach(IEntity entity in entities)
+ {
+ if (entity.Name == name)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void FilterRealRoots(IList<IEntity> entities)
+ {
+ int i = 0;
+ while (i < _root.Count)
+ {
+ if (EntityExists(entities, _root[i].Entity.Parent))
+ {
+ _root.RemoveAt(i);
+ }
+ else
+ {
+ i++;
+ }
+ }
+ }
+
+ private void BuildTree(MibTreeNode node, IList<IEntity> entities)
+ {
+ int i = 0;
+ while (i < entities.Count)
+ {
+ if (entities[i].Parent == node.Entity.Name)
+ {
+ node.AddChild(entities[i]);
+ entities.RemoveAt(i);
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ foreach (MibTreeNode childNode in node.ChildNodes)
+ {
+ BuildTree(childNode, entities);
+ }
+ }
+
+ private void UpdateTreeNodeTypes(MibTreeNode node)
+ {
+ node.UpdateNodeType();
+ foreach (MibTreeNode childNode in node.ChildNodes)
+ {
+ UpdateTreeNodeTypes(childNode);
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs
new file mode 100644
index 0000000..386c8e5
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ [Flags]
+ public enum MibTreeNodeType
+ {
+ Unknown = 0,
+ Container = (1 << 0),
+ Scalar = (1 << 1),
+ Table = (1 << 2),
+ TableRow = (1 << 3),
+ TableCell = (1 << 4),
+ NotificationRelated = (1 << 5),
+ ConformanceRelated = (1 << 6)
+ }
+
+
+ public class MibTreeNode
+ {
+ private MibTreeNode _parent = null;
+ private List<MibTreeNode> _childNodes = new List<MibTreeNode>();
+ private IEntity _entity = null;
+ private MibTreeNodeType _nodeType = MibTreeNodeType.Unknown;
+
+ public MibTreeNode(MibTreeNode parent, IEntity entity)
+ {
+ _parent = parent;
+ _entity = entity;
+ }
+
+ public MibTreeNode Parent
+ {
+ get { return _parent; }
+ }
+
+ public IEntity Entity
+ {
+ get { return _entity; }
+ }
+
+ public MibTreeNodeType NodeType
+ {
+ get { return _nodeType; }
+ }
+
+ public List<MibTreeNode> ChildNodes
+ {
+ get { return _childNodes; }
+ }
+
+ public MibTreeNode AddChild(IEntity element)
+ {
+ MibTreeNode result = new MibTreeNode(this, element);
+ this.ChildNodes.Add(result);
+
+ return result;
+ }
+
+ public void UpdateNodeType()
+ {
+ _nodeType = MibTreeNodeType.Unknown;
+
+ if (_entity != null)
+ {
+ if ((_entity is OidValueAssignment) || (_entity is ObjectIdentity))
+ {
+ _nodeType |= MibTreeNodeType.Container;
+ return;
+ }
+ else if (_childNodes.Count > 0)
+ {
+ _nodeType |= MibTreeNodeType.Container;
+ }
+
+ if (_entity is ObjectType)
+ {
+ ObjectType ot = _entity as ObjectType;
+
+ if (ot.Syntax is SequenceOf)
+ {
+ _nodeType |= MibTreeNodeType.Table;
+ }
+ else if (ot.Syntax is Sequence)
+ {
+ _nodeType |= MibTreeNodeType.TableRow;
+ }
+ else if ((_parent != null) && ((_parent.NodeType & MibTreeNodeType.TableRow) != 0))
+ {
+ _nodeType |= MibTreeNodeType.TableCell;
+ _nodeType |= MibTreeNodeType.Scalar;
+ }
+ else
+ {
+ _nodeType |= MibTreeNodeType.Scalar;
+ }
+ }
+ else if ((_entity is ModuleCompliance) || (_entity is ObjectGroup) || (_entity is NotificationGroup))
+ {
+ _nodeType |= MibTreeNodeType.ConformanceRelated;
+ }
+ else if ((_entity is NotificationGroup) || (_entity is NotificationType))
+ {
+ _nodeType |= MibTreeNodeType.NotificationRelated;
+ }
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs
new file mode 100644
index 0000000..1e7529a
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs
@@ -0,0 +1,216 @@
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using Lextm.SharpSnmpLib.Mib.Elements;
+using Lextm.SharpSnmpLib.Mib.Elements.Entities;
+using Lextm.SharpSnmpLib.Mib.Elements.Types;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public static class MibTypesResolver
+ {
+ private static readonly Regex _namedOidPathRegex = new Regex(@"^(?<Name>[^\(]+)\((?<Value>\d+)\)$");
+ private static readonly List<IMibResolver> _resolver = new List<IMibResolver>();
+ private static readonly List<IModule> _cachedModules = new List<IModule>();
+
+ public static void RegisterResolver(IMibResolver resolver)
+ {
+ if (resolver != null)
+ {
+ _resolver.Add(resolver);
+ }
+ }
+
+ public static IModule ResolveModule(string moduleName)
+ {
+ // check if module is already cached
+ foreach (MibModule cachedModule in _cachedModules)
+ {
+ if (cachedModule.Name == moduleName)
+ {
+ return cachedModule;
+ }
+ }
+
+ foreach (IMibResolver resolver in _resolver)
+ {
+ IModule resolvedModule = resolver.Resolve(moduleName);
+ if (resolvedModule != null)
+ {
+ ResolveTypes(resolvedModule);
+ _cachedModules.Add(resolvedModule);
+ return resolvedModule;
+ }
+ }
+
+ return null;
+ }
+
+ public static void ResolveTypes(IModule module)
+ {
+ foreach (IEntity entity in module.Entities)
+ {
+ ITypeReferrer typeReferringEntity = entity as ITypeReferrer;
+
+ if (typeReferringEntity != null)
+ {
+ CheckTypeReferrer(module, typeReferringEntity);
+ }
+ }
+
+ if (!_cachedModules.Contains(module))
+ {
+ _cachedModules.Add(module);
+ }
+ }
+
+ private static void CheckTypeReferrer(IModule module, ITypeReferrer typeReferringEntity)
+ {
+ TypeAssignment unknownType = typeReferringEntity.ReferredType as TypeAssignment;
+ if (unknownType != null)
+ {
+ typeReferringEntity.ReferredType = ResolveType(module, unknownType);
+
+ if (typeReferringEntity.ReferredType is TypeAssignment)
+ {
+ Console.WriteLine(String.Format("Could not resolve type '{0}' declared in module '{1}'", (typeReferringEntity.ReferredType as TypeAssignment).Type, typeReferringEntity.ReferredType.Module.Name));
+ }
+ }
+
+ ITypeReferrer nextTypeReferringEntity = typeReferringEntity.ReferredType as ITypeReferrer;
+ if (nextTypeReferringEntity != null)
+ {
+ CheckTypeReferrer(module, nextTypeReferringEntity);
+ }
+ }
+
+ public static ITypeAssignment ResolveType(IModule module, TypeAssignment type)
+ {
+ ITypeAssignment result = ResolveDeclaration(module, type.Type) as ITypeAssignment;
+
+ return (result != null) ? result : type;
+ }
+
+ public static IDeclaration ResolveDeclaration(IModule module, string name)
+ {
+ if ((module == null) || String.IsNullOrEmpty(name))
+ {
+ return null;
+ }
+
+ // check module internal types
+ foreach (IDeclaration decl in module.Declarations)
+ {
+ if (decl.Name == name)
+ {
+ return decl;
+ }
+ }
+
+ // check if type is imported
+ if (module.Imports != null)
+ {
+ ImportsFrom imports = module.Imports.GetImportFromType(name);
+ if (imports != null)
+ {
+ IModule importedModule = ResolveModule(imports.Module);
+ if (importedModule != null)
+ {
+ return ResolveDeclaration(importedModule, name);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public static ObjectIdentifier ResolveOid(IEntity entity)
+ {
+ ObjectIdentifier result = new ObjectIdentifier();
+
+ if (entity != null)
+ {
+ ResolveOid(entity, result);
+ }
+
+ return result;
+ }
+
+ private static void ResolveOid(IEntity entity, ObjectIdentifier result)
+ {
+ result.Prepend(entity.Name, entity.Value);
+
+ // check parent
+ if (!String.IsNullOrEmpty(entity.Parent))
+ {
+ string[] pathParts = entity.Parent.Split('.');
+ uint value;
+
+ // all parts except the first should have their value directly or indirectly with them
+ if (pathParts.Length > 1)
+ {
+ for (int i=pathParts.Length-1; i>=1; i--)
+ {
+ if (uint.TryParse(pathParts[i], out value))
+ {
+ result.Prepend("", value);
+ }
+ else
+ {
+ Match m = _namedOidPathRegex.Match(pathParts[i]);
+ if (m.Success)
+ {
+ result.Prepend(m.Groups["Name"].Value, uint.Parse(m.Groups["Value"].Value));
+ }
+ else
+ {
+ throw new MibException("Invalid OID path detected for entity '" + entity.Name + "' in module '" + entity.Module + "'!");
+ }
+ }
+ }
+ }
+
+ // parse root part: either another entity or a standard root object
+ if (IsOidRoot(pathParts[0], out value))
+ {
+ result.Prepend(pathParts[0], value);
+ }
+ else
+ {
+ // try to find entity inside this module
+ if (entity.Module != null)
+ {
+ entity = ResolveDeclaration(entity.Module, pathParts[0]) as IEntity;
+
+ if (entity != null)
+ {
+ ResolveOid(entity, result);
+ }
+ else
+ {
+ result.Prepend("", uint.MaxValue);
+ }
+ }
+ else
+ {
+ result.Prepend("", uint.MaxValue);
+ }
+ }
+ }
+ }
+
+ public static bool IsOidRoot(string name, out uint value)
+ {
+ value = uint.MaxValue;
+
+ switch (name)
+ {
+ case "ccitt": value = 0; return true;
+ case "iso": value = 1; return true;
+ case "joint-iso-ccitt": value = 2; return true;
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs
new file mode 100644
index 0000000..0424804
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs
@@ -0,0 +1,54 @@
+using System.Collections.Generic;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public class ObjectIdentifier: List<KeyValuePair<string, uint>>
+ {
+ public void Add(string name, uint oid)
+ {
+ this.Add(new KeyValuePair<string, uint>(name, oid));
+ }
+
+ public void Prepend(string name, uint oid)
+ {
+ this.Insert(0, new KeyValuePair<string, uint>(name, oid));
+ }
+
+ public void Insert(int index, string name, uint oid)
+ {
+ this.Insert(index, new KeyValuePair<string, uint>(name, oid));
+ }
+
+ public string GetOidString()
+ {
+ StringBuilder result = new StringBuilder();
+
+ foreach (KeyValuePair<string, uint> level in this)
+ {
+ result.Append(level.Value);
+ result.Append('.');
+ }
+
+ if (result.Length > 0)
+ {
+ result.Length--;
+ }
+
+ return result.ToString();
+ }
+
+ public uint[] GetOidValues()
+ {
+ List<uint> result = new List<uint>();
+
+ foreach (KeyValuePair<string, uint> level in this)
+ {
+ result.Add(level.Value);
+ }
+
+ return result.ToArray();
+ }
+
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs
new file mode 100644
index 0000000..4ddd3ba
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public enum Status
+ {
+ current,
+ deprecated,
+ obsolete,
+ mandatory,
+ optional
+ }
+
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs
new file mode 100644
index 0000000..b11386d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs
@@ -0,0 +1,357 @@
+/*
+ * Created by SharpDevelop.
+ * User: lextm
+ * Date: 2008/5/17
+ * Time: 17:14
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+
+using System;
+using System.Configuration;
+using System.Globalization;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ /// <summary>
+ /// Description of Symbol.
+ /// </summary>
+ public sealed class Symbol : IEquatable<Symbol>
+ {
+ private readonly string _text;
+ private readonly int _row;
+ private readonly int _column;
+ private readonly string _file;
+
+ private Symbol(string text) : this(null, text, -1, -1)
+ {
+ }
+
+ /// <summary>
+ /// Creates a <see cref="Symbol"/>.
+ /// </summary>
+ /// <param name="file">File</param>
+ /// <param name="text">Text</param>
+ /// <param name="row">Row number</param>
+ /// <param name="column">column number</param>
+ public Symbol(string file, string text, int row, int column)
+ {
+ _file = file;
+ _text = text;
+ _row = row;
+ _column = column;
+ }
+
+ /// <summary>
+ /// File.
+ /// </summary>
+ public string File
+ {
+ get
+ {
+ return _file;
+ }
+ }
+
+ /// <summary>
+ /// Row number.
+ /// </summary>
+ public int Row
+ {
+ get
+ {
+ return _row;
+ }
+ }
+
+ /// <summary>
+ /// Column number.
+ /// </summary>
+ public int Column
+ {
+ get
+ {
+ return _column;
+ }
+ }
+
+ /// <summary>
+ /// Returns a <see cref="String"/> that represents this <see cref="Symbol"/>.
+ /// </summary>
+ /// <returns></returns>
+ public override string ToString()
+ {
+ return _text;
+ }
+
+ /// <summary>
+ /// Determines whether the specified <see cref="Object"/> is equal to the current <see cref="Symbol"/>.
+ /// </summary>
+ /// <param name="obj">The <see cref="Object"/> to compare with the current <see cref="Symbol"/>. </param>
+ /// <returns><value>true</value> if the specified <see cref="Object"/> is equal to the current <see cref="Symbol"/>; otherwise, <value>false</value>.
+ /// </returns>
+ public override bool Equals(object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+
+ if (ReferenceEquals(this, obj))
+ {
+ return true;
+ }
+
+ return GetType() == obj.GetType() && Equals((Symbol)obj);
+ }
+
+ /// <summary>
+ /// Serves as a hash function for a particular type.
+ /// </summary>
+ /// <returns>A hash code for the current <see cref="Symbol"/>.</returns>
+ public override int GetHashCode()
+ {
+ return _text.GetHashCode();
+ }
+
+ /// <summary>
+ /// The equality operator.
+ /// </summary>
+ /// <param name="left">Left <see cref="Symbol"/> object</param>
+ /// <param name="right">Right <see cref="Symbol"/> object</param>
+ /// <returns>
+ /// Returns <c>true</c> if the values of its operands are equal, <c>false</c> otherwise.</returns>
+ public static bool operator ==(Symbol left, Symbol right)
+ {
+ return Equals(left, right);
+ }
+
+ /// <summary>
+ /// Determines whether the specified <see cref="Symbol"/> is equal to the current <see cref="Symbol"/>.
+ /// </summary>
+ /// <param name="left">Left <see cref="Symbol"/> object</param>
+ /// <param name="right">Right <see cref="Symbol"/> object</param>
+ /// <returns>
+ /// Returns <c>true</c> if the values of its operands are equal, <c>false</c> otherwise.</returns>
+ public static bool Equals(Symbol left, Symbol right)
+ {
+ object l = left;
+ object r = right;
+ if (l == r)
+ {
+ return true;
+ }
+
+ if (l == null || r == null)
+ {
+ return false;
+ }
+
+ return left._text.Equals(right._text);
+ }
+
+ /// <summary>
+ /// The inequality operator.
+ /// </summary>
+ /// <param name="left">Left <see cref="Symbol"/> object</param>
+ /// <param name="right">Right <see cref="Symbol"/> object</param>
+ /// <returns>
+ /// Returns <c>true</c> if the values of its operands are not equal, <c>false</c> otherwise.</returns>
+ public static bool operator !=(Symbol left, Symbol right)
+ {
+ return !(left == right);
+ }
+
+ #region IEquatable<Symbol> Members
+ /// <summary>
+ /// Indicates whether the current object is equal to another object of the same type.
+ /// </summary>
+ /// <param name="other">An object to compare with this object.</param>
+ /// <returns><value>true</value> if the current object is equal to the <paramref name="other"/> parameter; otherwise, <value>false</value>.
+ /// </returns>
+ public bool Equals(Symbol other)
+ {
+ return Equals(this, other);
+ }
+
+ #endregion
+
+ public static readonly Symbol Definitions = new Symbol("DEFINITIONS");
+ public static readonly Symbol Begin = new Symbol("BEGIN");
+ public static readonly Symbol Object = new Symbol("OBJECT");
+ public static readonly Symbol Identifier = new Symbol("IDENTIFIER");
+ public static readonly Symbol Assign = new Symbol("::=");
+ public static readonly Symbol OpenBracket = new Symbol("{");
+ public static readonly Symbol CloseBracket = new Symbol("}");
+ public static readonly Symbol Comment = new Symbol("--");
+ public static readonly Symbol Imports = new Symbol("IMPORTS");
+ public static readonly Symbol Semicolon = new Symbol(";");
+ public static readonly Symbol From = new Symbol("FROM");
+ public static readonly Symbol ModuleIdentity = new Symbol("MODULE-IDENTITY");
+ public static readonly Symbol ObjectType = new Symbol("OBJECT-TYPE");
+ public static readonly Symbol ObjectGroup = new Symbol("OBJECT-GROUP");
+ public static readonly Symbol NotificationGroup = new Symbol("NOTIFICATION-GROUP");
+ public static readonly Symbol ModuleCompliance = new Symbol("MODULE-COMPLIANCE");
+ public static readonly Symbol Sequence = new Symbol("SEQUENCE");
+ public static readonly Symbol NotificationType = new Symbol("NOTIFICATION-TYPE");
+ public static readonly Symbol EOL = new Symbol(Environment.NewLine);
+ public static readonly Symbol ObjectIdentity = new Symbol("OBJECT-IDENTITY");
+ public static readonly Symbol End = new Symbol("END");
+ public static readonly Symbol Macro = new Symbol("MACRO");
+ public static readonly Symbol Choice = new Symbol("CHOICE");
+ public static readonly Symbol TrapType = new Symbol("TRAP-TYPE");
+ public static readonly Symbol AgentCapabilities = new Symbol("AGENT-CAPABILITIES");
+ public static readonly Symbol Comma = new Symbol(",");
+ public static readonly Symbol TextualConvention = new Symbol("TEXTUAL-CONVENTION");
+ public static readonly Symbol Syntax = new Symbol("SYNTAX");
+ public static readonly Symbol Bits = new Symbol("BITS");
+ public static readonly Symbol Octet = new Symbol("OCTET");
+ public static readonly Symbol String = new Symbol("STRING");
+ public static readonly Symbol OpenParentheses = new Symbol("(");
+ public static readonly Symbol CloseParentheses = new Symbol(")");
+ public static readonly Symbol Exports = new Symbol("EXPORTS");
+ public static readonly Symbol DisplayHint = new Symbol("DISPLAY-HINT");
+ public static readonly Symbol Status = new Symbol("STATUS");
+ public static readonly Symbol Description = new Symbol("DESCRIPTION");
+ public static readonly Symbol Reference = new Symbol("REFERENCE");
+ public static readonly Symbol DoubleDot = new Symbol("..");
+ public static readonly Symbol Pipe = new Symbol("|");
+ public static readonly Symbol Size = new Symbol("SIZE");
+ public static readonly Symbol Units = new Symbol("UNITS");
+ public static readonly Symbol MaxAccess = new Symbol("MAX-ACCESS");
+ public static readonly Symbol Access = new Symbol("ACCESS");
+ public static readonly Symbol Index = new Symbol("INDEX");
+ public static readonly Symbol Augments = new Symbol("AUGMENTS");
+ public static readonly Symbol DefVal = new Symbol("DEFVAL");
+ public static readonly Symbol Of = new Symbol("OF");
+ public static readonly Symbol Integer = new Symbol("INTEGER");
+ public static readonly Symbol Integer32 = new Symbol("Integer32");
+ public static readonly Symbol IpAddress = new Symbol("IpAddress");
+ public static readonly Symbol Counter32 = new Symbol("Counter32");
+ public static readonly Symbol Counter = new Symbol("Counter");
+ public static readonly Symbol TimeTicks = new Symbol("TimeTicks");
+ public static readonly Symbol Opaque = new Symbol("Opaque");
+ public static readonly Symbol Counter64 = new Symbol("Counter64");
+ public static readonly Symbol Unsigned32 = new Symbol("Unsigned32");
+ public static readonly Symbol Gauge32 = new Symbol("Gauge32");
+ public static readonly Symbol Gauge = new Symbol("Gauge");
+ public static readonly Symbol TruthValue = new Symbol("TruthValue");
+ public static readonly Symbol Implied = new Symbol("IMPLIED");
+
+ internal void Expect(Symbol expected, params Symbol[] orExpected)
+ {
+ bool isExpected = (this == expected);
+
+ if (!isExpected && (orExpected != null) && (orExpected.Length > 0))
+ {
+ // check the alternatives
+ for (int i=0; i<orExpected.Length; i++)
+ {
+ if (this == orExpected[i])
+ {
+ isExpected = true;
+ break;
+ }
+ }
+ }
+
+ if (!isExpected)
+ {
+ if ((orExpected == null) || (orExpected.Length == 0))
+ {
+ Assert(false, "Unexpected symbol found! Expected '" + expected.ToString() + "'");
+ }
+ else
+ {
+ StringBuilder msg = new StringBuilder("Unexpected symbol found! Expected one of the following: '");
+ msg.Append(expected);
+
+ // check the alternatives
+ for (int i=0; i<orExpected.Length; i++)
+ {
+ msg.Append("', '");
+ msg.Append(expected);
+ }
+ msg.Append("'");
+
+ Assert(false, msg.ToString());
+ }
+ }
+ }
+
+ internal void Assert(bool condition, string message)
+ {
+ if (!condition)
+ {
+ throw MibException.Create(message, this);
+ }
+ }
+
+ internal void AssertIsValidIdentifier()
+ {
+ string message;
+ bool isValid = IsValidIdentifier(ToString(), out message);
+ Assert(isValid, message);
+ }
+
+ internal bool IsValidIdentifier()
+ {
+ string message;
+ return IsValidIdentifier(ToString(), out message);
+ }
+
+ private static bool IsValidIdentifier(string name, out string message)
+ {
+ if (UseStricterValidation && (name.Length < 1 || name.Length > 64))
+ {
+ message = "an identifier must consist of 1 to 64 letters, digits, and hyphens";
+ return false;
+ }
+
+ if (!Char.IsLetter(name[0]))
+ {
+ message = "the initial character must be a letter";
+ return false;
+ }
+
+ if (name.EndsWith("-", StringComparison.Ordinal))
+ {
+ message = "a hyphen cannot be the last character of an identifier";
+ return false;
+ }
+
+ if (name.Contains("--"))
+ {
+ message = "a hyphen cannot be immediately followed by another hyphen in an identifier";
+ return false;
+ }
+
+ if (UseStricterValidation && name.Contains("_"))
+ {
+ message = "underscores are not allowed in identifiers";
+ return false;
+ }
+
+ // TODO: SMIv2 forbids "-" except in module names and keywords
+ message = null;
+ return true;
+ }
+
+ private static bool? _useStricterValidation;
+
+ private static bool UseStricterValidation
+ {
+ get
+ {
+ if (_useStricterValidation == null)
+ {
+ object setting = ConfigurationManager.AppSettings["StricterValidationEnabled"];
+ _useStricterValidation = setting != null && Convert.ToBoolean(setting.ToString(), CultureInfo.InvariantCulture);
+ }
+
+ return _useStricterValidation.Value;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs
new file mode 100644
index 0000000..5b2218e
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public class SymbolList : List<Symbol>
+ {
+ public class SymbolEnumerator : ISymbolEnumerator
+ {
+ private SymbolList _list = null;
+ private int _index = -1;
+
+ internal SymbolEnumerator(SymbolList list)
+ {
+ if (list == null)
+ {
+ throw new ArgumentNullException("lexer");
+ }
+
+ _list = list;
+ }
+
+ #region ISymbolEnumerator Member
+
+ public bool PutBack(Symbol item)
+ {
+ if ((_index < 0) || (_index >= _list.Count) || (item != _list[_index]))
+ {
+ throw new ArgumentException(@"wrong last symbol", "last");
+ //return false;
+ }
+
+ _index--;
+ return true;
+ }
+
+ #endregion
+
+ #region IEnumerator<Symbol> Member
+
+ public Symbol Current
+ {
+ get
+ {
+ if ((_index >= 0) && (_index <= _list.Count))
+ {
+ return _list[_index];
+ }
+
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region IDisposable Member
+
+ public void Dispose()
+ {
+ }
+
+ #endregion
+
+ #region IEnumerator Member
+
+ object System.Collections.IEnumerator.Current
+ {
+ get { return this.Current; }
+ }
+
+ public bool MoveNext()
+ {
+ _index++;
+ return (_index >= 0) && (_index < _list.Count);
+ }
+
+ public void Reset()
+ {
+ _index = -1;
+ }
+
+ #endregion
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SymbolList"/> class.
+ /// </summary>
+ public SymbolList()
+ {
+ }
+
+ public ISymbolEnumerator GetSymbolEnumerator()
+ {
+ return new SymbolEnumerator(this);
+ }
+
+ public string Join(string separator)
+ {
+ if (separator == null)
+ separator = "";
+
+ StringBuilder result = new StringBuilder();
+
+ foreach (Symbol s in this)
+ {
+ result.Append(s);
+ result.Append(separator);
+ }
+
+ if (result.Length > 0)
+ {
+ result.Length -= separator.Length;
+ }
+
+ return result.ToString();
+ }
+ }
+
+ public static class SymbolEnumeratorExtension
+ {
+ public static Symbol NextSymbol(this IEnumerator<Symbol> enumerator)
+ {
+ if (enumerator.MoveNext())
+ {
+ return enumerator.Current;
+ }
+
+ return null;
+ }
+
+ public static Symbol NextNonEOLSymbol(this IEnumerator<Symbol> enumerator)
+ {
+ while (enumerator.MoveNext())
+ {
+ if (enumerator.Current != Symbol.EOL)
+ {
+ return enumerator.Current;
+ }
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs
new file mode 100644
index 0000000..4884235
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public class ValueMap : Dictionary<Int64, string>
+ {
+ public ValueMap()
+ {
+ }
+
+ /// <summary>
+ /// Returns the values of the map as continuous range. At best as one range.
+ /// </summary>
+ /// <returns></returns>
+ public ValueRanges GetContinousRanges()
+ {
+ ValueRanges result = new ValueRanges();
+
+ if (this.Count > 0)
+ {
+ List<Int64> values = new List<long>(this.Keys);
+ values.Sort();
+
+ Int64 last = values[0];
+ Int64 offset = values[0];
+ for (int i=1; i<values.Count; i++)
+ {
+ if (values[i] != last + 1)
+ {
+ if (last == offset)
+ {
+ result.Add(new ValueRange(offset, null));
+ }
+ else
+ {
+ result.Add(new ValueRange(offset, last));
+ }
+
+ offset = values[i];
+ }
+
+ last = values[i];
+ }
+
+ if (last == offset)
+ {
+ result.Add(new ValueRange(offset, null));
+ }
+ else
+ {
+ result.Add(new ValueRange(offset, last));
+ }
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// Gets the highest value contained in this value map.
+ /// </summary>
+ /// <returns></returns>
+ public Int64 GetHighestValue()
+ {
+ Int64 result = 0;
+
+ foreach (Int64 value in this.Keys)
+ {
+ if (value > result)
+ {
+ result = value;
+ }
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// Interprets the single values as bit positions and creates a mask of it.
+ /// </summary>
+ /// <returns></returns>
+ public UInt32 GetBitMask()
+ {
+ UInt32 result = 0;
+
+ foreach (Int64 key in this.Keys)
+ {
+ if (key < 0)
+ {
+ throw new NotSupportedException("Negative numbers are not allowed for Bits!");
+ }
+ if (key > 31)
+ {
+ throw new NotSupportedException("Bits with more than 32 bits are not supported!");
+ }
+
+ result |= (UInt32)(1 << (int)key);
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs
new file mode 100644
index 0000000..3ff5bcb
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+
+namespace Lextm.SharpSnmpLib.Mib
+{
+ public class ValueRanges: List<ValueRange>
+ {
+ public bool IsSizeDeclaration { get; internal set; }
+
+ public ValueRanges(bool isSizeDecl = false)
+ {
+ IsSizeDeclaration = isSizeDecl;
+ }
+
+ public bool Contains(Int64 value)
+ {
+ foreach (ValueRange range in this)
+ {
+ if (range.Contains(value))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ public class ValueRange
+ {
+ private readonly Int64 _start;
+ private readonly Int64? _end;
+
+ public ValueRange(Int64 first, Int64? second)
+ {
+ _start = first;
+ _end = second;
+ }
+
+ public Int64 Start
+ {
+ get { return _start; }
+ }
+
+ public Int64? End
+ {
+ get { return _end; }
+ }
+
+ public bool IntersectsWith(ValueRange other)
+ {
+ if (this._end == null)
+ {
+ return other.Contains(this._start);
+ }
+ else if (other._end == null)
+ {
+ return this.Contains(other._start);
+ }
+
+ return (this._start <= other.End) && (this._end >= other._start);
+ }
+
+ public bool Contains(Int64 value)
+ {
+ if (_end == null)
+ {
+ return value == _start;
+ }
+ else
+ {
+ return (_start <= value) && (value <= _end);
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f96080d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs
@@ -0,0 +1,61 @@
+// <summary>#SNMP Library. An open source SNMP implementation for .NET.</summary>
+// <copyright company="Lex Y. Li" file="AssemblyInfo.cs">Copyright (C) 2008 Lex Y. Li</copyright>
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+#region Using directives
+
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+#endregion
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SharpSnmpLib")]
+[assembly: AssemblyDescription("#SNMP Library for .NET")]
+[assembly: AssemblyConfiguration("Lesser GPL 2.1+")]
+[assembly: AssemblyCompany("LeXtudio")]
+[assembly: AssemblyProduct("#SNMPLib")]
+[assembly: AssemblyCopyright("(C) 2008-2010 Malcolm Crowe, Lex Li, Steve Santacroce, and other contributors.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// This sets the default COM visibility of types in the assembly to invisible.
+// If you need to expose index type to COM, use [ComVisible(true)] on that type.
+[assembly: ComVisible(false)]
+
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all the values or you can use the default the Revision and
+// Build Numbers by using the '*' as shown below:
+[assembly: AssemblyVersion("7.0.011207.31")]
+#if (!CF)
+[assembly: AssemblyFileVersion("7.0.011207.31")]
+#endif
+[assembly: NeutralResourcesLanguage("en-US")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lextm")]
+
+[assembly: InternalsVisibleTo("SharpSnmpLib.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f7030532c52524"
++ "993841a0d09420340f3814e1b65473851bdcd18815510b035a2ae9ecee69c4cd2d9e4d6e6d5fbf"
++ "a564e86c4a4cddc9597619a31c060846ebb2e99511a0323ff82b1ebd95d6a4912502945f0e769f"
++ "190a69a439dbfb969ebad72a6f7e2e047907da4a7b9c08c6e98d5f1be8b8cafaf3eb978914059a"
++ "245d4bc1")]
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..38bc6bb
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.225
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Lextm.SharpSnmpLib.Mib {
+ using System;
+
+
+ /// <summary>
+ /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
+ /// </summary>
+ // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+ // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+ // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+ // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Lextm.SharpSnmpLib.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+ /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx
new file mode 100644
index 0000000..7080a7d
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj b/contrib/apps/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj
new file mode 100644
index 0000000..2cf8657
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{CBE20411-5DB7-487D-825D-7694267BB6F5}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>Lextm.SharpSnmpLib</RootNamespace>
+ <AssemblyName>SharpSnmpLib.Mib</AssemblyName>
+ <DocumentationFile>..\bin\SharpSnmpLib.Mib.xml</DocumentationFile>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ <SignAssembly>True</SignAssembly>
+ <AssemblyOriginatorKeyFile>sharpsnmplib.snk</AssemblyOriginatorKeyFile>
+ <DelaySign>False</DelaySign>
+ <AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
+ <SccProjectName>
+ </SccProjectName>
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccAuxPath>
+ </SccAuxPath>
+ <SccProvider>
+ </SccProvider>
+ <RunSourceAnalysis>False</RunSourceAnalysis>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <DocumentationFile>
+ </DocumentationFile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <DocumentationFile>
+ </DocumentationFile>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Configuration" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Mib\DisplayHint.cs" />
+ <Compile Include="Mib\Elements\Entities\AgentCapabilities.cs" />
+ <Compile Include="Mib\Elements\Entities\EntityBase.cs" />
+ <Compile Include="Mib\Elements\Entities\IEntity.cs" />
+ <Compile Include="Mib\Elements\Entities\ModuleCompliance.cs" />
+ <Compile Include="Mib\Elements\Entities\ModuleIdentity.cs" />
+ <Compile Include="Mib\Elements\Entities\NotificationGroup.cs" />
+ <Compile Include="Mib\Elements\Entities\NotificationType.cs" />
+ <Compile Include="Mib\Elements\Entities\ObjectGroup.cs" />
+ <Compile Include="Mib\Elements\Entities\ObjectIdentity.cs" />
+ <Compile Include="Mib\Elements\Entities\ObjectType.cs" />
+ <Compile Include="Mib\Elements\Entities\OidValueAssignment.cs" />
+ <Compile Include="Mib\Elements\Exports.cs" />
+ <Compile Include="Mib\Elements\IElement.cs" />
+ <Compile Include="Mib\Elements\Imports.cs" />
+ <Compile Include="Mib\Elements\ImportsFrom.cs" />
+ <Compile Include="Mib\Elements\IDeclaration.cs" />
+ <Compile Include="Mib\Elements\TrapType.cs" />
+ <Compile Include="Mib\Elements\Types\BaseType.cs" />
+ <Compile Include="Mib\Elements\Types\BitsType.cs" />
+ <Compile Include="Mib\Elements\Types\Choice.cs" />
+ <Compile Include="Mib\Elements\Types\IntegerType.cs" />
+ <Compile Include="Mib\Elements\Types\IpAddressType.cs" />
+ <Compile Include="Mib\Elements\Types\ITypeAssignment.cs" />
+ <Compile Include="Mib\Elements\ITypeReferrer.cs" />
+ <Compile Include="Mib\Elements\Types\Macro.cs" />
+ <Compile Include="Mib\Elements\Types\ObjectIdentifierType.cs" />
+ <Compile Include="Mib\Elements\Types\OctetStringType.cs" />
+ <Compile Include="Mib\Elements\Types\OpaqueType.cs" />
+ <Compile Include="Mib\Elements\Types\Sequence.cs" />
+ <Compile Include="Mib\Elements\Types\SequenceOf.cs" />
+ <Compile Include="Mib\Elements\Types\TextualConvention.cs" />
+ <Compile Include="Mib\Elements\Types\TypeAssignment.cs" />
+ <Compile Include="Mib\Elements\Types\UnsignedType.cs" />
+ <Compile Include="Mib\IModule.cs" />
+ <Compile Include="Mib\ISymbolEnumerator.cs" />
+ <Compile Include="Mib\MaxAccess.cs" />
+ <Compile Include="Mib\MibResolver.cs" />
+ <Compile Include="Mib\MibTree.cs" />
+ <Compile Include="Mib\MibTreeNode.cs" />
+ <Compile Include="Mib\MibTypesResolver.cs" />
+ <Compile Include="Mib\ObjectIdentifier.cs" />
+ <Compile Include="Mib\Status.cs" />
+ <Compile Include="Mib\SymbolList.cs" />
+ <Compile Include="Mib\Lexer.cs" />
+ <Compile Include="Mib\MibDocument.cs" />
+ <Compile Include="Mib\MibModule.cs" />
+ <Compile Include="Mib\MibException.cs" />
+ <Compile Include="Mib\Symbol.cs" />
+ <Compile Include="Mib\ValueMap.cs" />
+ <Compile Include="Mib\ValueRange.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="sharpsnmplib.snk" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="license.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <CustomToolNamespace>Lextm.SharpSnmpLib.Mib</CustomToolNamespace>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Resources\" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/license.txt b/contrib/apps/LwipMibCompiler/SharpSnmpLib/license.txt
new file mode 100644
index 0000000..27946de
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/license.txt
@@ -0,0 +1,458 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/readme.txt b/contrib/apps/LwipMibCompiler/SharpSnmpLib/readme.txt
new file mode 100644
index 0000000..67b5a65
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/readme.txt
@@ -0,0 +1 @@
+See docs in src/apps/snmp/snmp_core.c.
diff --git a/contrib/apps/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk b/contrib/apps/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk
new file mode 100644
index 0000000..fe6f345
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk
Binary files differ
diff --git a/contrib/apps/LwipMibCompiler/example/compile_udp_mib.cmd b/contrib/apps/LwipMibCompiler/example/compile_udp_mib.cmd
new file mode 100644
index 0000000..1c84dbf
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/example/compile_udp_mib.cmd
@@ -0,0 +1 @@
+..\LwipMibCompiler\bin\Debug\LwipMibCompiler.exe ..\Mibs\UDP-MIB .\ ..\Mibs\
diff --git a/contrib/apps/LwipMibCompiler/example/compile_udp_mib.sh b/contrib/apps/LwipMibCompiler/example/compile_udp_mib.sh
new file mode 100644
index 0000000..93798c0
--- /dev/null
+++ b/contrib/apps/LwipMibCompiler/example/compile_udp_mib.sh
@@ -0,0 +1 @@
+../LwipMibCompiler/bin/Debug/LwipMibCompiler.exe ../Mibs/UDP-MIB ./ ../Mibs/
diff --git a/contrib/apps/chargen/README b/contrib/apps/chargen/README
new file mode 100644
index 0000000..7dc2ee5
--- /dev/null
+++ b/contrib/apps/chargen/README
@@ -0,0 +1,52 @@
+
+ CHARGEN
+
+This file implements a nice example of handling multiple tcp sockets in a
+server environment. Just call chargen_init() from your application after
+you have initialized lwip and added your network interfaces. Change the
+MAX_SERV option to increase or decrease the number of sessions supported.
+
+chargen will jam as much data as possible into the output socket, so it
+will take up a lot of CPU time. Therefore it will be a good idea to run it
+as the lowest possible priority (just ahead of any idle task).
+
+This is also a good example of how to support multiple sessions in an
+embedded system where you might not have fork(). The multiple sessions are
+all handled by the same thread and select() is used for demultiplexing.
+
+No makefile is provided, just add chargen to the makefile for your
+application. It is OS and HW independent.
+
+Once the chargen server is running in your application, go to another system
+and open a telnet session to your lwip platform at port 19. You should see an
+ASCII pattern start to stream on you screen.
+
+As an example, lets say that your system running lwip is at IP address
+192.168.10.244 and you have a linux system connected to it at IP address
+192.168.10.59. Issue the following command at a terminal prompt on the linux system:
+
+telnet 192.168.10.244 19
+
+You will see a pattern similar to the following on streaming by on your
+screen:
+
+ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{
+BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|
+CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
+DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!
+FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"
+GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#
+HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$
+IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%
+JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&
+KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'
+LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&'(
+
+It even works from windows: At a dos prompt you can also issue the same
+telnet command and you will get a similar (but much slower, at least on W98)
+data stream.
+
+David Haas
+
+
diff --git a/contrib/apps/chargen/chargen.c b/contrib/apps/chargen/chargen.c
new file mode 100644
index 0000000..94a70b9
--- /dev/null
+++ b/contrib/apps/chargen/chargen.c
@@ -0,0 +1,274 @@
+/** @file
+ *
+ * chargen server for lwip
+ */
+/*
+ * Copyright (c) 2003 NBS Card Technology, Paramus, NJ.
+ * 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: David Haas <dhaas@alum.rpi.edu>
+ *
+ * Purpose: chargen server for testing and demonstration purposes
+ *
+ * This file implements a nice example of handling multiple tcp sockets in a
+ * server environment. Just call chargen_init() from your application after
+ * you have initialized lwip and added your network interfaces. Change the
+ * MAX_SERV option to increase or decrease the number of sessions supported.
+ *
+ * chargen will jam as much data as possible into the output socket, so it
+ * will take up a lot of CPU time. Therefore it will be a good idea to run it
+ * as the lowest possible priority (just ahead of any idle task).
+ *
+ * This is also a good example of how to support multiple sessions in an
+ * embedded system where you might not have fork().
+ */
+
+#include "lwip/opt.h"
+#include "lwip/sys.h"
+#include "lwip/sockets.h"
+#include "lwip/mem.h"
+
+#include <string.h>
+
+#include "chargen.h"
+
+#if LWIP_SOCKET && LWIP_SOCKET_SELECT
+
+#define MAX_SERV 5 /* Maximum number of chargen services. Don't need too many */
+#define CHARGEN_THREAD_NAME "chargen"
+#define CHARGEN_PRIORITY 254 /* Really low priority */
+#define CHARGEN_THREAD_STACKSIZE 0
+#define SEND_SIZE TCP_SNDLOWAT /* If we only send this much, then when select
+ says we can send, we know we won't block */
+
+struct charcb {
+ struct charcb *next;
+ int socket;
+ struct sockaddr_storage cliaddr;
+ socklen_t clilen;
+ char nextchar;
+};
+
+static struct charcb *charcb_list = NULL;
+
+/**************************************************************
+ * void close_chargen(struct charcb *p_charcb)
+ *
+ * Close the socket and remove this charcb from the list.
+ **************************************************************/
+static void
+close_chargen(struct charcb *p_charcb)
+{
+ struct charcb *p_search_charcb;
+
+ /* Either an error or tcp connection closed on other
+ * end. Close here */
+ lwip_close(p_charcb->socket);
+ /* Free charcb */
+ if (charcb_list == p_charcb) {
+ charcb_list = p_charcb->next;
+ } else {
+ for (p_search_charcb = charcb_list; p_search_charcb; p_search_charcb = p_search_charcb->next) {
+ if (p_search_charcb->next == p_charcb) {
+ p_search_charcb->next = p_charcb->next;
+ break;
+ }
+ }
+ }
+ mem_free(p_charcb);
+}
+
+/**************************************************************
+ * void do_read(struct charcb *p_charcb)
+ *
+ * Socket definitely is ready for reading. Read a buffer from the socket and
+ * discard the data. If no data is read, then the socket is closed and the
+ * charcb is removed from the list and freed.
+ **************************************************************/
+static int
+do_read(struct charcb *p_charcb)
+{
+ char buffer[80];
+ int readcount;
+
+ /* Read some data */
+ readcount = lwip_read(p_charcb->socket, &buffer, 80);
+ if (readcount <= 0) {
+ close_chargen(p_charcb);
+ return -1;
+ }
+ return 0;
+}
+
+/**************************************************************
+ * void chargen_thread(void *arg)
+ *
+ * chargen task. This server will wait for connections on well
+ * known TCP port number: 19. For every connection, the server will
+ * write as much data as possible to the tcp port.
+ **************************************************************/
+static void
+chargen_thread(void *arg)
+{
+ int listenfd;
+#if LWIP_IPV6
+ struct sockaddr_in6 chargen_saddr;
+#else /* LWIP_IPV6 */
+ struct sockaddr_in chargen_saddr;
+#endif /* LWIP_IPV6 */
+ fd_set readset;
+ fd_set writeset;
+ int i, maxfdp1;
+ struct charcb *p_charcb;
+ LWIP_UNUSED_ARG(arg);
+
+ memset(&chargen_saddr, 0, sizeof (chargen_saddr));
+#if LWIP_IPV6
+ /* First acquire our socket for listening for connections */
+ listenfd = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+ chargen_saddr.sin6_family = AF_INET6;
+ chargen_saddr.sin6_addr = in6addr_any;
+ chargen_saddr.sin6_port = lwip_htons(19); /* Chargen server port */
+#else /* LWIP_IPV6 */
+ /* First acquire our socket for listening for connections */
+ listenfd = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ chargen_saddr.sin_family = AF_INET;
+ chargen_saddr.sin_addr.s_addr = PP_HTONL(INADDR_ANY);
+ chargen_saddr.sin_port = lwip_htons(19); /* Chargen server port */
+#endif /* LWIP_IPV6 */
+
+ LWIP_ASSERT("chargen_thread(): Socket create failed.", listenfd >= 0);
+
+ if (lwip_bind(listenfd, (struct sockaddr *) &chargen_saddr, sizeof (chargen_saddr)) == -1) {
+ LWIP_ASSERT("chargen_thread(): Socket bind failed.", 0);
+ }
+
+ /* Put socket into listening mode */
+ if (lwip_listen(listenfd, MAX_SERV) == -1) {
+ LWIP_ASSERT("chargen_thread(): Listen failed.", 0);
+ }
+
+
+ /* Wait forever for network input: This could be connections or data */
+ for (;;) {
+ maxfdp1 = listenfd + 1;
+
+ /* Determine what sockets need to be in readset */
+ FD_ZERO(&readset);
+ FD_ZERO(&writeset);
+ FD_SET(listenfd, &readset);
+ for (p_charcb = charcb_list; p_charcb; p_charcb = p_charcb->next) {
+ if (maxfdp1 < p_charcb->socket + 1) {
+ maxfdp1 = p_charcb->socket + 1;
+ }
+ FD_SET(p_charcb->socket, &readset);
+ FD_SET(p_charcb->socket, &writeset);
+ }
+
+ /* Wait for data or a new connection */
+ i = lwip_select(maxfdp1, &readset, &writeset, NULL, NULL);
+
+ if (i == 0) {
+ continue;
+ }
+ /* At least one descriptor is ready */
+ if (FD_ISSET(listenfd, &readset)) {
+ /* We have a new connection request!!! */
+ /* Lets create a new control block */
+ p_charcb = (struct charcb *) mem_malloc(sizeof (struct charcb));
+ if (p_charcb) {
+ p_charcb->socket = lwip_accept(listenfd,
+ (struct sockaddr *) &p_charcb->cliaddr,
+ &p_charcb->clilen);
+ if (p_charcb->socket < 0) {
+ mem_free(p_charcb);
+ } else {
+ /* Keep this tecb in our list */
+ p_charcb->next = charcb_list;
+ charcb_list = p_charcb;
+ p_charcb->nextchar = 0x21;
+ }
+ } else {
+ /* No memory to accept connection. Just accept and then close */
+ int sock;
+ struct sockaddr cliaddr;
+ socklen_t clilen;
+
+ sock = lwip_accept(listenfd, &cliaddr, &clilen);
+ if (sock >= 0) {
+ lwip_close(sock);
+ }
+ }
+ }
+ /* Go through list of connected clients and process data */
+ for (p_charcb = charcb_list; p_charcb; p_charcb = p_charcb->next) {
+ if (FD_ISSET(p_charcb->socket, &readset)) {
+ /* This socket is ready for reading. This could be because someone typed
+ * some characters or it could be because the socket is now closed. Try reading
+ * some data to see. */
+ if (do_read(p_charcb) < 0) {
+ break;
+ }
+ }
+ if (FD_ISSET(p_charcb->socket, &writeset)) {
+ char line[80];
+ char setchar = p_charcb->nextchar;
+
+ for (i = 0; i < 59; i++) {
+ line[i] = setchar;
+ if (++setchar == 0x7f) {
+ setchar = 0x21;
+ }
+ }
+ line[i] = 0;
+ strcat(line, "\n\r");
+ if (lwip_write(p_charcb->socket, line, strlen(line)) < 0) {
+ close_chargen(p_charcb);
+ break;
+ }
+ if (++p_charcb->nextchar == 0x7f) {
+ p_charcb->nextchar = 0x21;
+ }
+ }
+ }
+ }
+}
+
+
+/**************************************************************
+ * void chargen_init(void)
+ *
+ * This function initializes the chargen service. This function
+ * may only be called either before or after tasking has started.
+ **************************************************************/
+void
+chargen_init(void)
+{
+ sys_thread_new(CHARGEN_THREAD_NAME, chargen_thread, NULL, CHARGEN_THREAD_STACKSIZE, CHARGEN_PRIORITY);
+}
+
+#endif /* LWIP_SOCKET && LWIP_SOCKET_SELECT */
diff --git a/contrib/apps/chargen/chargen.h b/contrib/apps/chargen/chargen.h
new file mode 100644
index 0000000..eb83e4f
--- /dev/null
+++ b/contrib/apps/chargen/chargen.h
@@ -0,0 +1,12 @@
+#ifndef LWIP_CHARGEN_H
+#define LWIP_CHARGEN_H
+
+#include "lwip/opt.h"
+
+#if LWIP_SOCKET
+
+void chargen_init(void);
+
+#endif /* LWIP_SOCKET */
+
+#endif /* LWIP_CHARGEN_H */
diff --git a/contrib/apps/httpserver/README b/contrib/apps/httpserver/README
new file mode 100644
index 0000000..1f18bb8
--- /dev/null
+++ b/contrib/apps/httpserver/README
@@ -0,0 +1,12 @@
+HTTPSERVER
+
+This is a demonstration of how to make the most basic kind
+of server using lWIP.
+
+* httpserver-raw.c - uses raw TCP calls (coming soon!)
+
+* httpserver-netconn.c - uses netconn and netbuf API
+
+This code updates the examples in Adam Dunkel's original
+lwIP documentation to match changes in the code since that
+PDF release.
diff --git a/contrib/apps/httpserver/httpserver-netconn.c b/contrib/apps/httpserver/httpserver-netconn.c
new file mode 100644
index 0000000..051584e
--- /dev/null
+++ b/contrib/apps/httpserver/httpserver-netconn.c
@@ -0,0 +1,103 @@
+
+#include "lwip/opt.h"
+#include "lwip/arch.h"
+#include "lwip/api.h"
+
+#include "httpserver-netconn.h"
+
+#if LWIP_NETCONN
+
+#ifndef HTTPD_DEBUG
+#define HTTPD_DEBUG LWIP_DBG_OFF
+#endif
+
+static const char http_html_hdr[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
+static const char http_index_html[] = "<html><head><title>Congrats!</title></head><body><h1>Welcome to our lwIP HTTP server!</h1><p>This is a small test page, served by httpserver-netconn.</body></html>";
+
+/** Serve one HTTP connection accepted in the http thread */
+static void
+http_server_netconn_serve(struct netconn *conn)
+{
+ struct netbuf *inbuf;
+ char *buf;
+ u16_t buflen;
+ err_t err;
+
+ /* Read the data from the port, blocking if nothing yet there.
+ We assume the request (the part we care about) is in one netbuf */
+ err = netconn_recv(conn, &inbuf);
+
+ if (err == ERR_OK) {
+ netbuf_data(inbuf, (void**)&buf, &buflen);
+
+ /* Is this an HTTP GET command? (only check the first 5 chars, since
+ there are other formats for GET, and we're keeping it very simple )*/
+ if (buflen>=5 &&
+ buf[0]=='G' &&
+ buf[1]=='E' &&
+ buf[2]=='T' &&
+ buf[3]==' ' &&
+ buf[4]=='/' ) {
+
+ /* Send the HTML header
+ * subtract 1 from the size, since we don't send the \0 in the string
+ * NETCONN_NOCOPY: our data is const static, so no need to copy it
+ */
+ netconn_write(conn, http_html_hdr, sizeof(http_html_hdr)-1, NETCONN_NOCOPY);
+
+ /* Send our HTML page */
+ netconn_write(conn, http_index_html, sizeof(http_index_html)-1, NETCONN_NOCOPY);
+ }
+ }
+ /* Close the connection (server closes in HTTP) */
+ netconn_close(conn);
+
+ /* Delete the buffer (netconn_recv gives us ownership,
+ so we have to make sure to deallocate the buffer) */
+ netbuf_delete(inbuf);
+}
+
+/** The main function, never returns! */
+static void
+http_server_netconn_thread(void *arg)
+{
+ struct netconn *conn, *newconn;
+ err_t err;
+ LWIP_UNUSED_ARG(arg);
+
+ /* Create a new TCP connection handle */
+ /* Bind to port 80 (HTTP) with default IP address */
+#if LWIP_IPV6
+ conn = netconn_new(NETCONN_TCP_IPV6);
+ netconn_bind(conn, IP6_ADDR_ANY, 80);
+#else /* LWIP_IPV6 */
+ conn = netconn_new(NETCONN_TCP);
+ netconn_bind(conn, IP_ADDR_ANY, 80);
+#endif /* LWIP_IPV6 */
+ LWIP_ERROR("http_server: invalid conn", (conn != NULL), return;);
+
+ /* Put the connection into LISTEN state */
+ netconn_listen(conn);
+
+ do {
+ err = netconn_accept(conn, &newconn);
+ if (err == ERR_OK) {
+ http_server_netconn_serve(newconn);
+ netconn_delete(newconn);
+ }
+ } while(err == ERR_OK);
+ LWIP_DEBUGF(HTTPD_DEBUG,
+ ("http_server_netconn_thread: netconn_accept received error %d, shutting down\n",
+ err));
+ netconn_close(conn);
+ netconn_delete(conn);
+}
+
+/** Initialize the HTTP server (start its thread) */
+void
+http_server_netconn_init(void)
+{
+ sys_thread_new("http_server_netconn", http_server_netconn_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+}
+
+#endif /* LWIP_NETCONN*/
diff --git a/contrib/apps/httpserver/httpserver-netconn.h b/contrib/apps/httpserver/httpserver-netconn.h
new file mode 100644
index 0000000..d84b103
--- /dev/null
+++ b/contrib/apps/httpserver/httpserver-netconn.h
@@ -0,0 +1,6 @@
+#ifndef LWIP_HTTPSERVER_NETCONN_H
+#define LWIP_HTTPSERVER_NETCONN_H
+
+void http_server_netconn_init(void);
+
+#endif /* LWIP_HTTPSERVER_NETCONN_H */
diff --git a/contrib/apps/netio/netio.c b/contrib/apps/netio/netio.c
new file mode 100644
index 0000000..7d12ac8
--- /dev/null
+++ b/contrib/apps/netio/netio.c
@@ -0,0 +1,55 @@
+#include "netio.h"
+
+#include "lwip/opt.h"
+#include "lwip/tcp.h"
+
+/* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+static err_t
+netio_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
+{
+ LWIP_UNUSED_ARG(arg);
+
+ if (err == ERR_OK && p != NULL) {
+ tcp_recved(pcb, p->tot_len);
+ pbuf_free(p);
+ } else {
+ pbuf_free(p);
+ }
+
+ if (err == ERR_OK && p == NULL) {
+ tcp_arg(pcb, NULL);
+ tcp_sent(pcb, NULL);
+ tcp_recv(pcb, NULL);
+ tcp_close(pcb);
+ }
+
+ return ERR_OK;
+}
+
+static err_t
+netio_accept(void *arg, struct tcp_pcb *pcb, err_t err)
+{
+ LWIP_UNUSED_ARG(arg);
+ LWIP_UNUSED_ARG(err);
+
+ if (pcb != NULL) {
+ tcp_arg(pcb, NULL);
+ tcp_sent(pcb, NULL);
+ tcp_recv(pcb, netio_recv);
+ }
+ return ERR_OK;
+}
+
+void
+netio_init(void)
+{
+ struct tcp_pcb *pcb;
+
+ pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
+ tcp_bind(pcb, IP_ANY_TYPE, 18767);
+ pcb = tcp_listen(pcb);
+ tcp_accept(pcb, netio_accept);
+}
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/contrib/apps/netio/netio.h b/contrib/apps/netio/netio.h
new file mode 100644
index 0000000..11d7730
--- /dev/null
+++ b/contrib/apps/netio/netio.h
@@ -0,0 +1,6 @@
+#ifndef LWIP_NETIO_H
+#define LWIP_NETIO_H
+
+void netio_init(void);
+
+#endif /* LWIP_NETIO_H */
diff --git a/contrib/apps/ping/ping.c b/contrib/apps/ping/ping.c
new file mode 100644
index 0000000..143fb83
--- /dev/null
+++ b/contrib/apps/ping/ping.c
@@ -0,0 +1,396 @@
+/**
+ * @file
+ * Ping sender module
+ *
+ */
+
+/*
+ * 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.
+ *
+ */
+
+/**
+ * This is an example of a "ping" sender (with raw API and socket API).
+ * It can be used as a start point to maintain opened a network connection, or
+ * like a network "watchdog" for your device.
+ *
+ */
+
+#include "lwip/opt.h"
+
+#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */
+
+#include "ping.h"
+
+#include "lwip/mem.h"
+#include "lwip/raw.h"
+#include "lwip/icmp.h"
+#include "lwip/netif.h"
+#include "lwip/sys.h"
+#include "lwip/timeouts.h"
+#include "lwip/inet_chksum.h"
+#include "lwip/prot/ip4.h"
+
+#if PING_USE_SOCKETS
+#include "lwip/sockets.h"
+#include "lwip/inet.h"
+#include <string.h>
+#endif /* PING_USE_SOCKETS */
+
+
+/**
+ * PING_DEBUG: Enable debugging for PING.
+ */
+#ifndef PING_DEBUG
+#define PING_DEBUG LWIP_DBG_ON
+#endif
+
+/** ping receive timeout - in milliseconds */
+#ifndef PING_RCV_TIMEO
+#define PING_RCV_TIMEO 1000
+#endif
+
+/** ping delay - in milliseconds */
+#ifndef PING_DELAY
+#define PING_DELAY 1000
+#endif
+
+/** ping identifier - must fit on a u16_t */
+#ifndef PING_ID
+#define PING_ID 0xAFAF
+#endif
+
+/** ping additional data size to include in the packet */
+#ifndef PING_DATA_SIZE
+#define PING_DATA_SIZE 32
+#endif
+
+/** ping result action - no default action */
+#ifndef PING_RESULT
+#define PING_RESULT(ping_ok)
+#endif
+
+/* ping variables */
+static const ip_addr_t* ping_target;
+static u16_t ping_seq_num;
+#ifdef LWIP_DEBUG
+static u32_t ping_time;
+#endif /* LWIP_DEBUG */
+#if !PING_USE_SOCKETS
+static struct raw_pcb *ping_pcb;
+#endif /* PING_USE_SOCKETS */
+
+/** Prepare a echo ICMP request */
+static void
+ping_prepare_echo( struct icmp_echo_hdr *iecho, u16_t len)
+{
+ size_t i;
+ size_t data_len = len - sizeof(struct icmp_echo_hdr);
+
+ ICMPH_TYPE_SET(iecho, ICMP_ECHO);
+ ICMPH_CODE_SET(iecho, 0);
+ iecho->chksum = 0;
+ iecho->id = PING_ID;
+ iecho->seqno = lwip_htons(++ping_seq_num);
+
+ /* fill the additional data buffer with some data */
+ for(i = 0; i < data_len; i++) {
+ ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i;
+ }
+
+ iecho->chksum = inet_chksum(iecho, len);
+}
+
+#if PING_USE_SOCKETS
+
+/* Ping using the socket ip */
+static err_t
+ping_send(int s, const ip_addr_t *addr)
+{
+ int err;
+ struct icmp_echo_hdr *iecho;
+ struct sockaddr_storage to;
+ size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
+ LWIP_ASSERT("ping_size is too big", ping_size <= 0xffff);
+
+#if LWIP_IPV6
+ if(IP_IS_V6(addr) && !ip6_addr_isipv4mappedipv6(ip_2_ip6(addr))) {
+ /* todo: support ICMP6 echo */
+ return ERR_VAL;
+ }
+#endif /* LWIP_IPV6 */
+
+ iecho = (struct icmp_echo_hdr *)mem_malloc((mem_size_t)ping_size);
+ if (!iecho) {
+ return ERR_MEM;
+ }
+
+ ping_prepare_echo(iecho, (u16_t)ping_size);
+
+#if LWIP_IPV4
+ if(IP_IS_V4(addr)) {
+ struct sockaddr_in *to4 = (struct sockaddr_in*)&to;
+ to4->sin_len = sizeof(*to4);
+ to4->sin_family = AF_INET;
+ inet_addr_from_ip4addr(&to4->sin_addr, ip_2_ip4(addr));
+ }
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6
+ if(IP_IS_V6(addr)) {
+ struct sockaddr_in6 *to6 = (struct sockaddr_in6*)&to;
+ to6->sin6_len = sizeof(*to6);
+ to6->sin6_family = AF_INET6;
+ inet6_addr_from_ip6addr(&to6->sin6_addr, ip_2_ip6(addr));
+ }
+#endif /* LWIP_IPV6 */
+
+ err = lwip_sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to));
+
+ mem_free(iecho);
+
+ return (err ? ERR_OK : ERR_VAL);
+}
+
+static void
+ping_recv(int s)
+{
+ char buf[64];
+ int len;
+ struct sockaddr_storage from;
+ int fromlen = sizeof(from);
+
+ while((len = lwip_recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr*)&from, (socklen_t*)&fromlen)) > 0) {
+ if (len >= (int)(sizeof(struct ip_hdr)+sizeof(struct icmp_echo_hdr))) {
+ ip_addr_t fromaddr;
+ memset(&fromaddr, 0, sizeof(fromaddr));
+
+#if LWIP_IPV4
+ if(from.ss_family == AF_INET) {
+ struct sockaddr_in *from4 = (struct sockaddr_in*)&from;
+ inet_addr_to_ip4addr(ip_2_ip4(&fromaddr), &from4->sin_addr);
+ IP_SET_TYPE_VAL(fromaddr, IPADDR_TYPE_V4);
+ }
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6
+ if(from.ss_family == AF_INET6) {
+ struct sockaddr_in6 *from6 = (struct sockaddr_in6*)&from;
+ inet6_addr_to_ip6addr(ip_2_ip6(&fromaddr), &from6->sin6_addr);
+ IP_SET_TYPE_VAL(fromaddr, IPADDR_TYPE_V6);
+ }
+#endif /* LWIP_IPV6 */
+
+ LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
+ ip_addr_debug_print_val(PING_DEBUG, fromaddr);
+ LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now() - ping_time)));
+
+ /* todo: support ICMP6 echo */
+#if LWIP_IPV4
+ if (IP_IS_V4_VAL(fromaddr)) {
+ struct ip_hdr *iphdr;
+ struct icmp_echo_hdr *iecho;
+
+ iphdr = (struct ip_hdr *)buf;
+ iecho = (struct icmp_echo_hdr *)(buf + (IPH_HL(iphdr) * 4));
+ if ((iecho->id == PING_ID) && (iecho->seqno == lwip_htons(ping_seq_num))) {
+ /* do some ping result processing */
+ PING_RESULT((ICMPH_TYPE(iecho) == ICMP_ER));
+ return;
+ } else {
+ LWIP_DEBUGF( PING_DEBUG, ("ping: drop\n"));
+ }
+ }
+#endif /* LWIP_IPV4 */
+ }
+ fromlen = sizeof(from);
+ }
+
+ if (len == 0) {
+ LWIP_DEBUGF( PING_DEBUG, ("ping: recv - %"U32_F" ms - timeout\n", (sys_now()-ping_time)));
+ }
+
+ /* do some ping result processing */
+ PING_RESULT(0);
+}
+
+static void
+ping_thread(void *arg)
+{
+ int s;
+ int ret;
+
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+ int timeout = PING_RCV_TIMEO;
+#else
+ struct timeval timeout;
+ timeout.tv_sec = PING_RCV_TIMEO/1000;
+ timeout.tv_usec = (PING_RCV_TIMEO%1000)*1000;
+#endif
+ LWIP_UNUSED_ARG(arg);
+
+#if LWIP_IPV6
+ if(IP_IS_V4(ping_target) || ip6_addr_isipv4mappedipv6(ip_2_ip6(ping_target))) {
+ s = lwip_socket(AF_INET6, SOCK_RAW, IP_PROTO_ICMP);
+ } else {
+ s = lwip_socket(AF_INET6, SOCK_RAW, IP6_NEXTH_ICMP6);
+ }
+#else
+ s = lwip_socket(AF_INET, SOCK_RAW, IP_PROTO_ICMP);
+#endif
+ if (s < 0) {
+ return;
+ }
+
+ ret = lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
+ LWIP_ASSERT("setting receive timeout failed", ret == 0);
+ LWIP_UNUSED_ARG(ret);
+
+ while (1) {
+ if (ping_send(s, ping_target) == ERR_OK) {
+ LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
+ ip_addr_debug_print(PING_DEBUG, ping_target);
+ LWIP_DEBUGF( PING_DEBUG, ("\n"));
+
+#ifdef LWIP_DEBUG
+ ping_time = sys_now();
+#endif /* LWIP_DEBUG */
+ ping_recv(s);
+ } else {
+ LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
+ ip_addr_debug_print(PING_DEBUG, ping_target);
+ LWIP_DEBUGF( PING_DEBUG, (" - error\n"));
+ }
+ sys_msleep(PING_DELAY);
+ }
+}
+
+#else /* PING_USE_SOCKETS */
+
+/* Ping using the raw ip */
+static u8_t
+ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *addr)
+{
+ struct icmp_echo_hdr *iecho;
+ LWIP_UNUSED_ARG(arg);
+ LWIP_UNUSED_ARG(pcb);
+ LWIP_UNUSED_ARG(addr);
+ LWIP_ASSERT("p != NULL", p != NULL);
+
+ if ((p->tot_len >= (PBUF_IP_HLEN + sizeof(struct icmp_echo_hdr))) &&
+ pbuf_remove_header(p, PBUF_IP_HLEN) == 0) {
+ iecho = (struct icmp_echo_hdr *)p->payload;
+
+ if ((iecho->id == PING_ID) && (iecho->seqno == lwip_htons(ping_seq_num))) {
+ LWIP_DEBUGF( PING_DEBUG, ("ping: recv "));
+ ip_addr_debug_print(PING_DEBUG, addr);
+ LWIP_DEBUGF( PING_DEBUG, (" %"U32_F" ms\n", (sys_now()-ping_time)));
+
+ /* do some ping result processing */
+ PING_RESULT(1);
+ pbuf_free(p);
+ return 1; /* eat the packet */
+ }
+ /* not eaten, restore original packet */
+ pbuf_add_header(p, PBUF_IP_HLEN);
+ }
+
+ return 0; /* don't eat the packet */
+}
+
+static void
+ping_send(struct raw_pcb *raw, const ip_addr_t *addr)
+{
+ struct pbuf *p;
+ struct icmp_echo_hdr *iecho;
+ size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
+
+ LWIP_DEBUGF( PING_DEBUG, ("ping: send "));
+ ip_addr_debug_print(PING_DEBUG, addr);
+ LWIP_DEBUGF( PING_DEBUG, ("\n"));
+ LWIP_ASSERT("ping_size <= 0xffff", ping_size <= 0xffff);
+
+ p = pbuf_alloc(PBUF_IP, (u16_t)ping_size, PBUF_RAM);
+ if (!p) {
+ return;
+ }
+ if ((p->len == p->tot_len) && (p->next == NULL)) {
+ iecho = (struct icmp_echo_hdr *)p->payload;
+
+ ping_prepare_echo(iecho, (u16_t)ping_size);
+
+ raw_sendto(raw, p, addr);
+#ifdef LWIP_DEBUG
+ ping_time = sys_now();
+#endif /* LWIP_DEBUG */
+ }
+ pbuf_free(p);
+}
+
+static void
+ping_timeout(void *arg)
+{
+ struct raw_pcb *pcb = (struct raw_pcb*)arg;
+
+ LWIP_ASSERT("ping_timeout: no pcb given!", pcb != NULL);
+
+ ping_send(pcb, ping_target);
+
+ sys_timeout(PING_DELAY, ping_timeout, pcb);
+}
+
+static void
+ping_raw_init(void)
+{
+ ping_pcb = raw_new(IP_PROTO_ICMP);
+ LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL);
+
+ raw_recv(ping_pcb, ping_recv, NULL);
+ raw_bind(ping_pcb, IP_ADDR_ANY);
+ sys_timeout(PING_DELAY, ping_timeout, ping_pcb);
+}
+
+void
+ping_send_now(void)
+{
+ LWIP_ASSERT("ping_pcb != NULL", ping_pcb != NULL);
+ ping_send(ping_pcb, ping_target);
+}
+
+#endif /* PING_USE_SOCKETS */
+
+void
+ping_init(const ip_addr_t* ping_addr)
+{
+ ping_target = ping_addr;
+
+#if PING_USE_SOCKETS
+ sys_thread_new("ping_thread", ping_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+#else /* PING_USE_SOCKETS */
+ ping_raw_init();
+#endif /* PING_USE_SOCKETS */
+}
+
+#endif /* LWIP_RAW */
diff --git a/contrib/apps/ping/ping.h b/contrib/apps/ping/ping.h
new file mode 100644
index 0000000..1f21c7b
--- /dev/null
+++ b/contrib/apps/ping/ping.h
@@ -0,0 +1,19 @@
+#ifndef LWIP_PING_H
+#define LWIP_PING_H
+
+#include "lwip/ip_addr.h"
+
+/**
+ * PING_USE_SOCKETS: Set to 1 to use sockets, otherwise the raw api is used
+ */
+#ifndef PING_USE_SOCKETS
+#define PING_USE_SOCKETS LWIP_SOCKET
+#endif
+
+void ping_init(const ip_addr_t* ping_addr);
+
+#if !PING_USE_SOCKETS
+void ping_send_now(void);
+#endif /* !PING_USE_SOCKETS */
+
+#endif /* LWIP_PING_H */
diff --git a/contrib/apps/rtp/rtp.c b/contrib/apps/rtp/rtp.c
new file mode 100644
index 0000000..4be6973
--- /dev/null
+++ b/contrib/apps/rtp/rtp.c
@@ -0,0 +1,308 @@
+/**
+ * @file
+ * RTP client/server module
+ *
+ */
+
+/*
+ * 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"
+
+#if LWIP_SOCKET && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */
+
+#include "lwip/sys.h"
+#include "lwip/sockets.h"
+
+#include "rtp.h"
+
+#include "rtpdata.h"
+
+#include <string.h>
+
+/** This is an example of a "RTP" client/server based on a MPEG4 bitstream (with socket API).
+ */
+
+/**
+ * RTP_DEBUG: Enable debugging for RTP.
+ */
+#ifndef RTP_DEBUG
+#define RTP_DEBUG LWIP_DBG_ON
+#endif
+
+/** RTP stream port */
+#ifndef RTP_STREAM_PORT
+#define RTP_STREAM_PORT 4000
+#endif
+
+/** RTP stream multicast address as IPv4 address in "u32_t" format */
+#ifndef RTP_STREAM_ADDRESS
+#define RTP_STREAM_ADDRESS inet_addr("232.0.0.0")
+#endif
+
+/** RTP send delay - in milliseconds */
+#ifndef RTP_SEND_DELAY
+#define RTP_SEND_DELAY 40
+#endif
+
+/** RTP receive timeout - in milliseconds */
+#ifndef RTP_RECV_TIMEOUT
+#define RTP_RECV_TIMEOUT 2000
+#endif
+
+/** RTP stats display period - in received packets */
+#ifndef RTP_RECV_STATS
+#define RTP_RECV_STATS 50
+#endif
+
+/** RTP macro to let the application process the data */
+#ifndef RTP_RECV_PROCESSING
+#define RTP_RECV_PROCESSING(p,s)
+#endif
+
+/** RTP packet/payload size */
+#define RTP_PACKET_SIZE 1500
+#define RTP_PAYLOAD_SIZE 1024
+
+/** RTP header constants */
+#define RTP_VERSION 0x80
+#define RTP_TIMESTAMP_INCREMENT 3600
+#define RTP_SSRC 0
+#define RTP_PAYLOADTYPE 96
+#define RTP_MARKER_MASK 0x80
+
+/** RTP message header */
+#ifdef PACK_STRUCT_USE_INCLUDES
+# include "arch/bpstruct.h"
+#endif
+PACK_STRUCT_BEGIN
+struct rtp_hdr {
+ PACK_STRUCT_FLD_8(u8_t version);
+ PACK_STRUCT_FLD_8(u8_t payloadtype);
+ PACK_STRUCT_FIELD(u16_t seqNum);
+ PACK_STRUCT_FIELD(u32_t timestamp);
+ PACK_STRUCT_FIELD(u32_t ssrc);
+} PACK_STRUCT_STRUCT;
+PACK_STRUCT_END
+#ifdef PACK_STRUCT_USE_INCLUDES
+# include "arch/epstruct.h"
+#endif
+
+/** RTP packets */
+static u8_t rtp_send_packet[RTP_PACKET_SIZE];
+static u8_t rtp_recv_packet[RTP_PACKET_SIZE];
+
+/**
+ * RTP send packets
+ */
+static void
+rtp_send_packets( int sock, struct sockaddr_in* to)
+{
+ struct rtp_hdr* rtphdr;
+ u8_t* rtp_payload;
+ size_t rtp_payload_size;
+ size_t rtp_data_index;
+
+ /* prepare RTP packet */
+ rtphdr = (struct rtp_hdr*)rtp_send_packet;
+ rtphdr->version = RTP_VERSION;
+ rtphdr->payloadtype = 0;
+ rtphdr->ssrc = PP_HTONL(RTP_SSRC);
+ rtphdr->timestamp = lwip_htonl(lwip_ntohl(rtphdr->timestamp) + RTP_TIMESTAMP_INCREMENT);
+
+ /* send RTP stream packets */
+ rtp_data_index = 0;
+ do {
+ rtp_payload = rtp_send_packet+sizeof(struct rtp_hdr);
+ rtp_payload_size = LWIP_MIN(RTP_PAYLOAD_SIZE, sizeof(rtp_data) - rtp_data_index);
+
+ MEMCPY(rtp_payload, rtp_data + rtp_data_index, rtp_payload_size);
+
+ /* set MARKER bit in RTP header on the last packet of an image */
+ if ((rtp_data_index + rtp_payload_size) >= sizeof(rtp_data)) {
+ rtphdr->payloadtype = RTP_PAYLOADTYPE | RTP_MARKER_MASK;
+ } else {
+ rtphdr->payloadtype = RTP_PAYLOADTYPE;
+ }
+
+ /* send RTP stream packet */
+ if (lwip_sendto(sock, rtp_send_packet, sizeof(struct rtp_hdr) + rtp_payload_size,
+ 0, (struct sockaddr *)to, sizeof(struct sockaddr)) >= 0) {
+ rtphdr->seqNum = lwip_htons((u16_t)(lwip_ntohs(rtphdr->seqNum) + 1));
+ rtp_data_index += rtp_payload_size;
+ } else {
+ LWIP_DEBUGF(RTP_DEBUG, ("rtp_sender: not sendto==%i\n", errno));
+ }
+ }while (rtp_data_index < sizeof(rtp_data));
+}
+
+/**
+ * RTP send thread
+ */
+static void
+rtp_send_thread(void *arg)
+{
+ int sock;
+ struct sockaddr_in local;
+ struct sockaddr_in to;
+ u32_t rtp_stream_address;
+
+ LWIP_UNUSED_ARG(arg);
+
+ /* initialize RTP stream address */
+ rtp_stream_address = RTP_STREAM_ADDRESS;
+
+ /* if we got a valid RTP stream address... */
+ if (rtp_stream_address != 0) {
+ /* create new socket */
+ sock = lwip_socket(AF_INET, SOCK_DGRAM, 0);
+ if (sock >= 0) {
+ /* prepare local address */
+ memset(&local, 0, sizeof(local));
+ local.sin_family = AF_INET;
+ local.sin_port = PP_HTONS(INADDR_ANY);
+ local.sin_addr.s_addr = PP_HTONL(INADDR_ANY);
+
+ /* bind to local address */
+ if (lwip_bind(sock, (struct sockaddr *)&local, sizeof(local)) == 0) {
+ /* prepare RTP stream address */
+ memset(&to, 0, sizeof(to));
+ to.sin_family = AF_INET;
+ to.sin_port = PP_HTONS(RTP_STREAM_PORT);
+ to.sin_addr.s_addr = rtp_stream_address;
+
+ /* send RTP packets */
+ memset(rtp_send_packet, 0, sizeof(rtp_send_packet));
+ while (1) {
+ rtp_send_packets( sock, &to);
+ sys_msleep(RTP_SEND_DELAY);
+ }
+ }
+
+ /* close the socket */
+ lwip_close(sock);
+ }
+ }
+}
+
+/**
+ * RTP recv thread
+ */
+static void
+rtp_recv_thread(void *arg)
+{
+ int sock;
+ struct sockaddr_in local;
+ struct sockaddr_in from;
+ int fromlen;
+ struct ip_mreq ipmreq;
+ struct rtp_hdr* rtphdr;
+ u32_t rtp_stream_address;
+ int timeout;
+ int result;
+ int recvrtppackets = 0;
+ int lostrtppackets = 0;
+ u16_t lastrtpseq = 0;
+
+ LWIP_UNUSED_ARG(arg);
+
+ /* initialize RTP stream address */
+ rtp_stream_address = RTP_STREAM_ADDRESS;
+
+ /* if we got a valid RTP stream address... */
+ if (rtp_stream_address != 0) {
+ /* create new socket */
+ sock = lwip_socket(AF_INET, SOCK_DGRAM, 0);
+ if (sock >= 0) {
+ /* prepare local address */
+ memset(&local, 0, sizeof(local));
+ local.sin_family = AF_INET;
+ local.sin_port = PP_HTONS(RTP_STREAM_PORT);
+ local.sin_addr.s_addr = PP_HTONL(INADDR_ANY);
+
+ /* bind to local address */
+ if (lwip_bind(sock, (struct sockaddr *)&local, sizeof(local)) == 0) {
+ /* set recv timeout */
+ timeout = RTP_RECV_TIMEOUT;
+ result = lwip_setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
+ if (result) {
+ LWIP_DEBUGF(RTP_DEBUG, ("rtp_recv_thread: setsockopt(SO_RCVTIMEO) failed: errno=%d\n", errno));
+ }
+
+ /* prepare multicast "ip_mreq" struct */
+ ipmreq.imr_multiaddr.s_addr = rtp_stream_address;
+ ipmreq.imr_interface.s_addr = PP_HTONL(INADDR_ANY);
+
+ /* join multicast group */
+ if (lwip_setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipmreq, sizeof(ipmreq)) == 0) {
+ /* receive RTP packets */
+ while(1) {
+ fromlen = sizeof(from);
+ result = lwip_recvfrom(sock, rtp_recv_packet, sizeof(rtp_recv_packet), 0,
+ (struct sockaddr *)&from, (socklen_t *)&fromlen);
+ if ((result > 0) && ((size_t)result >= sizeof(struct rtp_hdr))) {
+ size_t recved = (size_t)result;
+ rtphdr = (struct rtp_hdr *)rtp_recv_packet;
+ recvrtppackets++;
+ if ((lastrtpseq == 0) || ((lastrtpseq + 1) == lwip_ntohs(rtphdr->seqNum))) {
+ RTP_RECV_PROCESSING((rtp_recv_packet + sizeof(rtp_hdr)), (recved-sizeof(rtp_hdr)));
+ LWIP_UNUSED_ARG(recved); /* just in case... */
+ } else {
+ lostrtppackets++;
+ }
+ lastrtpseq = lwip_ntohs(rtphdr->seqNum);
+ if ((recvrtppackets % RTP_RECV_STATS) == 0) {
+ LWIP_DEBUGF(RTP_DEBUG, ("rtp_recv_thread: recv %6i packet(s) / lost %4i packet(s) (%.4f%%)...\n", recvrtppackets, lostrtppackets, (lostrtppackets*100.0)/recvrtppackets));
+ }
+ } else {
+ LWIP_DEBUGF(RTP_DEBUG, ("rtp_recv_thread: recv timeout...\n"));
+ }
+ }
+
+ /* leave multicast group */
+ /* TODO: this code is never reached
+ result = lwip_setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &ipmreq, sizeof(ipmreq));
+ if (result) {
+ LWIP_DEBUGF(RTP_DEBUG, ("rtp_recv_thread: setsockopt(IP_DROP_MEMBERSHIP) failed: errno=%d\n", errno));
+ }*/
+ }
+ }
+
+ /* close the socket */
+ lwip_close(sock);
+ }
+ }
+}
+
+void
+rtp_init(void)
+{
+ sys_thread_new("rtp_send_thread", rtp_send_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+ sys_thread_new("rtp_recv_thread", rtp_recv_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+}
+
+#endif /* LWIP_SOCKET && LWIP_IGMP */
diff --git a/contrib/apps/rtp/rtp.h b/contrib/apps/rtp/rtp.h
new file mode 100644
index 0000000..c53d89b
--- /dev/null
+++ b/contrib/apps/rtp/rtp.h
@@ -0,0 +1,8 @@
+#ifndef LWIP_RTP_H
+#define LWIP_RTP_H
+
+#if LWIP_SOCKET && LWIP_IGMP
+void rtp_init(void);
+#endif /* LWIP_SOCKET && LWIP_IGMP */
+
+#endif /* LWIP_RTP_H */
diff --git a/contrib/apps/rtp/rtpdata.h b/contrib/apps/rtp/rtpdata.h
new file mode 100644
index 0000000..76ff344
--- /dev/null
+++ b/contrib/apps/rtp/rtpdata.h
@@ -0,0 +1,2040 @@
+const unsigned char rtp_data[] = {
+ 0x00, 0x00, 0x01, 0xb0, 0xf5, 0x00, 0x00, 0x01,
+ 0xb5, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x20, 0x00, 0x86, 0x84, 0x00, 0x67, 0x0c,
+ 0x2c, 0x10, 0x90, 0x51, 0x8f, 0x00, 0x00, 0x01,
+ 0xb2, 0x44, 0x69, 0x76, 0x58, 0x35, 0x30, 0x33,
+ 0x62, 0x31, 0x33, 0x39, 0x33, 0x70, 0x00, 0x00,
+ 0x01, 0xb2, 0x58, 0x76, 0x69, 0x44, 0x30, 0x30,
+ 0x33, 0x39, 0x00, 0x00, 0x01, 0xb6, 0x18, 0x60,
+ 0xab, 0x94, 0x03, 0xc0, 0xca, 0xc0, 0x3e, 0xd0,
+ 0x78, 0x4f, 0xf9, 0x44, 0x91, 0xe9, 0xfa, 0xc9,
+ 0xfe, 0xa1, 0xa4, 0xc1, 0x66, 0x03, 0x2e, 0x39,
+ 0x0c, 0x7e, 0x0e, 0xaa, 0x02, 0x92, 0xf8, 0xd5,
+ 0xec, 0xe2, 0x35, 0xb9, 0x35, 0x0c, 0xb3, 0x82,
+ 0xa6, 0xad, 0xd0, 0xd1, 0xca, 0xb8, 0xe8, 0x10,
+ 0x55, 0x78, 0x03, 0xc0, 0x38, 0x15, 0xba, 0xce,
+ 0xe2, 0xea, 0x00, 0xc3, 0x60, 0xb1, 0x70, 0xf4,
+ 0x14, 0x6c, 0x35, 0x4d, 0xe8, 0x5a, 0x1e, 0x58,
+ 0xdf, 0x03, 0x01, 0xfd, 0x2a, 0x45, 0x54, 0xca,
+ 0x0f, 0x05, 0x00, 0xbd, 0xd0, 0xcc, 0xb4, 0x90,
+ 0x4c, 0x24, 0x6b, 0x20, 0x30, 0x95, 0xf1, 0x2f,
+ 0xb4, 0xa7, 0x83, 0xdc, 0xce, 0x03, 0x05, 0x02,
+ 0x1a, 0x5d, 0x1a, 0x2c, 0xbf, 0x51, 0x28, 0x8b,
+ 0xd7, 0x6b, 0xdd, 0xf9, 0x44, 0xbb, 0x0e, 0x91,
+ 0x64, 0xb9, 0xa6, 0x33, 0xd3, 0x6e, 0x34, 0xa4,
+ 0xac, 0xac, 0x53, 0x0d, 0x79, 0xbe, 0xae, 0x5b,
+ 0x47, 0x2e, 0xde, 0x62, 0xa1, 0x53, 0xcd, 0x7d,
+ 0xfe, 0x66, 0xa1, 0x2b, 0x9c, 0xe1, 0xca, 0xbc,
+ 0xea, 0x84, 0x1c, 0x68, 0xff, 0xbb, 0x28, 0xa1,
+ 0x26, 0x18, 0x99, 0xb1, 0x4f, 0x68, 0x80, 0x28,
+ 0x0e, 0x20, 0xc3, 0xbf, 0x0f, 0x80, 0xf8, 0x90,
+ 0x3b, 0x1f, 0x16, 0xe4, 0xb0, 0x6f, 0x44, 0x16,
+ 0x38, 0xb8, 0xc3, 0x81, 0x22, 0xfa, 0xe3, 0x09,
+ 0xf6, 0x61, 0x6d, 0xef, 0x67, 0x56, 0x3b, 0x57,
+ 0xb5, 0x23, 0x03, 0x1f, 0x6d, 0x0d, 0xb9, 0x08,
+ 0xc6, 0x43, 0xba, 0xd1, 0x40, 0x5a, 0xe8, 0xca,
+ 0x9e, 0x17, 0x1f, 0x6d, 0x5d, 0x16, 0x98, 0xab,
+ 0xe6, 0x99, 0xf6, 0x37, 0xc6, 0x1b, 0xdc, 0xb9,
+ 0xb3, 0xfe, 0x9a, 0x4b, 0x1e, 0xec, 0xf9, 0x5f,
+ 0xb8, 0xc7, 0xfc, 0xbe, 0x6c, 0xd5, 0xf3, 0x9b,
+ 0x17, 0x8b, 0x89, 0x82, 0xff, 0x30, 0x19, 0x20,
+ 0x30, 0xe6, 0x29, 0x96, 0x75, 0x75, 0xeb, 0x00,
+ 0x3f, 0xa1, 0x20, 0x5b, 0x06, 0x11, 0x98, 0x1f,
+ 0xb2, 0xad, 0x3a, 0x59, 0xe6, 0x7d, 0x38, 0xa4,
+ 0xb1, 0x4f, 0xfe, 0xdf, 0x3a, 0x4b, 0xdb, 0x69,
+ 0xc3, 0x93, 0xcc, 0xdf, 0x5e, 0xf7, 0x2a, 0x38,
+ 0x2a, 0x89, 0x84, 0x80, 0x6c, 0x12, 0x44, 0x95,
+ 0x78, 0xd8, 0x7e, 0x3f, 0x4e, 0xcf, 0x3f, 0x39,
+ 0xba, 0x9f, 0xfa, 0x8f, 0x2f, 0x62, 0xfa, 0xf0,
+ 0xb6, 0x20, 0xa7, 0x06, 0x02, 0x3f, 0x28, 0x96,
+ 0x80, 0xf0, 0x99, 0x8e, 0x82, 0x15, 0x11, 0x87,
+ 0x35, 0xa4, 0xfd, 0x53, 0xcb, 0xcd, 0x68, 0x38,
+ 0xe8, 0xdb, 0x8d, 0xc2, 0x71, 0xbc, 0x65, 0x3e,
+ 0xac, 0x5b, 0x0d, 0xae, 0xc0, 0x3c, 0x77, 0xfe,
+ 0xe8, 0xde, 0x3c, 0xbd, 0xdb, 0xb3, 0x39, 0x09,
+ 0x56, 0x0a, 0xa2, 0xfe, 0x40, 0xd7, 0x6f, 0x56,
+ 0x07, 0x02, 0xec, 0xd6, 0xed, 0x06, 0x5e, 0x2f,
+ 0xb6, 0xce, 0xf1, 0x4f, 0x16, 0x88, 0x04, 0x41,
+ 0x79, 0x0e, 0x98, 0xbe, 0x54, 0x75, 0x1a, 0xd6,
+ 0x50, 0xcf, 0x82, 0x6a, 0xf7, 0xaf, 0x7f, 0xfb,
+ 0x6d, 0x88, 0x97, 0x24, 0x40, 0x68, 0xa0, 0x57,
+ 0x79, 0x57, 0xe9, 0x6b, 0xaa, 0xe5, 0xe4, 0x2b,
+ 0xaa, 0x14, 0x64, 0x90, 0x6c, 0x50, 0x4a, 0xe3,
+ 0x97, 0x43, 0xf6, 0x81, 0x90, 0xa9, 0xa6, 0xba,
+ 0xb1, 0x21, 0x12, 0x5f, 0xe0, 0xdf, 0x88, 0x86,
+ 0x03, 0x30, 0x94, 0xb2, 0x6d, 0xd2, 0xdc, 0x45,
+ 0x14, 0x54, 0x1d, 0xe8, 0x38, 0x8d, 0xbe, 0x8a,
+ 0xaf, 0x20, 0xa2, 0x3e, 0xa2, 0x5c, 0xc6, 0xae,
+ 0xe6, 0xc4, 0x48, 0xec, 0xea, 0xc7, 0x4e, 0x17,
+ 0xb2, 0x91, 0x52, 0xb4, 0xe9, 0x8b, 0x15, 0xfb,
+ 0x99, 0x7c, 0xda, 0xb8, 0xad, 0x57, 0x31, 0x5b,
+ 0x5b, 0x67, 0xaa, 0x1e, 0x93, 0x76, 0xa5, 0x25,
+ 0xd9, 0x0d, 0x70, 0xd8, 0xb9, 0x11, 0x34, 0xfd,
+ 0xaf, 0x0e, 0x0d, 0x42, 0x57, 0x97, 0x26, 0x06,
+ 0xdf, 0x29, 0x7e, 0x79, 0x72, 0x22, 0x36, 0xa5,
+ 0x9f, 0x6a, 0x16, 0x24, 0x6f, 0x10, 0x56, 0xec,
+ 0x5b, 0x46, 0x50, 0x94, 0x88, 0xc4, 0xfa, 0x9e,
+ 0xd8, 0x5b, 0xb7, 0x50, 0x72, 0x62, 0x25, 0xaa,
+ 0x39, 0x84, 0x69, 0xaa, 0xfc, 0xbf, 0x9b, 0x45,
+ 0xf7, 0xc5, 0x41, 0x97, 0x41, 0xc7, 0xac, 0x7f,
+ 0x68, 0x92, 0xab, 0x64, 0xaa, 0x46, 0x32, 0x84,
+ 0x77, 0x1b, 0xfc, 0xbc, 0x5a, 0x42, 0x28, 0xfa,
+ 0x3e, 0x55, 0xf4, 0xe9, 0x44, 0xac, 0xc5, 0x4a,
+ 0x6c, 0x93, 0xde, 0x03, 0x6d, 0xdc, 0xb8, 0x5b,
+ 0xb7, 0x83, 0x7e, 0xc2, 0xaa, 0x33, 0x70, 0x34,
+ 0x41, 0x46, 0x25, 0xa5, 0x6f, 0xdb, 0x96, 0x0f,
+ 0xd3, 0xab, 0xd4, 0x17, 0x65, 0x96, 0x0c, 0x1e,
+ 0x39, 0x4c, 0x9d, 0x90, 0x3f, 0x5b, 0x8d, 0xaa,
+ 0xce, 0xac, 0xa6, 0x50, 0xf0, 0x66, 0xb2, 0x30,
+ 0xce, 0x42, 0x61, 0xaa, 0xb6, 0x7e, 0xca, 0xbf,
+ 0xfd, 0xbf, 0xef, 0x51, 0xed, 0xdf, 0x95, 0x0b,
+ 0xa7, 0x34, 0x24, 0x13, 0x62, 0x44, 0x81, 0xdf,
+ 0x3a, 0x8e, 0x95, 0x91, 0x67, 0xd7, 0x57, 0x54,
+ 0x92, 0x1d, 0x79, 0xa3, 0x2a, 0xf3, 0x0c, 0x7a,
+ 0x12, 0xa8, 0x33, 0xf9, 0x05, 0x02, 0x7b, 0xef,
+ 0x12, 0x18, 0xab, 0x8b, 0x40, 0x38, 0x7e, 0x0c,
+ 0x1f, 0x04, 0x30, 0x62, 0xa8, 0xd5, 0xd9, 0x78,
+ 0xdd, 0x1c, 0xb4, 0x57, 0xc1, 0x83, 0xc4, 0x41,
+ 0x08, 0x72, 0x5c, 0xc2, 0xb6, 0xd3, 0xd4, 0x85,
+ 0x4a, 0x7e, 0x58, 0xc3, 0x19, 0xfa, 0xdd, 0x51,
+ 0x03, 0x85, 0x1d, 0xe9, 0x10, 0x5e, 0x8c, 0x8f,
+ 0x41, 0x03, 0xe9, 0xbc, 0xa8, 0xba, 0xeb, 0x73,
+ 0x7d, 0x85, 0x69, 0xc7, 0x3b, 0xd9, 0x49, 0x0b,
+ 0x39, 0x03, 0x12, 0x11, 0x8b, 0x72, 0x97, 0x62,
+ 0x5f, 0xfe, 0x59, 0x4d, 0xc0, 0x3a, 0xdf, 0xcb,
+ 0x3e, 0x80, 0x39, 0xd5, 0x7a, 0xb1, 0x45, 0x86,
+ 0x06, 0xf6, 0xb6, 0xda, 0x98, 0xa1, 0x41, 0xae,
+ 0x12, 0xd3, 0xd1, 0x71, 0x5a, 0xa5, 0x40, 0xc0,
+ 0x8a, 0x3f, 0x4e, 0xac, 0x78, 0x93, 0x55, 0x31,
+ 0xfc, 0xcf, 0x67, 0x93, 0x52, 0xc4, 0x53, 0x0d,
+ 0xdf, 0x49, 0xd7, 0x83, 0x00, 0x18, 0x4b, 0xcd,
+ 0x65, 0xaf, 0xb5, 0xd5, 0x6c, 0xc4, 0x14, 0xb7,
+ 0xdb, 0x9d, 0x06, 0x17, 0xca, 0xe1, 0x60, 0x07,
+ 0x6d, 0x57, 0xd0, 0xfb, 0x1a, 0xf5, 0xb2, 0x56,
+ 0xca, 0xea, 0x21, 0x77, 0x41, 0xc0, 0x46, 0xc8,
+ 0x85, 0xe3, 0x15, 0x6a, 0xdb, 0x80, 0x47, 0x6d,
+ 0x05, 0x44, 0x06, 0x04, 0xf6, 0x92, 0x24, 0xdb,
+ 0x9b, 0x6f, 0xfa, 0x8d, 0x72, 0x2d, 0x75, 0x7e,
+ 0x33, 0x9c, 0xe7, 0x06, 0xbb, 0x3d, 0xa4, 0xb7,
+ 0xee, 0x31, 0x46, 0x4b, 0x91, 0xe2, 0xb0, 0x54,
+ 0x5c, 0x78, 0x9e, 0x45, 0x90, 0xe4, 0x76, 0xbe,
+ 0xe1, 0x4c, 0xae, 0x89, 0x20, 0x6e, 0x77, 0x76,
+ 0x94, 0x63, 0x93, 0xaa, 0x62, 0x0e, 0x28, 0x7b,
+ 0xec, 0xc9, 0xc5, 0x25, 0x64, 0x5a, 0xe9, 0xcc,
+ 0x91, 0x1a, 0x9c, 0xcf, 0x91, 0x47, 0x32, 0x12,
+ 0x9f, 0x8b, 0x36, 0x07, 0x33, 0x4c, 0x45, 0x06,
+ 0x19, 0xdb, 0x61, 0xc5, 0x68, 0xb7, 0xab, 0x2e,
+ 0x7b, 0x5c, 0xa6, 0x4c, 0x6e, 0x08, 0x5f, 0xc1,
+ 0xc4, 0x99, 0x64, 0xef, 0xd8, 0x05, 0x5c, 0x0f,
+ 0x76, 0xdd, 0xab, 0x4f, 0x8e, 0x29, 0x54, 0x59,
+ 0x1d, 0x30, 0x33, 0xfb, 0x3b, 0x43, 0x96, 0xf4,
+ 0x52, 0x47, 0x2c, 0x66, 0x81, 0xca, 0xa6, 0x73,
+ 0x51, 0xc1, 0xc0, 0x32, 0x98, 0xa3, 0x41, 0x1c,
+ 0x40, 0x5e, 0x22, 0x05, 0xa0, 0xdb, 0xb0, 0x88,
+ 0xdf, 0xee, 0x2f, 0x3a, 0xbb, 0xe2, 0xef, 0x79,
+ 0x09, 0xa6, 0x0c, 0x0f, 0x4c, 0xdc, 0x81, 0xcc,
+ 0x3d, 0x36, 0x52, 0x4e, 0xbd, 0x44, 0x0d, 0x0d,
+ 0x84, 0xf5, 0x74, 0x33, 0x14, 0x1a, 0x87, 0xcb,
+ 0xcc, 0x93, 0xa3, 0x69, 0x21, 0x20, 0x26, 0x23,
+ 0xd9, 0x95, 0x0c, 0x22, 0x2b, 0x2f, 0x0d, 0xf4,
+ 0x34, 0x74, 0x53, 0x16, 0x5d, 0x60, 0x96, 0x3e,
+ 0x53, 0xd3, 0xcc, 0xc5, 0x72, 0x49, 0xc2, 0x4d,
+ 0xea, 0x02, 0x21, 0x7f, 0xbd, 0x80, 0x1d, 0xf0,
+ 0x87, 0xe6, 0xdb, 0xcc, 0x92, 0xdd, 0xfe, 0x78,
+ 0x4a, 0xd2, 0xf9, 0x77, 0x24, 0xed, 0x5a, 0x31,
+ 0x6c, 0xec, 0x71, 0x5d, 0x85, 0xad, 0xb3, 0xb9,
+ 0x6f, 0x11, 0x2d, 0xfa, 0x42, 0x2b, 0xcb, 0x01,
+ 0x08, 0x18, 0x11, 0x56, 0xcb, 0x01, 0xe1, 0xe0,
+ 0x1f, 0x06, 0xe8, 0x3c, 0x6c, 0x01, 0xaa, 0x49,
+ 0x86, 0xbf, 0x63, 0x79, 0x03, 0xbe, 0xd8, 0x47,
+ 0x4f, 0x26, 0x0d, 0x11, 0xe3, 0x76, 0x27, 0x0e,
+ 0xf1, 0x79, 0x44, 0x46, 0xc3, 0x3b, 0x4f, 0x05,
+ 0x20, 0x40, 0xff, 0x59, 0x6f, 0xaa, 0x17, 0xf4,
+ 0x40, 0xa1, 0x15, 0x0a, 0x4c, 0x0f, 0x94, 0x81,
+ 0xb8, 0x0c, 0x8e, 0x8d, 0xc3, 0x80, 0xc1, 0xeb,
+ 0x02, 0x16, 0xf4, 0xbe, 0xca, 0xa4, 0x3a, 0xa8,
+ 0xec, 0x0c, 0x89, 0xc4, 0x59, 0xe4, 0x8b, 0x9a,
+ 0x40, 0x7e, 0xae, 0xea, 0xa0, 0xeb, 0x6a, 0x99,
+ 0x95, 0x73, 0x79, 0x62, 0x18, 0xb8, 0x38, 0x64,
+ 0x73, 0x97, 0xb7, 0x58, 0xd1, 0x2d, 0x8d, 0xbe,
+ 0xf3, 0x13, 0x2f, 0x7c, 0xc0, 0x1d, 0x61, 0x4e,
+ 0x4c, 0xe6, 0x95, 0xce, 0x97, 0xf9, 0xbc, 0xf4,
+ 0x5a, 0xce, 0xa1, 0x3b, 0x39, 0xef, 0xc5, 0x39,
+ 0x4b, 0x72, 0x1b, 0xa5, 0x41, 0x92, 0x27, 0xda,
+ 0x72, 0xc2, 0xbb, 0xd4, 0x8d, 0x34, 0x97, 0x9d,
+ 0xb7, 0xde, 0xe7, 0xb0, 0x64, 0x8a, 0x0a, 0x0c,
+ 0x0e, 0x60, 0x30, 0x62, 0xb8, 0xbb, 0x9f, 0x96,
+ 0x05, 0x31, 0x33, 0xfa, 0x3c, 0x1f, 0xf4, 0x3d,
+ 0x04, 0x3c, 0x5c, 0x1e, 0x1b, 0xfe, 0xf1, 0xfe,
+ 0xa1, 0xb1, 0x03, 0x54, 0x99, 0x50, 0x61, 0xc5,
+ 0xbc, 0x2d, 0x00, 0xfe, 0xaf, 0x01, 0xe1, 0x7f,
+ 0xeb, 0xd4, 0x77, 0x0d, 0xb4, 0x0a, 0x9c, 0x18,
+ 0x92, 0x3d, 0x5a, 0xbf, 0xc0, 0x98, 0x66, 0xcc,
+ 0x06, 0x09, 0x6a, 0x50, 0xe9, 0x18, 0x32, 0x00,
+ 0x78, 0xc8, 0x06, 0x68, 0xac, 0x8b, 0x3f, 0x38,
+ 0xbf, 0x4a, 0x33, 0x30, 0x1c, 0x4f, 0xae, 0x16,
+ 0x44, 0x98, 0x24, 0x08, 0xc9, 0x07, 0xed, 0x62,
+ 0xbb, 0x89, 0x15, 0xca, 0x0f, 0x09, 0x00, 0x7a,
+ 0x51, 0xc5, 0x93, 0x54, 0x45, 0xfb, 0x73, 0xdf,
+ 0xe9, 0x42, 0x07, 0x90, 0x10, 0xcb, 0xdb, 0x2b,
+ 0x47, 0x20, 0x2b, 0xaa, 0xf4, 0x5c, 0xa4, 0x28,
+ 0x38, 0x9d, 0x5a, 0x44, 0x22, 0x0d, 0x54, 0x81,
+ 0x1d, 0x07, 0x0a, 0x37, 0xee, 0x49, 0x8b, 0xfb,
+ 0x3a, 0x8d, 0x7e, 0x83, 0x84, 0xfd, 0xf7, 0x98,
+ 0xad, 0xac, 0xa7, 0x46, 0x07, 0x62, 0x72, 0x56,
+ 0x1c, 0x03, 0x05, 0x4d, 0x70, 0xd8, 0x60, 0x62,
+ 0x8a, 0x8d, 0xe8, 0x23, 0x03, 0x04, 0x6d, 0x60,
+ 0xdc, 0x2a, 0x27, 0x92, 0x08, 0x8f, 0x65, 0xed,
+ 0xbd, 0xca, 0xa5, 0x1d, 0x80, 0x8d, 0x11, 0x03,
+ 0x83, 0xc7, 0x05, 0x04, 0x85, 0xcd, 0x2f, 0x3a,
+ 0xd4, 0x83, 0x02, 0x91, 0x91, 0xc5, 0x76, 0xb5,
+ 0x79, 0xcb, 0xfb, 0x29, 0x22, 0x90, 0x1e, 0x09,
+ 0x9f, 0x2c, 0x07, 0x77, 0xa0, 0x38, 0xf8, 0x63,
+ 0xf5, 0x2a, 0xd4, 0xc5, 0x0f, 0xd7, 0x43, 0x38,
+ 0xb5, 0xe8, 0x38, 0x94, 0x29, 0x71, 0x68, 0xb4,
+ 0x99, 0x0a, 0x4d, 0xf6, 0x94, 0x9d, 0x8e, 0x96,
+ 0x58, 0x88, 0x63, 0x46, 0x02, 0x9d, 0x64, 0x83,
+ 0x70, 0x72, 0x32, 0x6f, 0x90, 0x1d, 0x0e, 0xd5,
+ 0xf5, 0xd9, 0x0d, 0xe8, 0x0f, 0xa3, 0x20, 0x5f,
+ 0x26, 0x59, 0xc3, 0x50, 0x33, 0x04, 0xc9, 0x0c,
+ 0xc8, 0xa2, 0xce, 0x12, 0x43, 0x44, 0xa3, 0x55,
+ 0xe5, 0x07, 0x05, 0x1a, 0x69, 0xa8, 0xc4, 0x39,
+ 0x92, 0xa2, 0x44, 0x0e, 0x08, 0xe0, 0xa2, 0x4a,
+ 0x28, 0xd7, 0x80, 0xe1, 0x37, 0x96, 0x0c, 0x49,
+ 0x28, 0x0f, 0x3c, 0xc8, 0xe2, 0xc1, 0x5d, 0x4f,
+ 0xd4, 0x48, 0xa2, 0x21, 0x59, 0xf1, 0x0d, 0x9f,
+ 0xaa, 0xc6, 0x77, 0xc8, 0xe5, 0xce, 0x0d, 0xca,
+ 0x02, 0x87, 0x4a, 0x49, 0x01, 0xc8, 0x48, 0xc8,
+ 0xf3, 0x1b, 0x2f, 0xdf, 0x6c, 0xcb, 0x88, 0x66,
+ 0xf1, 0x40, 0xbd, 0x6a, 0x34, 0xfc, 0xb0, 0x89,
+ 0xde, 0x11, 0xc5, 0xc6, 0xa2, 0x44, 0xc6, 0xdb,
+ 0x67, 0xff, 0xd1, 0x79, 0x01, 0xa4, 0x9e, 0xf0,
+ 0x1f, 0x10, 0x57, 0x2b, 0x24, 0xc5, 0x1c, 0x09,
+ 0x45, 0x7e, 0xcc, 0x55, 0xe5, 0x0d, 0x64, 0xe2,
+ 0x2c, 0xe4, 0xea, 0xe4, 0x81, 0x31, 0xfd, 0x61,
+ 0x38, 0x8f, 0xba, 0x1f, 0xb4, 0xd9, 0x6c, 0xa8,
+ 0xac, 0xe4, 0xe8, 0xca, 0x9e, 0xee, 0xa9, 0x51,
+ 0xd7, 0xe9, 0x9d, 0xcc, 0xb0, 0x7c, 0x24, 0xc5,
+ 0x13, 0xa0, 0x89, 0x78, 0x0b, 0x15, 0xd1, 0x09,
+ 0xe4, 0xbf, 0x34, 0x6f, 0xcf, 0x0b, 0x82, 0x51,
+ 0xb3, 0x70, 0x7d, 0x83, 0xe1, 0x24, 0x0d, 0x33,
+ 0xad, 0xda, 0x5d, 0xfe, 0xe7, 0x38, 0x54, 0x52,
+ 0x0e, 0x3d, 0xd5, 0xec, 0xef, 0x0b, 0x05, 0xe1,
+ 0x16, 0xa9, 0x45, 0xec, 0x5f, 0x81, 0xb9, 0xc8,
+ 0xff, 0x36, 0x0e, 0x0e, 0x01, 0x81, 0x31, 0xae,
+ 0x4b, 0x35, 0xd8, 0x18, 0x17, 0x8c, 0x33, 0x7a,
+ 0xa2, 0xee, 0x06, 0x5b, 0xd8, 0x0b, 0x07, 0xb0,
+ 0x52, 0xbe, 0xf6, 0xf4, 0x38, 0xec, 0x35, 0x6e,
+ 0x45, 0xc1, 0x5e, 0x51, 0xd3, 0x67, 0x93, 0x6d,
+ 0xaf, 0xd0, 0xe0, 0x2a, 0xea, 0x6a, 0x1e, 0x03,
+ 0x0c, 0x38, 0xa4, 0x38, 0xea, 0x34, 0x41, 0x99,
+ 0xcb, 0xe0, 0xcd, 0xda, 0xf2, 0xee, 0x86, 0x28,
+ 0x83, 0x38, 0x0b, 0x13, 0xd1, 0x73, 0x1e, 0x4f,
+ 0xb5, 0x18, 0x7d, 0xef, 0xed, 0x09, 0xdf, 0xf7,
+ 0x4a, 0x91, 0xdb, 0x41, 0x84, 0xf7, 0x07, 0x14,
+ 0x15, 0x3b, 0x01, 0xc5, 0x28, 0x41, 0x78, 0x9f,
+ 0xf6, 0x92, 0xce, 0x06, 0xe0, 0xb9, 0x9d, 0xa0,
+ 0xee, 0xf0, 0x25, 0xa9, 0xd4, 0xe0, 0x71, 0xb4,
+ 0x66, 0x0c, 0x11, 0x47, 0x01, 0x89, 0x34, 0x62,
+ 0x11, 0x60, 0x27, 0xa0, 0xfb, 0x1f, 0xfe, 0xd1,
+ 0x50, 0x6e, 0x0e, 0x23, 0xc3, 0xd8, 0x0e, 0xe8,
+ 0x53, 0xa7, 0x94, 0x03, 0x12, 0x41, 0x9a, 0x90,
+ 0x97, 0xce, 0x87, 0x0d, 0x42, 0x9d, 0x07, 0xce,
+ 0xff, 0xef, 0x4e, 0x07, 0x1a, 0x31, 0x08, 0x92,
+ 0x98, 0x0c, 0x49, 0x46, 0x74, 0x22, 0x2a, 0xf1,
+ 0x01, 0x51, 0x48, 0x26, 0xe9, 0xf5, 0xcd, 0xb0,
+ 0x0c, 0x2e, 0xa1, 0x3d, 0x29, 0x05, 0x4f, 0xa0,
+ 0x12, 0x06, 0x08, 0x9c, 0x94, 0x08, 0x60, 0xce,
+ 0xd0, 0x96, 0x81, 0x81, 0x18, 0x62, 0x03, 0xcc,
+ 0xba, 0x15, 0xd6, 0x91, 0x11, 0x14, 0x7e, 0xb2,
+ 0x7e, 0xd4, 0x56, 0x74, 0x37, 0xdc, 0x82, 0xfb,
+ 0x21, 0xa1, 0x93, 0x91, 0x60, 0x3d, 0xcb, 0x28,
+ 0x4b, 0x52, 0xe9, 0x26, 0x4a, 0x0c, 0x32, 0xca,
+ 0x31, 0xab, 0x10, 0x19, 0x6e, 0x76, 0x50, 0x1e,
+ 0x7c, 0x89, 0x2f, 0x42, 0x4a, 0x46, 0xf8, 0xb1,
+ 0x5e, 0xdc, 0xbe, 0x81, 0x4a, 0x0c, 0x4e, 0x6a,
+ 0x31, 0x70, 0xd4, 0x17, 0x62, 0x30, 0xf8, 0xbb,
+ 0xaa, 0xba, 0x06, 0x98, 0xf4, 0x05, 0x40, 0x7c,
+ 0x8e, 0x81, 0x22, 0xc7, 0x8b, 0xf2, 0x67, 0x49,
+ 0x64, 0x58, 0x1c, 0xb8, 0xa0, 0x6d, 0xb9, 0xea,
+ 0x5b, 0x11, 0x47, 0x18, 0xe7, 0xd0, 0xbc, 0xce,
+ 0xf3, 0x9d, 0x19, 0x10, 0x92, 0x95, 0x45, 0x47,
+ 0x78, 0x87, 0x81, 0x32, 0x6b, 0xc0, 0xe5, 0x7a,
+ 0x79, 0x25, 0x37, 0x0d, 0x05, 0x06, 0x73, 0x39,
+ 0x50, 0x9f, 0x8f, 0x5d, 0x09, 0x24, 0x34, 0x32,
+ 0x18, 0x04, 0x62, 0x9c, 0xe8, 0x1e, 0x06, 0x52,
+ 0x88, 0x1e, 0x26, 0x01, 0x30, 0x36, 0x81, 0x60,
+ 0x63, 0x41, 0x6a, 0x77, 0xa8, 0x42, 0xd4, 0xba,
+ 0x1f, 0x0e, 0x79, 0x06, 0x2d, 0x16, 0x83, 0x00,
+ 0xe3, 0xe6, 0xcb, 0xba, 0x82, 0x4a, 0x27, 0xd7,
+ 0x5e, 0xdc, 0x58, 0x44, 0x19, 0x28, 0x0c, 0xc7,
+ 0x2f, 0x57, 0xb2, 0x83, 0x83, 0x40, 0xcc, 0x1c,
+ 0xb8, 0x99, 0x41, 0xb9, 0xb0, 0xc8, 0x1f, 0x36,
+ 0x00, 0x75, 0x14, 0xa9, 0x25, 0x34, 0x87, 0x83,
+ 0x05, 0x13, 0x16, 0x7d, 0x91, 0x40, 0x3b, 0x9c,
+ 0xe8, 0x38, 0x57, 0x17, 0xd2, 0x03, 0xc0, 0xff,
+ 0x4e, 0x0c, 0x1f, 0x16, 0x96, 0xc0, 0xe3, 0x8d,
+ 0x62, 0x75, 0xb8, 0x04, 0xae, 0x03, 0x80, 0x88,
+ 0xa1, 0x56, 0x31, 0x57, 0x66, 0x2d, 0x8a, 0xef,
+ 0x11, 0x6f, 0xca, 0xe9, 0x47, 0x79, 0xd0, 0x9d,
+ 0x0c, 0xb0, 0x18, 0x47, 0x06, 0x03, 0x57, 0x2c,
+ 0xda, 0x8f, 0x4a, 0x80, 0xd9, 0xa0, 0x62, 0x80,
+ 0x60, 0x4d, 0x95, 0x18, 0x8c, 0x18, 0x45, 0xcb,
+ 0x17, 0xad, 0x34, 0xa3, 0xd2, 0xa1, 0xb5, 0xd3,
+ 0x32, 0xd9, 0xdb, 0xd1, 0x82, 0x98, 0x18, 0x83,
+ 0xa9, 0xcd, 0xb5, 0x20, 0x77, 0x03, 0x5c, 0x5f,
+ 0xa6, 0xdb, 0x48, 0x12, 0xd7, 0x46, 0xc8, 0xd1,
+ 0x78, 0x1c, 0x1d, 0x17, 0x04, 0x91, 0xe8, 0xbc,
+ 0x2a, 0xa0, 0x53, 0x83, 0x11, 0x29, 0xff, 0x18,
+ 0xfe, 0x8d, 0x98, 0x6e, 0xad, 0x11, 0x65, 0xa0,
+ 0xc8, 0x3c, 0x48, 0x48, 0x13, 0x55, 0x28, 0xf5,
+ 0x61, 0x9d, 0xe0, 0x38, 0x5e, 0x12, 0xc0, 0x70,
+ 0x44, 0xbf, 0x6f, 0x25, 0x9d, 0x2b, 0xcf, 0xb6,
+ 0x79, 0x3d, 0xcf, 0x45, 0x32, 0xa8, 0x19, 0x67,
+ 0x3a, 0x14, 0x43, 0x6d, 0x7d, 0xa1, 0x04, 0xb7,
+ 0x3e, 0xd3, 0x75, 0x45, 0x2a, 0x6a, 0x6d, 0xb2,
+ 0x12, 0x87, 0x90, 0xa0, 0x6b, 0xbf, 0x1a, 0x5b,
+ 0xb7, 0x14, 0xd0, 0x26, 0x88, 0x5e, 0xb8, 0x4d,
+ 0x70, 0x19, 0x65, 0x36, 0xdd, 0x9c, 0x40, 0x7a,
+ 0xbf, 0x21, 0xc8, 0x38, 0x38, 0x01, 0xca, 0x1e,
+ 0xc5, 0xee, 0xb3, 0x40, 0xc0, 0x9a, 0xd6, 0x24,
+ 0xa7, 0xb4, 0x6b, 0x06, 0x18, 0xfc, 0x1c, 0x11,
+ 0xaf, 0x6d, 0xcc, 0xbd, 0x5e, 0xc8, 0x8e, 0x07,
+ 0xbc, 0xe0, 0x52, 0x8f, 0x9a, 0xb1, 0x74, 0x40,
+ 0xe4, 0x63, 0x20, 0x99, 0x4f, 0xa8, 0xbc, 0x0e,
+ 0xf2, 0x86, 0x80, 0xea, 0x09, 0x8a, 0xec, 0xdd,
+ 0xe7, 0x39, 0x49, 0x6e, 0xc4, 0x5c, 0x5d, 0x0d,
+ 0x45, 0xd1, 0x7b, 0x8b, 0xd5, 0xaf, 0x43, 0x17,
+ 0xe9, 0x49, 0xac, 0x6d, 0x10, 0xa6, 0x4e, 0x5e,
+ 0xa8, 0xc8, 0x20, 0xca, 0x54, 0x8e, 0xa1, 0x15,
+ 0xb5, 0x0d, 0xa0, 0x66, 0x70, 0x93, 0x6f, 0x01,
+ 0xc4, 0x2b, 0xc1, 0x46, 0xbd, 0x74, 0x96, 0x05,
+ 0x75, 0x50, 0xc0, 0xc3, 0x8b, 0x22, 0x25, 0x07,
+ 0x1d, 0xf6, 0x70, 0x92, 0x2d, 0x17, 0x09, 0xcb,
+ 0xef, 0xbd, 0x88, 0xd6, 0x46, 0x7b, 0xbd, 0xa0,
+ 0xe7, 0xe9, 0xc7, 0x09, 0x01, 0xc0, 0xb1, 0x29,
+ 0x3a, 0xc1, 0xdd, 0x05, 0xd2, 0x6a, 0x60, 0x73,
+ 0x06, 0x54, 0x26, 0x84, 0x0b, 0x22, 0x42, 0x7e,
+ 0x0d, 0x62, 0xfe, 0xc5, 0xb8, 0x30, 0x3a, 0xa2,
+ 0x5f, 0x5b, 0xee, 0x6c, 0xc2, 0x50, 0x7a, 0x18,
+ 0x00, 0xdf, 0x86, 0x41, 0x97, 0x16, 0x3d, 0xd9,
+ 0xcb, 0x09, 0x46, 0x40, 0xb0, 0x04, 0xe5, 0xa0,
+ 0xbb, 0xa9, 0x8d, 0x84, 0xa6, 0xd4, 0xb7, 0x53,
+ 0xb2, 0xdf, 0x33, 0x16, 0x41, 0x38, 0x2f, 0x3c,
+ 0xa8, 0x21, 0xef, 0x3e, 0xd6, 0xcd, 0x8b, 0xf9,
+ 0x1f, 0x03, 0x7a, 0x29, 0x18, 0x84, 0x26, 0x7f,
+ 0xe1, 0xdf, 0x98, 0x1c, 0x36, 0x58, 0xdc, 0x51,
+ 0xde, 0x2d, 0x35, 0x1f, 0x69, 0xa7, 0x0a, 0x82,
+ 0x08, 0xe9, 0x59, 0x7f, 0x2b, 0x4a, 0x39, 0x25,
+ 0x96, 0x5f, 0xf1, 0x08, 0xa6, 0x5b, 0x4b, 0x67,
+ 0x51, 0x12, 0xf0, 0xf2, 0xae, 0x68, 0xbb, 0x72,
+ 0xef, 0x0a, 0xb6, 0x02, 0xbd, 0x14, 0x42, 0x37,
+ 0x1b, 0x80, 0xe2, 0x3a, 0xb7, 0xb4, 0x1c, 0x0a,
+ 0x9b, 0xa0, 0xea, 0x11, 0x21, 0x4b, 0x07, 0xc9,
+ 0x93, 0xb7, 0x7b, 0xd1, 0x13, 0x8d, 0x62, 0xfd,
+ 0x28, 0xbd, 0x44, 0x0e, 0x0f, 0x4e, 0x49, 0xb4,
+ 0x43, 0x11, 0xc0, 0x38, 0x38, 0x08, 0xd2, 0xd9,
+ 0x2e, 0x2c, 0x03, 0x9f, 0xa7, 0xd6, 0x37, 0x46,
+ 0x01, 0x1f, 0x58, 0x56, 0xc0, 0x9c, 0x07, 0x0c,
+ 0x9d, 0xba, 0x0a, 0x9a, 0x15, 0xd4, 0x63, 0x6a,
+ 0x13, 0x69, 0xe0, 0x6f, 0x4c, 0xd0, 0x53, 0xc0,
+ 0xf6, 0x6f, 0x3c, 0xb7, 0x7d, 0xcb, 0x3b, 0x40,
+ 0x8e, 0xfa, 0x04, 0x48, 0x16, 0x35, 0x8b, 0x7d,
+ 0xbc, 0x81, 0xaa, 0xb2, 0xe8, 0xbf, 0x7a, 0x0c,
+ 0x1c, 0xfe, 0x86, 0x26, 0x8e, 0x86, 0x25, 0x83,
+ 0x9d, 0x07, 0x11, 0xcf, 0xb8, 0x5b, 0x88, 0xe9,
+ 0x5e, 0x12, 0x21, 0x13, 0xed, 0xb1, 0xfa, 0x0c,
+ 0x87, 0xf0, 0xa3, 0x96, 0x05, 0x75, 0x33, 0x7a,
+ 0x3d, 0x1f, 0x09, 0x49, 0x58, 0x56, 0x9d, 0x95,
+ 0x5e, 0x52, 0x9b, 0x30, 0x3d, 0x64, 0x3d, 0xe4,
+ 0xde, 0xcb, 0x3c, 0x59, 0x56, 0x0d, 0xd4, 0x94,
+ 0x43, 0xf6, 0x24, 0xb7, 0x19, 0x1f, 0xa5, 0x6f,
+ 0xd7, 0xc5, 0x9f, 0x56, 0xde, 0xe7, 0x38, 0x8a,
+ 0xed, 0x3c, 0x15, 0xc1, 0x9b, 0x6b, 0x55, 0xab,
+ 0x11, 0xa4, 0xce, 0xef, 0xd2, 0x4c, 0x88, 0x00,
+ 0xad, 0x15, 0x18, 0xff, 0xb5, 0xad, 0xdf, 0x6f,
+ 0xa4, 0xdc, 0xbc, 0xab, 0x84, 0x65, 0x30, 0xab,
+ 0x09, 0x6b, 0xf4, 0xff, 0x43, 0x78, 0x30, 0x08,
+ 0xa7, 0xa0, 0xa9, 0xa2, 0xf0, 0x8b, 0x72, 0x82,
+ 0xa0, 0x5c, 0x12, 0xb0, 0x27, 0xe1, 0x84, 0x09,
+ 0x27, 0x6e, 0x2d, 0x62, 0xc6, 0xd1, 0x85, 0x1a,
+ 0x72, 0xb1, 0xbf, 0x83, 0xcc, 0x7f, 0xfa, 0x13,
+ 0x54, 0xe0, 0x71, 0xfa, 0x0e, 0x23, 0x7d, 0x06,
+ 0x25, 0x18, 0x4a, 0x11, 0x69, 0x43, 0x76, 0xe8,
+ 0xc8, 0x18, 0x23, 0x96, 0x15, 0x2c, 0x7f, 0x4e,
+ 0x8b, 0x01, 0x83, 0x6d, 0x18, 0x83, 0x04, 0x5b,
+ 0x80, 0xa8, 0xc1, 0x9d, 0x01, 0xfa, 0xe2, 0xa3,
+ 0x8d, 0x4f, 0xe9, 0x63, 0x0d, 0xfe, 0xe7, 0x7b,
+ 0xcc, 0x5e, 0x86, 0xf5, 0x1b, 0xae, 0x0e, 0x93,
+ 0xa0, 0x1f, 0x36, 0x33, 0xe8, 0x0e, 0x74, 0xcf,
+ 0xa0, 0x43, 0x11, 0x82, 0x6d, 0x5a, 0xa8, 0xa6,
+ 0x1a, 0xcb, 0xa1, 0xb4, 0x99, 0x6a, 0x08, 0x8f,
+ 0x68, 0x30, 0x2c, 0x5f, 0x51, 0xfd, 0x10, 0x1a,
+ 0xff, 0xd6, 0xec, 0xe7, 0x7a, 0xc7, 0xaf, 0x49,
+ 0x16, 0xbb, 0x51, 0x50, 0xad, 0xbf, 0x8b, 0x76,
+ 0x86, 0x20, 0x9b, 0x11, 0x81, 0xc5, 0x1b, 0x6f,
+ 0x06, 0xdf, 0xfc, 0x28, 0xda, 0xe9, 0x03, 0x6a,
+ 0xc1, 0x83, 0x96, 0xc1, 0x86, 0x3a, 0x12, 0xd2,
+ 0x8a, 0x8c, 0x83, 0x85, 0xd0, 0xa0, 0xf3, 0x2e,
+ 0x86, 0xee, 0xe1, 0xb7, 0xa1, 0x6d, 0x16, 0x2e,
+ 0xf4, 0x46, 0xc1, 0x45, 0x99, 0xd2, 0x6d, 0x72,
+ 0xd2, 0xe6, 0x52, 0x84, 0x07, 0x84, 0xf3, 0xc0,
+ 0xe0, 0x0e, 0xa2, 0x1f, 0x6c, 0xce, 0xf6, 0x83,
+ 0xc1, 0xc0, 0x3f, 0x47, 0xb9, 0x68, 0xc8, 0x11,
+ 0x04, 0x14, 0x40, 0xc3, 0x43, 0x13, 0xa0, 0xf3,
+ 0xff, 0xff, 0xbe, 0xfe, 0x58, 0xd4, 0x51, 0x7b,
+ 0x0a, 0x01, 0x62, 0x48, 0xe1, 0x9b, 0x6b, 0x65,
+ 0x8b, 0x54, 0x41, 0xc8, 0x9d, 0x57, 0x57, 0x64,
+ 0xf7, 0x51, 0x83, 0x0c, 0x47, 0x25, 0x01, 0xc8,
+ 0xad, 0x4a, 0x58, 0x4b, 0x05, 0xe0, 0xc0, 0x3d,
+ 0x10, 0x4e, 0xb5, 0x85, 0xb8, 0xbc, 0xb0, 0x1e,
+ 0x2a, 0x00, 0xb0, 0x58, 0xbd, 0x5e, 0xca, 0x4a,
+ 0x0c, 0x2e, 0x19, 0x82, 0xe5, 0x3e, 0x8b, 0xa0,
+ 0xe0, 0xc8, 0x8a, 0xae, 0xe7, 0xbe, 0x55, 0xbc,
+ 0x45, 0x4a, 0x60, 0x60, 0x09, 0xcb, 0x89, 0x4c,
+ 0x32, 0x08, 0x6d, 0x09, 0x0d, 0xb4, 0xd2, 0x54,
+ 0xf8, 0xa8, 0xab, 0xca, 0x6f, 0xc4, 0xbf, 0x00,
+ 0xe6, 0xb6, 0x8c, 0x4f, 0xc6, 0x16, 0xf7, 0x67,
+ 0x1a, 0x9b, 0x2a, 0x1c, 0xe0, 0x0e, 0x44, 0x80,
+ 0x80, 0x34, 0xb2, 0x9d, 0x59, 0x58, 0x17, 0xd1,
+ 0x87, 0x81, 0x60, 0x2c, 0xf8, 0x0a, 0xad, 0x69,
+ 0x49, 0x5d, 0x40, 0x43, 0x1b, 0x4e, 0x83, 0x7c,
+ 0x48, 0x88, 0x92, 0x09, 0x3f, 0x05, 0x78, 0xf6,
+ 0xc0, 0x60, 0xc9, 0xea, 0xd0, 0x66, 0xd3, 0x20,
+ 0x08, 0x5b, 0xa0, 0xaf, 0x1d, 0xb3, 0xa1, 0x35,
+ 0x2e, 0x1c, 0xc8, 0x33, 0x09, 0x1a, 0x34, 0x6d,
+ 0x83, 0x06, 0x61, 0x21, 0x5a, 0x99, 0x57, 0xd1,
+ 0xcc, 0xa2, 0x96, 0xed, 0x05, 0xc3, 0x61, 0x84,
+ 0x1e, 0x07, 0xfc, 0x3e, 0x55, 0x2d, 0x01, 0xe4,
+ 0x92, 0xc4, 0x56, 0xd6, 0xff, 0xc0, 0xa0, 0x6a,
+ 0x23, 0x89, 0x29, 0xc4, 0x76, 0x43, 0xf6, 0x7c,
+ 0xd6, 0x55, 0x0a, 0x0a, 0xb1, 0x00, 0x13, 0xaf,
+ 0xa2, 0xa0, 0xe4, 0x5c, 0x11, 0xb2, 0xa2, 0x51,
+ 0x80, 0x46, 0x98, 0xc3, 0x1e, 0x1b, 0x35, 0xc2,
+ 0x5c, 0xb5, 0xf4, 0xfb, 0xf2, 0x1c, 0x83, 0x83,
+ 0x80, 0x7c, 0xf8, 0x01, 0xfd, 0x9a, 0x85, 0x49,
+ 0x69, 0xc7, 0xd8, 0x1a, 0xc3, 0x0f, 0xa3, 0x27,
+ 0xb5, 0xa6, 0xc5, 0xdb, 0x3a, 0x15, 0x6e, 0x5e,
+ 0xdb, 0x93, 0x60, 0x8b, 0x28, 0x31, 0x48, 0xc0,
+ 0x35, 0x09, 0x3b, 0x5f, 0x28, 0x18, 0x54, 0x01,
+ 0x80, 0x66, 0x8c, 0x8e, 0x7e, 0xd6, 0xaa, 0x8d,
+ 0xa9, 0x9c, 0xa6, 0xe3, 0x10, 0xb6, 0x8c, 0x16,
+ 0xd0, 0x97, 0x4f, 0x78, 0x15, 0x21, 0x88, 0xb8,
+ 0x85, 0xb9, 0x01, 0xd1, 0x67, 0x69, 0xfd, 0xbe,
+ 0xe4, 0x52, 0xd6, 0xc4, 0x6a, 0x24, 0x07, 0x54,
+ 0x28, 0x08, 0xa6, 0x6f, 0x94, 0x03, 0x22, 0xf8,
+ 0x67, 0x46, 0x20, 0x9a, 0x4c, 0x93, 0x90, 0x1c,
+ 0x09, 0x90, 0x32, 0x46, 0x32, 0x0a, 0x2d, 0xe8,
+ 0x27, 0xc5, 0xdc, 0xf6, 0xc9, 0xde, 0x4e, 0x1a,
+ 0x45, 0x02, 0x5b, 0xab, 0xeb, 0x4a, 0x2f, 0x4d,
+ 0x95, 0x29, 0xe8, 0x0f, 0x04, 0xcc, 0xb8, 0xbc,
+ 0x6b, 0x32, 0x06, 0x08, 0x0d, 0xc0, 0x5f, 0xdb,
+ 0x24, 0x46, 0xb1, 0xbe, 0x85, 0x5a, 0xeb, 0x4a,
+ 0xa0, 0x40, 0x42, 0x48, 0x59, 0x37, 0xbd, 0x18,
+ 0x82, 0x72, 0x63, 0xfd, 0xa5, 0x12, 0x83, 0x90,
+ 0x85, 0x1e, 0xd5, 0x83, 0x35, 0xe0, 0xb9, 0x02,
+ 0xc7, 0xcd, 0x88, 0x23, 0x86, 0xe7, 0xc7, 0x12,
+ 0x4b, 0xcd, 0x1c, 0x59, 0x51, 0x29, 0x0c, 0x3b,
+ 0xc9, 0xd0, 0x4d, 0xf9, 0x6a, 0x33, 0xba, 0xef,
+ 0x2e, 0xe5, 0xd8, 0x69, 0x1a, 0x14, 0x44, 0x29,
+ 0xe6, 0xcb, 0xee, 0x7f, 0xd6, 0x9b, 0x25, 0x0c,
+ 0x51, 0x05, 0x48, 0xe4, 0xf9, 0x6a, 0xfd, 0xc9,
+ 0x9d, 0x8b, 0xd9, 0xd1, 0x3a, 0x14, 0x7d, 0xa9,
+ 0x38, 0x5a, 0x55, 0xd4, 0x57, 0x7f, 0xfb, 0x62,
+ 0x11, 0x80, 0x30, 0x61, 0x1d, 0x6a, 0x00, 0x92,
+ 0x2e, 0x9a, 0x7b, 0x82, 0x4a, 0x75, 0x77, 0x3b,
+ 0x61, 0xb6, 0xbe, 0x36, 0xa1, 0x87, 0x67, 0x46,
+ 0x0f, 0x30, 0xaf, 0x70, 0xbd, 0x8d, 0xc8, 0x31,
+ 0x53, 0x37, 0xc0, 0xc1, 0x8c, 0x15, 0x1d, 0x4d,
+ 0x38, 0xb5, 0x5c, 0x1c, 0x0b, 0xc1, 0x53, 0x17,
+ 0xe0, 0x75, 0xb6, 0x68, 0x19, 0x9d, 0x2b, 0xf4,
+ 0xe2, 0x09, 0x41, 0x30, 0xbe, 0xd0, 0xf7, 0xb2,
+ 0x2c, 0x69, 0xd1, 0x33, 0x83, 0xa6, 0x59, 0x66,
+ 0x17, 0xcb, 0x59, 0x6c, 0x18, 0x0c, 0x27, 0x1b,
+ 0xfe, 0xd4, 0x72, 0xac, 0x75, 0x25, 0x65, 0xca,
+ 0xfa, 0x0c, 0x05, 0xac, 0x29, 0x06, 0x04, 0xe1,
+ 0x78, 0xe8, 0x79, 0x4a, 0xf2, 0xa9, 0xe6, 0xfb,
+ 0xf1, 0x0e, 0x7e, 0xcd, 0x95, 0x6c, 0xed, 0x5a,
+ 0x9a, 0xa6, 0xc5, 0x01, 0x4d, 0x38, 0x36, 0x24,
+ 0x6b, 0xac, 0xe8, 0xf0, 0x77, 0xb9, 0xe9, 0x6f,
+ 0x55, 0x8f, 0x52, 0x48, 0xb2, 0xeb, 0xe6, 0x29,
+ 0xb7, 0xa6, 0xa5, 0x71, 0xbe, 0x57, 0x9e, 0xd0,
+ 0xda, 0xa1, 0xe5, 0x08, 0xaa, 0x65, 0xc1, 0x13,
+ 0xe8, 0x43, 0xef, 0x06, 0xac, 0xf8, 0x1f, 0x37,
+ 0xff, 0xb7, 0x53, 0x7e, 0x65, 0xd9, 0xf4, 0xdf,
+ 0x99, 0xc5, 0x25, 0x9b, 0x9b, 0x5c, 0x71, 0x90,
+ 0x6c, 0x49, 0xbe, 0x55, 0xff, 0x69, 0x70, 0xfa,
+ 0xff, 0xca, 0x7f, 0xe4, 0xe2, 0x4c, 0x42, 0x84,
+ 0x3a, 0x7d, 0xb0, 0x07, 0x07, 0x8c, 0x29, 0x80,
+ 0xc5, 0xa3, 0xc6, 0xee, 0xe1, 0x66, 0xe3, 0x1f,
+ 0xdf, 0xd5, 0x15, 0x08, 0x89, 0x16, 0x3c, 0x30,
+ 0x39, 0xcf, 0xaf, 0x35, 0x10, 0x2a, 0x38, 0x19,
+ 0xbe, 0x26, 0xb8, 0x13, 0x83, 0x00, 0x1c, 0xe4,
+ 0xda, 0xc5, 0x2b, 0xcf, 0xd2, 0xad, 0xc2, 0xa9,
+ 0x37, 0xb7, 0xb5, 0x01, 0x41, 0x0d, 0x40, 0x38,
+ 0x01, 0x9d, 0xe5, 0x12, 0x7f, 0xb4, 0x38, 0x54,
+ 0x5c, 0xdb, 0x7c, 0x02, 0x73, 0x7e, 0x2c, 0x17,
+ 0x2a, 0x1e, 0x09, 0x0a, 0xb3, 0x7c, 0x5d, 0x07,
+ 0xbb, 0xf5, 0xfb, 0xff, 0xa6, 0x9e, 0xef, 0x29,
+ 0xb5, 0x0b, 0x70, 0x6a, 0xa0, 0x6d, 0x01, 0x67,
+ 0xe9, 0x2d, 0x98, 0x72, 0xa6, 0x44, 0x47, 0x12,
+ 0xa2, 0x58, 0x25, 0x2b, 0xdc, 0x67, 0x71, 0xa5,
+ 0x57, 0x0b, 0x15, 0x65, 0xba, 0xa6, 0x07, 0xb3,
+ 0xb6, 0x22, 0x35, 0xde, 0x13, 0x09, 0xda, 0x08,
+ 0x0d, 0xb3, 0xad, 0x83, 0xc1, 0x40, 0x42, 0x3b,
+ 0xb7, 0x22, 0x90, 0xf5, 0xbe, 0x5d, 0xea, 0xcb,
+ 0x01, 0x88, 0xa5, 0x72, 0x60, 0xbe, 0x23, 0x64,
+ 0x6d, 0x57, 0xbb, 0x10, 0x7f, 0x94, 0x41, 0xac,
+ 0x73, 0x84, 0xb1, 0x75, 0xc1, 0x38, 0xeb, 0x25,
+ 0xbe, 0x6e, 0xf4, 0xb9, 0x8f, 0xa9, 0xd5, 0x84,
+ 0x14, 0xad, 0xfe, 0xc3, 0x48, 0x11, 0x52, 0x99,
+ 0x3a, 0x4e, 0x70, 0xe7, 0x65, 0x5a, 0x29, 0x85,
+ 0x2a, 0x02, 0x68, 0x99, 0xaf, 0xaa, 0xfa, 0xad,
+ 0x2c, 0xd1, 0x09, 0x46, 0xc4, 0x0d, 0xfd, 0xba,
+ 0x0c, 0x18, 0x98, 0x6d, 0x97, 0x5a, 0xd3, 0x0d,
+ 0xf9, 0x57, 0xbd, 0x75, 0x4e, 0x7f, 0x3b, 0xd5,
+ 0xf2, 0xa3, 0x9d, 0xde, 0xaf, 0x10, 0x13, 0x97,
+ 0xd5, 0x1c, 0xdb, 0xa3, 0xa2, 0xe9, 0x50, 0x7d,
+ 0x44, 0xdd, 0xe4, 0x0d, 0xea, 0x08, 0x27, 0x33,
+ 0x41, 0xba, 0xd5, 0xda, 0xc4, 0x2c, 0xec, 0xe7,
+ 0x66, 0x35, 0xc9, 0x3b, 0xd9, 0x27, 0x73, 0x83,
+ 0x17, 0x0d, 0x08, 0x3d, 0x35, 0x34, 0xa6, 0x9e,
+ 0xd7, 0xea, 0x84, 0xb2, 0xcf, 0x87, 0x95, 0x94,
+ 0xd5, 0x8b, 0x2e, 0x11, 0x89, 0x02, 0x06, 0x25,
+ 0x6a, 0x46, 0xd5, 0xe5, 0xa5, 0xb9, 0x54, 0x67,
+ 0x22, 0x9d, 0x2b, 0x92, 0xa0, 0x3c, 0x5e, 0xc5,
+ 0x78, 0x38, 0xac, 0xc2, 0xff, 0xe1, 0x57, 0xbc,
+ 0xb2, 0xd5, 0x48, 0xc7, 0x85, 0x10, 0x81, 0x54,
+ 0x89, 0x3d, 0xbb, 0xdc, 0xb8, 0xd8, 0xf5, 0x9c,
+ 0x8c, 0xa7, 0xe9, 0x46, 0x45, 0xd7, 0x40, 0x88,
+ 0x8c, 0xdc, 0x56, 0xdc, 0x46, 0xa3, 0x06, 0xfc,
+ 0xce, 0x91, 0x69, 0x8a, 0x55, 0x02, 0x8b, 0x72,
+ 0xe7, 0xdb, 0x1f, 0xa5, 0x2b, 0x06, 0x40, 0x55,
+ 0x31, 0x45, 0x9d, 0x40, 0xdd, 0x90, 0x54, 0x9a,
+ 0x70, 0x64, 0x89, 0x15, 0xc9, 0xbe, 0x4f, 0xb3,
+ 0x6d, 0xe5, 0x1c, 0xab, 0xc2, 0xc8, 0x30, 0x94,
+ 0xea, 0x5e, 0x54, 0xab, 0x14, 0x7b, 0xfe, 0xce,
+ 0x9b, 0xe6, 0xae, 0x50, 0xa6, 0xe9, 0x18, 0xb6,
+ 0xb1, 0x95, 0x44, 0x53, 0xcf, 0x7b, 0x96, 0x7b,
+ 0x98, 0x59, 0x43, 0x8e, 0x95, 0x0c, 0x21, 0x3b,
+ 0x95, 0xc2, 0xb5, 0xe1, 0x42, 0x80, 0xc0, 0xf6,
+ 0x99, 0xa4, 0xe0, 0x19, 0x83, 0xe1, 0x29, 0x28,
+ 0xf3, 0xd4, 0x72, 0xdb, 0x77, 0xd4, 0x3c, 0xaa,
+ 0x70, 0x3c, 0x45, 0xbd, 0x1b, 0x76, 0xf4, 0x80,
+ 0x30, 0x60, 0x34, 0x12, 0x6f, 0xe2, 0x84, 0x96,
+ 0xaf, 0x36, 0x29, 0xfb, 0x52, 0x73, 0xa8, 0xff,
+ 0x2d, 0xe9, 0xe3, 0x3f, 0xf4, 0xa8, 0xb2, 0xf7,
+ 0x4d, 0x15, 0x45, 0x83, 0x9b, 0x38, 0x33, 0x8b,
+ 0x8a, 0xf0, 0x80, 0xd4, 0x5e, 0x79, 0x7e, 0xf2,
+ 0xd1, 0xb8, 0xbe, 0x2f, 0xb2, 0x94, 0x9e, 0x24,
+ 0x73, 0xfe, 0x02, 0x63, 0x26, 0x79, 0xa4, 0xdd,
+ 0x4a, 0xda, 0x4a, 0xb5, 0xbb, 0x7c, 0x55, 0xdb,
+ 0xee, 0xca, 0x1b, 0x4b, 0xd9, 0xd8, 0x02, 0x0e,
+ 0xfd, 0xaa, 0xd7, 0xee, 0x6c, 0xb3, 0x86, 0xfb,
+ 0x28, 0x56, 0x0c, 0x1a, 0xab, 0xf8, 0x24, 0xb3,
+ 0xf5, 0x51, 0x46, 0xc6, 0x5b, 0xbd, 0x5a, 0xc9,
+ 0x26, 0xd9, 0xb5, 0x75, 0xb9, 0xc3, 0x7c, 0x3c,
+ 0x48, 0x43, 0x08, 0x5a, 0x3f, 0x6f, 0x4b, 0xfb,
+ 0x41, 0x86, 0xc5, 0xad, 0xf1, 0x78, 0xa7, 0x24,
+ 0xce, 0x45, 0xe8, 0xa4, 0x5e, 0x33, 0xcb, 0x3b,
+ 0x39, 0xd4, 0x67, 0x55, 0x72, 0x63, 0xc2, 0xd6,
+ 0x1b, 0x45, 0x29, 0xbb, 0xd8, 0x81, 0x00, 0xcc,
+ 0x63, 0xd3, 0xc5, 0x12, 0x73, 0xfe, 0xf6, 0xde,
+ 0x6e, 0x41, 0x89, 0x5f, 0xaf, 0x65, 0x5a, 0x9b,
+ 0x21, 0x59, 0x5c, 0xc1, 0x0b, 0xc5, 0x7a, 0xbe,
+ 0x28, 0xdf, 0x40, 0xf6, 0x2c, 0x8a, 0xc2, 0xa5,
+ 0x2b, 0x74, 0xf9, 0x3d, 0x63, 0x13, 0xd8, 0x98,
+ 0x71, 0x6f, 0x73, 0xb6, 0x88, 0x0d, 0xb3, 0x66,
+ 0x5a, 0x56, 0x22, 0x77, 0x9b, 0x88, 0x08, 0x64,
+ 0x2d, 0xff, 0x50, 0x42, 0x0d, 0x35, 0x47, 0x1b,
+ 0x93, 0x2d, 0x42, 0x88, 0x50, 0x2f, 0x06, 0xcf,
+ 0x29, 0x4a, 0x3e, 0xa5, 0x5d, 0xc4, 0xea, 0xbb,
+ 0x03, 0xde, 0xf0, 0x73, 0x2f, 0x51, 0xa8, 0x13,
+ 0x11, 0x64, 0x03, 0x14, 0xfb, 0xb3, 0xe1, 0xe2,
+ 0x65, 0x18, 0xcd, 0xd9, 0x51, 0x72, 0xf3, 0x72,
+ 0xd1, 0x12, 0xa3, 0x42, 0x8c, 0x4d, 0x00, 0x79,
+ 0x9f, 0x36, 0x24, 0x8e, 0x95, 0x2a, 0xcc, 0x06,
+ 0x02, 0xea, 0xad, 0x2b, 0xaa, 0x43, 0xcf, 0xe5,
+ 0xd3, 0x4b, 0x2c, 0x4a, 0x34, 0x76, 0xdb, 0x9b,
+ 0x97, 0x80, 0xe1, 0x56, 0xba, 0x6d, 0xe5, 0xf7,
+ 0x40, 0x70, 0x3a, 0x05, 0x91, 0xca, 0x8f, 0x9b,
+ 0xc1, 0x88, 0x2c, 0x0f, 0x0b, 0xb2, 0x50, 0x42,
+ 0x06, 0x2d, 0xbb, 0x98, 0x4b, 0xc6, 0x22, 0x90,
+ 0x78, 0xcf, 0xfd, 0xe6, 0x50, 0x60, 0x9d, 0x16,
+ 0xda, 0xd1, 0xd2, 0x6f, 0xb3, 0xf9, 0x21, 0xab,
+ 0x38, 0xc2, 0x30, 0xd4, 0xb7, 0xea, 0x1d, 0xfa,
+ 0xf6, 0xe7, 0x01, 0xc1, 0xde, 0xc0, 0xb3, 0x4f,
+ 0x03, 0x0f, 0xe7, 0x40, 0x39, 0x3a, 0x3a, 0xbb,
+ 0x08, 0x81, 0x5f, 0x10, 0x10, 0x94, 0x4c, 0x5d,
+ 0x3f, 0x9f, 0xd0, 0x34, 0x9d, 0x3e, 0xad, 0x31,
+ 0x8f, 0x66, 0xf6, 0xf4, 0x45, 0x2a, 0x9b, 0x78,
+ 0xe2, 0x02, 0x3f, 0xbc, 0x3f, 0x2e, 0xfb, 0x01,
+ 0xf8, 0x1a, 0x9b, 0xc0, 0xf6, 0xe5, 0xb5, 0x65,
+ 0xf8, 0xa2, 0xce, 0x3c, 0x23, 0xb4, 0x25, 0x17,
+ 0x2a, 0xb5, 0xa0, 0x60, 0xfd, 0x5f, 0x2f, 0xa5,
+ 0x0f, 0xd5, 0x28, 0x6b, 0xf6, 0xf4, 0x3a, 0xe4,
+ 0xf2, 0x28, 0x8c, 0xd8, 0xac, 0xe4, 0xdf, 0x51,
+ 0x0b, 0x14, 0x6a, 0x32, 0x5e, 0x0b, 0x9d, 0x5f,
+ 0xf8, 0x9d, 0x27, 0xfd, 0x36, 0xfb, 0xfa, 0x59,
+ 0xe0, 0x33, 0xce, 0xf1, 0x63, 0xb6, 0xd9, 0x6f,
+ 0x41, 0xe1, 0x20, 0x15, 0xba, 0x5e, 0x42, 0x57,
+ 0xed, 0x09, 0x1a, 0x59, 0xed, 0x1e, 0x8f, 0x4b,
+ 0xea, 0x56, 0x94, 0x6f, 0x33, 0xba, 0x2f, 0x14,
+ 0x74, 0x9e, 0x08, 0x51, 0x08, 0x8d, 0xbf, 0xf3,
+ 0x7d, 0x57, 0x2a, 0xf1, 0x01, 0xf2, 0x59, 0xd2,
+ 0xd9, 0xce, 0xe4, 0x97, 0xa4, 0xf8, 0x3f, 0x9c,
+ 0x00, 0x6b, 0xa3, 0x1a, 0xfe, 0x82, 0x26, 0xd6,
+ 0x26, 0x67, 0xb6, 0xf2, 0xab, 0xad, 0x7c, 0x3d,
+ 0x9c, 0x06, 0x34, 0xa3, 0x61, 0x55, 0x29, 0x42,
+ 0xe3, 0xac, 0xea, 0x52, 0x4a, 0xc6, 0x1c, 0x32,
+ 0x21, 0xa5, 0x69, 0xbf, 0x7f, 0x1a, 0xc6, 0x04,
+ 0xaa, 0x92, 0x0e, 0x54, 0x79, 0xac, 0xa5, 0xbb,
+ 0xe4, 0x32, 0xc5, 0x2a, 0x38, 0x69, 0x67, 0x91,
+ 0x57, 0xf1, 0xfa, 0xa0, 0xe9, 0xa5, 0x43, 0xea,
+ 0x9e, 0x6c, 0xe4, 0x1b, 0x72, 0xef, 0x1c, 0x5a,
+ 0xac, 0xcc, 0xf7, 0xae, 0x41, 0xcc, 0xa6, 0xcf,
+ 0xaa, 0xe5, 0xd5, 0x77, 0xc1, 0xdc, 0x6e, 0x7f,
+ 0xb9, 0xad, 0x62, 0xe5, 0x56, 0xf0, 0xd3, 0xca,
+ 0x35, 0x1a, 0x55, 0x3f, 0xa0, 0xc1, 0xef, 0x9b,
+ 0x6a, 0x59, 0xba, 0x59, 0x35, 0x6f, 0x72, 0xd3,
+ 0x48, 0x86, 0xa5, 0x41, 0x4e, 0x25, 0xa3, 0x06,
+ 0x0f, 0x55, 0xa6, 0x9b, 0xb3, 0x26, 0x03, 0x8e,
+ 0x2d, 0xe6, 0x75, 0x3b, 0x38, 0xd4, 0xe7, 0xfe,
+ 0xa3, 0xdd, 0xe5, 0xd9, 0x2a, 0x20, 0x71, 0x29,
+ 0x39, 0xec, 0xab, 0xdc, 0xda, 0xa5, 0x47, 0xae,
+ 0x59, 0x05, 0xb5, 0x71, 0x2b, 0x0a, 0x84, 0x25,
+ 0x51, 0x9f, 0xa9, 0x6d, 0x2f, 0x9b, 0x8a, 0x1b,
+ 0x4f, 0xc9, 0xfd, 0xe6, 0x4e, 0x74, 0x3b, 0x5c,
+ 0x8b, 0xf3, 0x6e, 0x4a, 0x18, 0xc0, 0x74, 0x3f,
+ 0x72, 0xee, 0x48, 0xa7, 0x75, 0xb6, 0x7f, 0x6a,
+ 0x2e, 0x49, 0x6a, 0xd3, 0xa1, 0x40, 0xd4, 0x47,
+ 0xd8, 0xce, 0x59, 0x2c, 0x43, 0xc5, 0xe5, 0x5d,
+ 0xfa, 0x66, 0x3f, 0xfa, 0x86, 0xf5, 0x7c, 0x3d,
+ 0x17, 0x32, 0xa2, 0x0f, 0xf1, 0xa5, 0x3d, 0xb4,
+ 0x11, 0xf8, 0x6c, 0x96, 0x22, 0x18, 0xb9, 0xe9,
+ 0x56, 0xee, 0x15, 0x28, 0x44, 0x84, 0x91, 0x11,
+ 0x09, 0xab, 0x75, 0xb6, 0x3d, 0xd9, 0x38, 0xb9,
+ 0x6a, 0x10, 0x1c, 0x35, 0x19, 0xb3, 0x89, 0xd9,
+ 0x95, 0x16, 0xfa, 0x92, 0x2f, 0x45, 0xdc, 0x3f,
+ 0x25, 0x2c, 0xd0, 0x74, 0xd0, 0xc8, 0xf6, 0x9a,
+ 0x31, 0x3f, 0xb8, 0x5a, 0x80, 0xd2, 0xc8, 0x39,
+ 0x10, 0x04, 0xb1, 0x12, 0xf9, 0x19, 0x5a, 0xe6,
+ 0xa0, 0xd1, 0x7d, 0x00, 0xdd, 0xed, 0x2b, 0x49,
+ 0xa0, 0x48, 0x07, 0x3c, 0x69, 0x00, 0x34, 0x43,
+ 0x5e, 0xc6, 0xf1, 0xa4, 0x12, 0x73, 0x06, 0xc8,
+ 0x0e, 0x97, 0x18, 0xdb, 0xd5, 0x82, 0xbd, 0x78,
+ 0xf2, 0x3f, 0x5e, 0xa1, 0x5f, 0x88, 0x88, 0x92,
+ 0xfe, 0x5f, 0x5b, 0xe9, 0xda, 0x04, 0xe5, 0x04,
+ 0xc2, 0x23, 0xf6, 0x95, 0x49, 0x92, 0x40, 0xfd,
+ 0x58, 0x31, 0xbd, 0xc8, 0x83, 0xd2, 0xd4, 0x76,
+ 0x21, 0x0a, 0x82, 0x40, 0xf0, 0x21, 0x26, 0x69,
+ 0x40, 0x19, 0x12, 0xcb, 0x95, 0x37, 0xd1, 0xc6,
+ 0x82, 0xbb, 0x56, 0xab, 0x8d, 0x86, 0xcf, 0xb2,
+ 0x83, 0xba, 0x43, 0x53, 0xa6, 0x95, 0x7e, 0x52,
+ 0xb6, 0x6e, 0xac, 0x8a, 0xa1, 0x29, 0x38, 0x58,
+ 0x77, 0xbe, 0xf2, 0x46, 0x77, 0x65, 0x2c, 0xc8,
+ 0xa6, 0xac, 0xba, 0x88, 0x8e, 0xc3, 0x74, 0x5c,
+ 0x41, 0x70, 0x20, 0x8f, 0xf6, 0x16, 0x87, 0xc3,
+ 0xa4, 0xc6, 0xe1, 0x78, 0x97, 0xef, 0x51, 0x87,
+ 0x17, 0xea, 0xc8, 0xe9, 0xc5, 0x04, 0x31, 0xe9,
+ 0x68, 0x84, 0xde, 0x26, 0x56, 0x3a, 0xf8, 0xfc,
+ 0xb3, 0x8a, 0x12, 0x33, 0xe6, 0x57, 0x43, 0x32,
+ 0x6f, 0xd1, 0x0d, 0x6a, 0x8d, 0x83, 0x7e, 0x70,
+ 0x1c, 0x7a, 0x26, 0xbe, 0x02, 0x94, 0x03, 0x98,
+ 0x6e, 0x6b, 0x0c, 0x0e, 0xdb, 0xdc, 0x44, 0x55,
+ 0x80, 0xc0, 0x3c, 0x26, 0x33, 0xf0, 0x41, 0xd6,
+ 0xdb, 0x97, 0xc3, 0xa5, 0x77, 0xd7, 0x26, 0xf7,
+ 0x6e, 0x79, 0x47, 0x67, 0x78, 0xbe, 0x55, 0xc5,
+ 0x41, 0x9d, 0x5a, 0xb0, 0x65, 0x6a, 0x0a, 0xd2,
+ 0x0f, 0xfd, 0xe0, 0xe7, 0xc3, 0xa5, 0x00, 0xf1,
+ 0x5f, 0xfb, 0xb4, 0xc0, 0x30, 0x4e, 0x3d, 0x6d,
+ 0x94, 0xb6, 0x83, 0x2f, 0xf6, 0xed, 0x06, 0x25,
+ 0xbb, 0xd0, 0x60, 0xaf, 0xea, 0x64, 0x2b, 0x86,
+ 0x9b, 0x68, 0x66, 0x79, 0x91, 0x8f, 0x7c, 0x10,
+ 0xd5, 0x8e, 0x73, 0xaa, 0x8b, 0x95, 0x67, 0x54,
+ 0x52, 0xd1, 0xeb, 0x5d, 0x9e, 0x42, 0x22, 0xf9,
+ 0x73, 0xd0, 0x3d, 0x11, 0xc1, 0x09, 0xa1, 0x15,
+ 0x33, 0x7f, 0x99, 0x54, 0x28, 0xdf, 0xb7, 0xcb,
+ 0x50, 0x8d, 0xff, 0x0f, 0xad, 0xd7, 0xf3, 0x37,
+ 0xed, 0x20, 0xf6, 0x82, 0x3a, 0x80, 0xc8, 0xfe,
+ 0x91, 0x1a, 0x0d, 0xa0, 0xa0, 0xc9, 0x20, 0x2a,
+ 0xa3, 0x76, 0x64, 0x9d, 0x04, 0x4f, 0x5e, 0x83,
+ 0x0c, 0x78, 0xf1, 0x82, 0x70, 0x66, 0x47, 0xd6,
+ 0x71, 0x50, 0x8d, 0x06, 0x31, 0x89, 0xd4, 0x05,
+ 0x4d, 0x4b, 0xde, 0x03, 0x0a, 0x59, 0x46, 0x04,
+ 0x81, 0x2d, 0x38, 0x30, 0xd8, 0x74, 0x3f, 0x64,
+ 0x18, 0xa1, 0x33, 0x3f, 0x83, 0x1c, 0xc7, 0x8f,
+ 0xd6, 0xf8, 0x49, 0x09, 0x7f, 0xfa, 0x19, 0x99,
+ 0xd7, 0x30, 0xd8, 0x41, 0x4a, 0xc2, 0x6e, 0x35,
+ 0x3d, 0xac, 0xfe, 0xd2, 0xa6, 0xa1, 0xbb, 0x33,
+ 0x3c, 0xe3, 0x7c, 0xc0, 0x60, 0x3f, 0x3c, 0xdc,
+ 0x5a, 0x02, 0xa5, 0x26, 0x37, 0x94, 0x11, 0xbb,
+ 0xf6, 0xb4, 0x91, 0x1c, 0xc8, 0xe1, 0x60, 0x28,
+ 0x04, 0x36, 0x15, 0x2b, 0x0f, 0x23, 0x05, 0xe5,
+ 0xcc, 0xe3, 0x6c, 0x36, 0x15, 0x98, 0xbf, 0x07,
+ 0x81, 0x81, 0xcd, 0xb0, 0x51, 0xe8, 0x3c, 0x6c,
+ 0x01, 0x63, 0xcf, 0xc1, 0x88, 0x7f, 0x75, 0xa1,
+ 0x70, 0xe3, 0xe6, 0x4c, 0xb1, 0x4d, 0xaa, 0x4b,
+ 0x1a, 0x6b, 0x39, 0x02, 0x9d, 0x31, 0xe8, 0x8c,
+ 0x08, 0x21, 0x09, 0x9c, 0xf7, 0x9b, 0x1e, 0xb4,
+ 0xab, 0x85, 0xb7, 0xf1, 0x9c, 0xe7, 0x50, 0xe4,
+ 0xee, 0xf2, 0x0c, 0x00, 0x58, 0xb9, 0xa4, 0xf1,
+ 0xbf, 0xcd, 0x62, 0x2a, 0xf8, 0xe6, 0x8e, 0x65,
+ 0x94, 0xb5, 0x4e, 0xcb, 0xcc, 0x2c, 0x34, 0x6c,
+ 0x44, 0x88, 0x09, 0xd4, 0x68, 0x1e, 0x02, 0x08,
+ 0x32, 0xfe, 0x75, 0x58, 0x43, 0x63, 0xc4, 0x9e,
+ 0x4d, 0xbf, 0x17, 0xeb, 0x6c, 0x0c, 0x78, 0x78,
+ 0xd2, 0x40, 0x60, 0x0e, 0x2e, 0x4d, 0xfb, 0xa0,
+ 0xc1, 0xf8, 0xee, 0x56, 0x8a, 0xee, 0xaa, 0x6f,
+ 0xc9, 0x29, 0x4e, 0x07, 0x8d, 0xac, 0x1b, 0x96,
+ 0x9c, 0x2b, 0x13, 0xe7, 0x78, 0xba, 0xe8, 0x79,
+ 0xb6, 0x40, 0x71, 0xdd, 0x34, 0x1b, 0x4c, 0x9e,
+ 0x5e, 0xa9, 0x53, 0xba, 0xba, 0xc1, 0xd4, 0x81,
+ 0xc0, 0x15, 0x51, 0x50, 0xed, 0xbc, 0xef, 0x24,
+ 0x3c, 0x2b, 0xba, 0x39, 0x2a, 0xef, 0x27, 0xa7,
+ 0x2f, 0x27, 0x7b, 0x62, 0x3a, 0x6d, 0x70, 0xdf,
+ 0x86, 0xcf, 0x16, 0xf0, 0x18, 0x63, 0xf8, 0xd6,
+ 0x37, 0xb6, 0x4b, 0x23, 0x6a, 0xdb, 0x6d, 0xbb,
+ 0x7f, 0x9c, 0x5b, 0x79, 0x24, 0xe5, 0xe9, 0xae,
+ 0x22, 0xa7, 0x6c, 0x3e, 0x4b, 0x36, 0x58, 0xa3,
+ 0xd8, 0xcb, 0x15, 0x49, 0x6e, 0xef, 0x3b, 0x11,
+ 0xac, 0xb4, 0xd5, 0x8d, 0xd0, 0xa5, 0x56, 0x0e,
+ 0x65, 0x07, 0x13, 0x54, 0xff, 0xb3, 0x7f, 0x3e,
+ 0xa2, 0xee, 0xf0, 0xac, 0xd0, 0xc9, 0x79, 0x87,
+ 0xd5, 0x52, 0xa5, 0x49, 0x65, 0x44, 0x55, 0xaa,
+ 0x2c, 0x96, 0x1b, 0xe9, 0x36, 0x1f, 0x5c, 0x54,
+ 0xdb, 0x7e, 0x6e, 0x8e, 0x7f, 0x99, 0xd9, 0x24,
+ 0x51, 0x67, 0xaf, 0x64, 0x2a, 0xbc, 0xbc, 0xff,
+ 0x16, 0xe4, 0x40, 0x42, 0x4f, 0x5a, 0x92, 0x29,
+ 0x69, 0x15, 0x6f, 0xbb, 0x16, 0xe1, 0xbb, 0xd5,
+ 0x39, 0x38, 0xa0, 0x97, 0xa2, 0x65, 0x15, 0xe9,
+ 0xa6, 0x59, 0xec, 0x92, 0xed, 0xd5, 0x1b, 0x79,
+ 0x2d, 0x51, 0x2f, 0x56, 0x37, 0xbd, 0x24, 0x36,
+ 0x52, 0x43, 0x76, 0x28, 0xeb, 0x6a, 0x24, 0x6f,
+ 0x79, 0xd0, 0xe4, 0xaa, 0xf3, 0x27, 0x6a, 0xc8,
+ 0x91, 0xa2, 0xa6, 0x8e, 0xab, 0x92, 0xb3, 0xed,
+ 0xd0, 0xef, 0x11, 0xb4, 0xa0, 0xab, 0x60, 0xcb,
+ 0x3a, 0x52, 0xbd, 0x1a, 0xae, 0xc8, 0xe7, 0x56,
+ 0x9c, 0x53, 0x85, 0x8a, 0x77, 0x57, 0xcd, 0xa2,
+ 0xe5, 0xe1, 0xb3, 0x67, 0xa0, 0x9f, 0x4c, 0xbc,
+ 0xda, 0x39, 0xc2, 0xb9, 0x27, 0x11, 0xc3, 0x7a,
+ 0xb7, 0x17, 0xec, 0x1a, 0xc7, 0xf7, 0x3c, 0xd4,
+ 0xdf, 0xe6, 0x95, 0xf3, 0x25, 0x37, 0xb5, 0x04,
+ 0x50, 0xb7, 0x45, 0xc2, 0x72, 0x49, 0xb9, 0xbe,
+ 0xb3, 0xeb, 0x6e, 0x64, 0x8a, 0x6d, 0x80, 0xc1,
+ 0x9d, 0xe0, 0xc5, 0xf4, 0xad, 0x86, 0xdb, 0x51,
+ 0x2d, 0xbf, 0x68, 0xa9, 0x78, 0x83, 0x22, 0x1b,
+ 0xab, 0x9b, 0x28, 0x26, 0x36, 0xac, 0x84, 0xe6,
+ 0x98, 0x56, 0xf8, 0x84, 0x05, 0xdb, 0x94, 0x71,
+ 0x9d, 0xba, 0xdc, 0x5f, 0xcb, 0x2f, 0xbc, 0xd8,
+ 0x8e, 0xed, 0x24, 0x51, 0xd5, 0xfa, 0x4e, 0x2f,
+ 0x08, 0x5a, 0xc8, 0x96, 0x5c, 0xad, 0x86, 0x36,
+ 0xcd, 0x80, 0x60, 0xb7, 0x67, 0x3f, 0xc5, 0x25,
+ 0x45, 0x9d, 0x11, 0x26, 0x20, 0xed, 0xe7, 0x7a,
+ 0x7c, 0x4e, 0x3d, 0x51, 0x07, 0x29, 0x33, 0xfd,
+ 0xad, 0xa3, 0xc5, 0x02, 0x09, 0x62, 0xd9, 0x3a,
+ 0x55, 0x66, 0xd9, 0x16, 0x5e, 0x45, 0xad, 0x5d,
+ 0xe6, 0xc7, 0x43, 0xcd, 0x1e, 0x36, 0xdf, 0xcb,
+ 0x51, 0x4c, 0xf6, 0x60, 0x7b, 0x3b, 0x14, 0xa3,
+ 0x8b, 0xf1, 0x4a, 0x0b, 0x3a, 0x54, 0x46, 0x38,
+ 0xa7, 0x14, 0x1a, 0xe1, 0x3a, 0xa6, 0xa4, 0x08,
+ 0x5f, 0xf3, 0x3d, 0x6b, 0xf6, 0x5c, 0xc2, 0xc5,
+ 0x16, 0xdb, 0x69, 0xb5, 0x30, 0xac, 0x0b, 0xaf,
+ 0x56, 0xe1, 0x24, 0x3c, 0x2f, 0x69, 0x33, 0x3b,
+ 0xbd, 0xd6, 0x14, 0x28, 0x5b, 0x24, 0x9d, 0x46,
+ 0xb5, 0x5e, 0xa0, 0xb2, 0x73, 0x51, 0x0d, 0x04,
+ 0x6c, 0x0f, 0x38, 0x97, 0xed, 0xcd, 0xaa, 0x55,
+ 0xa3, 0xb5, 0x7e, 0x96, 0x22, 0xc1, 0x16, 0x2d,
+ 0xd4, 0x7c, 0xe9, 0xd4, 0xd9, 0xf3, 0x63, 0x86,
+ 0xfc, 0xd2, 0x82, 0xdd, 0x44, 0x86, 0xf5, 0x05,
+ 0xe5, 0x5f, 0x82, 0xe2, 0x47, 0xb9, 0x69, 0xb5,
+ 0x03, 0x4d, 0x31, 0xc0, 0x43, 0xa3, 0xb0, 0xfa,
+ 0xcb, 0x6b, 0x09, 0x23, 0x3f, 0x6b, 0x72, 0x28,
+ 0x97, 0xf2, 0xaf, 0x9c, 0x9c, 0x1b, 0x48, 0xb4,
+ 0x8b, 0x1f, 0x3a, 0x0d, 0x15, 0x2b, 0x82, 0x18,
+ 0xf9, 0x96, 0x0a, 0xfc, 0x06, 0xf3, 0x3e, 0x89,
+ 0x4c, 0x8a, 0x64, 0xaa, 0x43, 0x84, 0x7d, 0x82,
+ 0xe3, 0xa2, 0xc5, 0x62, 0x32, 0x51, 0xda, 0xa1,
+ 0xc0, 0xe0, 0xac, 0x73, 0x91, 0x9b, 0xfe, 0x49,
+ 0x9a, 0xc7, 0x43, 0xd9, 0x32, 0xd0, 0x2f, 0x2a,
+ 0x25, 0xa8, 0x99, 0x22, 0xe5, 0x4d, 0x08, 0xcc,
+ 0xa4, 0xf4, 0x6a, 0x34, 0x1f, 0x8f, 0xd8, 0x5f,
+ 0x8a, 0x57, 0xad, 0xc8, 0x8d, 0x4f, 0x27, 0x50,
+ 0x05, 0x12, 0xb6, 0x83, 0x83, 0x35, 0x82, 0x2d,
+ 0x30, 0x89, 0x78, 0x68, 0x5c, 0x09, 0x95, 0xd1,
+ 0x90, 0x38, 0x17, 0xb6, 0x88, 0xa0, 0x1c, 0x30,
+ 0x0a, 0x6c, 0x94, 0x16, 0x20, 0xb0, 0x0a, 0x8f,
+ 0x0c, 0xc9, 0xaa, 0xe6, 0x84, 0x82, 0xff, 0x6a,
+ 0x25, 0xc1, 0x1c, 0x1c, 0xbc, 0x05, 0xc1, 0x61,
+ 0xeb, 0x63, 0xce, 0x2b, 0x1e, 0x2a, 0x4b, 0x04,
+ 0x7c, 0x61, 0x9f, 0x8e, 0x99, 0xfd, 0x49, 0xa0,
+ 0x78, 0x43, 0xff, 0xb2, 0xe1, 0x5f, 0x3d, 0xec,
+ 0x06, 0xe8, 0x94, 0xbf, 0x67, 0x43, 0xdb, 0xfc,
+ 0xf3, 0x7c, 0xed, 0xc3, 0xf8, 0xa5, 0x11, 0xa0,
+ 0x58, 0x04, 0x5e, 0xab, 0x54, 0x99, 0x29, 0x53,
+ 0x0a, 0x87, 0xf1, 0x20, 0x78, 0xac, 0x18, 0x3d,
+ 0x2e, 0x12, 0xc4, 0x86, 0xd1, 0x28, 0xfc, 0x03,
+ 0x71, 0x38, 0xf8, 0x15, 0xb1, 0xad, 0x47, 0x03,
+ 0xa6, 0xcc, 0x7d, 0x53, 0x16, 0x94, 0x1d, 0x17,
+ 0x22, 0xdf, 0xe3, 0xef, 0x89, 0x77, 0xa3, 0xd6,
+ 0x87, 0x98, 0x9b, 0xf7, 0x1a, 0x1f, 0xb3, 0xad,
+ 0xb0, 0x5c, 0x23, 0x24, 0x4e, 0xca, 0x46, 0x13,
+ 0xeb, 0x71, 0xaa, 0x23, 0x46, 0x5a, 0xf8, 0x93,
+ 0xf6, 0x37, 0xf7, 0x26, 0x82, 0xb5, 0x3b, 0x7d,
+ 0xf4, 0xf5, 0xc9, 0x98, 0x01, 0x65, 0xb5, 0x50,
+ 0xf5, 0x4d, 0xcf, 0x36, 0xad, 0xb1, 0xd4, 0xff,
+ 0x9b, 0x4c, 0xc7, 0xef, 0x80, 0xcb, 0x0a, 0xd3,
+ 0x2b, 0xf3, 0x6c, 0x7f, 0x22, 0xd7, 0x2e, 0x01,
+ 0x5f, 0x59, 0xb9, 0x2c, 0xbf, 0xf6, 0xc8, 0xf3,
+ 0xd1, 0x85, 0x40, 0x7d, 0x30, 0x06, 0x08, 0x0c,
+ 0xb5, 0x78, 0xc0, 0x2a, 0xc4, 0xb4, 0xad, 0x80,
+ 0x69, 0x7a, 0x95, 0x69, 0xc7, 0xa9, 0xd4, 0x33,
+ 0x57, 0xf1, 0x74, 0x12, 0xfc, 0xd3, 0x4d, 0x62,
+ 0x96, 0x94, 0xef, 0x44, 0x81, 0xbd, 0x1b, 0x78,
+ 0xc0, 0xb9, 0x20, 0xf8, 0x79, 0x07, 0x89, 0xc4,
+ 0x06, 0x87, 0xc9, 0x32, 0xf1, 0xa6, 0x1b, 0xd4,
+ 0x81, 0x01, 0x5c, 0x54, 0xad, 0x9f, 0xd0, 0x61,
+ 0x04, 0x77, 0xf9, 0x32, 0xcd, 0x69, 0xb4, 0xac,
+ 0x78, 0x72, 0x94, 0x40, 0x4d, 0xee, 0xa9, 0xb3,
+ 0xc9, 0x98, 0xda, 0xd9, 0x91, 0x8f, 0x2e, 0xa4,
+ 0x18, 0x07, 0xd9, 0xc8, 0x03, 0xc9, 0x45, 0x38,
+ 0x38, 0x89, 0xff, 0xb3, 0x57, 0x69, 0x46, 0x37,
+ 0x37, 0xcd, 0xb5, 0xf5, 0x4c, 0xf7, 0x92, 0xa7,
+ 0x48, 0xad, 0xa9, 0x57, 0x93, 0x7b, 0xef, 0xae,
+ 0x59, 0xf6, 0xb6, 0x15, 0xca, 0x22, 0x3e, 0x58,
+ 0x65, 0x26, 0x4a, 0x39, 0xf0, 0xf4, 0x4a, 0x4a,
+ 0xd4, 0xff, 0x8a, 0x94, 0x75, 0x9f, 0x29, 0xf5,
+ 0xdf, 0x36, 0xa3, 0x6e, 0x07, 0xbe, 0xec, 0x2d,
+ 0xcf, 0xc9, 0xb7, 0xb1, 0x6e, 0xf5, 0xc1, 0x88,
+ 0x43, 0xf1, 0x7f, 0x81, 0xc0, 0xa4, 0x04, 0x50,
+ 0x6e, 0x16, 0x7c, 0x3f, 0x05, 0x58, 0x30, 0xe4,
+ 0x7a, 0x0e, 0x05, 0x58, 0x30, 0x29, 0xc1, 0x8b,
+ 0x4b, 0x01, 0x4c, 0x0c, 0xa4, 0x18, 0x41, 0x10,
+ 0x41, 0x10, 0x18, 0x6c, 0xa4, 0x3f, 0x02, 0xe0,
+ 0xaa, 0x06, 0x0e, 0x41, 0xf0, 0x7f, 0xed, 0x0b,
+ 0x69, 0x44, 0xb4, 0xe5, 0xcd, 0x5c, 0x1f, 0xb4,
+ 0x3f, 0xd5, 0x7c, 0x6d, 0xa2, 0xf6, 0x8b, 0xc4,
+ 0x88, 0x24, 0x2b, 0x4f, 0xac, 0xec, 0xff, 0xc7,
+ 0x20, 0x64, 0x78, 0xa9, 0x20, 0x32, 0x96, 0x1b,
+ 0x8a, 0xfc, 0xac, 0xaf, 0xf5, 0xac, 0x6f, 0x14,
+ 0xe5, 0x6d, 0xa6, 0xcc, 0x45, 0x19, 0x2a, 0xe8,
+ 0xd0, 0x12, 0x9f, 0xc1, 0xe9, 0xa0, 0x03, 0xe0,
+ 0x52, 0x9a, 0x82, 0x27, 0xb7, 0x7e, 0x3e, 0xbd,
+ 0x60, 0xb5, 0xb5, 0x65, 0xcc, 0xf4, 0x42, 0xec,
+ 0xbb, 0x3f, 0xf4, 0x89, 0x55, 0xef, 0x41, 0x55,
+ 0x14, 0x03, 0x23, 0x65, 0xb5, 0xae, 0x33, 0xdd,
+ 0xe1, 0x87, 0x9b, 0xe6, 0xfa, 0x20, 0x27, 0x1f,
+ 0x27, 0x98, 0xa2, 0x6d, 0x2e, 0x2f, 0x48, 0x3f,
+ 0x51, 0xde, 0xdc, 0x8d, 0xd4, 0xcd, 0xb6, 0x58,
+ 0xa5, 0x46, 0xdc, 0x2d, 0xe1, 0x69, 0x67, 0xf8,
+ 0x36, 0xa7, 0x87, 0x23, 0xf9, 0x41, 0xe0, 0x60,
+ 0x43, 0x05, 0x14, 0x03, 0x05, 0x9d, 0x08, 0x00,
+ 0x8a, 0x08, 0xb5, 0x38, 0x2a, 0x80, 0xd6, 0xab,
+ 0x10, 0xe8, 0x3c, 0x17, 0xfd, 0x34, 0xb8, 0x15,
+ 0xa0, 0xaa, 0x8a, 0xc0, 0xd4, 0x6d, 0x42, 0xea,
+ 0x47, 0x0a, 0x03, 0xd0, 0xb1, 0x29, 0xed, 0x06,
+ 0xe9, 0x7b, 0x6a, 0x9b, 0x06, 0x62, 0x27, 0xf0,
+ 0x28, 0x84, 0x3c, 0x10, 0x01, 0x84, 0xa0, 0x62,
+ 0xd5, 0x0d, 0xeb, 0x2c, 0x37, 0x07, 0x9f, 0x57,
+ 0x73, 0xc0, 0xc2, 0x00, 0x7e, 0xc0, 0xec, 0x71,
+ 0x55, 0x4c, 0x67, 0xc3, 0xfa, 0xcd, 0x4c, 0x38,
+ 0xf3, 0x3f, 0x85, 0xd0, 0xc5, 0xba, 0x80, 0xf4,
+ 0x4d, 0x3f, 0x56, 0x9b, 0x64, 0x40, 0xc2, 0xf1,
+ 0xd6, 0xab, 0xed, 0xca, 0x93, 0x04, 0xb1, 0xf6,
+ 0x97, 0xf7, 0x03, 0xbf, 0x52, 0xec, 0x57, 0x53,
+ 0xcd, 0xf2, 0x8a, 0x5b, 0xea, 0xd2, 0x9c, 0x51,
+ 0xaa, 0x64, 0xe3, 0xd4, 0x08, 0x25, 0xe5, 0xc2,
+ 0x56, 0x84, 0x2c, 0x6f, 0xe5, 0xdd, 0x56, 0x24,
+ 0x97, 0x24, 0x6f, 0x13, 0xa7, 0x9e, 0xd6, 0x07,
+ 0xca, 0xc3, 0xf1, 0xc8, 0xef, 0x32, 0x2b, 0xf5,
+ 0x98, 0xab, 0x5a, 0xcc, 0x0f, 0xd9, 0x9f, 0x1f,
+ 0x78, 0xae, 0x7f, 0x2e, 0xf0, 0x2c, 0x61, 0x08,
+ 0x1e, 0x06, 0x04, 0x10, 0x53, 0x01, 0xe0, 0xfc,
+ 0x18, 0xb0, 0x6c, 0x5c, 0xa0, 0x3e, 0x1c, 0xd0,
+ 0x3b, 0x40, 0xf9, 0x65, 0x53, 0xd0, 0x61, 0x00,
+ 0x1e, 0x0b, 0xfc, 0xf9, 0x41, 0x56, 0x20, 0x88,
+ 0x0a, 0x41, 0x80, 0xc7, 0x40, 0xd0, 0xe0, 0x3c,
+ 0x07, 0xc1, 0x80, 0x54, 0x46, 0x0c, 0xad, 0x30,
+ 0xf0, 0x1e, 0x0a, 0x02, 0xf4, 0xe3, 0xf6, 0x87,
+ 0xdc, 0x07, 0x81, 0xff, 0x1c, 0x48, 0x61, 0x5a,
+ 0xb4, 0xbe, 0x63, 0x80, 0xaa, 0x50, 0x3f, 0xfb,
+ 0x2d, 0x7d, 0x96, 0x67, 0x01, 0x55, 0xd0, 0xf7,
+ 0xed, 0x6e, 0x87, 0xd6, 0x95, 0xeb, 0x9e, 0xda,
+ 0xb2, 0x0e, 0x1a, 0x0c, 0x6c, 0xa7, 0xaa, 0xe1,
+ 0x79, 0x84, 0xd9, 0x98, 0x23, 0x09, 0x6d, 0xf2,
+ 0x08, 0xbd, 0x68, 0x70, 0x3c, 0x1f, 0xb2, 0x1e,
+ 0x71, 0x48, 0x18, 0xef, 0x95, 0x32, 0xc8, 0x79,
+ 0xc5, 0x25, 0x43, 0x72, 0xa4, 0x6f, 0x7a, 0x3a,
+ 0xb9, 0x55, 0x27, 0xca, 0x5d, 0x55, 0x5b, 0x2c,
+ 0x2f, 0x2e, 0xdf, 0x5c, 0xff, 0x92, 0x25, 0x63,
+ 0x7f, 0x35, 0x4e, 0x76, 0x8d, 0xf2, 0x9b, 0x99,
+ 0xff, 0x7e, 0xf4, 0xb3, 0xe6, 0x03, 0x10, 0x32,
+ 0x70, 0x86, 0x0d, 0x85, 0x6a, 0x3a, 0x24, 0xb0,
+ 0x99, 0x6a, 0x06, 0xb8, 0x21, 0x02, 0x18, 0x32,
+ 0xe9, 0x18, 0xd0, 0x78, 0x48, 0x0a, 0xd2, 0x83,
+ 0x15, 0xb0, 0xba, 0x49, 0x67, 0x0b, 0x19, 0x06,
+ 0x41, 0xa1, 0x70, 0xe9, 0x57, 0x52, 0xe8, 0x85,
+ 0xf6, 0x1b, 0x55, 0x8a, 0xda, 0x10, 0x68, 0x33,
+ 0x09, 0x81, 0xe0, 0x7f, 0xb5, 0x04, 0x49, 0xff,
+ 0x08, 0x40, 0xaa, 0x6f, 0xa3, 0xcf, 0xb6, 0xac,
+ 0x21, 0x2a, 0x1d, 0xab, 0xf9, 0x6d, 0x2c, 0x6f,
+ 0xcd, 0xb4, 0x3e, 0xd4, 0x93, 0xfe, 0xf7, 0xd4,
+ 0xb2, 0x20, 0x99, 0xbb, 0xd3, 0x4a, 0x78, 0x88,
+ 0x1c, 0x41, 0xa6, 0x83, 0x65, 0xc0, 0x7b, 0xc3,
+ 0x81, 0xca, 0x41, 0x21, 0x50, 0x82, 0xde, 0x2a,
+ 0x68, 0xb7, 0xc9, 0xbc, 0x1f, 0xab, 0xfa, 0xde,
+ 0x55, 0xe2, 0xde, 0x0e, 0x59, 0xff, 0x2a, 0x86,
+ 0xb3, 0xbf, 0xd5, 0x15, 0x44, 0x59, 0xe6, 0x6d,
+ 0x06, 0x60, 0xab, 0x07, 0x20, 0xa0, 0x95, 0xb0,
+ 0x2d, 0x04, 0x11, 0x28, 0xb5, 0x92, 0xbd, 0x68,
+ 0x0c, 0x42, 0xde, 0xb6, 0x06, 0x73, 0x5a, 0x2a,
+ 0x5c, 0x73, 0x9b, 0xe0, 0xee, 0x58, 0xe0, 0xb8,
+ 0x07, 0x40, 0xf8, 0x42, 0x1d, 0xb2, 0x0c, 0x5c,
+ 0xc0, 0xf8, 0x7a, 0x98, 0xbd, 0xbf, 0x83, 0x2b,
+ 0x03, 0xc5, 0xf1, 0xa5, 0x5f, 0x9f, 0xdc, 0x63,
+ 0x2f, 0xfb, 0xac, 0xe6, 0x2e, 0x9b, 0x65, 0x4e,
+ 0xd0, 0x18, 0x4e, 0x58, 0xdd, 0xa5, 0xb2, 0x67,
+ 0x5a, 0x6c, 0x05, 0x1e, 0x06, 0x60, 0x1b, 0x00,
+ 0xf0, 0xec, 0x14, 0x1f, 0x4e, 0x9d, 0x24, 0x56,
+ 0xc8, 0x43, 0x64, 0x7e, 0x5a, 0xaf, 0x66, 0x6b,
+ 0x6a, 0xb1, 0x84, 0xec, 0xb1, 0xe0, 0x55, 0x6d,
+ 0xf5, 0x03, 0x56, 0x70, 0x73, 0x77, 0x3b, 0x7f,
+ 0xf5, 0x9b, 0x2d, 0x62, 0x40, 0x18, 0x6a, 0xf5,
+ 0x1f, 0xc5, 0xf7, 0xa3, 0x2e, 0x3f, 0x5c, 0x98,
+ 0x42, 0x08, 0x21, 0x09, 0x60, 0x78, 0x3f, 0xf8,
+ 0x47, 0x43, 0xf6, 0xa9, 0x27, 0x0a, 0x1e, 0x33,
+ 0x03, 0xea, 0xfc, 0x08, 0x61, 0x08, 0x7d, 0xa5,
+ 0xc9, 0xe6, 0xcd, 0xce, 0x7d, 0x81, 0xfb, 0x43,
+ 0xd1, 0xf8, 0x90, 0x3c, 0xaa, 0xaf, 0x53, 0x96,
+ 0x42, 0xfa, 0x98, 0xbc, 0x3c, 0x8c, 0x2f, 0xd2,
+ 0xc8, 0xa5, 0xaf, 0xa9, 0x93, 0xf9, 0x6b, 0x82,
+ 0x58, 0x28, 0xc0, 0xf8, 0xfd, 0x85, 0x4a, 0x95,
+ 0x0e, 0x59, 0xfe, 0xee, 0x16, 0xab, 0x6e, 0x30,
+ 0xc3, 0x4c, 0x4f, 0xb3, 0xfe, 0x37, 0xfe, 0x4d,
+ 0xcf, 0x66, 0x4d, 0x6f, 0x79, 0xfb, 0xc9, 0xc8,
+ 0xbf, 0x21, 0xc3, 0x03, 0xdf, 0x84, 0x0a, 0xc0,
+ 0xe5, 0x28, 0xf8, 0x0e, 0x8e, 0x83, 0xff, 0xcf,
+ 0x27, 0x2f, 0x54, 0xb8, 0xe5, 0x52, 0xae, 0xf9,
+ 0xb9, 0x37, 0x1b, 0x97, 0x62, 0x8f, 0x29, 0x96,
+ 0xe6, 0xac, 0x6e, 0x1c, 0xb6, 0xde, 0x21, 0xe4,
+ 0x34, 0xed, 0x71, 0x9b, 0x69, 0xfe, 0xac, 0x4a,
+ 0x4a, 0x07, 0x55, 0x2b, 0x08, 0x42, 0x1a, 0x46,
+ 0xe2, 0x51, 0x08, 0x7a, 0x21, 0x7c, 0x0e, 0x68,
+ 0x34, 0x11, 0x92, 0xd5, 0x6c, 0xf9, 0xa5, 0x4a,
+ 0x75, 0x52, 0x56, 0x04, 0x11, 0xfb, 0x55, 0x16,
+ 0xa8, 0xd5, 0x7e, 0xb8, 0x38, 0x93, 0x7f, 0xbb,
+ 0xa0, 0xb2, 0x28, 0xd0, 0x33, 0x62, 0x58, 0x94,
+ 0x9c, 0x78, 0x3f, 0x48, 0xa8, 0x4a, 0xa2, 0x1a,
+ 0x96, 0xb0, 0xb1, 0x52, 0x42, 0xf5, 0x49, 0xfd,
+ 0x36, 0x66, 0xea, 0xfe, 0x9e, 0x6f, 0xdb, 0x93,
+ 0x79, 0x6a, 0x25, 0xd7, 0xe3, 0xec, 0x03, 0x5b,
+ 0x1f, 0x0f, 0x47, 0x63, 0xe1, 0xf4, 0x1d, 0x0f,
+ 0x00, 0xe8, 0xf9, 0xaf, 0x26, 0x4e, 0xca, 0x7a,
+ 0x94, 0x7a, 0xc1, 0x77, 0xd5, 0x07, 0xdf, 0xd2,
+ 0xdf, 0x56, 0x9b, 0xfa, 0x5c, 0x61, 0x99, 0x65,
+ 0x6b, 0xc0, 0x65, 0x82, 0xbf, 0xa9, 0xa3, 0x89,
+ 0x02, 0xd4, 0xc2, 0x06, 0x0e, 0x80, 0x31, 0xa0,
+ 0x78, 0x2f, 0xf9, 0x44, 0x06, 0x18, 0x9b, 0x7e,
+ 0xac, 0x1e, 0x0b, 0xfd, 0x9f, 0x82, 0x85, 0x91,
+ 0x28, 0x18, 0x38, 0xf7, 0x04, 0x28, 0x23, 0xe8,
+ 0x30, 0x18, 0x10, 0x18, 0x51, 0xec, 0xe0, 0x2b,
+ 0x27, 0xc5, 0x7d, 0x51, 0xde, 0x75, 0x74, 0x27,
+ 0xb5, 0xc1, 0x66, 0xc0, 0x8e, 0x10, 0xcb, 0xd2,
+ 0x83, 0x32, 0x21, 0x26, 0x12, 0x07, 0xf1, 0x37,
+ 0xbe, 0xaf, 0x52, 0x44, 0xcd, 0x40, 0x6c, 0x12,
+ 0xfb, 0xcc, 0xef, 0x03, 0xfb, 0x90, 0x21, 0xa4,
+ 0xef, 0x74, 0x18, 0xd2, 0x9b, 0x3c, 0x22, 0x1f,
+ 0x14, 0x01, 0xe0, 0x51, 0x62, 0x66, 0x52, 0x40,
+ 0x3b, 0xa2, 0x4e, 0x09, 0x5e, 0x05, 0x3f, 0xc7,
+ 0xc0, 0xa7, 0xcb, 0x47, 0x20, 0xaa, 0x8c, 0x8e,
+ 0x14, 0xf0, 0xb7, 0xa3, 0x80, 0x23, 0xc2, 0xc0,
+ 0xe7, 0x87, 0xcd, 0x24, 0x6c, 0x49, 0x03, 0x82,
+ 0x18, 0x31, 0x5e, 0x17, 0xc6, 0x9a, 0xbc, 0x60,
+ 0x1e, 0x0b, 0xfd, 0xb1, 0x28, 0x10, 0xc2, 0x13,
+ 0x5f, 0xa3, 0x75, 0x05, 0x8d, 0x89, 0x25, 0xc5,
+ 0x5b, 0xf5, 0x0a, 0x78, 0x05, 0xbe, 0xf2, 0x1a,
+ 0xca, 0x86, 0x80, 0xc7, 0x9a, 0x55, 0xe9, 0x33,
+ 0xde, 0x2b, 0xfe, 0xff, 0x74, 0x45, 0xdb, 0x77,
+ 0x76, 0x95, 0xdf, 0xff, 0x6d, 0xaf, 0x35, 0x8f,
+ 0x79, 0x01, 0x64, 0x91, 0x10, 0xcc, 0x55, 0xae,
+ 0x68, 0x14, 0x00, 0xcd, 0x0f, 0x19, 0x56, 0x56,
+ 0x39, 0xc6, 0x2e, 0x79, 0xa6, 0xb5, 0x70, 0xe6,
+ 0x90, 0x6a, 0x0c, 0xb2, 0xa9, 0x3d, 0xde, 0x16,
+ 0xb6, 0xdf, 0xf5, 0x44, 0x59, 0x4d, 0xdb, 0xd7,
+ 0xc7, 0xd4, 0x06, 0xd0, 0x07, 0x03, 0x97, 0x3f,
+ 0xa1, 0xa4, 0x48, 0x81, 0xc7, 0x5a, 0x1b, 0x0f,
+ 0x6d, 0x33, 0xa6, 0x2d, 0xf0, 0xe8, 0xb9, 0x8e,
+ 0x0e, 0x13, 0x30, 0xd4, 0x35, 0xe6, 0xbd, 0x81,
+ 0x91, 0x84, 0x0b, 0x32, 0x2c, 0x2f, 0x09, 0x9d,
+ 0x9d, 0x3f, 0xe5, 0x34, 0x11, 0xce, 0x62, 0x19,
+ 0xd2, 0x9e, 0x3f, 0x4e, 0x78, 0x0e, 0x25, 0x19,
+ 0x11, 0xf5, 0x00, 0x3c, 0x94, 0x23, 0xdc, 0x07,
+ 0x23, 0x39, 0x91, 0xa3, 0xe1, 0xe5, 0x02, 0x43,
+ 0x4d, 0x3f, 0x51, 0x82, 0xc4, 0x1c, 0x2e, 0xeb,
+ 0xcf, 0xc1, 0xf3, 0x0d, 0x27, 0xb9, 0x93, 0x74,
+ 0x73, 0x37, 0x6d, 0xd0, 0x33, 0x9e, 0xea, 0x39,
+ 0x14, 0xa2, 0xea, 0x22, 0xce, 0x73, 0x88, 0x88,
+ 0x54, 0xa8, 0xc4, 0xc2, 0xd5, 0x0b, 0x2c, 0x37,
+ 0xe2, 0xdd, 0x88, 0x44, 0xc6, 0xc1, 0x5d, 0x5c,
+ 0xae, 0xec, 0xa8, 0xd4, 0x44, 0x1c, 0xaa, 0x3b,
+ 0xd5, 0x90, 0x20, 0x9d, 0x43, 0xc3, 0x83, 0x71,
+ 0xea, 0x82, 0xf6, 0xc4, 0x0b, 0x1a, 0xff, 0x40,
+ 0x87, 0xd8, 0x0f, 0x66, 0xf3, 0xf2, 0x72, 0x6a,
+ 0xd6, 0x11, 0xad, 0xef, 0xd9, 0xa0, 0xc1, 0xef,
+ 0xe1, 0x59, 0x56, 0x77, 0x95, 0x44, 0x88, 0x44,
+ 0x5e, 0xf2, 0x22, 0xea, 0xce, 0x15, 0x26, 0xf6,
+ 0x24, 0x9b, 0xb9, 0xb7, 0xa8, 0x54, 0xd6, 0x65,
+ 0xbc, 0xe2, 0xd1, 0x6f, 0x4e, 0x45, 0x90, 0x8c,
+ 0xce, 0xf6, 0x23, 0x8b, 0xc3, 0x43, 0x5a, 0x9a,
+ 0xde, 0xe2, 0x82, 0xd0, 0xfb, 0xed, 0xb2, 0x1e,
+ 0x41, 0xc2, 0x05, 0x08, 0x06, 0xd7, 0x54, 0xf1,
+ 0x1c, 0x95, 0x71, 0x41, 0x4a, 0xd3, 0x72, 0xc5,
+ 0xb9, 0x93, 0x6d, 0xd6, 0xb3, 0xa8, 0xaa, 0xc8,
+ 0xed, 0x8b, 0xc5, 0xd6, 0x97, 0x49, 0xd7, 0x9d,
+ 0x89, 0xe4, 0x91, 0x69, 0x2c, 0xda, 0xba, 0xd6,
+ 0x0d, 0x83, 0xde, 0xc5, 0xc6, 0x26, 0xfa, 0x81,
+ 0xe9, 0x56, 0xea, 0x9b, 0x27, 0x36, 0xa3, 0xe7,
+ 0x2a, 0xcb, 0x2c, 0x8b, 0xa3, 0x71, 0x99, 0xe5,
+ 0x9b, 0xc4, 0x10, 0x33, 0xa1, 0x5c, 0x4d, 0x45,
+ 0x62, 0x02, 0xab, 0x93, 0x9f, 0x51, 0x20, 0x77,
+ 0xe5, 0x37, 0x72, 0xa0, 0x95, 0x74, 0x5c, 0x5e,
+ 0xa9, 0x58, 0x6a, 0x33, 0xfa, 0xbf, 0x0f, 0xf9,
+ 0xa9, 0x8b, 0x75, 0xaf, 0x58, 0x5b, 0xcc, 0xfb,
+ 0x17, 0x43, 0xd2, 0xae, 0xf9, 0x47, 0xb6, 0x1b,
+ 0xde, 0xc5, 0xd1, 0xae, 0x8d, 0xeb, 0x37, 0xe5,
+ 0xf3, 0x3e, 0xc2, 0x9f, 0x69, 0x6e, 0xb7, 0xf0,
+ 0x21, 0x22, 0x2e, 0x76, 0x49, 0x57, 0x45, 0x56,
+ 0x40, 0x8d, 0xe2, 0x54, 0x8a, 0x8b, 0x4b, 0x6c,
+ 0x68, 0x70, 0xc2, 0x2f, 0x7b, 0x99, 0x16, 0xef,
+ 0x54, 0xc8, 0xa3, 0xa1, 0xea, 0x3e, 0xda, 0xb8,
+ 0x56, 0xa5, 0xbc, 0x20, 0xab, 0xa2, 0xaf, 0x27,
+ 0xa2, 0xeb, 0xa1, 0x9b, 0x32, 0x4d, 0xa6, 0xf8,
+ 0x1c, 0x68, 0x61, 0x45, 0x7a, 0xb3, 0x6b, 0x4d,
+ 0x0e, 0x3f, 0xfb, 0xb8, 0x8e, 0x7e, 0xf7, 0x85,
+ 0x8b, 0x55, 0x1c, 0xe6, 0x4e, 0x73, 0xbc, 0x8b,
+ 0x09, 0x88, 0xfe, 0x37, 0xa5, 0x9d, 0xb6, 0x5b,
+ 0x67, 0x38, 0x80, 0xd7, 0x7b, 0xc2, 0x53, 0xae,
+ 0x58, 0xb2, 0xd9, 0xb6, 0xae, 0x4b, 0x0d, 0xaf,
+ 0x4d, 0x94, 0x3b, 0x5c, 0xfe, 0x9a, 0xb8, 0x90,
+ 0x15, 0xbf, 0x56, 0xb6, 0xb7, 0x72, 0x2d, 0x7d,
+ 0x65, 0x96, 0x08, 0x90, 0xab, 0xba, 0xa4, 0xd1,
+ 0x11, 0x5a, 0x3c, 0xcd, 0x62, 0x59, 0x3e, 0xc4,
+ 0xe6, 0xf6, 0xac, 0xa4, 0xae, 0x59, 0xb3, 0xba,
+ 0xa7, 0x88, 0xfb, 0x28, 0xde, 0x72, 0x11, 0xd8,
+ 0xe3, 0xb2, 0x23, 0x95, 0x05, 0x5a, 0x8c, 0x16,
+ 0xea, 0xf0, 0xdc, 0x59, 0x01, 0x3c, 0xff, 0x54,
+ 0xe1, 0x65, 0xf5, 0xe5, 0x0f, 0x2d, 0x58, 0x63,
+ 0x7b, 0x9c, 0xe3, 0xd9, 0x7a, 0xb1, 0x2f, 0x7b,
+ 0x28, 0x4b, 0x13, 0x4d, 0x33, 0x03, 0x86, 0x2f,
+ 0xbc, 0x1e, 0xdc, 0x91, 0x1f, 0x7b, 0x79, 0x00,
+ 0xae, 0xad, 0xde, 0xf1, 0x18, 0x50, 0x4d, 0x80,
+ 0x33, 0x9d, 0xb9, 0xca, 0x50, 0x8f, 0x84, 0xab,
+ 0xf0, 0x99, 0x55, 0x73, 0x73, 0xdc, 0x6b, 0x2e,
+ 0x7f, 0x9c, 0x9f, 0x11, 0x20, 0x2b, 0xe2, 0x95,
+ 0xc9, 0xa1, 0xab, 0x24, 0x93, 0xb0, 0xd1, 0x51,
+ 0x52, 0x05, 0xd6, 0x0c, 0x5f, 0x78, 0x4b, 0x4f,
+ 0xd4, 0xc4, 0x6a, 0x92, 0xfa, 0x6b, 0x6a, 0x76,
+ 0xf4, 0x73, 0x62, 0x8e, 0x6a, 0xca, 0x16, 0x43,
+ 0x06, 0xd3, 0xa8, 0xc2, 0x9b, 0xb0, 0x72, 0xca,
+ 0xa9, 0xf8, 0xb4, 0x1f, 0xb0, 0xdf, 0xba, 0x49,
+ 0xb3, 0x96, 0x0d, 0xd1, 0x2e, 0x68, 0x4e, 0x83,
+ 0x10, 0x41, 0xad, 0xb7, 0x36, 0xde, 0xb7, 0xce,
+ 0xf0, 0xb7, 0x16, 0x5a, 0xe2, 0xd7, 0x96, 0x0a,
+ 0xcb, 0xe2, 0xac, 0xeb, 0x05, 0x57, 0x91, 0x99,
+ 0x78, 0x8f, 0x8b, 0xf7, 0x16, 0x5f, 0x90, 0x28,
+ 0x5b, 0x6b, 0xa2, 0xee, 0xf7, 0xa0, 0xf5, 0x30,
+ 0x01, 0x84, 0xbd, 0x05, 0xe0, 0x3a, 0x1b, 0x04,
+ 0xd5, 0x56, 0xd3, 0x61, 0x8c, 0xa0, 0xe0, 0x1e,
+ 0x72, 0xa9, 0xf9, 0x10, 0x1f, 0xd3, 0xa3, 0x68,
+ 0xca, 0x11, 0x1d, 0x2c, 0xa6, 0x9a, 0x88, 0xae,
+ 0x29, 0xe7, 0xaf, 0xfd, 0x3f, 0xc1, 0xce, 0x7b,
+ 0xfc, 0x53, 0xec, 0x6f, 0x90, 0x41, 0xcc, 0xb3,
+ 0x19, 0xe6, 0x0e, 0x66, 0xa8, 0x73, 0x52, 0xb1,
+ 0xa4, 0x20, 0xe4, 0x47, 0x0c, 0xb4, 0xad, 0x9b,
+ 0xf6, 0x73, 0xe9, 0xae, 0x7b, 0x2c, 0x2c, 0xf9,
+ 0x6c, 0x05, 0x6c, 0x0e, 0x54, 0x41, 0xb5, 0xe8,
+ 0xc5, 0x18, 0xa9, 0x4a, 0x81, 0xc2, 0x8a, 0x98,
+ 0xaa, 0xf2, 0xce, 0x7f, 0xde, 0xff, 0xaa, 0x36,
+ 0x99, 0xf7, 0x99, 0x6b, 0x79, 0x7a, 0x56, 0xc3,
+ 0x33, 0x5a, 0xde, 0x6c, 0x9b, 0x14, 0xe5, 0xe6,
+ 0xe6, 0x68, 0xdf, 0x23, 0xde, 0xef, 0x57, 0xed,
+ 0xb6, 0xdb, 0xd4, 0x3d, 0xb4, 0x96, 0xa1, 0xb4,
+ 0x8d, 0x05, 0x24, 0x80, 0xe2, 0x51, 0xaf, 0xe8,
+ 0x3f, 0x7c, 0x00, 0x72, 0x13, 0xc6, 0xc2, 0xd0,
+ 0x2b, 0x26, 0x8e, 0x74, 0x7c, 0x3c, 0xd6, 0x62,
+ 0x8b, 0x15, 0xfc, 0x74, 0x3c, 0xfa, 0x59, 0x73,
+ 0x85, 0x97, 0x13, 0xfd, 0x35, 0x57, 0x2b, 0x53,
+ 0x24, 0x6a, 0x96, 0xf5, 0xa5, 0x12, 0x7a, 0xe2,
+ 0x88, 0x79, 0x54, 0xe9, 0x07, 0x83, 0xf5, 0x10,
+ 0x7e, 0x93, 0xc9, 0x7d, 0x2a, 0x9e, 0x37, 0xaa,
+ 0xfd, 0x4b, 0x78, 0x37, 0x2d, 0x61, 0xb6, 0x1b,
+ 0x29, 0x0f, 0x54, 0x7d, 0x6b, 0xf9, 0xa5, 0x98,
+ 0x7a, 0xaf, 0x41, 0x63, 0xd0, 0xc0, 0xeb, 0x19,
+ 0x83, 0x81, 0x3a, 0xd9, 0x06, 0x24, 0xaf, 0xa3,
+ 0x44, 0xc4, 0x9b, 0xca, 0x37, 0xcc, 0x2c, 0x51,
+ 0x22, 0x8a, 0xd6, 0x56, 0x0b, 0x24, 0x92, 0x35,
+ 0x58, 0xb0, 0x70, 0x20, 0x4c, 0xc9, 0xe8, 0xc1,
+ 0x60, 0xe0, 0xb2, 0x4f, 0x28, 0x51, 0x0f, 0x29,
+ 0x31, 0xa9, 0xd8, 0xa9, 0xa4, 0xc9, 0xa6, 0xf3,
+ 0xb8, 0x3e, 0x1e, 0x24, 0x2e, 0x9b, 0x73, 0xaa,
+ 0x2b, 0x70, 0xb9, 0x86, 0x87, 0x3b, 0x93, 0x7f,
+ 0x30, 0xb5, 0x4a, 0x82, 0xdf, 0xa8, 0xe2, 0x9a,
+ 0x7c, 0xcf, 0x4f, 0x7e, 0x9b, 0x2b, 0x19, 0x05,
+ 0x5a, 0x8c, 0x24, 0x07, 0x12, 0x91, 0xe9, 0x8b,
+ 0x44, 0x84, 0x93, 0x47, 0x29, 0xd8, 0x1f, 0x09,
+ 0x54, 0x77, 0x36, 0x96, 0x27, 0x06, 0x50, 0x3e,
+ 0xf2, 0x59, 0xff, 0x87, 0x6c, 0xfd, 0x2e, 0x35,
+ 0x89, 0xef, 0xea, 0x9d, 0x2d, 0xbb, 0xf5, 0x2d,
+ 0xaf, 0x2d, 0xbd, 0x78, 0x95, 0x38, 0xe1, 0xb4,
+ 0xda, 0xc7, 0xd3, 0x34, 0x3f, 0x53, 0x24, 0xaa,
+ 0x93, 0xe3, 0x4c, 0xb1, 0xbf, 0xc1, 0xb5, 0xfb,
+ 0x5a, 0xa7, 0x0a, 0xbf, 0x26, 0xaf, 0x2f, 0x2a,
+ 0x24, 0x4e, 0x44, 0x4a, 0x49, 0x93, 0x1a, 0xf9,
+ 0x6b, 0x79, 0xac, 0xaf, 0xc5, 0x3c, 0xcb, 0xca,
+ 0x6e, 0x50, 0x60, 0xa5, 0x3d, 0xf3, 0x78, 0xb3,
+ 0x5c, 0x44, 0xa6, 0xfc, 0xd6, 0x8c, 0xba, 0x8c,
+ 0x1d, 0x48, 0x06, 0x10, 0x9a, 0x88, 0x10, 0x1e,
+ 0xd7, 0xb2, 0xe6, 0xf5, 0xa4, 0xe9, 0x15, 0x09,
+ 0x25, 0xed, 0x35, 0x93, 0x75, 0xb6, 0x5a, 0x92,
+ 0x22, 0x54, 0xd6, 0x78, 0x93, 0x39, 0xef, 0x01,
+ 0x49, 0x92, 0x39, 0x3d, 0x4d, 0xe6, 0x8b, 0xa7,
+ 0x8b, 0x92, 0x5b, 0xb3, 0x1a, 0x48, 0x93, 0xcd,
+ 0x5e, 0xed, 0xad, 0x7b, 0x22, 0x3d, 0xde, 0xcc,
+ 0xdb, 0xb7, 0x7b, 0x6f, 0x24, 0x99, 0x88, 0x0f,
+ 0x6f, 0xe1, 0x66, 0x45, 0x3d, 0x02, 0x74, 0xd2,
+ 0xc4, 0xa1, 0x57, 0x50, 0x8c, 0x95, 0x11, 0x40,
+ 0x2c, 0x45, 0x3c, 0x52, 0x85, 0xfa, 0x6a, 0xb4,
+ 0x21, 0x09, 0x0d, 0x72, 0xaa, 0x10, 0x84, 0x85,
+ 0x56, 0x7f, 0xcc, 0xe0, 0x80, 0x3a, 0x2e, 0x6a,
+ 0xc6, 0x58, 0xe8, 0xe1, 0x9c, 0xbe, 0x6b, 0x38,
+ 0xdb, 0x4a, 0x74, 0x70, 0xdc, 0x0f, 0x5a, 0x2d,
+ 0xd5, 0x16, 0x29, 0xd3, 0xe5, 0xfc, 0xc3, 0x49,
+ 0xb2, 0x34, 0xc3, 0x4d, 0x30, 0xd6, 0x5b, 0x71,
+ 0x86, 0x3d, 0x15, 0x7a, 0x5d, 0xbd, 0xfd, 0x9e,
+ 0xc9, 0x99, 0x3b, 0x7b, 0xbb, 0x79, 0xdb, 0xb6,
+ 0xed, 0x5e, 0x9f, 0x2a, 0x63, 0x5a, 0x2f, 0x25,
+ 0x42, 0x14, 0x42, 0x4a, 0x45, 0x13, 0x74, 0xa3,
+ 0x87, 0xc4, 0x7b, 0x99, 0xfc, 0xdf, 0x6f, 0xa3,
+ 0x7e, 0xfc, 0xb1, 0xbf, 0x7f, 0x33, 0xfe, 0xdf,
+ 0x55, 0xae, 0x7f, 0xdf, 0x53, 0x9b, 0x95, 0x0e,
+ 0x6f, 0x65, 0x21, 0xba, 0x88, 0x1d, 0xc0, 0x58,
+ 0x03, 0x9f, 0x81, 0xcb, 0xd4, 0x60, 0xe2, 0x17,
+ 0x18, 0xbe, 0xa6, 0xa2, 0x41, 0x28, 0x74, 0xd1,
+ 0x6b, 0x4d, 0x09, 0x43, 0xc5, 0x5e, 0x67, 0x2e,
+ 0x2b, 0xf2, 0xa1, 0xe2, 0x65, 0x58, 0xaf, 0x39,
+ 0xb1, 0x43, 0x38, 0xc3, 0x59, 0x8c, 0xe7, 0x3f,
+ 0xfc, 0xe7, 0xe6, 0xad, 0xfd, 0x82, 0x2b, 0xc5,
+ 0xad, 0x7b, 0xde, 0x6a, 0x34, 0xd7, 0xa3, 0x5e,
+ 0xcc, 0x99, 0xef, 0x35, 0x26, 0x67, 0xbd, 0x88,
+ 0xb3, 0x3d, 0xee, 0x66, 0x64, 0x85, 0x53, 0x24,
+ 0xe6, 0x49, 0xc8, 0x79, 0x0f, 0x55, 0xc6, 0x43,
+ 0x20, 0x1f, 0x0a, 0x02, 0xad, 0x88, 0x90, 0x84,
+ 0x56, 0x94, 0x85, 0x55, 0x1b, 0xe3, 0x0c, 0x7a,
+ 0xb7, 0xbe, 0x6b, 0x33, 0x59, 0xd2, 0xd6, 0x77,
+ 0xd9, 0x26, 0xb3, 0xfe, 0x70, 0xb5, 0xbb, 0xc9,
+ 0x5b, 0xff, 0x39, 0x85, 0xbb, 0xdd, 0x51, 0xc9,
+ 0xde, 0x3a, 0x38, 0xb0, 0xcc, 0x1d, 0xc0, 0x4e,
+ 0x4c, 0xe3, 0x5b, 0x62, 0x11, 0xae, 0xbe, 0xa8,
+ 0x86, 0x2f, 0xce, 0xdd, 0x19, 0x02, 0xc5, 0xee,
+ 0xc2, 0x9a, 0x0b, 0x96, 0x95, 0x63, 0x9a, 0xfa,
+ 0x83, 0x88, 0x74, 0x07, 0x1f, 0xd1, 0x02, 0x22,
+ 0x2a, 0x0c, 0x45, 0xcb, 0x42, 0x64, 0x42, 0x41,
+ 0xa7, 0x45, 0x21, 0x44, 0x83, 0x86, 0x03, 0x56,
+ 0x80, 0x31, 0x21, 0x7d, 0x59, 0x10, 0x64, 0x19,
+ 0x39, 0xd6, 0xe9, 0x1e, 0x9c, 0x5c, 0x44, 0xb1,
+ 0x28, 0x39, 0x71, 0x5a, 0x62, 0x78, 0x91, 0x60,
+ 0x7f, 0x2f, 0xff, 0xf0, 0x3d, 0x1c, 0x00, 0x60,
+ 0xe7, 0x67, 0x74, 0xcb, 0x8c, 0x21, 0x40, 0x2c,
+ 0x51, 0x0d, 0x75, 0x88, 0x40, 0x70, 0x38, 0x82,
+ 0x01, 0xc6, 0xba, 0x0e, 0x26, 0x68, 0x56, 0x44,
+ 0x0e, 0x34, 0xe6, 0x2b, 0x13, 0x69, 0x9a, 0x65,
+ 0x85, 0x28, 0x79, 0x10, 0xf0, 0x31, 0x91, 0x61,
+ 0x88, 0x54, 0xa2, 0xaf, 0x41, 0xcf, 0xef, 0x7b,
+ 0xcb, 0xcb, 0xd9, 0x54, 0xca, 0x22, 0x21, 0x40,
+ 0xe2, 0xfa, 0x8a, 0xf2, 0x03, 0x81, 0x72, 0x70,
+ 0x41, 0x9a, 0xd5, 0xdc, 0x8d, 0xf2, 0x76, 0x2e,
+ 0x55, 0xfb, 0xa8, 0x38, 0x6d, 0x70, 0x74, 0x7a,
+ 0x10, 0x54, 0xc5, 0xaa, 0x26, 0xa3, 0x44, 0x0b,
+ 0x00, 0x5f, 0x2c, 0xdc, 0xe0, 0x75, 0x11, 0xde,
+ 0x44, 0x7c, 0xec, 0x44, 0x75, 0x75, 0x43, 0x9a,
+ 0xc5, 0x0f, 0xed, 0xde, 0xed, 0x24, 0xd9, 0x10,
+ 0x62, 0xc8, 0xf8, 0x04, 0x56, 0xec, 0x46, 0x42,
+ 0x96, 0x15, 0xcb, 0x17, 0x5a, 0xc4, 0x38, 0xb1,
+ 0x22, 0xe8, 0xa1, 0x48, 0xc8, 0xe1, 0x92, 0xae,
+ 0x09, 0xd1, 0x34, 0xf3, 0x03, 0x9b, 0xd1, 0xb7,
+ 0x22, 0x05, 0x89, 0x29, 0x0e, 0xb9, 0x11, 0xf1,
+ 0x12, 0x14, 0x01, 0x8c, 0x0c, 0xa9, 0x3c, 0xcc,
+ 0x5e, 0x23, 0xec, 0x28, 0x0a, 0x67, 0x57, 0x36,
+ 0x0e, 0x28, 0x39, 0x22, 0x11, 0x71, 0xda, 0xbf,
+ 0x91, 0x7d, 0xd2, 0x85, 0xd7, 0x0c, 0xc6, 0x01,
+ 0x3d, 0x2b, 0xda, 0xcb, 0x52, 0x23, 0x88, 0x56,
+ 0xec, 0xe8, 0xc6, 0x20, 0x44, 0x4f, 0x8a, 0x14,
+ 0x12, 0x50, 0xc5, 0x12, 0xe4, 0x4c, 0xa4, 0xe7,
+ 0x46, 0x9a, 0x66, 0x72, 0x36, 0xde, 0x8e, 0x7e,
+ 0xc9, 0x50, 0x14, 0xf4, 0x5a, 0x12, 0x55, 0xa1,
+ 0x5d, 0x24, 0x22, 0x82, 0xc9, 0x51, 0xcb, 0xde,
+ 0x02, 0xc0, 0xa7, 0xa2, 0x92, 0x35, 0x44, 0x46,
+ 0x85, 0x11, 0x28, 0x30, 0x51, 0xa4, 0x43, 0x41,
+ 0x85, 0xe0, 0xe0, 0xae, 0xf5, 0x09, 0x06, 0x99,
+ 0x2f, 0x31, 0x99, 0x16, 0xc2, 0xc9, 0xc0, 0xd3,
+ 0xa3, 0x28, 0x43, 0xda, 0xbf, 0x9b, 0xe8, 0x1d,
+ 0xdb, 0xf5, 0xd0, 0x16, 0x60, 0x67, 0x49, 0x10,
+ 0xde, 0x9d, 0x9e, 0x14, 0x8c, 0x51, 0x82, 0xc0,
+ 0xd0, 0xa9, 0x55, 0x18, 0x5a, 0xd5, 0xb2, 0xd2,
+ 0xb9, 0xcd, 0x59, 0x65, 0xcd, 0xd4, 0x08, 0x14,
+ 0x41, 0x83, 0x9c, 0xdd, 0x5d, 0xfa, 0x6b, 0x29,
+ 0x05, 0xcb, 0x52, 0x32, 0x07, 0x06, 0x24, 0xe6,
+ 0xaf, 0xe9, 0x48, 0xa5, 0x45, 0x3a, 0x48, 0x0e,
+ 0x20, 0x5e, 0x70, 0x17, 0xba, 0x75, 0x69, 0x48,
+ 0x47, 0x1d, 0x36, 0x0e, 0x17, 0x11, 0x6e, 0xea,
+ 0x34, 0x63, 0x35, 0x86, 0x92, 0x5b, 0xa6, 0xa9,
+ 0x2c, 0xe8, 0x38, 0x16, 0x02, 0xa5, 0x59, 0xd1,
+ 0x75, 0x7b, 0xde, 0x70, 0x1f, 0xbe, 0x00, 0x3f,
+ 0xfa, 0xfa, 0xce, 0x9a, 0x90, 0x51, 0xe4, 0xea,
+ 0x0c, 0x22, 0x99, 0x57, 0x34, 0x4d, 0x57, 0xa3,
+ 0x8f, 0x86, 0xca, 0x0f, 0xdb, 0x6d, 0x37, 0x50,
+ 0x4a, 0xe5, 0x5b, 0x6a, 0xd8, 0xbf, 0x65, 0xec,
+ 0xd7, 0x2b, 0xb5, 0xff, 0x61, 0xc7, 0xe9, 0x7b,
+ 0xd3, 0x96, 0xcc, 0x9c, 0x5a, 0xb7, 0xed, 0x41,
+ 0x38, 0x73, 0x46, 0x53, 0x75, 0x6b, 0xfd, 0x30,
+ 0xd7, 0x84, 0xaf, 0xd3, 0x32, 0x07, 0x95, 0xfc,
+ 0x73, 0x5a, 0x1b, 0xf9, 0x42, 0x99, 0x03, 0x8e,
+ 0x10, 0xcc, 0xa0, 0xe1, 0xa0, 0xc4, 0x10, 0x8b,
+ 0xf7, 0xe3, 0xdc, 0xf0, 0x7d, 0x71, 0x4e, 0x7e,
+ 0x5d, 0xb4, 0x36, 0x14, 0x28, 0x83, 0x03, 0x00,
+ 0x58, 0x82, 0xc0, 0xfa, 0x7f, 0x39, 0x51, 0x9e,
+ 0x89, 0xbb, 0x20, 0xcd, 0x12, 0x01, 0x3d, 0xaf,
+ 0x50, 0x83, 0x85, 0xe8, 0x8a, 0x05, 0x29, 0xaf,
+ 0x4e, 0xe8, 0x84, 0x31, 0x08, 0x8c, 0x3f, 0xa7,
+ 0x22, 0xf5, 0x88, 0xea, 0x83, 0xba, 0x18, 0x0a,
+ 0xf4, 0x92, 0xa1, 0x44, 0x0e, 0x44, 0x12, 0x6a,
+ 0x0e, 0x90, 0x1c, 0x7a, 0xa0, 0x21, 0xa9, 0xb5,
+ 0xd1, 0x83, 0xba, 0x6d, 0x08, 0x4d, 0xdf, 0x97,
+ 0x35, 0x22, 0x30, 0x72, 0x03, 0xbf, 0x88, 0xc0,
+ 0x72, 0xe0, 0x38, 0x29, 0x9d, 0x34, 0xbd, 0x0a,
+ 0x34, 0xdf, 0x91, 0xf0, 0xa4, 0x53, 0x39, 0x09,
+ 0x2a, 0x30, 0x73, 0xdf, 0x91, 0xc4, 0x00, 0xe5,
+ 0xa7, 0x01, 0x39, 0xf9, 0x11, 0xa0, 0x8a, 0xbe,
+ 0x2f, 0xaa, 0x31, 0x90, 0xcc, 0x31, 0x27, 0xfd,
+ 0x34, 0xb1, 0xcf, 0x01, 0xfd, 0x7f, 0xff, 0xd2,
+ 0x74, 0xa0, 0x1d, 0x4a, 0x4e, 0x59, 0x0e, 0xe9,
+ 0xb4, 0x05, 0x00, 0xe3, 0x44, 0xf8, 0x31, 0x05,
+ 0xd3, 0x8b, 0x21, 0x7e, 0x5c, 0x1c, 0x03, 0xc1,
+ 0x3d, 0x51, 0x14, 0x0a, 0xea, 0x78, 0xa0, 0x31,
+ 0x09, 0x64, 0x1c, 0x12, 0xbe, 0x1b, 0x80, 0xe2,
+ 0x0c, 0x8b, 0x84, 0x85, 0x20, 0xb0, 0x09, 0x18,
+ 0x28, 0xd3, 0xe0, 0xe4, 0x20, 0xe0, 0x4d, 0xf6,
+ 0x9a, 0x07, 0x06, 0x4f, 0x60, 0xe4, 0x46, 0xdf,
+ 0xc6, 0x22, 0xe0, 0xc0, 0x28, 0xe2, 0x32, 0x0d,
+ 0x3f, 0xde, 0x00, 0xe0, 0x92, 0x01, 0x79, 0x54,
+ 0x6e, 0xec, 0xba, 0x02, 0x1a, 0x6c, 0xfc, 0x5f,
+ 0x8b, 0xc0, 0x77, 0x4f, 0x4a, 0x03, 0x61, 0x1b,
+ 0x50, 0x83, 0x84, 0x5f, 0xa3, 0x31, 0x45, 0xc5,
+ 0x81, 0xd4, 0xee, 0x9c, 0xda, 0x48, 0x31, 0xe2,
+ 0x32, 0x8a, 0xe2, 0xd2, 0x5b, 0xb7, 0x68, 0xcb,
+ 0x0d, 0x12, 0xa2, 0x42, 0x14, 0x65, 0xcd, 0x03,
+ 0x83, 0x20, 0x9d, 0x0e, 0x0b, 0x82, 0x96, 0xb4,
+ 0x64, 0xed, 0x34, 0xf9, 0xb5, 0x0d, 0x80, 0xfd,
+ 0xb0, 0x01, 0xd6, 0x62, 0x8d, 0x5d, 0x1d, 0x29,
+ 0xa1, 0x80, 0x66, 0x32, 0x7f, 0xe9, 0xb1, 0x33,
+ 0x17, 0x1a, 0x87, 0x59, 0x72, 0x0a, 0xba, 0x7a,
+ 0x88, 0x92, 0xf1, 0xf8, 0x31, 0x07, 0x40, 0x8f,
+ 0x12, 0xa0, 0x45, 0x3a, 0x88, 0x1c, 0x11, 0x30,
+ 0x72, 0xe4, 0x5a, 0x83, 0x61, 0x3c, 0x4e, 0xaa,
+ 0x00, 0xc9, 0x19, 0xf6, 0xb0, 0x38, 0x07, 0x04,
+ 0x93, 0x46, 0x62, 0x66, 0xb0, 0x2c, 0x08, 0xea,
+ 0x95, 0xc1, 0x3f, 0x48, 0x99, 0x3a, 0x8e, 0xf4,
+ 0xd2, 0xc0, 0xe0, 0xc4, 0x69, 0x34, 0x1e, 0x82,
+ 0x00, 0x30, 0x71, 0x4b, 0xdb, 0x0c, 0x45, 0x29,
+ 0xda, 0x4d, 0xa7, 0xf9, 0xde, 0x74, 0x5c, 0x0b,
+ 0xa4, 0xfc, 0xa6, 0xfc, 0x3d, 0x51, 0xc9, 0xf0,
+ 0xf3, 0x88, 0xcd, 0x4e, 0xd3, 0x60, 0xbb, 0xf3,
+ 0xaa, 0x17, 0xe4, 0xa2, 0xe0, 0x71, 0xf8, 0x8b,
+ 0x5c, 0x86, 0xa8, 0x3b, 0xa7, 0x64, 0x1a, 0x69,
+ 0x8e, 0x01, 0x14, 0x49, 0x41, 0x3c, 0x08, 0xd0,
+ 0x18, 0x07, 0xb9, 0x1c, 0x4e, 0x25, 0xd4, 0x71,
+ 0x80, 0x7d, 0x8f, 0xff, 0x52, 0xdd, 0x36, 0x14,
+ 0xd7, 0x4d, 0x38, 0xba, 0x36, 0x5a, 0x18, 0xa9,
+ 0xd2, 0x91, 0xda, 0x1f, 0xb5, 0x90, 0xa1, 0x71,
+ 0x7f, 0x48, 0x28, 0x19, 0x7a, 0x8c, 0xbc, 0x61,
+ 0xc8, 0x12, 0x7e, 0xae, 0x15, 0x60, 0xc8, 0x4d,
+ 0xe6, 0xea, 0x20, 0xc0, 0x13, 0x75, 0xe9, 0x52,
+ 0xaf, 0x74, 0x3d, 0xd6, 0x6d, 0xa2, 0xba, 0x69,
+ 0x32, 0xa4, 0x77, 0x65, 0x3d, 0x2b, 0x50, 0x75,
+ 0x05, 0xd5, 0xee, 0x1f, 0x55, 0xca, 0xd1, 0xbf,
+ 0x5e, 0x59, 0xbe, 0x06, 0x24, 0xc3, 0xe9, 0xff,
+ 0xeb, 0x20, 0x39, 0x41, 0xda, 0x80, 0x75, 0x07,
+ 0x0d, 0x56, 0x02, 0xe7, 0xaf, 0xa0, 0xcc, 0x8b,
+ 0x4e, 0x65, 0x91, 0x12, 0xc3, 0x49, 0x52, 0xe7,
+ 0x59, 0xa5, 0x01, 0x47, 0x2d, 0x06, 0x14, 0x4e,
+ 0x6a, 0x3a, 0x76, 0x2e, 0xbf, 0xfe, 0xd7, 0xc1,
+ 0x8d, 0xfa, 0xd4, 0x44, 0x27, 0x3e, 0x5a, 0x25,
+ 0xb0, 0xc5, 0x51, 0xd3, 0x54, 0xb2, 0xab, 0xf0,
+ 0x3c, 0x64, 0x01, 0xad, 0xb7, 0x8b, 0x85, 0x63,
+ 0x16, 0x67, 0x95, 0xc0, 0x64, 0x3e, 0xd9, 0x62,
+ 0x14, 0x41, 0x29, 0x6f, 0x5b, 0xc5, 0xba, 0x84,
+ 0xd0, 0xc4, 0x2b, 0x4d, 0x8a, 0x01, 0xd2, 0xe0,
+ 0x0f, 0x76, 0x9a, 0x02, 0x40, 0xed, 0xa1, 0x2e,
+ 0x37, 0x7d, 0x8c, 0xe4, 0xf5, 0x90, 0x15, 0xad,
+ 0x6b, 0x48, 0x10, 0x29, 0x40, 0xb1, 0x01, 0x1d,
+ 0xc3, 0x5c, 0x07, 0x1f, 0x24, 0xab, 0x4a, 0x90,
+ 0x14, 0x82, 0xc0, 0x27, 0x8d, 0x44, 0x18, 0x12,
+ 0x05, 0x1a, 0x24, 0x1c, 0x34, 0xbf, 0x42, 0xbd,
+ 0x3b, 0x15, 0x6d, 0x07, 0x12, 0x0b, 0x9e, 0xac,
+ 0x0c, 0x81, 0xcf, 0xf6, 0x03, 0xd0, 0x40, 0x06,
+ 0x30, 0x20, 0x61, 0x4e, 0x9d, 0x8c, 0xf8, 0x26,
+ 0x84, 0x43, 0x33, 0x74, 0x1c, 0x0b, 0xec, 0xb9,
+ 0x36, 0x41, 0x45, 0x5a, 0x28, 0xb9, 0xcd, 0x3f,
+ 0x9d, 0x2d, 0x80, 0xe9, 0x01, 0xc2, 0xfa, 0x34,
+ 0xde, 0x07, 0x1b, 0x73, 0xc1, 0xb8, 0xcf, 0xa5,
+ 0x23, 0x56, 0xd7, 0x41, 0xc8, 0xf8, 0x14, 0xe7,
+ 0x2a, 0xf0, 0x52, 0x0e, 0x0a, 0x3c, 0x43, 0x7a,
+ 0x8c, 0x4f, 0x89, 0x41, 0xd4, 0x13, 0x7d, 0xa0,
+ 0xe0, 0xc8, 0x89, 0xaa, 0x03, 0xd1, 0x3f, 0x3b,
+ 0xd2, 0x40, 0x71, 0xd6, 0x37, 0x01, 0xfc, 0x05,
+ 0xd3, 0x84, 0x39, 0x09, 0x03, 0x23, 0xa1, 0x1e,
+ 0x9e, 0x19, 0x83, 0x06, 0x41, 0x57, 0x07, 0x0c,
+ 0x09, 0x4f, 0x63, 0xfc, 0x66, 0xb8, 0x38, 0xf2,
+ 0xf0, 0x17, 0x71, 0x3c, 0x32, 0x0a, 0xba, 0x28,
+ 0x81, 0x72, 0x40, 0x5c, 0x35, 0xa9, 0x0b, 0x07,
+ 0x02, 0x6a, 0x12, 0x11, 0xe9, 0xea, 0x0e, 0x01,
+ 0xe0, 0xb8, 0xe8, 0x81, 0xc2, 0x8d, 0x46, 0x42,
+ 0x9c, 0x0f, 0x43, 0xff, 0xff, 0x02, 0x76, 0x22,
+ 0xa9, 0xcd, 0x07, 0x52, 0x3e, 0x0e, 0x04, 0xea,
+ 0xa0, 0xf3, 0xd0, 0x01, 0x83, 0x88, 0x9a, 0xe8,
+ 0xd1, 0x92, 0x03, 0x81, 0x3e, 0xf6, 0x54, 0x5d,
+ 0x58, 0x4d, 0x17, 0x66, 0xc3, 0x10, 0x5c, 0xf0,
+ 0xcc, 0x1c, 0x12, 0x3a, 0xe9, 0x05, 0x80, 0x54,
+ 0xc8, 0xc1, 0xd7, 0xa7, 0xaa, 0xf5, 0xd8, 0x6d,
+ 0x68, 0x8a, 0xba, 0x39, 0xc4, 0x08, 0xc8, 0x2c,
+ 0x07, 0x83, 0x84, 0xf5, 0x79, 0xa8, 0x45, 0xcb,
+ 0x82, 0xc3, 0x83, 0x17, 0xa6, 0x48, 0x48, 0x27,
+ 0xd3, 0xc2, 0xe1, 0x3f, 0x07, 0x04, 0xcc, 0x65,
+ 0xd0, 0xc8, 0x28, 0xc0, 0xe2, 0x40, 0x5c, 0x5b,
+ 0x38, 0x0b, 0xba, 0xbf, 0xa5, 0x72, 0x72, 0xca,
+ 0x8d, 0x1a, 0x21, 0x75, 0x8b, 0x13, 0xf2, 0x99,
+ 0x67, 0x10, 0x51, 0x81, 0x07, 0x15, 0x60, 0x75,
+ 0x58, 0x2a, 0xb6, 0x9e, 0xd3, 0xca, 0x54, 0xc5,
+ 0x8a, 0x41, 0xce, 0x65, 0x24, 0x4d, 0x15, 0x45,
+ 0xd0, 0xc0, 0x5c, 0x0b, 0xcc, 0xb1, 0xb1, 0x8f,
+ 0x20, 0x60, 0x13, 0x34, 0xee, 0x14, 0xbf, 0x5e,
+ 0x77, 0x4d, 0x03, 0xa0, 0x2c, 0x42, 0x6d, 0x2d,
+ 0xa7, 0x97, 0x2f, 0x98, 0xdb, 0x5c, 0x2d, 0xd5,
+ 0xd1, 0x77, 0xa8, 0x2e, 0x5e, 0x73, 0x81, 0x2d,
+ 0xef, 0xb1, 0xa5, 0x38, 0x38, 0xb9, 0x56, 0xec,
+ 0xd6, 0xb7, 0x64, 0x24, 0x41, 0x6a, 0x2a, 0x71,
+ 0x3d, 0x04, 0x5a, 0x28, 0xa9, 0x99, 0xd6, 0x49,
+ 0x01, 0xc4, 0x16, 0x20, 0xe8, 0xa0, 0xe5, 0x63,
+ 0xe8, 0x53, 0xe9, 0x2f, 0x14, 0x03, 0xb8, 0x35,
+ 0xa0, 0x44, 0x82, 0x2f, 0xdb, 0xd8, 0x1b, 0xeb,
+ 0xd0, 0x3c, 0x58, 0x3d, 0x19, 0x16, 0x1d, 0xd7,
+ 0xb5, 0x1b, 0x60, 0x54, 0xaf, 0xfd, 0xb4, 0x38,
+ 0xd7, 0x7a, 0xc2, 0xa0, 0x62, 0x49, 0x2a, 0xf5,
+ 0x61, 0x33, 0xfa, 0x25, 0xa7, 0xbc, 0x16, 0x27,
+ 0x7d, 0xd4, 0x3f, 0x76, 0xba, 0xbf, 0xcc, 0xb3,
+ 0x9d, 0xdc, 0xd9, 0xc3, 0xd5, 0x3e, 0xd2, 0x0b,
+ 0xfc, 0xb6, 0x58, 0xe8, 0x80, 0x52, 0x06, 0x07,
+ 0xb5, 0xfd, 0x15, 0xb1, 0x6e, 0x5e, 0xf4, 0xb3,
+ 0x76, 0x0a, 0xb5, 0xea, 0xfe, 0x4f, 0xd9, 0xe1,
+ 0xc2, 0x76, 0xbb, 0x02, 0xd9, 0x1e, 0x0f, 0x77,
+ 0xab, 0x4f, 0x79, 0xb5, 0x8c, 0xd2, 0xdc, 0x42,
+ 0x27, 0xef, 0xf5, 0x4e, 0x60, 0x31, 0xa9, 0x4d,
+ 0x54, 0x47, 0xf5, 0xdb, 0x4d, 0x25, 0xec, 0xee,
+ 0x7d, 0x56, 0x5b, 0x78, 0x2b, 0xd1, 0x25, 0xc4,
+ 0x75, 0x96, 0xf9, 0xc8, 0x08, 0xce, 0xfb, 0x9f,
+ 0xe2, 0xf3, 0x1f, 0x6d, 0xb5, 0xb6, 0x21, 0x95,
+ 0x01, 0xf4, 0xca, 0x8a, 0x87, 0xbb, 0x20, 0x49,
+ 0x53, 0x2e, 0x5c, 0xa9, 0xa8, 0x5e, 0xc3, 0x74,
+ 0xb4, 0xa9, 0x96, 0xb4, 0x3b, 0xf8, 0x73, 0x05,
+ 0x6b, 0x37, 0x79, 0x4a, 0x78, 0x2f, 0x82, 0x75,
+ 0xd3, 0x2b, 0x03, 0x6a, 0xda, 0x54, 0xc4, 0xfd,
+ 0xd6, 0xff, 0xef, 0x65, 0xe7, 0x17, 0xba, 0xb5,
+ 0x5c, 0xc9, 0xa8, 0x9a, 0x8f, 0x9a, 0x61, 0x8a,
+ 0xce, 0xa7, 0xdc, 0xc0, 0x2f, 0xf4, 0x21, 0x9a,
+ 0xc6, 0x85, 0x43, 0x2c, 0xe0, 0xca, 0x93, 0x69,
+ 0xae, 0x5d, 0x7b, 0xe3, 0x6b, 0x82, 0x71, 0x4a,
+ 0x8a, 0x91, 0xf1, 0x28, 0x3a, 0xbd, 0x05, 0xac,
+ 0x15, 0x22, 0xea, 0x04, 0x0e, 0xc8, 0xa2, 0xee,
+ 0xf4, 0x1c, 0x52, 0x0e, 0x40, 0x15, 0x4d, 0x8b,
+ 0x03, 0xa0, 0x0f, 0xe9, 0x1a, 0x0b, 0x43, 0x61,
+ 0x85, 0x39, 0xa6, 0x41, 0x78, 0x4b, 0x78, 0x88,
+ 0xf6, 0x9c, 0xf5, 0x70, 0x77, 0x02, 0x2c, 0x0f,
+ 0x4f, 0x00, 0x18, 0xd2, 0xc7, 0x08, 0x41, 0xc1,
+ 0x88, 0x4d, 0x40, 0xc7, 0x99, 0x19, 0x1e, 0x9e,
+ 0xf2, 0xd6, 0x02, 0xc7, 0x80, 0xe1, 0x93, 0xf7,
+ 0x91, 0x8c, 0x85, 0x73, 0x1a, 0x5c, 0xfc, 0x22,
+ 0x74, 0xa7, 0xb4, 0xd8, 0x39, 0x18, 0x4b, 0x97,
+ 0x01, 0xe8, 0xc1, 0x3f, 0xa2, 0x07, 0xf5, 0x80,
+ 0x0f, 0xf4, 0x13, 0x35, 0x02, 0xad, 0x7d, 0x20,
+ 0xc0, 0x1c, 0x14, 0xfa, 0x32, 0xef, 0x41, 0xc3,
+ 0x56, 0x19, 0x23, 0x21, 0x62, 0xe7, 0xf2, 0x02,
+ 0xeb, 0x4d, 0x83, 0x8a, 0x41, 0xc3, 0x07, 0x30,
+ 0x73, 0xf4, 0xea, 0x23, 0x40, 0xe0, 0x9d, 0xae,
+ 0x4a, 0x32, 0x05, 0xc4, 0xe9, 0x2f, 0x5d, 0xae,
+ 0xc1, 0xc5, 0x34, 0x51, 0x22, 0xad, 0xc0, 0x75,
+ 0xbc, 0x07, 0x1e, 0xb3, 0x47, 0xb7, 0x54, 0xf8,
+ 0x39, 0xcd, 0x08, 0x3a, 0x80, 0xea, 0x13, 0xb5,
+ 0xc1, 0xcb, 0x84, 0xac, 0x9b, 0x29, 0x0a, 0x34,
+ 0xfa, 0xe4, 0x83, 0x1a, 0x0e, 0x26, 0x90, 0x72,
+ 0xeb, 0x03, 0xa0, 0xd7, 0x23, 0xa1, 0x92, 0xc0,
+ 0xb1, 0x39, 0xd1, 0x03, 0x83, 0x32, 0x78, 0x09,
+ 0xf5, 0x7f, 0x17, 0x37, 0xd5, 0xa2, 0x31, 0xad,
+ 0xa2, 0xe8, 0x48, 0xa3, 0x3e, 0x6f, 0xec, 0x75,
+ 0xb6, 0xb3, 0xf2, 0xcb, 0x9a, 0x0e, 0xe0, 0x48,
+ 0x36, 0x08, 0x23, 0xe4, 0xa9, 0xd8, 0x5b, 0x6b,
+ 0x1b, 0x38, 0xdf, 0xbb, 0xc4, 0x7d, 0x86, 0x53,
+ 0x14, 0x44, 0x47, 0xf5, 0xf5, 0xca, 0x32, 0x17,
+ 0x86, 0x63, 0x43, 0x09, 0xeb, 0x06, 0x93, 0xfa,
+ 0xde, 0x08, 0xb1, 0x0c, 0x5a, 0xf4, 0x26, 0x1b,
+ 0xab, 0x12, 0xd5, 0x6e, 0xd2, 0xcc, 0x56, 0xc3,
+ 0x1f, 0xa6, 0xcd, 0x10, 0x18, 0x1e, 0x25, 0x65,
+ 0xb6, 0xf7, 0x7d, 0x1a, 0x56, 0x95, 0x8b, 0x22,
+ 0xdd, 0x18, 0x74, 0xe1, 0x53, 0xb0, 0x6f, 0xc1,
+ 0x5e, 0xb9, 0xe1, 0x1e, 0x17, 0x37, 0xe5, 0xbe,
+ 0x9f, 0x06, 0xf8, 0xb9, 0x49, 0x09, 0x94, 0xf7,
+ 0xfa, 0x88, 0x40, 0xde, 0x0d, 0xe5, 0xa4, 0xab,
+ 0x82, 0x4f, 0x48, 0x97, 0x8b, 0x45, 0x17, 0x31,
+ 0x4c, 0xd2, 0x81, 0x5a, 0x7b, 0x7d, 0x3a, 0xbb,
+ 0x02, 0x07, 0xfa, 0xf3, 0x1b, 0xcb, 0x56, 0xc5,
+ 0x0a, 0x62, 0x37, 0x6b, 0xab, 0xff, 0xde, 0x61,
+ 0x68, 0x1a, 0x6e, 0xf6, 0xc2, 0xb5, 0x91, 0x20,
+ 0x07, 0x05, 0x6a, 0x6e, 0x6e, 0xd8, 0xa3, 0x9c,
+ 0x80, 0x3c, 0x4e, 0x8c, 0xc6, 0x96, 0xef, 0x73,
+ 0x35, 0x08, 0x26, 0x2a, 0xdb, 0x0c, 0x2f, 0xdb,
+ 0x3d, 0xb3, 0x94, 0xf9, 0x72, 0xe4, 0x25, 0xca,
+ 0x41, 0xa6, 0x66, 0x83, 0x51, 0xfe, 0xf0, 0xb3,
+ 0xd7, 0x0a, 0x40, 0x77, 0x02, 0x7a, 0xa2, 0x18,
+ 0x43, 0x66, 0x22, 0xcb, 0x3a, 0x1c, 0x40, 0x70,
+ 0x26, 0xa7, 0x02, 0x09, 0x7d, 0x46, 0xd2, 0xab,
+ 0x41, 0x83, 0x41, 0x79, 0x1a, 0x30, 0x0f, 0xab,
+ 0x06, 0x0e, 0x18, 0xa0, 0xc0, 0x48, 0x23, 0xf2,
+ 0x06, 0xd0, 0x64, 0xfd, 0xfe, 0x5c, 0xd7, 0xed,
+ 0x2b, 0x53, 0xbb, 0x79, 0x0c, 0x49, 0x71, 0x70,
+ 0x37, 0x34, 0x7b, 0x77, 0xab, 0xa3, 0x80, 0xa6,
+ 0x89, 0xd7, 0x07, 0x8a, 0x80, 0x24, 0x2d, 0x4f,
+ 0x3c, 0xba, 0xe7, 0x4a, 0x35, 0x22, 0x4d, 0x4f,
+ 0x8b, 0xef, 0x10, 0x87, 0xda, 0xdc, 0xe2, 0x00,
+ 0x21, 0x5f, 0xdb, 0xb4, 0xdc, 0x19, 0xba, 0x11,
+ 0x26, 0x9d, 0x53, 0x50, 0x41, 0xad, 0x73, 0x50,
+ 0x85, 0x2f, 0x77, 0x50, 0x65, 0xa3, 0x20, 0x71,
+ 0x35, 0x71, 0x2e, 0xad, 0x8d, 0x6c, 0x17, 0x06,
+ 0x67, 0xaa, 0xdc, 0x5d, 0x6a, 0x6d, 0x49, 0xdd,
+ 0x7f, 0x32, 0xae, 0x8e, 0x04, 0x95, 0xb2, 0x71,
+ 0x7e, 0x2d, 0x0e, 0xc1, 0x70, 0x7f, 0x35, 0x7f,
+ 0x60, 0x73, 0x06, 0x11, 0xf0, 0xa8, 0x7d, 0xb2,
+ 0x87, 0xbf, 0x6d, 0x07, 0xa4, 0x0d, 0x0f, 0x99,
+ 0xc5, 0x3c, 0xe0, 0x66, 0x0e, 0x9d, 0x3f, 0xa6,
+ 0xae, 0xa7, 0x6b, 0x16, 0x47, 0x43, 0x87, 0x3e,
+ 0x17, 0xb6, 0x36, 0x68, 0x71, 0x00, 0x8b, 0x37,
+ 0x83, 0x08, 0x8c, 0x29, 0x2c, 0xd2, 0x46, 0x98,
+ 0x1b, 0x2a, 0xe1, 0x2c, 0x46, 0x31, 0xe0, 0x5b,
+ 0x1c, 0x86, 0xb0, 0x67, 0xd1, 0x7b, 0xe5, 0xe1,
+ 0xa0, 0xa3, 0x5d, 0x04, 0xc3, 0xe1, 0xeb, 0x50,
+ 0x15, 0xbf, 0xfc, 0x8b, 0x66, 0x4a, 0x85, 0x47,
+ 0x69, 0x16, 0x62, 0x2a, 0xff, 0xff, 0x7c, 0xa1,
+ 0x49, 0x5d, 0xde, 0x44, 0x60, 0xe2, 0x0b, 0xba,
+ 0x1a, 0xf2, 0x11, 0x56, 0x36, 0x85, 0x03, 0xe2,
+ 0x9f, 0xe4, 0x24, 0x14, 0xeb, 0xdd, 0xd6, 0x2b,
+ 0x5c, 0x9b, 0x9c, 0x85, 0x72, 0xae, 0x86, 0x74,
+ 0x89, 0x74, 0xfb, 0x6a, 0x0b, 0xee, 0xa3, 0x18,
+ 0xae, 0x47, 0x1c, 0xb0, 0xa6, 0x93, 0x44, 0xcb,
+ 0xd2, 0x51, 0x33, 0xf5, 0x4a, 0x90, 0x58, 0xba,
+ 0xa6, 0x50, 0x48, 0x60, 0xb1, 0x95, 0x4a, 0xc7,
+ 0x3c, 0xd6, 0x99, 0x9f, 0x51, 0xec, 0x61, 0x42,
+ 0xc8, 0x3b, 0xf6, 0xda, 0xc4, 0x4b, 0x53, 0x4b,
+ 0x1c, 0x44, 0x3f, 0x69, 0x2e, 0x79, 0xb6, 0xb6,
+ 0x55, 0xa7, 0x62, 0x9c, 0xd5, 0x14, 0xd5, 0xad,
+ 0x7f, 0x72, 0x89, 0xa0, 0x0c, 0xa2, 0xea, 0xc2,
+ 0x80, 0xd8, 0x3e, 0x11, 0xc4, 0x94, 0x9e, 0x1c,
+ 0x31, 0x18, 0x51, 0xde, 0xf0, 0x70, 0x7e, 0xee,
+ 0x16, 0x95, 0xa9, 0x2b, 0x0a, 0xa2, 0xeb, 0x25,
+ 0xa5, 0x55, 0x11, 0xb1, 0x49, 0xa6, 0xba, 0x4a,
+ 0x48, 0x1c, 0x00, 0xf0, 0xa0, 0x88, 0xf5, 0xbc,
+ 0xc9, 0x6f, 0x70, 0x3d, 0x93, 0xa7, 0x91, 0xd6,
+ 0x3d, 0x03, 0x8f, 0xfe, 0x8b, 0xd6, 0x05, 0xc1,
+ 0x76, 0x96, 0x6e, 0x83, 0xce, 0xff, 0xfb, 0xc3,
+ 0xda, 0xf0, 0xa1, 0x65, 0x97, 0xa2, 0x8b, 0xbf,
+ 0xa5, 0x10, 0x89, 0x02, 0xce, 0x23, 0x2d, 0xb2,
+ 0x55, 0x0e, 0x4f, 0x53, 0x78, 0xdf, 0xf7, 0x3d,
+ 0xab, 0x14, 0xbf, 0xc8, 0x0a, 0xe8, 0xfd, 0x79,
+ 0xb0, 0xa4, 0xa4, 0x1c, 0x41, 0x13, 0x64, 0x46,
+ 0x28, 0x4c, 0xb3, 0x24, 0x02, 0xba, 0x58, 0x50,
+ 0x14, 0xa7, 0x67, 0x35, 0x7e, 0xf2, 0xa2, 0x7b,
+ 0xb6, 0x0c, 0x33, 0xa8, 0x4e, 0xeb, 0xee, 0x74,
+ 0xb6, 0x03, 0xb8, 0x0b, 0x01, 0x71, 0x0d, 0x65,
+ 0x91, 0x7a, 0x0e, 0x05, 0x8f, 0x68, 0x48, 0x96,
+ 0x31, 0xb0, 0x39, 0xcc, 0xd4, 0x41, 0x4c, 0xec,
+ 0xfa, 0x22, 0xbc, 0xb5, 0x09, 0x07, 0x36, 0x77,
+ 0x8b, 0xe0, 0xaf, 0x5f, 0x58, 0xb1, 0xb9, 0x49,
+ 0x4d, 0x3b, 0xca, 0x87, 0xb6, 0x70, 0x92, 0x82,
+ 0xf1, 0xe5, 0xe8, 0xdb, 0x7b, 0x65, 0x2c, 0xd8,
+ 0xf1, 0x84, 0x08, 0x7f, 0x67, 0xf0, 0x40, 0x69,
+ 0x24, 0xd4, 0x6b, 0x53, 0x7c, 0x74, 0x9d, 0xe8,
+ 0x88, 0x2b, 0xab, 0xba, 0x49, 0xc4, 0x34, 0x55,
+ 0x81, 0x60, 0x0b, 0xb3, 0xc2, 0x30, 0x22, 0xa9,
+ 0xee, 0x82, 0x2b, 0x3a, 0x0b, 0x00, 0x5c, 0x6c,
+ 0x95, 0x04, 0xe5, 0xef, 0x46, 0x22, 0x74, 0x98,
+ 0x52, 0x2a, 0xd7, 0x6f, 0x68, 0x11, 0x85, 0x29,
+ 0xfd, 0xbd, 0x28, 0xc8, 0x4f, 0xb6, 0xde, 0x41,
+ 0x13, 0x17, 0x46, 0x46, 0xca, 0x3e, 0x69, 0xd5,
+ 0x3f, 0xde, 0x02, 0x69, 0x86, 0x47, 0xe3, 0xe6,
+ 0x03, 0xb6, 0x7d, 0x00, 0x9f, 0x68, 0xc1, 0x1b,
+ 0xd4, 0xd2, 0xf5, 0x7b, 0x2d, 0x6d, 0xb6, 0x74,
+ 0x09, 0xff, 0x46, 0x5c, 0x87, 0x15, 0x53, 0xd4,
+ 0x1a, 0x30, 0xe0, 0x60, 0x31, 0x0a, 0xf5, 0x03,
+ 0x38, 0x49, 0x0e, 0x6b, 0x9d, 0x12, 0x62, 0xaf,
+ 0xe1, 0x57, 0xd2, 0xb0, 0xb5, 0x86, 0x0f, 0x36,
+ 0x3b, 0x4c, 0xda, 0xcd, 0x46, 0x1b, 0xef, 0x0b,
+ 0x46, 0x07, 0xf6, 0x23, 0x41, 0x42, 0x69, 0xcb,
+ 0x91, 0x07, 0xaf, 0x78, 0xb9, 0x21, 0x20, 0x9c,
+ 0xb5, 0x00, 0x4c, 0x13, 0x35, 0xcf, 0x17, 0x08,
+ 0x62, 0x5e, 0xb6, 0x05, 0xb3, 0xd9, 0x28, 0x78,
+ 0x0c, 0x2f, 0x21, 0x32, 0x21, 0x30, 0xad, 0x4c,
+ 0xb6, 0xa5, 0x56, 0xda, 0xdc, 0x46, 0x4d, 0x3a,
+ 0xa6, 0x2d, 0xcb, 0x94, 0x16, 0x26, 0xc1, 0x75,
+ 0x0b, 0x8a, 0x6f, 0xf4, 0xaa, 0x0d, 0x9d, 0xae,
+ 0xb8, 0xf8, 0x78, 0x3c, 0x5d, 0x4f, 0xd5, 0x35,
+ 0x3a, 0x57, 0xd2, 0x97, 0xce, 0x79, 0x80, 0x24,
+ 0x0e, 0xed, 0x3e, 0x58, 0x39, 0x90, 0x16, 0x00,
+ 0x9d, 0x45, 0x74, 0x65, 0xc0, 0x1c, 0x48, 0x43,
+ 0xc4, 0x7d, 0xe6, 0xf4, 0x9b, 0x5e, 0x61, 0x6a,
+ 0xeb, 0x74, 0xd2, 0xc0, 0x9a, 0x9b, 0x3b, 0xb3,
+ 0x0d, 0x5b, 0xc0, 0x5d, 0x65, 0xba, 0x4a, 0x32,
+ 0x19, 0x02, 0xea, 0x7b, 0x21, 0xbb, 0x1f, 0x8c,
+ 0xce, 0x77, 0x0a, 0x25, 0x8b, 0x83, 0x81, 0x73,
+ 0x41, 0xf7, 0xa1, 0xb1, 0x9b, 0xfe, 0x4f, 0xc1,
+ 0x17, 0x51, 0x9b, 0xe1, 0x28, 0x2d, 0xa2, 0x4a,
+ 0x4b, 0x4d, 0xbc, 0xad, 0x33, 0x4a, 0x27, 0x10,
+ 0xd2, 0x50, 0x1c, 0xb1, 0x36, 0x50, 0x48, 0x65,
+ 0x35, 0xf8, 0x88, 0x28, 0x6b, 0x82, 0xc0, 0x1c,
+ 0x80, 0xa0, 0xfd, 0x5d, 0x17, 0x78, 0x13, 0xeb,
+ 0xcb, 0x5d, 0x85, 0x08, 0x51, 0x92, 0xf4, 0x1c,
+ 0xf4, 0xa4, 0xe2, 0x35, 0x9f, 0x08, 0xa9, 0xa4,
+ 0x08, 0x05, 0x32, 0x6d, 0x16, 0xf1, 0x7b, 0xc1,
+ 0x92, 0xc7, 0xd7, 0x8b, 0x2c, 0x27, 0xdf, 0x4e,
+ 0x9a, 0xe6, 0x54, 0x40, 0xe4, 0x21, 0x5a, 0xf9,
+ 0xc6, 0x24, 0xef, 0x65, 0x07, 0x2e, 0x2b, 0x4d,
+ 0x4f, 0x2a, 0x09, 0x6c, 0xe8, 0xc7, 0x88, 0x05,
+ 0xc7, 0x50, 0xb2, 0xde, 0xa2, 0xa1, 0x80, 0x64,
+ 0x0b, 0xb3, 0x36, 0xcd, 0x26, 0xde, 0x98, 0x8a,
+ 0xe4, 0x84, 0x17, 0x54, 0x2c, 0x54, 0x0e, 0x18,
+ 0x38, 0xa6, 0xb5, 0x0a, 0x46, 0x41, 0x2f, 0x1c,
+ 0x74, 0x80, 0xee, 0xf1, 0x7e, 0x74, 0x29, 0x8b,
+ 0xd4, 0xdd, 0xb5, 0x64, 0x74, 0x17, 0xcf, 0xcf,
+ 0xd8, 0x32, 0x34, 0xf9, 0xfc, 0x58, 0x64, 0xb5,
+ 0x44, 0x0e, 0x34, 0x41, 0x17, 0x15, 0xeb, 0xe0,
+ 0xa3, 0x49, 0x08, 0x3f, 0xe8, 0xc8, 0x8d, 0x5e,
+ 0xde, 0xa2, 0xb5, 0x00, 0x3a, 0x05, 0x78, 0xca,
+ 0x0a, 0xf5, 0xe5, 0x09, 0xb0, 0x5f, 0xea, 0x33,
+ 0x73, 0xce, 0x12, 0xde, 0x89, 0xa2, 0x49, 0x17,
+ 0x5a, 0x70, 0x07, 0xc1, 0x3b, 0xf5, 0x4c, 0x58,
+ 0xf6, 0xbe, 0x51, 0x49, 0x0f, 0xee, 0x8c, 0x11,
+ 0x03, 0x85, 0x5a, 0x29, 0x35, 0xd3, 0x44, 0x4c,
+ 0x63, 0x24, 0x0c, 0xc5, 0x2b, 0x2d, 0x9c, 0x46,
+ 0x50, 0x28, 0xd3, 0x88, 0xc4, 0x34, 0xbb, 0xb0,
+ 0x81, 0x41, 0x3d, 0xcf, 0x22, 0x58, 0x63, 0x43,
+ 0x13, 0xd3, 0x70, 0x64, 0x28, 0xc6, 0xcb, 0x90,
+ 0x6b, 0x9d, 0xd8, 0x38, 0x74, 0xfe, 0xf8, 0xa5,
+ 0x18, 0x0f, 0x08, 0xa3, 0x76, 0x8c, 0xa0, 0xbc,
+ 0x85, 0xc8, 0x2f, 0x0a, 0x16, 0x41, 0xc8, 0x3a,
+ 0x02, 0xe7, 0x5e, 0x03, 0xd2, 0x49, 0xde, 0x53,
+ 0x5c, 0x5c, 0x85, 0xf0, 0xa5, 0x69, 0x10, 0xf4,
+ 0x28, 0x65, 0x48, 0x38, 0x52, 0x11, 0x7b, 0x78,
+ 0x8b, 0x9d, 0x07, 0x04, 0x53, 0x3b, 0xd4, 0x75,
+ 0x41, 0xdd, 0x7c, 0xb1, 0xb4, 0x43, 0x21, 0x33,
+ 0xa0, 0xfd, 0xf0, 0x01, 0xee, 0x5e, 0x23, 0xd0,
+ 0x1e, 0x4c, 0xef, 0x05, 0xe2, 0xe1, 0x47, 0x8b,
+ 0x21, 0x84, 0x1a, 0x7b, 0xa8, 0x14, 0x03, 0x8e,
+ 0xb1, 0x5c, 0xf4, 0x92, 0x42, 0x55, 0x86, 0x92,
+ 0x69, 0x69, 0x42, 0x5b, 0x6a, 0xf1, 0x01, 0x20,
+ 0x4b, 0xa7, 0x0b, 0x03, 0x82, 0x36, 0x8b, 0xa8,
+ 0x0d, 0x10, 0xe1, 0x88, 0x38, 0x62, 0x2e, 0x13,
+ 0xe0, 0x7a, 0x48, 0x00, 0xc6, 0xb3, 0xbd, 0xe8,
+ 0x49, 0xaf, 0xb8, 0xed, 0x3b, 0x10, 0xa2, 0x15,
+ 0x4a, 0xd4, 0x30, 0x7e, 0x9c, 0xe9, 0xb0, 0x58,
+ 0x92, 0x04, 0x8d, 0x2a, 0xc8, 0xcf, 0xe9, 0xcc,
+ 0x8b, 0xa3, 0x0c, 0x89, 0xf5, 0x9c, 0xe5, 0xc5,
+ 0x08, 0xca, 0xd4, 0x95, 0x15, 0x21, 0xe2, 0xc8,
+ 0xc6, 0x93, 0xc2, 0x40, 0x70, 0x62, 0xf7, 0x20,
+ 0x39, 0x60, 0xaa, 0x5a, 0x48, 0x2e, 0x22, 0xd3,
+ 0x47, 0x26, 0x2c, 0xb8, 0xc8, 0x88, 0xaf, 0x11,
+ 0xf0, 0x32, 0x07, 0x02, 0x6c, 0xf1, 0x0f, 0x38,
+ 0x84, 0x1d, 0x5d, 0x96, 0x07, 0x70, 0x1c, 0x2b,
+ 0xb9, 0xc2, 0x50, 0x9b, 0x4e, 0x45, 0xe3, 0x25,
+ 0x8f, 0xee, 0x14, 0x72, 0x2c, 0x68, 0x29, 0x80,
+ 0x46, 0x58, 0xa1, 0x11, 0x20, 0x38, 0x9b, 0x70,
+ 0x90, 0x1c, 0x2e, 0x0c, 0x84, 0xcc, 0x7e, 0x27,
+ 0x2a, 0x16, 0x07, 0x0a, 0x1a, 0x88, 0x0f, 0x41,
+ 0xff, 0xf8, 0x61, 0x44, 0xd8, 0x60, 0x18, 0x85,
+ 0x53, 0x03, 0x20, 0x73, 0xa2, 0x07, 0x6b, 0xee,
+ 0x92, 0xc7, 0x4f, 0x0d, 0xf6, 0xf0, 0x17, 0x1a,
+ 0x59, 0xde, 0x9b, 0x28, 0x07, 0x04, 0xda, 0xca,
+ 0x2b, 0x6a, 0x37, 0x58, 0x6b, 0xaf, 0x83, 0x13,
+ 0x60, 0xe7, 0x6e, 0xc4, 0x48, 0x21, 0x0e, 0x58,
+ 0x92, 0x83, 0x82, 0x78, 0x8b, 0x23, 0x58, 0xd9,
+ 0x0d, 0x24, 0x7d, 0xb9, 0x2c, 0x07, 0x2c, 0x0e,
+ 0x42, 0x09, 0x98, 0xb0, 0xd8, 0x4d, 0x23, 0x10,
+ 0x70, 0xa7, 0x73, 0x86, 0xc6, 0x0b, 0x04, 0x9f,
+ 0xfb, 0x56, 0x29, 0x07, 0x23, 0x8f, 0x98, 0x0e,
+ 0x8f, 0x63, 0x0a, 0x50, 0x76, 0x29, 0x28, 0x26,
+ 0x3c, 0x5f, 0x02, 0xfb, 0x51, 0x9b, 0xb0, 0x61,
+ 0xc0, 0x70, 0xbc, 0x17, 0x29, 0xc0, 0xcc, 0x1d,
+ 0x08, 0x62, 0xca, 0x72, 0xf0, 0xa4, 0xfd, 0x5d,
+ 0x2c, 0x58, 0xd5, 0x5c, 0x1c, 0x2a, 0x4e, 0xf7,
+ 0x0a, 0x01, 0xfa, 0xff, 0xff, 0xd5, 0x09, 0xa8,
+ 0x8c, 0x1c, 0x30, 0x25, 0x09, 0xd3, 0xd9, 0x30,
+ 0xd3, 0xdb, 0x94, 0x13, 0x74, 0xc8, 0x71, 0x1a,
+ 0x21, 0x87, 0x43, 0x10, 0x89, 0x5a, 0x6b, 0x91,
+ 0xd5, 0x66, 0xa0, 0xb0, 0x1c, 0x30, 0x58, 0x64,
+ 0x15, 0xfe, 0x36, 0x04, 0x7b, 0x4d, 0x23, 0x07,
+ 0x3a, 0xf1, 0x0a, 0xc2, 0x7d, 0x3b, 0xa1, 0x91,
+ 0xa4, 0x62, 0x96, 0xb1, 0xae, 0x83, 0xf6, 0xc0,
+ 0x07, 0xae, 0x6c, 0x11, 0x45, 0xf4, 0x1c, 0x35,
+ 0x6a, 0x28, 0x39, 0x60, 0x71, 0x1b, 0xf4, 0x39,
+ 0x44, 0x41, 0xae, 0xf1, 0x07, 0x01, 0xd4, 0x89,
+ 0xf6, 0x94, 0x1f, 0x7d, 0xab, 0x1b, 0x20, 0xdb,
+ 0x22, 0x1e, 0xa2, 0x07, 0x09, 0x8b, 0xe3, 0xf4,
+ 0xda, 0x82, 0x8c, 0x25, 0x01, 0xc0, 0xe2, 0x36,
+ 0x59, 0xa0, 0xe2, 0x42, 0x82, 0x64, 0x78, 0xb0,
+ 0x66, 0x0e, 0x59, 0xdd, 0x63, 0x65, 0x0b, 0x02,
+ 0x6a, 0x8c, 0xc2, 0xad, 0x7a, 0x90, 0xa3, 0xa0,
+ 0xbd, 0xda, 0x53, 0xd9, 0xd5, 0x82, 0x4f, 0x2c,
+ 0x37, 0xd8, 0x50, 0x8c, 0xa0, 0x2a, 0x70, 0x5e,
+ 0x47, 0x4a, 0xa9, 0x28, 0xaf, 0x4f, 0x58, 0x88,
+ 0x31, 0x29, 0x19, 0x76, 0x8c, 0xc8, 0xbf, 0x0d,
+ 0xc1, 0x56, 0xe7, 0x0a, 0x05, 0xe5, 0x20, 0xe8,
+ 0xe6, 0xb0, 0x3b, 0xb7, 0xa0, 0xe1, 0x80, 0xaa,
+ 0xa0, 0x23, 0xd7, 0x74, 0xd5, 0x01, 0xfc, 0x19,
+ 0x85, 0x13, 0x01, 0xc1, 0x91, 0x1b, 0xec, 0x28,
+ 0x80, 0xb1, 0xe2, 0xc7, 0x6a, 0x74, 0x07, 0x2c,
+ 0x31, 0x15, 0xd8, 0xbd, 0xb7, 0x82, 0xe2, 0x1d,
+ 0x3c, 0xa2, 0x83, 0x97, 0x09, 0x3a, 0xc0, 0xb1,
+ 0x34, 0x50, 0x0b, 0x87, 0x6c, 0xc8, 0xa7, 0x6e,
+ 0x64, 0x37, 0xb7, 0x91, 0x1f, 0x09, 0x0a, 0x38,
+ 0x34, 0x8c, 0x97, 0x80, 0xe5, 0x8d, 0x94, 0x0a,
+ 0xd6, 0xe9, 0x24, 0x18, 0xae, 0x34, 0xd7, 0xd2,
+ 0x94, 0x20, 0x36, 0x34, 0x7c, 0x29, 0xe9, 0xb0,
+ 0x71, 0x3e, 0xe2, 0x08, 0x69, 0xde, 0x14, 0x8b,
+ 0xca, 0x01, 0x32, 0x67, 0x64, 0x43, 0x85, 0x07,
+ 0xf4, 0xdf, 0x04, 0xdb, 0x88, 0x38, 0xb0, 0xbc,
+ 0x32, 0x44, 0x14, 0x4f, 0x10, 0xa8, 0x34, 0x89,
+ 0x10, 0x38, 0x28, 0x7c, 0xe2, 0x0a, 0x0e, 0x17,
+ 0x04, 0xae, 0xfd, 0x78, 0x5d, 0x12, 0xdc, 0xde,
+ 0x73, 0x9c, 0x17, 0x85, 0x2f, 0x79, 0xc5, 0xbb,
+ 0x2c, 0x21, 0x6b, 0x92, 0x14, 0x92, 0x9f, 0x9e,
+ 0x0c, 0xd6, 0x20, 0x99, 0x28, 0xae, 0x27, 0x22,
+ 0x6d, 0xd9, 0xc4, 0x41, 0x99, 0xfd, 0x71, 0x42,
+ 0x25, 0x8a, 0x41, 0xd2, 0x1c, 0x60, 0xe3, 0xfa,
+ 0x14, 0x70, 0xa4, 0x8a, 0xaf, 0xa5, 0xd1, 0x90,
+ 0x26, 0x42, 0x2e, 0x53, 0x42, 0xe8, 0x0e, 0x0a,
+ 0x37, 0x27, 0x69, 0x29, 0x21, 0x41, 0x3c, 0xf6,
+ 0xf2, 0x21, 0xe5, 0x07, 0x48, 0x7a, 0x49, 0xd0,
+ 0x5c, 0xe9, 0xc9, 0x25, 0x0c, 0xa7, 0x02, 0xa9,
+ 0x9d, 0x17, 0x8c, 0x85, 0xdd, 0x05, 0xf6, 0x83,
+ 0x31, 0x8f, 0x41, 0xc2, 0xa8, 0x46, 0x0e, 0xa0,
+ 0xe0, 0x5f, 0x3c, 0x19, 0xd1, 0x4e, 0x9e, 0x40,
+ 0x89, 0x60, 0x5e, 0xcf, 0x60, 0x38, 0x07, 0xd4,
+ 0x20, 0xba, 0x7c, 0x28, 0xe8, 0x38, 0x62, 0xe9,
+ 0x25, 0xe1, 0xa1, 0x90, 0x38, 0x9a, 0xac, 0x45,
+ 0xaf, 0xa5, 0x8b, 0x21, 0xea, 0x23, 0x60, 0xe7,
+ 0x68, 0x8c, 0xa3, 0x81, 0x4c, 0xc3, 0x74, 0xd7,
+ 0x03, 0x22, 0x3e, 0xb8, 0xb8, 0x26, 0x64, 0x24,
+ 0xa4, 0xa7, 0xb4, 0xe6, 0x14, 0x12, 0x05, 0x52,
+ 0x0f, 0x45, 0x00, 0x19, 0xfc, 0x0e, 0x0a, 0x34,
+ 0x19, 0x03, 0x81, 0x7f, 0x8d, 0x34, 0xf7, 0x02,
+ 0x39, 0x8b, 0x8b, 0x90, 0x04, 0x52, 0x14, 0xb8,
+ 0xb8, 0x2c, 0x42, 0x58, 0x0b, 0x98, 0x9e, 0x51,
+ 0xc0, 0xc5, 0x68, 0x11, 0xe8, 0x03, 0x81, 0xc0,
+ 0xbf, 0x66, 0x81, 0xd5, 0xd2, 0xb9, 0x41, 0x27,
+ 0x02, 0x63, 0x11, 0xa3, 0x3f, 0x57, 0x9e, 0x73,
+ 0xbc, 0xb1, 0x09, 0x4f, 0x08, 0x37, 0x30, 0x94,
+ 0xe6, 0x93, 0x8b, 0xa3, 0x36, 0x6e, 0x00, 0xe1,
+ 0xae, 0xa8, 0x91, 0x83, 0x8d, 0x12, 0x85, 0x4a,
+ 0x8a, 0x1b, 0x27, 0xd3, 0xd3, 0x88, 0xc3, 0x07,
+ 0xcc, 0x80, 0xe0, 0x5c, 0xcc, 0xea, 0xc1, 0x90,
+ 0x2c, 0x5d, 0x3c, 0xa0, 0xe0, 0x9e, 0xad, 0x62,
+ 0x37, 0xc5, 0xe2, 0xa1, 0x40, 0x84, 0x2b, 0x82,
+ 0xb0, 0x5d, 0x3e, 0x73, 0xbd, 0x07, 0x0b, 0xc2,
+ 0x77, 0x16, 0x25, 0x17, 0x70, 0xd8, 0x38, 0x69,
+ 0x08, 0xb4, 0xcb, 0x0e, 0x05, 0x14, 0x38, 0x27,
+ 0x48, 0xaa, 0xa1, 0x85, 0x10, 0x07, 0xa3, 0x3d,
+ 0x54, 0x66, 0x18, 0x03, 0x8f, 0x1b, 0x3a, 0x4a,
+ 0x27, 0xd7, 0xbb, 0x01, 0xd0, 0xfe, 0xea, 0xf3,
+ 0xa6, 0xf8, 0x43, 0x86, 0x10, 0x1c, 0x76, 0x86,
+ 0x34, 0x62, 0x4a, 0x0b, 0xc4, 0xb9, 0xd3, 0x4e,
+ 0xd7, 0xf9, 0xa0, 0xb1, 0x24, 0x14, 0x50, 0xcf,
+ 0x86, 0x81, 0x3d, 0xe5, 0x42, 0xb7, 0x68, 0x2e,
+ 0xf4, 0x92, 0x14, 0x44, 0x63, 0x2e, 0x1d, 0x7e,
+ 0xaf, 0x42, 0x6d, 0x7f, 0x64, 0x29, 0x0a, 0xb5,
+ 0xec, 0x40, 0x0e, 0x04, 0xef, 0xbd, 0xe7, 0x56,
+ 0x40, 0x0b, 0x0a, 0x79, 0x8c, 0x7b, 0xc0, 0xa7,
+ 0x3d, 0xaf, 0x94, 0xde, 0x21, 0x45, 0xc0, 0xc0,
+ 0x17, 0x33, 0x31, 0x0a, 0xcb, 0x92, 0x03, 0x8f,
+ 0xb5, 0xd0, 0xf7, 0x9d, 0x3b, 0x56, 0x61, 0x21,
+ 0x25, 0x19, 0x82, 0xee, 0xf3, 0x92, 0xa3, 0x76,
+ 0xbd, 0xe7, 0xf6, 0x76, 0xf6, 0xe4, 0xc0, 0x29,
+ 0x81, 0xb5, 0xd0, 0x70, 0xad, 0xff, 0x3c, 0xba,
+ 0xd3, 0x6d, 0x96, 0xf5, 0x10, 0x2f, 0xe3, 0xb3,
+ 0x05, 0xc4, 0x53, 0xdb, 0x61, 0x20, 0x3a, 0x9f,
+ 0x9d, 0x35, 0xca, 0x4f, 0xa6, 0xe2, 0x90, 0x72,
+ 0xdd, 0x09, 0x21, 0x70, 0x7e, 0xe8, 0x00, 0xf2,
+ 0xe0, 0x3d, 0x60, 0x1d, 0x42, 0x5d, 0x20, 0x6d,
+ 0x82, 0xb6, 0xea, 0xe8, 0x04, 0xda, 0xfa, 0x48,
+ 0x8b, 0xb0, 0x96, 0xa0, 0x07, 0x2c, 0x4f, 0xed,
+ 0xbc, 0x5b, 0xa0, 0xe9, 0x05, 0x0f, 0x3a, 0x4a,
+ 0x82, 0x0a, 0xfe, 0x62, 0x13, 0xb1, 0x79, 0xde,
+ 0x8b, 0x88, 0x34, 0xe5, 0x1a, 0x01, 0x70, 0x57,
+ 0x2b, 0x82, 0xc3, 0x91, 0x72, 0x1a, 0xad, 0x62,
+ 0x0e, 0x83, 0x89, 0x57, 0x81, 0x27, 0x50, 0x2f,
+ 0x07, 0x3f, 0x07, 0x23, 0x3f, 0x17, 0xfc, 0xc4,
+ 0x1d, 0xda, 0x18, 0x11, 0x3b, 0x6f, 0x50, 0x62,
+ 0xc2, 0xf4, 0x40, 0x9d, 0xbc, 0x52, 0x88, 0x5c,
+ 0x2b, 0x77, 0x28, 0x6e, 0xb9, 0x20, 0x2e, 0xad,
+ 0x42, 0x68, 0x9f, 0x5e, 0x64, 0xbd, 0x36, 0x53,
+ 0x0a, 0x4a, 0x46, 0x8d, 0x64, 0x2b, 0x22, 0x3b,
+ 0xa6, 0xf5, 0x06, 0x76, 0x12, 0x89, 0xba, 0xc3,
+ 0x24, 0x23, 0x10, 0xc0, 0x87, 0x92, 0xf0, 0xe6,
+ 0xbe, 0x2b, 0x88, 0x6d, 0x34, 0x18, 0x1f, 0x95,
+ 0x89, 0x01, 0x7b, 0xed, 0x07, 0x20, 0x0c, 0x44,
+ 0xdb, 0x69, 0xae, 0x12, 0x20, 0x20, 0x8b, 0x40,
+ 0x9e, 0x2c, 0x4f, 0x10, 0x9b, 0x5c, 0x24, 0x79,
+ 0x78, 0x85, 0x12, 0x31, 0x98, 0x56, 0xf6, 0xde,
+ 0xa2, 0xb4, 0x66, 0x43, 0x54, 0xa9, 0x76, 0xbc,
+ 0xf0, 0x1c, 0x45, 0xba, 0x1a, 0x21, 0x28, 0x07,
+ 0x3f, 0x81, 0x1e, 0x83, 0x06, 0x5d, 0x0c, 0x89,
+ 0xa7, 0x94, 0x93, 0x80, 0xbd, 0xe9, 0xa0, 0xc3,
+ 0xa0, 0x3c, 0xee, 0x9c, 0xf2, 0x12, 0x03, 0x85,
+ 0x4f, 0x80, 0xea, 0x7a, 0xa2, 0xc8, 0x10, 0xae,
+ 0x8c, 0x82, 0x46, 0x28, 0xc1, 0xc2, 0xf0, 0x77,
+ 0x48, 0x69, 0xae, 0x48, 0x2b, 0xab, 0xe4, 0x0b,
+ 0x5e, 0xa3, 0x91, 0x61, 0x5e, 0x5c, 0xda, 0x34,
+ 0x44, 0xbd, 0xa4, 0x0d, 0x7e, 0x50, 0x73, 0xba,
+ 0xf4, 0x1f, 0xbf, 0xff, 0xff, 0x6a, 0x20, 0xa6,
+ 0x27, 0xf9, 0xc0, 0x7a, 0x0f, 0xff, 0xcf, 0xf5,
+ 0xd1, 0xae, 0x15, 0x65, 0x28, 0x90, 0x84, 0xd3,
+ 0x0a, 0x2f, 0x06, 0x00, 0xe2, 0x3f, 0x83, 0x4d,
+ 0x3f, 0x10, 0xac, 0x52, 0x0e, 0x3b, 0x81, 0xd1,
+ 0x7e, 0x06, 0x01, 0x14, 0x82, 0x3a, 0x04, 0x02,
+ 0xe4, 0x76, 0x1e, 0xe0, 0xe0, 0x5d, 0x52, 0x95,
+ 0xdd, 0xa7, 0xb8, 0x0b, 0x14, 0x00, 0xe0, 0xc8,
+ 0xeb, 0x58, 0xd8, 0xc4, 0x30, 0x21, 0xe0, 0xf4,
+ 0x30, 0x01, 0x84, 0xf4, 0x31, 0x18, 0x02, 0x7a,
+ 0x94, 0x2c, 0x15, 0xc4, 0xda, 0xc4, 0x78, 0x62,
+ 0x32, 0x8b, 0x42, 0x45, 0x81, 0xc5, 0x24, 0x71,
+ 0x01, 0x74, 0xe0, 0xc8, 0x90, 0x1c, 0x6c, 0x94,
+ 0x4d, 0x48, 0xb4, 0xf4, 0x37, 0x0d, 0x03, 0x89,
+ 0x0f, 0x38, 0x67, 0x60, 0x3f, 0xbc, 0x00, 0x6c,
+ 0x5e, 0x0e, 0x41, 0x4d, 0x85, 0x76, 0x02, 0xef,
+ 0x5e, 0x41, 0xcb, 0xd0, 0x70, 0x64, 0x85, 0x62,
+ 0x79, 0xd1, 0x80, 0xb8, 0x1c, 0x27, 0x70, 0x1f,
+ 0xdf, 0xff, 0xf7, 0x20, 0xa3, 0x25, 0x22, 0xd3,
+ 0x8b, 0x9e, 0x02, 0x1e, 0x5c, 0x1c, 0x11, 0xae,
+ 0xa3, 0x3a, 0xb7, 0xb2, 0x8b, 0xab, 0xe0, 0xb1,
+ 0x12, 0xf0, 0x1c, 0x2e, 0x0a, 0x12, 0xbc, 0x95,
+ 0x0f, 0x6a, 0x09, 0x2f, 0x45, 0xeb, 0x40, 0x1c,
+ 0x43, 0xcd, 0x59, 0x0b, 0xe2, 0x6a, 0x5f, 0x43,
+ 0x4a, 0x09, 0x54, 0xd3, 0x62, 0x9f, 0x65, 0x88,
+ 0x94, 0x8c, 0xaa, 0xc2, 0xfa, 0xfe, 0x55, 0x2c,
+ 0xe7, 0x82, 0xad, 0x6d, 0x41, 0xcc, 0x19, 0x22,
+ 0xe0, 0xa7, 0x31, 0x53, 0x91, 0x03, 0xf5, 0x17,
+ 0xfe, 0x2e, 0x29, 0x26, 0x4c, 0xb1, 0xb9, 0x2f,
+ 0x5b, 0x80, 0x8c, 0xb8, 0x61, 0x41, 0x77, 0x41,
+ 0xef, 0x11, 0xd4, 0x06, 0x86, 0x24, 0x5e, 0x44,
+ 0x2b, 0x8c, 0xd1, 0x14, 0x93, 0x32, 0xfc, 0x5b,
+ 0x51, 0x0a, 0xb4, 0xe5, 0x64, 0x3c, 0xb4, 0xd8,
+ 0x39, 0x18, 0x51, 0x48, 0x41, 0xcb, 0x70, 0x9f,
+ 0x70, 0x32, 0x40, 0x15, 0x4a, 0x88, 0x0e, 0x46,
+ 0x19, 0x84, 0x70, 0xd2, 0xe7, 0xf5, 0xe7, 0x81,
+ 0xaa, 0xe7, 0xdf, 0xe8, 0x69, 0x25, 0x36, 0x48,
+ 0x0e, 0x42, 0x14, 0x4d, 0xa6, 0xf2, 0x92, 0xac,
+ 0x49, 0xd2, 0x66, 0x85, 0x01, 0x28, 0xb8, 0x13,
+ 0x19, 0x6b, 0x78, 0x2e, 0x7e, 0xbf, 0xf8, 0x13,
+ 0xee, 0x50, 0x71, 0xcf, 0x20, 0x7f, 0x20, 0x30,
+ 0x2c, 0x34, 0x13, 0x5b, 0xb2, 0x31, 0x8a, 0xe2,
+ 0xf7, 0x34, 0x83, 0x31, 0xa6, 0xbe, 0x99, 0x56,
+ 0x1b, 0x6b, 0xb4, 0xa8, 0xf9, 0xca, 0x31, 0x1a,
+ 0x39, 0x50, 0x2c, 0x0e, 0x90, 0x1c, 0x73, 0xdc,
+ 0x9d, 0x5d, 0x6e, 0x22, 0xa6, 0x90, 0x9e, 0x5a,
+ 0xb2, 0x0e, 0x13, 0x45, 0xe7, 0xb3, 0xa0, 0xc4,
+ 0xcf, 0xbd, 0x43, 0x4d, 0x83, 0x06, 0x50, 0xe5,
+ 0x81, 0x6e, 0x00, 0xee, 0x00, 0xe8, 0xe9, 0xb8,
+ 0x52, 0x41, 0xec, 0x1b, 0x51, 0x75, 0x80, 0x99,
+ 0x57, 0xd1, 0x75, 0xd0, 0x94, 0x12, 0x0b, 0x89,
+ 0xfc, 0x17, 0x44, 0x25, 0x20, 0xb9, 0x53, 0x79,
+ 0x67, 0x3b, 0xf5, 0x22, 0x26, 0x69, 0x25, 0x42,
+ 0xe5, 0x71, 0x9c, 0xa1, 0xd0, 0x31, 0x5f, 0x6c,
+ 0x9b, 0x56, 0x35, 0x41, 0x71, 0x0b, 0x64, 0xe0,
+ 0x8a, 0x2b, 0xd3, 0xd7, 0x41, 0x63, 0x00, 0x79,
+ 0xdd, 0xd9, 0x2a, 0xe8, 0x51, 0x10, 0x40, 0x22,
+ 0x7d, 0x0b, 0x3b, 0xe2, 0x45, 0xe8, 0xbf, 0x54,
+ 0xf4, 0x60, 0xb0, 0xa5, 0x29, 0xe5, 0x11, 0x0d,
+ 0x29, 0xab, 0xde, 0xa2, 0x45, 0x20, 0x2f, 0xea,
+ 0xc8, 0xfa, 0x2e, 0x7e, 0x9c, 0x95, 0x12, 0x84,
+ 0xae, 0x23, 0x07, 0x09, 0x93, 0x24, 0x09, 0x38,
+ 0x3b, 0x86, 0x81, 0x35, 0x84, 0xda, 0xfb, 0x92,
+ 0x2f, 0x10, 0x83, 0x82, 0x2e, 0xba, 0x10, 0xc8,
+ 0xa4, 0x22, 0xdd, 0x07, 0x0d, 0x1f, 0x0d, 0xd9,
+ 0xd0, 0x4d, 0xd7, 0x21, 0xd7, 0x98, 0x03, 0x81,
+ 0x60, 0x7d, 0xd5, 0xe7, 0x21, 0x42, 0xe7, 0xe6,
+ 0xa0, 0xab, 0x83, 0x82, 0x7d, 0xc8, 0x32, 0xe5,
+ 0x07, 0x3e, 0x14, 0x9d, 0xd3, 0xf3, 0xa4, 0xa3,
+ 0x10, 0xca, 0x83, 0x8e, 0xa6, 0xb1, 0x4a, 0xc4,
+ 0xed, 0x74, 0x7d, 0x07, 0x02, 0xeb, 0xc3, 0x17,
+ 0x9c, 0xa8, 0xc2, 0x4a, 0x9f, 0x5c, 0x5c, 0x69,
+ 0x01, 0x36, 0x9d, 0xa4, 0xa0, 0xf3, 0xff, 0xff,
+ 0xa0, 0x39, 0x32, 0x52, 0x45, 0x91, 0x2f, 0xc0,
+ 0x9f, 0x06, 0x60, 0xe2, 0x5a, 0x77, 0x0a, 0x3f,
+ 0x89, 0x24, 0x28, 0x5c, 0x22, 0xac, 0xc5, 0xf8,
+ 0xb7, 0x6c, 0x40, 0x33, 0x7d, 0x58, 0x89, 0x72,
+ 0x69, 0xea, 0xc0, 0xe1, 0x91, 0x1f, 0x57, 0xd9,
+ 0x99, 0x27, 0x17, 0x47, 0x7a, 0x88, 0x26, 0xdb,
+ 0xa6, 0xe5, 0xe4, 0x01, 0xe2, 0xa9, 0x0c, 0x05,
+ 0x3b, 0x90, 0xda, 0x3e, 0x2c, 0x2b, 0x7e, 0x77,
+ 0xa4, 0x7a, 0x73, 0xc8, 0x1c, 0x59, 0x0a, 0x41,
+ 0x3f, 0x16, 0x61, 0x47, 0x01, 0xc4, 0xb3, 0x80,
+ 0xba, 0xd3, 0x4d, 0x86, 0x21, 0x80, 0x52, 0xfa,
+ 0x48, 0x8d, 0x10, 0xc4, 0x17, 0xd2, 0xf5, 0x14,
+ 0x0a, 0xe2, 0x7d, 0x46, 0x54, 0x4b, 0x0c, 0x0d,
+ 0x05, 0x58, 0xb0, 0x95, 0x4f, 0x50, 0x83, 0x91,
+ 0x05, 0x39, 0x10, 0x39, 0x10, 0x38, 0x8f, 0x1b,
+ 0xbc, 0x85, 0x01, 0x88, 0xd3, 0xb4, 0x13, 0xb5,
+ 0xe5, 0x74, 0x4b, 0x03, 0x91, 0x10, 0x31, 0x8c,
+ 0x0a, 0x25, 0x72, 0x5b, 0x06, 0x70, 0x9e, 0x51,
+ 0x53, 0x55, 0x19, 0x28, 0x38, 0xa0, 0x8f, 0x83,
+ 0x64, 0x21, 0x5e, 0xbb, 0x19, 0xcd, 0x18, 0x06,
+ 0x20, 0xe3, 0xf3, 0x16, 0xe8, 0x38, 0x22, 0xd0,
+ 0x12, 0x62, 0xac, 0x6c, 0x1d, 0x11, 0x9d, 0xbd,
+ 0x28, 0x84, 0xfa, 0xfa, 0x95, 0x77, 0xa0, 0x3a,
+ 0x86, 0x48, 0xa9, 0xa0, 0x8e, 0x2c, 0x50, 0x8f,
+ 0xbc, 0x01, 0xc0, 0xb0, 0x05, 0xcc, 0xd5, 0x90,
+ 0x41, 0x70, 0x4e, 0x9a, 0xeb, 0x22, 0x07, 0x14,
+ 0x82, 0xeb, 0xe0, 0x9f, 0x4e, 0x2c, 0x07, 0xea,
+ 0x80, 0x0d, 0x12, 0xc2, 0x81, 0x98, 0x38, 0x56,
+ 0x99, 0x60, 0x38, 0x27, 0xa5, 0x00, 0xf3, 0xff,
+ 0xff, 0x91, 0x99, 0x54, 0x8c, 0x4d, 0x9f, 0xab,
+ 0xdd, 0x51, 0x57, 0x5c, 0x90, 0x60, 0xb1, 0xef,
+ 0xca, 0x2b, 0xc0, 0xe2, 0x2a, 0x58, 0x94, 0xf1,
+ 0x4a, 0x22, 0xc8, 0x5d, 0xdf, 0x50, 0x49, 0x46,
+ 0x68, 0xc6, 0x51, 0xd1, 0x7b, 0x03, 0x00, 0x4d,
+ 0xa5, 0x14, 0x1d, 0x51, 0x05, 0x4f, 0x8b, 0x76,
+ 0x86, 0x6b, 0x03, 0x81, 0x3b, 0xd3, 0xb5, 0x1a,
+ 0xa7, 0xb6, 0xce, 0x20, 0x9c, 0x5e, 0x2c, 0x6c,
+ 0x86, 0x79, 0xc3, 0x64, 0x9d, 0x3f, 0xb8, 0x6c,
+ 0x1c, 0x42, 0xd6, 0x5a, 0x76, 0x0a, 0x2a, 0x32,
+ 0x3d, 0x77, 0x79, 0xc4, 0x16, 0x12, 0xd0, 0xa7,
+ 0x41, 0x80, 0xaf, 0x76, 0x20, 0xec, 0x07, 0x05,
+ 0x1f, 0x11, 0x85, 0x1c, 0xa8, 0x02, 0x8d, 0x7c,
+ 0x0e, 0x21, 0x75, 0x4f, 0x60, 0x3a, 0xa2, 0x27,
+ 0x9d, 0x06, 0x0c, 0x8d, 0x0a, 0xd9, 0x22, 0xf5,
+ 0x4d, 0x07, 0x50, 0x4c, 0xed, 0xe2, 0x30, 0xcc,
+ 0x07, 0xbb, 0x4f, 0x0c, 0xd1, 0x14, 0x83, 0x83,
+ 0x3e, 0x0d, 0x67, 0x94, 0x62, 0x0e, 0x17, 0xf5,
+ 0x00, 0xd1, 0xf0, 0x1c, 0xfd, 0x62, 0x04, 0x24,
+ 0x18, 0x51, 0x53, 0xfc, 0x28, 0x07, 0x0d, 0x77,
+ 0x03, 0x31, 0x5e, 0x51, 0xc8, 0x0e, 0x0a, 0xda,
+ 0xd5, 0x0f, 0x16, 0x58, 0x1d, 0xc0, 0x71, 0xc6,
+ 0x8b, 0x22, 0xc4, 0x66, 0xc2, 0x3d, 0x77, 0x6c,
+ 0xd2, 0x47, 0x65, 0x15, 0x0f, 0x41, 0xc3, 0x31,
+ 0x3f, 0xec, 0x36, 0x0b, 0xc7, 0x3b, 0x57, 0x44,
+ 0x52, 0x6e, 0x8a, 0xa7, 0x37, 0x95, 0x6a, 0x09,
+ 0x95, 0x37, 0xc4, 0x3c, 0x81, 0x98, 0x3a, 0x04,
+ 0x9f, 0x8b, 0x1a, 0x19, 0x83, 0x83, 0x11, 0x35,
+ 0x03, 0x90, 0x50, 0x72, 0x12, 0x39, 0xb0, 0xdf,
+ 0x41, 0xc4, 0x71, 0x4a, 0x12, 0x6d, 0x3e, 0x58,
+ 0xb8, 0xc9, 0x08, 0x2c, 0x20, 0x38, 0xf7, 0x58,
+ 0xd7, 0x41, 0xc1, 0x3d, 0x70, 0x33, 0x05, 0xd4,
+ 0xa8, 0x58, 0x1c, 0x18, 0xc8, 0x14, 0x77, 0xa2,
+ 0xa8, 0xbf, 0xcb, 0x51, 0x83, 0x8e, 0xc5, 0x29,
+ 0x5c, 0x17, 0x9e, 0xa0, 0x25, 0x44, 0x28, 0x9a,
+ 0x2f, 0xa8, 0x43, 0x0a, 0x7a, 0xd8, 0x8f, 0xb6,
+ 0x82, 0x66, 0x9f, 0x5e, 0x0c, 0x0d, 0x03, 0x97,
+ 0x42, 0x8c, 0xf4, 0xf0, 0xda, 0x21, 0x3e, 0x47,
+ 0xc3, 0x64, 0xcc, 0x66, 0x0e, 0x1a, 0x51, 0x5d,
+ 0x5d, 0x3b, 0x8a, 0x0a, 0x0a, 0x62, 0x3e, 0x72,
+ 0x3d, 0xdf, 0x83, 0x90, 0xa0, 0x05, 0xf7, 0xde,
+ 0x45, 0xb8, 0x33, 0xe2, 0xc0, 0xb0, 0x19, 0x91,
+ 0x3c, 0xef, 0x43, 0x75, 0xa2, 0x33, 0x6b, 0xf0,
+ 0x33, 0x7e, 0x56, 0x28, 0xd3, 0xab, 0xd4, 0x52,
+ 0x90, 0xfe, 0x21, 0x40, 0x52, 0xe8, 0x9e, 0xe7,
+ 0x22, 0x00, 0xd5, 0x4d, 0x06, 0x09, 0xe7, 0x90,
+ 0x16, 0x3c, 0xe1, 0x42, 0x10, 0xc0, 0x69, 0x10,
+ 0x71, 0xd1, 0x3d, 0x27, 0x79, 0x08, 0xda, 0x81,
+ 0x9a, 0x30, 0x72, 0x30, 0x4d, 0x72, 0x2e, 0x83,
+ 0x9c, 0x07, 0x06, 0x42, 0xbd, 0xcb, 0xd2, 0x2e,
+ 0x74, 0x51, 0xa7, 0xd4, 0x53, 0x70, 0x63, 0xc0,
+ 0x70, 0x49, 0xb9, 0x06, 0x66, 0xd0, 0x02, 0xc4,
+ 0x17, 0x9b, 0x84, 0x88, 0xc3, 0x30, 0x70, 0x55,
+ 0xb8, 0x0e, 0x5c, 0x1c, 0x32, 0x09, 0x90, 0xe5,
+ 0x5e, 0x6d, 0x01, 0xc4, 0x7d, 0x0a, 0xfd, 0x46,
+ 0x48, 0x48, 0xb3, 0xb7, 0x06, 0x4b, 0x8c, 0x10,
+ 0x03, 0x9f, 0xba, 0x2e, 0x46, 0x19, 0xbe, 0xf5,
+ 0x1a, 0xc7, 0xb4, 0xe0, 0x65, 0x02, 0x7c, 0x30,
+ 0x0c, 0x4d, 0x8a, 0x5f, 0x0d, 0x45, 0xca, 0x28,
+ 0x4b, 0x2b, 0x03, 0xa0, 0x30, 0x2c, 0x42, 0x5c,
+ 0xe6, 0x9e, 0x28, 0x82, 0xe0, 0x5c, 0xbe, 0xa3,
+ 0x96, 0x06, 0x61, 0x2c, 0x40, 0x1d, 0xd2, 0x17,
+ 0xc5, 0xc1, 0xc3, 0x5e, 0xce, 0x1a, 0xe0, 0xaf,
+ 0x4f, 0x0c, 0xba, 0x19, 0x06, 0x40, 0x3c, 0x6b,
+ 0xe7, 0x57, 0x58, 0xd4, 0x07, 0x1b, 0x14, 0x27,
+ 0xce, 0x92, 0xc2, 0x94, 0x60, 0xbe, 0x60, 0xe0,
+ 0x9f, 0x44, 0x85, 0xfa, 0xf8, 0xd8, 0x64, 0xa3,
+ 0x80, 0x39, 0x10, 0x55, 0xed, 0x18, 0x9b, 0x0b,
+ 0x32, 0x20, 0x58, 0x02, 0xe7, 0x1b, 0x21, 0xbd,
+ 0x9d, 0xe9, 0x50, 0x26, 0xe9, 0xba, 0x1f, 0xa2,
+ 0xee, 0x14, 0x2e, 0x03, 0xc8, 0xdd, 0x10, 0x4d,
+ 0x66, 0x8c, 0xe9, 0x48, 0x2e, 0x51, 0xe0, 0x26,
+ 0xa9, 0xc6, 0x43, 0x9c, 0x92, 0x20, 0x04, 0xd2,
+ 0xd7, 0x43, 0x27, 0x01, 0x7d, 0xa7, 0x65, 0x7c,
+ 0x0e, 0xb0, 0x11, 0xc2, 0x5b, 0xbf, 0x51, 0x57,
+ 0xc0, 0x46, 0xb1, 0x71, 0x97, 0x5d, 0x62, 0x06,
+ 0x68, 0xdf, 0xba, 0x6c, 0xad, 0x18, 0xc8, 0xe4,
+ 0x28, 0xcc, 0x1b, 0x7b, 0x85, 0x10, 0x31, 0x3f,
+ 0x41, 0xc8, 0x88, 0xb4, 0xde, 0x7f, 0x7e, 0x0c,
+ 0x05, 0x3e, 0xb9, 0xb5, 0x10, 0x6b, 0x2a, 0x1b,
+ 0xe7, 0x54, 0xe6, 0x12, 0x8d, 0xe8, 0x38, 0x62,
+ 0x7b, 0xd2, 0x45, 0xe8, 0x51, 0xf8, 0x8d, 0x71,
+ 0x78, 0x38, 0x62, 0x13, 0xb2, 0xfd, 0x09, 0x62,
+ 0x6c, 0x0d, 0x60, 0x32, 0x1f, 0xb7, 0xfa, 0x53,
+ 0xc8, 0x50, 0xb7, 0x06, 0x92, 0xa3, 0x32, 0xad,
+ 0x38, 0x0e, 0x28, 0x3d, 0x27, 0x9f, 0x20, 0x63,
+ 0xd7, 0xcb, 0xd4, 0x72, 0xf0, 0x90, 0x83, 0x5f,
+ 0x5d, 0x18, 0x92, 0xa3, 0x0d, 0xd7, 0x3d, 0xaa,
+ 0x91, 0x95, 0xe9, 0x48, 0xd1, 0xf4, 0x1f, 0xc2,
+ 0x00, 0x3f, 0x6c, 0x44, 0xba, 0x00, 0x70, 0x72,
+ 0x7e, 0x70, 0x57, 0x53, 0x64, 0x92, 0x0c, 0xcd,
+ 0x92, 0x02, 0xeb, 0xae, 0x50, 0x2a, 0xca, 0x0a,
+ 0x45, 0xc0, 0x3c, 0x1c, 0xee, 0x18, 0x03, 0x90,
+ 0x84, 0x54, 0x35, 0xe8, 0x49, 0xa7, 0x35, 0x12,
+ 0x00, 0x1c, 0x2e, 0x07, 0x3b, 0x49, 0x01, 0xdd,
+ 0x19, 0x83, 0x90, 0x89, 0xa7, 0x85, 0x05, 0x01,
+ 0x1b, 0x17, 0x14, 0x03, 0xb8, 0x0b, 0xe6, 0xc2,
+ 0x9e, 0x94, 0x9c, 0xd3, 0xa0, 0x70, 0x66, 0x43,
+ 0x3c, 0x07, 0x05, 0x49, 0x74, 0xd5, 0xe0, 0xc0,
+ 0x07, 0xae, 0xea, 0x5f, 0xa6, 0xc1, 0xc3, 0x05,
+ 0x85, 0xc2, 0xb8, 0xa4, 0x90, 0x2b, 0x89, 0xb8,
+ 0x0e, 0x42, 0x12, 0x34, 0x46, 0x81, 0xc4, 0xa2,
+ 0x96, 0xb8, 0x64, 0x6e, 0x02, 0xe7, 0xa3, 0x40,
+ 0x32, 0x07, 0x40, 0x5c, 0x3d, 0xed, 0x5f, 0xa1,
+ 0x55, 0x4b, 0xf9, 0x60, 0x70, 0xa2, 0x11, 0xf4,
+ 0x32, 0x73, 0xe5, 0x29, 0x0c, 0x01, 0xc5, 0x03,
+ 0x5b, 0x57, 0x20, 0x89, 0xd8, 0x39, 0x00, 0x39,
+ 0x71, 0x80, 0xd1, 0x8c, 0x49, 0x3a, 0x09, 0xf0,
+ 0xa2, 0x23, 0x07, 0x02, 0xfa, 0x54, 0x78, 0x94,
+ 0x31, 0x13, 0xac, 0x2a, 0x15, 0xd5, 0xe1, 0x17,
+ 0x51, 0x03, 0xa5, 0x3b, 0xa1, 0x2a, 0x37, 0xed,
+ 0xd2, 0xa2, 0x52, 0x42, 0x8a, 0xb1, 0xa2, 0x83,
+ 0xb2, 0xa4, 0xa2, 0x4a, 0x50, 0x8f, 0xa1, 0x80,
+ 0x55, 0x29, 0xd8, 0x9e, 0x50, 0x87, 0xa7, 0x31,
+ 0x50, 0x3b, 0x92, 0x0c, 0x0f, 0xf1, 0x99, 0x48,
+ 0x38, 0x07, 0x22, 0x24, 0x3f, 0xc1, 0xcb, 0x83,
+ 0x81, 0x60, 0x35, 0xc1, 0x75, 0x13, 0xf1, 0x74,
+ 0x43, 0x12, 0x51, 0x98, 0x47, 0x84, 0x52, 0x81,
+ 0x82, 0xc0, 0xe1, 0xac, 0x74, 0x16, 0x04, 0xa1,
+ 0x81, 0xe6, 0x04, 0x83, 0x20, 0x89, 0xd6, 0x42,
+ 0x7f, 0x4d, 0xd1, 0x81, 0x48, 0xa1, 0x46, 0x3f,
+ 0x8c, 0xc5, 0x33, 0x9b, 0xe4, 0x1b, 0x9d, 0x5c,
+ 0x63, 0x90, 0x1c, 0x83, 0xae, 0xc8, 0x51, 0x06,
+ 0x50, 0x32, 0xa0, 0xbf, 0x2d, 0xc0, 0x71, 0x20,
+ 0x38, 0x5c, 0x4a, 0xef, 0xa7, 0xb4, 0xd0, 0xb8,
+ 0x4b, 0x45, 0xc2, 0xf0, 0x4e, 0x65, 0x21, 0x3f,
+ 0x34, 0x8c, 0x1c, 0x4a, 0x0e, 0xeb, 0xe4, 0xa0,
+ 0x1d, 0x46, 0x01, 0x5c, 0xe8, 0x9f, 0x5f, 0x14,
+ 0xa2, 0x37, 0x49, 0x44, 0xcf, 0x9c, 0x18, 0x92,
+ 0xa3, 0x07, 0x09, 0xe6, 0x1b, 0x09, 0x2b, 0x83,
+ 0x10, 0x4c, 0xe2, 0x35, 0x9d, 0x13, 0x92, 0x80,
+ 0x70, 0x66, 0x35, 0x6b, 0x77, 0x84, 0x6c, 0x64,
+ 0xb9, 0xa5, 0x96, 0x13, 0xee, 0x0c, 0x41, 0xc8,
+ 0xfa, 0x13, 0xb5, 0x9d, 0x25, 0x0a, 0x75, 0xde,
+ 0x50, 0x70, 0x2f, 0xa7, 0x56, 0x37, 0x61, 0xb2,
+ 0x42, 0x40, 0xae, 0x68, 0xcc, 0xa5, 0x07, 0x42,
+ 0x4d, 0x0d, 0xad, 0xca, 0x0b, 0xd5, 0xa3, 0x21,
+ 0x36, 0x9e, 0x8a, 0x22, 0xfd, 0x05, 0x88, 0x38,
+ 0x82, 0x4a, 0x28, 0xc1, 0x6e, 0x92, 0xad, 0x43,
+ 0x17, 0x4a, 0x34, 0x60, 0xfe, 0x10, 0x01, 0xe3,
+ 0x75, 0x6e, 0x03, 0x82, 0x4b, 0xdc, 0xa2, 0xbd,
+ 0x77, 0x28, 0x3b, 0xab, 0x77, 0x85, 0x21, 0x3c,
+ 0xc1, 0x9b, 0x9c, 0xb6, 0x76, 0xdb, 0x67, 0x78,
+ 0xb6, 0x5e, 0x21, 0x92, 0xde, 0x11, 0x4a, 0x20,
+ 0x74, 0x08, 0xa4, 0xa1, 0xb8, 0xd3, 0x5e, 0x68,
+ 0xd6, 0x57, 0x85, 0x01, 0x89, 0x0c, 0x5e, 0xa0,
+ 0x07, 0x1a, 0x07, 0x09, 0xf7, 0x11, 0x02, 0xeb,
+ 0x07, 0x1e, 0xd3, 0x46, 0xad, 0x11, 0x94, 0x74,
+ 0x1d, 0xd7, 0x29, 0xc3, 0x62, 0xf7, 0x24, 0x1f,
+ 0x7c, 0x18, 0x38, 0xf8, 0x30, 0xc2, 0x86, 0x12,
+ 0x03, 0x9f, 0xea, 0x66, 0xc1, 0x83, 0x86, 0xc6,
+ 0x5e, 0xa0, 0x39, 0xce, 0x51, 0x44, 0xda, 0xf8,
+ 0x5f, 0x01, 0xc3, 0x4f, 0x61, 0xb5, 0xe8, 0x62,
+ 0x8c, 0xa0, 0x17, 0x57, 0x75, 0x0f, 0x36, 0xf1,
+ 0x65, 0xc8, 0x1c, 0x02, 0x53, 0xab, 0xd0, 0x58,
+ 0xba, 0xf6, 0x44, 0x00, 0x9d, 0xaf, 0x48, 0x22,
+ 0x38, 0x85, 0x09, 0x48, 0x45, 0xe5, 0x28, 0x1a,
+ 0xfb, 0x20, 0x6f, 0x38, 0x32, 0x14, 0x54, 0xb4,
+ 0x63, 0xd0, 0x70, 0xd6, 0x82, 0xef, 0x5d, 0xd1,
+ 0x9f, 0x56, 0x3d, 0xc6, 0x1c, 0xe2, 0x11, 0x5b,
+ 0x46, 0x6a, 0xfd, 0x6e, 0x04, 0xad, 0x62, 0x8c,
+ 0x07, 0x00, 0xe2, 0x32, 0xf8, 0x1c, 0xf0, 0x51,
+ 0x57, 0xc0, 0xe0, 0x1c, 0x2a, 0xf1, 0x07, 0x09,
+ 0xb0, 0xbe, 0x03, 0xb8, 0x09, 0xfd, 0x62, 0x8b,
+ 0x45, 0xe1, 0x5d, 0x07, 0x2c, 0xb0, 0x4f, 0x17,
+ 0xf4, 0x95, 0x00, 0x26, 0xc9, 0x4a, 0x18, 0x13,
+ 0xe2, 0xb4, 0x6b, 0xd0, 0xb1, 0xd4, 0x11, 0x69,
+ 0x69, 0xc2, 0xc8, 0x75, 0xf2, 0xc0, 0xe4, 0x64,
+ 0x1d, 0x71, 0x80, 0xb8, 0x4c, 0xc6, 0x36, 0x3b,
+ 0x64, 0x90, 0x38, 0xb3, 0x56, 0x18, 0x65, 0x08,
+ 0x8c, 0x46, 0xb9, 0xfa, 0xbf, 0x0c, 0xaa, 0xc1,
+ 0x26, 0x90, 0x1e, 0x8f, 0xff, 0xf2, 0x36, 0xba,
+ 0x34, 0x56, 0x54, 0x2b, 0x03, 0x90, 0x9e, 0x9a,
+ 0x31, 0x44, 0x18, 0x11, 0xfb, 0xc8, 0x13, 0x6b,
+ 0xe9, 0x61, 0x24, 0xc4, 0x68, 0x85, 0x33, 0x25,
+ 0x29, 0xa1, 0x15, 0x5d, 0xa4, 0xb2, 0xda, 0x15,
+ 0x7e, 0x62, 0x35, 0x96, 0x20, 0xf3, 0xa4, 0x51,
+ 0x79, 0xb0, 0xa5, 0x1f, 0x20, 0xc7, 0x80, 0x9b,
+ 0xed, 0x24, 0xe2, 0x11, 0xab, 0xe8, 0xcb, 0xa1,
+ 0x54, 0xcc, 0x44, 0x8b, 0x66, 0x76, 0x3a, 0x62,
+ 0x20, 0x4f, 0xd7, 0xe2, 0x29, 0xbe, 0x92, 0x93,
+ 0xb5, 0x90, 0x03, 0xba, 0x27, 0x7d, 0xb0, 0x39,
+ 0x2b, 0xea, 0x31, 0x9f, 0x02, 0x7f, 0x78, 0x50,
+ 0x80, 0x30, 0x3f, 0x68, 0x38, 0x90, 0x5e, 0x73,
+ 0x5f, 0x4e, 0xc5, 0x83, 0x80, 0x58, 0x53, 0x64,
+ 0x0e, 0xf5, 0x75, 0xea, 0xfd, 0x28, 0x01, 0xc2,
+ 0x7d, 0x25, 0x24, 0x18, 0x21, 0x26, 0x63, 0x2e,
+ 0x14, 0x03, 0x89, 0xb0, 0x4b, 0xd7, 0xcb, 0x40,
+ 0x1c, 0x0e, 0x27, 0xf1, 0x0a, 0x25, 0x08, 0xf8,
+ 0x0b, 0x00, 0x96, 0x57, 0x24, 0xb4, 0x1c, 0xbb,
+ 0xf2, 0xc8, 0x90, 0x13, 0xdb, 0xc5, 0xf8, 0x0b,
+ 0x8d, 0x77, 0x68, 0xc5, 0x12, 0x15, 0xd6, 0x58,
+ 0x1c, 0x41, 0x0a, 0x24, 0x17, 0x74, 0x99, 0x86,
+ 0x6e, 0x7b, 0x56, 0x5b, 0x8a, 0x1e, 0xb3, 0xa8,
+ 0xcf, 0x6b, 0xb5, 0x34, 0x66, 0x18, 0x0c, 0x90,
+ 0x0c, 0x0f, 0x6e, 0x12, 0x2e, 0x50, 0x30, 0x15,
+ 0xb8, 0xa5, 0x61, 0xbd, 0xe7, 0x21, 0x0b, 0x51,
+ 0x94, 0xd4, 0xe7, 0x03, 0x00, 0x75, 0x0a, 0xfb,
+ 0xce, 0x9c, 0xab, 0xb2, 0x94, 0x48, 0x17, 0x0c,
+ 0x02, 0x67, 0xc1, 0x91, 0x45, 0xa6, 0xc1, 0x3e,
+ 0x49, 0x62, 0x34, 0x41, 0x33, 0xb4, 0x67, 0xd1,
+ 0x5c, 0x9d, 0xe2, 0xe7, 0x62, 0xee, 0x55, 0x08,
+ 0x81, 0xdc, 0x42, 0x0e, 0x21, 0x85, 0xe4, 0xef,
+ 0x00, 0x78, 0x39, 0x18, 0x55, 0x2b, 0x92, 0xde,
+ 0xf4, 0xd1, 0x48, 0x2e, 0x7c, 0x90, 0x91, 0x6e,
+ 0x83, 0x84, 0xee, 0x4b, 0x16, 0x14, 0x55, 0xf5,
+ 0x45, 0x10, 0x03, 0x9c, 0xe7, 0x0d, 0xf4, 0x90,
+ 0x64, 0x0b, 0x17, 0xcd, 0x84, 0x96, 0x4a, 0xbc,
+ 0x09, 0x37, 0x4a, 0x3a, 0x0f, 0x3d, 0x00, 0x19,
+ 0x34, 0x74, 0x5f, 0x59, 0x41, 0x18, 0x17, 0x33,
+ 0x95, 0x75, 0xe7, 0x14, 0x80, 0xee, 0x84, 0xcc,
+ 0xae, 0x12, 0x80, 0xf2, 0x0d, 0xa4, 0x9d, 0xc9,
+ 0x00, 0x79, 0x03, 0x3b, 0x5f, 0x5b, 0xc4, 0x3d,
+ 0x82, 0xf0, 0x71, 0xf9, 0xb3, 0x88, 0xfb, 0xd0,
+ 0x72, 0x09, 0xd1, 0xa4, 0xe2, 0xc8, 0x33, 0x7a,
+ 0x8d, 0x00, 0x39, 0x08, 0x2e, 0xb5, 0xc0, 0xd4,
+ 0xd7, 0x68, 0x38, 0x17, 0x5a, 0x33, 0xfa, 0xf3,
+ 0x38, 0x83, 0x8b, 0x12, 0x21, 0x39, 0x2b, 0x94,
+ 0xf5, 0x18, 0x38, 0x33, 0x21, 0x9b, 0x41, 0xf1,
+ 0xe0, 0x07, 0xd2, 0x52, 0x59, 0x11, 0x92, 0x92,
+ 0x2f, 0x41, 0xc4, 0x3d, 0x5e, 0x1e, 0xd3, 0x95,
+ 0xc0, 0x71, 0x0c, 0x7a, 0xc5, 0x38, 0x8c, 0x6e,
+ 0xed, 0x31, 0xb0, 0xe2, 0x82, 0x35, 0x09, 0x27,
+ 0x3d, 0xaa, 0x72, 0xdc, 0x43, 0x04, 0x47, 0xc5,
+ 0xa9, 0xb0, 0x9b, 0x7f
+};
diff --git a/contrib/apps/shell/shell.c b/contrib/apps/shell/shell.c
new file mode 100644
index 0000000..f4f668d
--- /dev/null
+++ b/contrib/apps/shell/shell.c
@@ -0,0 +1,1277 @@
+/*
+ * 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 "shell.h"
+
+#include "lwip/opt.h"
+
+#if LWIP_NETCONN && LWIP_TCP
+
+#include <string.h>
+#include <stdio.h>
+
+#include "lwip/mem.h"
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/api.h"
+#include "lwip/stats.h"
+
+#if LWIP_SOCKET
+#include "lwip/errno.h"
+#include "lwip/if_api.h"
+#endif
+
+#ifdef WIN32
+#define NEWLINE "\r\n"
+#else /* WIN32 */
+#define NEWLINE "\n"
+#endif /* WIN32 */
+
+/** Define this to 1 if you want to echo back all received characters
+ * (e.g. so they are displayed on a remote telnet)
+ */
+#ifndef SHELL_ECHO
+#define SHELL_ECHO 0
+#endif
+
+#define BUFSIZE 1024
+static unsigned char buffer[BUFSIZE];
+
+struct command {
+ struct netconn *conn;
+ s8_t (* exec)(struct command *);
+ u8_t nargs;
+ char *args[10];
+};
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#define ESUCCESS 0
+#define ESYNTAX -1
+#define ETOOFEW -2
+#define ETOOMANY -3
+#define ECLOSED -4
+
+#define NCONNS 10
+static struct netconn *conns[NCONNS];
+
+/* help_msg is split into 3 strings to prevent exceeding the C89 maximum length of 509 per string */
+static char help_msg1[] = "Available commands:"NEWLINE"\
+open [IP address] [TCP port]: opens a TCP connection to the specified address."NEWLINE"\
+lstn [TCP port]: sets up a server on the specified port."NEWLINE"\
+acpt [connection #]: waits for an incoming connection request."NEWLINE"\
+send [connection #] [message]: sends a message on a TCP connection."NEWLINE"\
+udpc [local UDP port] [IP address] [remote port]: opens a UDP \"connection\"."NEWLINE"\
+udpl [local UDP port] [IP address] [remote port]: opens a UDP-Lite \"connection\"."NEWLINE"";
+static char help_msg2[] = "udpn [local UDP port] [IP address] [remote port]: opens a UDP \"connection\" without checksums."NEWLINE"\
+udpb [local port] [remote port]: opens a UDP broadcast \"connection\"."NEWLINE"\
+usnd [connection #] [message]: sends a message on a UDP connection."NEWLINE"\
+recv [connection #]: receives data on a TCP or UDP connection."NEWLINE"\
+clos [connection #]: closes a TCP or UDP connection."NEWLINE"\
+stat: prints out lwIP statistics."NEWLINE"\
+idxtoname [index]: outputs interface name from index."NEWLINE"\
+nametoidx [name]: outputs interface index from name."NEWLINE;
+static char help_msg3[] =
+"gethostnm [name]: outputs IP address of host."NEWLINE"\
+quit: quits"NEWLINE"";
+
+#if LWIP_STATS
+static char padding_10spaces[] = " ";
+
+#define PROTOCOL_STATS (LINK_STATS && ETHARP_STATS && IPFRAG_STATS && IP_STATS && ICMP_STATS && UDP_STATS && TCP_STATS)
+
+#if PROTOCOL_STATS
+static const char* shell_stat_proto_names[] = {
+#if LINK_STATS
+ "LINK ",
+#endif
+#if ETHARP_STATS
+ "ETHARP ",
+#endif
+#if IPFRAG_STATS
+ "IP_FRAG ",
+#endif
+#if IP_STATS
+ "IP ",
+#endif
+#if ICMP_STATS
+ "ICMP ",
+#endif
+#if UDP_STATS
+ "UDP ",
+#endif
+#if TCP_STATS
+ "TCP ",
+#endif
+ "last"
+};
+
+static struct stats_proto* shell_stat_proto_stats[] = {
+#if LINK_STATS
+ &lwip_stats.link,
+#endif
+#if ETHARP_STATS
+ &lwip_stats.etharp,
+#endif
+#if IPFRAG_STATS
+ &lwip_stats.ip_frag,
+#endif
+#if IP_STATS
+ &lwip_stats.ip,
+#endif
+#if ICMP_STATS
+ &lwip_stats.icmp,
+#endif
+#if UDP_STATS
+ &lwip_stats.udp,
+#endif
+#if TCP_STATS
+ &lwip_stats.tcp,
+#endif
+};
+static const size_t num_protostats = sizeof(shell_stat_proto_stats)/sizeof(struct stats_proto*);
+
+static const char *stat_msgs_proto[] = {
+ " * transmitted ",
+ " * received ",
+ " forwarded ",
+ " * dropped ",
+ " * checksum errors ",
+ " * length errors ",
+ " * memory errors ",
+ " routing errors ",
+ " protocol errors ",
+ " option errors ",
+ " * misc errors ",
+ " cache hits "
+};
+#endif /* PROTOCOL_STATS */
+#endif /* LWIP_STATS */
+
+/*-----------------------------------------------------------------------------------*/
+static void
+sendstr(const char *str, struct netconn *conn)
+{
+ netconn_write(conn, (const void *)str, strlen(str), NETCONN_NOCOPY);
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_open(struct command *com)
+{
+ ip_addr_t ipaddr;
+ u16_t port;
+ int i;
+ err_t err;
+ long tmp;
+
+ if (ipaddr_aton(com->args[0], &ipaddr) == -1) {
+ sendstr(strerror(errno), com->conn);
+ return ESYNTAX;
+ }
+ tmp = strtol(com->args[1], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ port = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Opening connection to ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(":", com->conn);
+ netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_TCP);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ err = netconn_connect(conns[i], &ipaddr, port);
+ if (err != ERR_OK) {
+ fprintf(stderr, "error %s"NEWLINE, lwip_strerr(err));
+ sendstr("Could not connect to remote host: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ return ESUCCESS;
+ }
+
+ sendstr("Opened connection, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_lstn(struct command *com)
+{
+ u16_t port;
+ int i;
+ err_t err;
+ long tmp;
+
+ tmp = strtol(com->args[0], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ port = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Opening a listening connection on port ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_TCP);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_bind(conns[i], IP_ADDR_ANY, port);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not bind: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_listen(conns[i]);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not listen: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Opened connection, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_clos(struct command *com)
+{
+ int i;
+ err_t err;
+
+ i = strtol(com->args[0], NULL, 10);
+
+ if (i > NCONNS) {
+ sendstr("Connection identifier too high."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ if (conns[i] == NULL) {
+ sendstr("Connection identifier not in use."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_close(conns[i]);
+ if (err != ERR_OK) {
+ sendstr("Could not close connection: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Connection closed."NEWLINE, com->conn);
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_acpt(struct command *com)
+{
+ int i, j;
+ err_t err;
+
+ /* Find the first unused connection in conns. */
+ for(j = 0; j < NCONNS && conns[j] != NULL; j++);
+
+ if (j == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ i = strtol(com->args[0], NULL, 10);
+
+ if (i > NCONNS) {
+ sendstr("Connection identifier too high."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ if (conns[i] == NULL) {
+ sendstr("Connection identifier not in use."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_accept(conns[i], &conns[j]);
+
+ if (err != ERR_OK) {
+ sendstr("Could not accept connection: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Accepted connection, connection identifier for new connection is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, j);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_STATS
+static void
+com_stat_write_mem(struct netconn *conn, struct stats_mem *elem, int i)
+{
+ u16_t len;
+ char buf[100];
+ size_t slen;
+
+#ifdef LWIP_DEBUG
+ LWIP_UNUSED_ARG(i);
+ slen = strlen(elem->name);
+ netconn_write(conn, elem->name, slen, NETCONN_COPY);
+#else /* LWIP_DEBUG */
+ len = (u16_t)sprintf(buf, "%d", i);
+ slen = strlen(buf);
+ netconn_write(conn, buf, slen, NETCONN_COPY);
+#endif /* LWIP_DEBUG */
+ if(slen < 10) {
+ netconn_write(conn, padding_10spaces, 10-slen, NETCONN_COPY);
+ }
+
+ len = (u16_t)sprintf(buf, " * available %"MEM_SIZE_F NEWLINE, elem->avail);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * used %"MEM_SIZE_F NEWLINE, elem->used);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * high water mark %"MEM_SIZE_F NEWLINE, elem->max);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * errors %"STAT_COUNTER_F NEWLINE, elem->err);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * illegal %"STAT_COUNTER_F NEWLINE, elem->illegal);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+}
+static void
+com_stat_write_sys(struct netconn *conn, struct stats_syselem *elem, const char *name)
+{
+ u16_t len;
+ char buf[100];
+ size_t slen = strlen(name);
+
+ netconn_write(conn, name, slen, NETCONN_COPY);
+ if(slen < 10) {
+ netconn_write(conn, padding_10spaces, 10-slen, NETCONN_COPY);
+ }
+
+ len = (u16_t)sprintf(buf, " * used %"STAT_COUNTER_F NEWLINE, elem->used);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * high water mark %"STAT_COUNTER_F NEWLINE, elem->max);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+ len = (u16_t)sprintf(buf, " * errors %"STAT_COUNTER_F NEWLINE, elem->err);
+ netconn_write(conn, buf, len, NETCONN_COPY);
+}
+static s8_t
+com_stat(struct command *com)
+{
+#if PROTOCOL_STATS || MEMP_STATS
+ size_t i;
+#endif /* PROTOCOL_STATS || MEMP_STATS */
+#if PROTOCOL_STATS
+ size_t k;
+ char buf[100];
+ u16_t len;
+
+ /* protocol stats, @todo: add IGMP */
+ for(i = 0; i < num_protostats; i++) {
+ size_t s = sizeof(struct stats_proto)/sizeof(STAT_COUNTER);
+ STAT_COUNTER *c = &shell_stat_proto_stats[i]->xmit;
+ LWIP_ASSERT("stats not in sync", s == sizeof(stat_msgs_proto)/sizeof(char*));
+ netconn_write(com->conn, shell_stat_proto_names[i], strlen(shell_stat_proto_names[i]), NETCONN_COPY);
+ for(k = 0; k < s; k++) {
+ len = (u16_t)sprintf(buf, "%s%"STAT_COUNTER_F NEWLINE, stat_msgs_proto[k], c[k]);
+ netconn_write(com->conn, buf, len, NETCONN_COPY);
+ }
+ }
+#endif /* PROTOCOL_STATS */
+#if MEM_STATS
+ com_stat_write_mem(com->conn, &lwip_stats.mem, -1);
+#endif /* MEM_STATS */
+#if MEMP_STATS
+ for(i = 0; i < MEMP_MAX; i++) {
+ com_stat_write_mem(com->conn, lwip_stats.memp[i], -1);
+ }
+#endif /* MEMP_STATS */
+#if SYS_STATS
+ com_stat_write_sys(com->conn, &lwip_stats.sys.sem, "SEM ");
+ com_stat_write_sys(com->conn, &lwip_stats.sys.mutex, "MUTEX ");
+ com_stat_write_sys(com->conn, &lwip_stats.sys.mbox, "MBOX ");
+#endif /* SYS_STATS */
+
+ return ESUCCESS;
+}
+#endif
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_send(struct command *com)
+{
+ int i;
+ err_t err;
+ size_t len;
+
+ i = strtol(com->args[0], NULL, 10);
+
+ if (i > NCONNS) {
+ sendstr("Connection identifier too high."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ if (conns[i] == NULL) {
+ sendstr("Connection identifier not in use."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ len = strlen(com->args[1]);
+ com->args[1][len] = '\r';
+ com->args[1][len + 1] = '\n';
+ com->args[1][len + 2] = 0;
+
+ err = netconn_write(conns[i], com->args[1], len + 3, NETCONN_COPY);
+ if (err != ERR_OK) {
+ sendstr("Could not send data: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Data enqueued for sending."NEWLINE, com->conn);
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_recv(struct command *com)
+{
+ int i;
+ err_t err;
+ struct netbuf *buf;
+ u16_t len;
+
+ i = strtol(com->args[0], NULL, 10);
+
+ if (i > NCONNS) {
+ sendstr("Connection identifier too high."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ if (conns[i] == NULL) {
+ sendstr("Connection identifier not in use."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_recv(conns[i], &buf);
+ if (err == ERR_OK) {
+
+ netbuf_copy(buf, buffer, BUFSIZE);
+ len = netbuf_len(buf);
+ sendstr("Reading from connection:"NEWLINE, com->conn);
+ netconn_write(com->conn, buffer, len, NETCONN_COPY);
+ netbuf_delete(buf);
+ } else {
+ sendstr("EOF."NEWLINE, com->conn);
+ }
+ err = netconn_err(conns[i]);
+ if (err != ERR_OK) {
+ sendstr("Could not receive data: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_udpc(struct command *com)
+{
+ ip_addr_t ipaddr;
+ u16_t lport, rport;
+ int i;
+ err_t err;
+ long tmp;
+
+ tmp = strtol(com->args[0], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ lport = (u16_t)tmp;
+ if (ipaddr_aton(com->args[1], &ipaddr) == -1) {
+ sendstr(strerror(errno), com->conn);
+ return ESYNTAX;
+ }
+ tmp = strtol(com->args[2], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ rport = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Setting up UDP connection from port ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(" to ", com->conn);
+ netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
+ sendstr(":", com->conn);
+ netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_UDP);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_connect(conns[i], &ipaddr, rport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not connect to remote host: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_bind(conns[i], IP_ADDR_ANY, lport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not bind: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Connection set up, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_udpl(struct command *com)
+{
+ ip_addr_t ipaddr;
+ u16_t lport, rport;
+ int i;
+ err_t err;
+ long tmp;
+
+ tmp = strtol(com->args[0], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ lport = (u16_t)tmp;
+ if (ipaddr_aton(com->args[1], &ipaddr) == -1) {
+ sendstr(strerror(errno), com->conn);
+ return ESYNTAX;
+ }
+ tmp = strtol(com->args[2], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ rport = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Setting up UDP-Lite connection from port ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(" to ", com->conn);
+ netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
+ sendstr(":", com->conn);
+ netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_UDPLITE);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_connect(conns[i], &ipaddr, rport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not connect to remote host: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_bind(conns[i], IP_ADDR_ANY, lport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not bind: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Connection set up, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_udpn(struct command *com)
+{
+ ip_addr_t ipaddr;
+ u16_t lport, rport;
+ int i;
+ err_t err;
+ long tmp;
+
+ tmp = strtol(com->args[0], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ lport = (u16_t)tmp;
+ if (ipaddr_aton(com->args[1], &ipaddr) == -1) {
+ sendstr(strerror(errno), com->conn);
+ return ESYNTAX;
+ }
+ tmp = strtol(com->args[2], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ rport = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Setting up UDP connection without checksums from port ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(" to ", com->conn);
+ netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
+ sendstr(":", com->conn);
+ netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_UDPNOCHKSUM);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_connect(conns[i], &ipaddr, rport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not connect to remote host: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_bind(conns[i], IP_ADDR_ANY, lport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not bind: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Connection set up, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_udpb(struct command *com)
+{
+ ip_addr_t ipaddr;
+#if LWIP_IPV4
+ u16_t lport;
+#endif /* LWIP_IPV4 */
+ u16_t rport;
+ int i;
+ err_t err;
+ long tmp;
+
+ tmp = strtol(com->args[0], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+#if LWIP_IPV4
+ lport = (u16_t)tmp;
+#endif /* LWIP_IPV4 */
+ if (ipaddr_aton(com->args[1], &ipaddr) == -1) {
+ sendstr(strerror(errno), com->conn);
+ return ESYNTAX;
+ }
+ tmp = strtol(com->args[2], NULL, 10);
+ if((tmp < 0) || (tmp > 0xffff)) {
+ sendstr("Invalid port number."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ rport = (u16_t)tmp;
+
+ /* Find the first unused connection in conns. */
+ for(i = 0; i < NCONNS && conns[i] != NULL; i++);
+
+ if (i == NCONNS) {
+ sendstr("No more connections available, sorry."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Setting up UDP broadcast connection from port ", com->conn);
+ netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
+ sendstr(" to ", com->conn);
+ netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+
+ conns[i] = netconn_new(NETCONN_UDP);
+ if (conns[i] == NULL) {
+ sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ err = netconn_connect(conns[i], &ipaddr, rport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not connect to remote host: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+#if LWIP_IPV4
+ if (IP_IS_V6_VAL(ipaddr)) {
+ err = netconn_bind(conns[i], &ip_addr_broadcast, lport);
+ if (err != ERR_OK) {
+ netconn_delete(conns[i]);
+ conns[i] = NULL;
+ sendstr("Could not bind: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ }
+#endif /* LWIP_IPV4 */
+
+ sendstr("Connection set up, connection identifier is ", com->conn);
+ snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_usnd(struct command *com)
+{
+ long i;
+ err_t err;
+ struct netbuf *buf;
+ char *mem;
+ u16_t len;
+ size_t tmp;
+
+ i = strtol(com->args[0], NULL, 10);
+
+ if (i > NCONNS) {
+ sendstr("Connection identifier too high."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ if (conns[i] == NULL) {
+ sendstr("Connection identifier not in use."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ tmp = strlen(com->args[1]) + 1;
+ if (tmp > 0xffff) {
+ sendstr("Invalid length."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ len = (u16_t)tmp;
+
+ buf = netbuf_new();
+ mem = (char *)netbuf_alloc(buf, len);
+ if (mem == NULL) {
+ sendstr("Could not allocate memory for sending."NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+ strncpy(mem, com->args[1], len);
+ err = netconn_send(conns[i], buf);
+ netbuf_delete(buf);
+ if (err != ERR_OK) {
+ sendstr("Could not send data: ", com->conn);
+#ifdef LWIP_DEBUG
+ sendstr(lwip_strerr(err), com->conn);
+#else
+ sendstr("(debugging must be turned on for error message to appear)", com->conn);
+#endif /* LWIP_DEBUG */
+ sendstr(NEWLINE, com->conn);
+ return ESUCCESS;
+ }
+
+ sendstr("Data sent."NEWLINE, com->conn);
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_SOCKET
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_idxtoname(struct command *com)
+{
+ long i = strtol(com->args[0], NULL, 10);
+
+ if (lwip_if_indextoname((unsigned int)i, (char *)buffer)) {
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+ sendstr(NEWLINE, com->conn);
+ } else {
+ snprintf((char *)buffer, sizeof(buffer), "if_indextoname() failed: %d"NEWLINE, errno);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+ }
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_nametoidx(struct command *com)
+{
+ unsigned int idx = lwip_if_nametoindex(com->args[0]);
+
+ if (idx) {
+ snprintf((char *)buffer, sizeof(buffer), "%u"NEWLINE, idx);
+ netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
+ } else {
+ sendstr("No interface found"NEWLINE, com->conn);
+ }
+ return ESUCCESS;
+}
+#endif /* LWIP_SOCKET */
+/*-----------------------------------------------------------------------------------*/
+#if LWIP_DNS
+static s8_t
+com_gethostbyname(struct command *com)
+{
+ ip_addr_t addr;
+ err_t err = netconn_gethostbyname(com->args[0], &addr);
+
+ if (err == ERR_OK) {
+ if (ipaddr_ntoa_r(&addr, (char *)buffer, sizeof(buffer))) {
+ sendstr("Host found: ", com->conn);
+ sendstr((char *)buffer, com->conn);
+ sendstr(NEWLINE, com->conn);
+ } else {
+ sendstr("ipaddr_ntoa_r failed", com->conn);
+ }
+ } else {
+ sendstr("No host found"NEWLINE, com->conn);
+ }
+ return ESUCCESS;
+}
+#endif /* LWIP_DNS */
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+com_help(struct command *com)
+{
+ sendstr(help_msg1, com->conn);
+ sendstr(help_msg2, com->conn);
+ sendstr(help_msg3, com->conn);
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static s8_t
+parse_command(struct command *com, u32_t len)
+{
+ u16_t i;
+ u16_t bufp;
+
+ if (strncmp((const char *)buffer, "open", 4) == 0) {
+ com->exec = com_open;
+ com->nargs = 2;
+ } else if (strncmp((const char *)buffer, "lstn", 4) == 0) {
+ com->exec = com_lstn;
+ com->nargs = 1;
+ } else if (strncmp((const char *)buffer, "acpt", 4) == 0) {
+ com->exec = com_acpt;
+ com->nargs = 1;
+ } else if (strncmp((const char *)buffer, "clos", 4) == 0) {
+ com->exec = com_clos;
+ com->nargs = 1;
+#if LWIP_STATS
+ } else if (strncmp((const char *)buffer, "stat", 4) == 0) {
+ com->exec = com_stat;
+ com->nargs = 0;
+#endif
+ } else if (strncmp((const char *)buffer, "send", 4) == 0) {
+ com->exec = com_send;
+ com->nargs = 2;
+ } else if (strncmp((const char *)buffer, "recv", 4) == 0) {
+ com->exec = com_recv;
+ com->nargs = 1;
+ } else if (strncmp((const char *)buffer, "udpc", 4) == 0) {
+ com->exec = com_udpc;
+ com->nargs = 3;
+ } else if (strncmp((const char *)buffer, "udpb", 4) == 0) {
+ com->exec = com_udpb;
+ com->nargs = 2;
+ } else if (strncmp((const char *)buffer, "udpl", 4) == 0) {
+ com->exec = com_udpl;
+ com->nargs = 3;
+ } else if (strncmp((const char *)buffer, "udpn", 4) == 0) {
+ com->exec = com_udpn;
+ com->nargs = 3;
+ } else if (strncmp((const char *)buffer, "usnd", 4) == 0) {
+ com->exec = com_usnd;
+ com->nargs = 2;
+#if LWIP_SOCKET
+ } else if (strncmp((const char *)buffer, "idxtoname", 9) == 0) {
+ com->exec = com_idxtoname;
+ com->nargs = 1;
+ } else if (strncmp((const char *)buffer, "nametoidx", 9) == 0) {
+ com->exec = com_nametoidx;
+ com->nargs = 1;
+#endif /* LWIP_SOCKET */
+#if LWIP_DNS
+ } else if (strncmp((const char *)buffer, "gethostnm", 9) == 0) {
+ com->exec = com_gethostbyname;
+ com->nargs = 1;
+#endif /* LWIP_DNS */
+ } else if (strncmp((const char *)buffer, "help", 4) == 0) {
+ com->exec = com_help;
+ com->nargs = 0;
+ } else if (strncmp((const char *)buffer, "quit", 4) == 0) {
+ printf("quit"NEWLINE);
+ return ECLOSED;
+ } else {
+ return ESYNTAX;
+ }
+
+ if (com->nargs == 0) {
+ return ESUCCESS;
+ }
+ bufp = 0;
+ for(; bufp < len && buffer[bufp] != ' '; bufp++);
+ for(i = 0; i < 10; i++) {
+ for(; bufp < len && buffer[bufp] == ' '; bufp++);
+ if (buffer[bufp] == '\r' ||
+ buffer[bufp] == '\n') {
+ buffer[bufp] = 0;
+ if (i < com->nargs - 1) {
+ return ETOOFEW;
+ }
+ if (i > com->nargs - 1) {
+ return ETOOMANY;
+ }
+ break;
+ }
+ if (bufp > len) {
+ return ETOOFEW;
+ }
+ com->args[i] = (char *)&buffer[bufp];
+ for(; bufp < len && buffer[bufp] != ' ' && buffer[bufp] != '\r' &&
+ buffer[bufp] != '\n'; bufp++) {
+ if (buffer[bufp] == '\\') {
+ buffer[bufp] = ' ';
+ }
+ }
+ if (bufp > len) {
+ return ESYNTAX;
+ }
+ buffer[bufp] = 0;
+ bufp++;
+ if (i == com->nargs - 1) {
+ break;
+ }
+
+ }
+
+ return ESUCCESS;
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+shell_error(s8_t err, struct netconn *conn)
+{
+ switch (err) {
+ case ESYNTAX:
+ sendstr("## Syntax error"NEWLINE, conn);
+ break;
+ case ETOOFEW:
+ sendstr("## Too few arguments to command given"NEWLINE, conn);
+ break;
+ case ETOOMANY:
+ sendstr("## Too many arguments to command given"NEWLINE, conn);
+ break;
+ case ECLOSED:
+ sendstr("## Connection closed"NEWLINE, conn);
+ break;
+ default:
+ /* unknown error, don't assert here */
+ break;
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+prompt(struct netconn *conn)
+{
+ sendstr("> ", conn);
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+shell_main(struct netconn *conn)
+{
+ struct pbuf *p;
+ u16_t len = 0, cur_len;
+ struct command com;
+ s8_t err;
+ int i;
+ err_t ret;
+#if SHELL_ECHO
+ void *echomem;
+#endif /* SHELL_ECHO */
+
+ do {
+ ret = netconn_recv_tcp_pbuf(conn, &p);
+ if (ret == ERR_OK) {
+ pbuf_copy_partial(p, &buffer[len], (u16_t)(BUFSIZE - len), 0);
+ cur_len = p->tot_len;
+ len = (u16_t)(len + cur_len);
+ if ((len < cur_len) || (len > BUFSIZE)) {
+ len = BUFSIZE;
+ }
+#if SHELL_ECHO
+ echomem = mem_malloc(cur_len);
+ if (echomem != NULL) {
+ pbuf_copy_partial(p, echomem, cur_len, 0);
+ netconn_write(conn, echomem, cur_len, NETCONN_COPY);
+ mem_free(echomem);
+ }
+#endif /* SHELL_ECHO */
+ pbuf_free(p);
+ if (((len > 0) && ((buffer[len-1] == '\r') || (buffer[len-1] == '\n'))) ||
+ (len >= BUFSIZE)) {
+ if (buffer[0] != 0xff &&
+ buffer[1] != 0xfe) {
+ err = parse_command(&com, len);
+ if (err == ESUCCESS) {
+ com.conn = conn;
+ err = com.exec(&com);
+ }
+ if (err == ECLOSED) {
+ printf("Closed"NEWLINE);
+ shell_error(err, conn);
+ goto close;
+ }
+ if (err != ESUCCESS) {
+ shell_error(err, conn);
+ }
+ } else {
+ sendstr(NEWLINE NEWLINE
+ "lwIP simple interactive shell."NEWLINE
+ "(c) Copyright 2001, Swedish Institute of Computer Science."NEWLINE
+ "Written by Adam Dunkels."NEWLINE
+ "For help, try the \"help\" command."NEWLINE, conn);
+ }
+ if (ret == ERR_OK) {
+ prompt(conn);
+ }
+ len = 0;
+ }
+ }
+ } while (ret == ERR_OK);
+ printf("err %s"NEWLINE, lwip_strerr(ret));
+
+close:
+ netconn_close(conn);
+
+ for(i = 0; i < NCONNS; i++) {
+ if (conns[i] != NULL) {
+ netconn_delete(conns[i]);
+ }
+ conns[i] = NULL;
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+shell_thread(void *arg)
+{
+ struct netconn *conn, *newconn;
+ err_t err;
+ LWIP_UNUSED_ARG(arg);
+
+#if LWIP_IPV6
+ conn = netconn_new(NETCONN_TCP_IPV6);
+ LWIP_ERROR("shell: invalid conn", (conn != NULL), return;);
+ err = netconn_bind(conn, IP6_ADDR_ANY, 23);
+#else /* LWIP_IPV6 */
+ conn = netconn_new(NETCONN_TCP);
+ LWIP_ERROR("shell: invalid conn", (conn != NULL), return;);
+ err = netconn_bind(conn, IP_ADDR_ANY, 23);
+#endif /* LWIP_IPV6 */
+ LWIP_ERROR("shell: netconn_bind failed", (err == ERR_OK), netconn_delete(conn); return;);
+ err = netconn_listen(conn);
+ LWIP_ERROR("shell: netconn_listen failed", (err == ERR_OK), netconn_delete(conn); return;);
+
+ while (1) {
+ err = netconn_accept(conn, &newconn);
+ if (err == ERR_OK) {
+ shell_main(newconn);
+ netconn_delete(newconn);
+ }
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+shell_init(void)
+{
+ sys_thread_new("shell_thread", shell_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+}
+
+#endif /* LWIP_NETCONN && LWIP_TCP */
diff --git a/contrib/apps/shell/shell.h b/contrib/apps/shell/shell.h
new file mode 100644
index 0000000..1ba9d19
--- /dev/null
+++ b/contrib/apps/shell/shell.h
@@ -0,0 +1,37 @@
+/*
+ * 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_SHELL_H
+#define LWIP_SHELL_H
+
+void shell_init(void);
+
+#endif /* LWIP_SHELL_H */
diff --git a/contrib/apps/socket_examples/socket_examples.c b/contrib/apps/socket_examples/socket_examples.c
new file mode 100644
index 0000000..a60156f
--- /dev/null
+++ b/contrib/apps/socket_examples/socket_examples.c
@@ -0,0 +1,680 @@
+
+#include "socket_examples.h"
+
+#include "lwip/opt.h"
+
+#if LWIP_SOCKET && (LWIP_IPV4 || LWIP_IPV6)
+
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#ifndef SOCK_TARGET_HOST4
+#define SOCK_TARGET_HOST4 "192.168.0.1"
+#endif
+
+#ifndef SOCK_TARGET_HOST6
+#define SOCK_TARGET_HOST6 "FE80::12:34FF:FE56:78AB"
+#endif
+
+#ifndef SOCK_TARGET_PORT
+#define SOCK_TARGET_PORT 80
+#endif
+
+#ifndef SOCK_TARGET_MAXHTTPPAGESIZE
+#define SOCK_TARGET_MAXHTTPPAGESIZE 1024
+#endif
+
+#ifndef SOCKET_EXAMPLES_RUN_PARALLEL
+#define SOCKET_EXAMPLES_RUN_PARALLEL 0
+#endif
+
+static const u8_t cmpbuf[8] = {0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab};
+
+/* a helper struct to ensure memory before/after fd_set is not touched */
+typedef struct _xx
+{
+ u8_t buf1[8];
+ fd_set readset;
+ u8_t buf2[8];
+ fd_set writeset;
+ u8_t buf3[8];
+ fd_set errset;
+ u8_t buf4[8];
+} fdsets;
+
+#define INIT_FDSETS(sets) do { \
+ memset((sets)->buf1, 0xab, 8); \
+ memset((sets)->buf2, 0xab, 8); \
+ memset((sets)->buf3, 0xab, 8); \
+ memset((sets)->buf4, 0xab, 8); \
+}while(0)
+
+#define CHECK_FDSETS(sets) do { \
+ LWIP_ASSERT("buf1 fail", !memcmp((sets)->buf1, cmpbuf, 8)); \
+ LWIP_ASSERT("buf2 fail", !memcmp((sets)->buf2, cmpbuf, 8)); \
+ LWIP_ASSERT("buf3 fail", !memcmp((sets)->buf3, cmpbuf, 8)); \
+ LWIP_ASSERT("buf4 fail", !memcmp((sets)->buf4, cmpbuf, 8)); \
+}while(0)
+
+static ip_addr_t dstaddr;
+
+/** This is an example function that tests
+ blocking- and nonblocking connect. */
+static void
+sockex_nonblocking_connect(void *arg)
+{
+#if LWIP_SOCKET_SELECT
+ int s;
+ int ret;
+ int opt;
+#if LWIP_IPV6
+ struct sockaddr_in6 addr;
+#else /* LWIP_IPV6 */
+ struct sockaddr_in addr;
+#endif /* LWIP_IPV6 */
+ fdsets sets;
+ struct timeval tv;
+ u32_t ticks_a, ticks_b;
+ int err;
+ const ip_addr_t *ipaddr = (const ip_addr_t*)arg;
+ struct pollfd fds;
+ INIT_FDSETS(&sets);
+
+ /* set up address to connect to */
+ memset(&addr, 0, sizeof(addr));
+#if LWIP_IPV6
+ addr.sin6_len = sizeof(addr);
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet6_addr_from_ip6addr(&addr.sin6_addr, ip_2_ip6(ipaddr));
+#else /* LWIP_IPV6 */
+ addr.sin_len = sizeof(addr);
+ addr.sin_family = AF_INET;
+ addr.sin_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet_addr_from_ip4addr(&addr.sin_addr, ip_2_ip4(ipaddr));
+#endif /* LWIP_IPV6 */
+
+ /* first try blocking: */
+
+ /* create the socket */
+#if LWIP_IPV6
+ s = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s >= 0", s >= 0);
+
+ /* connect */
+ ret = lwip_connect(s, (struct sockaddr*)&addr, sizeof(addr));
+ /* should succeed */
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ /* write something */
+ ret = lwip_write(s, "test", 4);
+ LWIP_ASSERT("ret == 4", ret == 4);
+
+ /* close */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ /* now try nonblocking and close before being connected */
+
+ /* create the socket */
+#if LWIP_IPV6
+ s = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s >= 0", s >= 0);
+ /* nonblocking */
+ opt = lwip_fcntl(s, F_GETFL, 0);
+ LWIP_ASSERT("ret != -1", ret != -1);
+ opt |= O_NONBLOCK;
+ ret = lwip_fcntl(s, F_SETFL, opt);
+ LWIP_ASSERT("ret != -1", ret != -1);
+ /* connect */
+ ret = lwip_connect(s, (struct sockaddr*)&addr, sizeof(addr));
+ /* should have an error: "inprogress" */
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EINPROGRESS", err == EINPROGRESS);
+ /* close */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ /* try to close again, should fail with EBADF */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EBADF", err == EBADF);
+ printf("closing socket in nonblocking connect succeeded\n");
+
+ /* now try nonblocking, connect should succeed:
+ this test only works if it is fast enough, i.e. no breakpoints, please! */
+
+ /* create the socket */
+#if LWIP_IPV6
+ s = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s >= 0", s >= 0);
+
+ /* nonblocking */
+ opt = 1;
+ ret = lwip_ioctl(s, FIONBIO, &opt);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ /* connect */
+ ret = lwip_connect(s, (struct sockaddr*)&addr, sizeof(addr));
+ /* should have an error: "inprogress" */
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EINPROGRESS", err == EINPROGRESS);
+
+ /* write should fail, too */
+ ret = lwip_write(s, "test", 4);
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EINPROGRESS", err == EINPROGRESS);
+
+ CHECK_FDSETS(&sets);
+ FD_ZERO(&sets.readset);
+ CHECK_FDSETS(&sets);
+ FD_SET(s, &sets.readset);
+ CHECK_FDSETS(&sets);
+ FD_ZERO(&sets.writeset);
+ CHECK_FDSETS(&sets);
+ FD_SET(s, &sets.writeset);
+ CHECK_FDSETS(&sets);
+ FD_ZERO(&sets.errset);
+ CHECK_FDSETS(&sets);
+ FD_SET(s, &sets.errset);
+ CHECK_FDSETS(&sets);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ /* select without waiting should fail */
+ ret = lwip_select(s + 1, &sets.readset, &sets.writeset, &sets.errset, &tv);
+ CHECK_FDSETS(&sets);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ LWIP_ASSERT("!FD_ISSET(s, &writeset)", !FD_ISSET(s, &sets.writeset));
+ LWIP_ASSERT("!FD_ISSET(s, &readset)", !FD_ISSET(s, &sets.readset));
+ LWIP_ASSERT("!FD_ISSET(s, &errset)", !FD_ISSET(s, &sets.errset));
+
+ fds.fd = s;
+ fds.events = POLLIN|POLLOUT;
+ fds.revents = 0;
+ ret = lwip_poll(&fds, 1, 0);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ LWIP_ASSERT("fds.revents == 0", fds.revents == 0);
+
+ FD_ZERO(&sets.readset);
+ FD_SET(s, &sets.readset);
+ FD_ZERO(&sets.writeset);
+ FD_SET(s, &sets.writeset);
+ FD_ZERO(&sets.errset);
+ FD_SET(s, &sets.errset);
+ ticks_a = sys_now();
+ /* select with waiting should succeed */
+ ret = lwip_select(s + 1, &sets.readset, &sets.writeset, &sets.errset, NULL);
+ ticks_b = sys_now();
+ LWIP_ASSERT("ret == 1", ret == 1);
+ LWIP_ASSERT("FD_ISSET(s, &writeset)", FD_ISSET(s, &sets.writeset));
+ LWIP_ASSERT("!FD_ISSET(s, &readset)", !FD_ISSET(s, &sets.readset));
+ LWIP_ASSERT("!FD_ISSET(s, &errset)", !FD_ISSET(s, &sets.errset));
+
+ fds.fd = s;
+ fds.events = POLLIN|POLLOUT;
+ fds.revents = 0;
+ ret = lwip_poll(&fds, 1, 0);
+ LWIP_ASSERT("ret == 1", ret == 1);
+ LWIP_ASSERT("fds.revents & POLLOUT", fds.revents & POLLOUT);
+
+ /* now write should succeed */
+ ret = lwip_write(s, "test", 4);
+ LWIP_ASSERT("ret == 4", ret == 4);
+
+ /* close */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ printf("select() needed %d ticks to return writable\n", (int)(ticks_b - ticks_a));
+
+
+ /* now try nonblocking to invalid address:
+ this test only works if it is fast enough, i.e. no breakpoints, please! */
+
+ /* create the socket */
+#if LWIP_IPV6
+ s = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s >= 0", s >= 0);
+
+ /* nonblocking */
+ opt = 1;
+ ret = lwip_ioctl(s, FIONBIO, &opt);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+#if LWIP_IPV6
+ addr.sin6_addr.un.u8_addr[0]++; /* this should result in an invalid address */
+#else /* LWIP_IPV6 */
+ addr.sin_addr.s_addr++; /* this should result in an invalid address */
+#endif /* LWIP_IPV6 */
+
+ /* connect */
+ ret = lwip_connect(s, (struct sockaddr*)&addr, sizeof(addr));
+ /* should have an error: "inprogress" */
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EINPROGRESS", err == EINPROGRESS);
+
+ /* write should fail, too */
+ ret = lwip_write(s, "test", 4);
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EINPROGRESS", err == EINPROGRESS);
+ LWIP_UNUSED_ARG(err);
+
+ FD_ZERO(&sets.readset);
+ FD_SET(s, &sets.readset);
+ FD_ZERO(&sets.writeset);
+ FD_SET(s, &sets.writeset);
+ FD_ZERO(&sets.errset);
+ FD_SET(s, &sets.errset);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ /* select without waiting should fail */
+ ret = lwip_select(s + 1, &sets.readset, &sets.writeset, &sets.errset, &tv);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ FD_ZERO(&sets.readset);
+ FD_SET(s, &sets.readset);
+ FD_ZERO(&sets.writeset);
+ FD_SET(s, &sets.writeset);
+ FD_ZERO(&sets.errset);
+ FD_SET(s, &sets.errset);
+ ticks_a = sys_now();
+ /* select with waiting should eventually succeed and return errset! */
+ ret = lwip_select(s + 1, &sets.readset, &sets.writeset, &sets.errset, NULL);
+ ticks_b = sys_now();
+ LWIP_ASSERT("ret > 0", ret > 0);
+ LWIP_ASSERT("FD_ISSET(s, &errset)", FD_ISSET(s, &sets.errset));
+ /*LWIP_ASSERT("!FD_ISSET(s, &readset)", !FD_ISSET(s, &sets.readset));
+ LWIP_ASSERT("!FD_ISSET(s, &writeset)", !FD_ISSET(s, &sets.writeset));*/
+
+ /* close */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ LWIP_UNUSED_ARG(ret);
+
+ printf("select() needed %d ticks to return error\n", (int)(ticks_b - ticks_a));
+ printf("sockex_nonblocking_connect finished successfully\n");
+#else
+ LWIP_UNUSED_ARG(arg);
+#endif
+}
+
+/** This is an example function that tests
+ the recv function (timeout etc.). */
+static void
+sockex_testrecv(void *arg)
+{
+ int s;
+ int ret;
+ int err;
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+ int opt, opt2;
+#else
+ struct timeval opt, opt2;
+#endif
+ socklen_t opt2size;
+#if LWIP_IPV6
+ struct sockaddr_in6 addr;
+#else /* LWIP_IPV6 */
+ struct sockaddr_in addr;
+#endif /* LWIP_IPV6 */
+ size_t len;
+ char rxbuf[SOCK_TARGET_MAXHTTPPAGESIZE];
+#if LWIP_SOCKET_SELECT
+ fd_set readset;
+ fd_set errset;
+ struct timeval tv;
+#endif
+ const ip_addr_t *ipaddr = (const ip_addr_t*)arg;
+
+ /* set up address to connect to */
+ memset(&addr, 0, sizeof(addr));
+#if LWIP_IPV6
+ addr.sin6_len = sizeof(addr);
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet6_addr_from_ip6addr(&addr.sin6_addr, ip_2_ip6(ipaddr));
+#else /* LWIP_IPV6 */
+ addr.sin_len = sizeof(addr);
+ addr.sin_family = AF_INET;
+ addr.sin_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet_addr_from_ip4addr(&addr.sin_addr, ip_2_ip4(ipaddr));
+#endif /* LWIP_IPV6 */
+
+ /* first try blocking: */
+
+ /* create the socket */
+#if LWIP_IPV6
+ s = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s >= 0", s >= 0);
+
+ /* connect */
+ ret = lwip_connect(s, (struct sockaddr*)&addr, sizeof(addr));
+ /* should succeed */
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ /* set recv timeout (100 ms) */
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+ opt = 100;
+#else
+ opt.tv_sec = 0;
+ opt.tv_usec = 100 * 1000;
+#endif
+ ret = lwip_setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &opt, sizeof(opt));
+ LWIP_ASSERT("ret == 0", ret == 0);
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+ opt2 = 0;
+#else
+ opt2.tv_sec = 0;
+ opt2.tv_usec = 0;
+#endif
+ opt2size = sizeof(opt2);
+ ret = lwip_getsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &opt2, &opt2size);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ LWIP_ASSERT("opt2size == sizeof(opt2)", opt2size == sizeof(opt2));
+#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
+ LWIP_ASSERT("opt == opt2", opt == opt2);
+#else
+ LWIP_ASSERT("opt == opt2", opt.tv_sec == opt2.tv_sec);
+ LWIP_ASSERT("opt == opt2", opt.tv_usec == opt2.tv_usec);
+#endif
+
+ /* write the start of a GET request */
+#define SNDSTR1 "G"
+ len = strlen(SNDSTR1);
+ ret = lwip_write(s, SNDSTR1, len);
+ LWIP_ASSERT("ret == len", ret == (int)len);
+
+ /* should time out if the other side is a good HTTP server */
+ ret = lwip_read(s, rxbuf, 1);
+ LWIP_ASSERT("ret == -1", ret == -1);
+ err = errno;
+ LWIP_ASSERT("errno == EAGAIN", err == EAGAIN);
+ LWIP_UNUSED_ARG(err);
+
+ /* write the rest of a GET request */
+#define SNDSTR2 "ET / HTTP_1.1\r\n\r\n"
+ len = strlen(SNDSTR2);
+ ret = lwip_write(s, SNDSTR2, len);
+ LWIP_ASSERT("ret == len", ret == (int)len);
+
+ /* wait a while: should be enough for the server to send a response */
+ sys_msleep(1000);
+
+ /* should not time out but receive a response */
+ ret = lwip_read(s, rxbuf, SOCK_TARGET_MAXHTTPPAGESIZE);
+ LWIP_ASSERT("ret > 0", ret > 0);
+
+#if LWIP_SOCKET_SELECT
+ /* now select should directly return because the socket is readable */
+ FD_ZERO(&readset);
+ FD_ZERO(&errset);
+ FD_SET(s, &readset);
+ FD_SET(s, &errset);
+ tv.tv_sec = 10;
+ tv.tv_usec = 0;
+ ret = lwip_select(s + 1, &readset, NULL, &errset, &tv);
+ LWIP_ASSERT("ret == 1", ret == 1);
+ LWIP_ASSERT("!FD_ISSET(s, &errset)", !FD_ISSET(s, &errset));
+ LWIP_ASSERT("FD_ISSET(s, &readset)", FD_ISSET(s, &readset));
+#endif
+
+ /* should not time out but receive a response */
+ ret = lwip_read(s, rxbuf, SOCK_TARGET_MAXHTTPPAGESIZE);
+ /* might receive a second packet for HTTP/1.1 servers */
+ if (ret > 0) {
+ /* should return 0: closed */
+ ret = lwip_read(s, rxbuf, SOCK_TARGET_MAXHTTPPAGESIZE);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ }
+
+ /* close */
+ ret = lwip_close(s);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ LWIP_UNUSED_ARG(ret);
+
+ printf("sockex_testrecv finished successfully\n");
+}
+
+#if LWIP_SOCKET_SELECT
+/** helper struct for the 2 functions below (multithreaded: thread-argument) */
+struct sockex_select_helper {
+ int socket;
+ int wait_read;
+ int expect_read;
+ int wait_write;
+ int expect_write;
+ int wait_err;
+ int expect_err;
+ int wait_ms;
+ sys_sem_t sem;
+};
+
+/** helper thread to wait for socket events using select */
+static void
+sockex_select_waiter(void *arg)
+{
+ struct sockex_select_helper *helper = (struct sockex_select_helper *)arg;
+ int ret;
+ fd_set readset;
+ fd_set writeset;
+ fd_set errset;
+ struct timeval tv;
+
+ LWIP_ASSERT("helper != NULL", helper != NULL);
+
+ FD_ZERO(&readset);
+ FD_ZERO(&writeset);
+ FD_ZERO(&errset);
+ if (helper->wait_read) {
+ FD_SET(helper->socket, &readset);
+ }
+ if (helper->wait_write) {
+ FD_SET(helper->socket, &writeset);
+ }
+ if (helper->wait_err) {
+ FD_SET(helper->socket, &errset);
+ }
+
+ tv.tv_sec = helper->wait_ms / 1000;
+ tv.tv_usec = (helper->wait_ms % 1000) * 1000;
+
+ ret = lwip_select(helper->socket, &readset, &writeset, &errset, &tv);
+ if (helper->expect_read || helper->expect_write || helper->expect_err) {
+ LWIP_ASSERT("ret > 0", ret > 0);
+ } else {
+ LWIP_ASSERT("ret == 0", ret == 0);
+ }
+ LWIP_UNUSED_ARG(ret);
+ if (helper->expect_read) {
+ LWIP_ASSERT("FD_ISSET(helper->socket, &readset)", FD_ISSET(helper->socket, &readset));
+ } else {
+ LWIP_ASSERT("!FD_ISSET(helper->socket, &readset)", !FD_ISSET(helper->socket, &readset));
+ }
+ if (helper->expect_write) {
+ LWIP_ASSERT("FD_ISSET(helper->socket, &writeset)", FD_ISSET(helper->socket, &writeset));
+ } else {
+ LWIP_ASSERT("!FD_ISSET(helper->socket, &writeset)", !FD_ISSET(helper->socket, &writeset));
+ }
+ if (helper->expect_err) {
+ LWIP_ASSERT("FD_ISSET(helper->socket, &errset)", FD_ISSET(helper->socket, &errset));
+ } else {
+ LWIP_ASSERT("!FD_ISSET(helper->socket, &errset)", !FD_ISSET(helper->socket, &errset));
+ }
+ sys_sem_signal(&helper->sem);
+}
+
+/** This is an example function that tests
+ more than one thread being active in select. */
+static void
+sockex_testtwoselects(void *arg)
+{
+ int s1;
+ int s2;
+ int ret;
+#if LWIP_IPV6
+ struct sockaddr_in6 addr;
+#else /* LWIP_IPV6 */
+ struct sockaddr_in addr;
+#endif /* LWIP_IPV6 */
+ size_t len;
+ err_t lwiperr;
+ struct sockex_select_helper h1, h2, h3, h4;
+ const ip_addr_t *ipaddr = (const ip_addr_t*)arg;
+
+ /* set up address to connect to */
+ memset(&addr, 0, sizeof(addr));
+#if LWIP_IPV6
+ addr.sin6_len = sizeof(addr);
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet6_addr_from_ip6addr(&addr.sin6_addr, ip_2_ip6(ipaddr));
+#else /* LWIP_IPV6 */
+ addr.sin_len = sizeof(addr);
+ addr.sin_family = AF_INET;
+ addr.sin_port = PP_HTONS(SOCK_TARGET_PORT);
+ inet_addr_from_ip4addr(&addr.sin_addr, ip_2_ip4(ipaddr));
+#endif /* LWIP_IPV6 */
+
+ /* create the sockets */
+#if LWIP_IPV6
+ s1 = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+ s2 = lwip_socket(AF_INET6, SOCK_STREAM, 0);
+#else /* LWIP_IPV6 */
+ s1 = lwip_socket(AF_INET, SOCK_STREAM, 0);
+ s2 = lwip_socket(AF_INET, SOCK_STREAM, 0);
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("s1 >= 0", s1 >= 0);
+ LWIP_ASSERT("s2 >= 0", s2 >= 0);
+
+ /* connect, should succeed */
+ ret = lwip_connect(s1, (struct sockaddr*)&addr, sizeof(addr));
+ LWIP_ASSERT("ret == 0", ret == 0);
+ ret = lwip_connect(s2, (struct sockaddr*)&addr, sizeof(addr));
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ /* write the start of a GET request */
+#define SNDSTR1 "G"
+ len = strlen(SNDSTR1);
+ ret = lwip_write(s1, SNDSTR1, len);
+ LWIP_ASSERT("ret == len", ret == (int)len);
+ ret = lwip_write(s2, SNDSTR1, len);
+ LWIP_ASSERT("ret == len", ret == (int)len);
+ LWIP_UNUSED_ARG(ret);
+
+ h1.wait_read = 1;
+ h1.wait_write = 1;
+ h1.wait_err = 1;
+ h1.expect_read = 0;
+ h1.expect_write = 0;
+ h1.expect_err = 0;
+ lwiperr = sys_sem_new(&h1.sem, 0);
+ LWIP_ASSERT("lwiperr == ERR_OK", lwiperr == ERR_OK);
+ h1.socket = s1;
+ h1.wait_ms = 500;
+
+ h2 = h1;
+ lwiperr = sys_sem_new(&h2.sem, 0);
+ LWIP_ASSERT("lwiperr == ERR_OK", lwiperr == ERR_OK);
+ h2.socket = s2;
+ h2.wait_ms = 1000;
+
+ h3 = h1;
+ lwiperr = sys_sem_new(&h3.sem, 0);
+ LWIP_ASSERT("lwiperr == ERR_OK", lwiperr == ERR_OK);
+ h3.socket = s2;
+ h3.wait_ms = 1500;
+
+ h4 = h1;
+ lwiperr = sys_sem_new(&h4.sem, 0);
+ LWIP_ASSERT("lwiperr == ERR_OK", lwiperr == ERR_OK);
+ LWIP_UNUSED_ARG(lwiperr);
+ h4.socket = s2;
+ h4.wait_ms = 2000;
+
+ /* select: all sockets should time out if the other side is a good HTTP server */
+
+ sys_thread_new("sockex_select_waiter1", sockex_select_waiter, &h2, 0, 0);
+ sys_msleep(100);
+ sys_thread_new("sockex_select_waiter2", sockex_select_waiter, &h1, 0, 0);
+ sys_msleep(100);
+ sys_thread_new("sockex_select_waiter2", sockex_select_waiter, &h4, 0, 0);
+ sys_msleep(100);
+ sys_thread_new("sockex_select_waiter2", sockex_select_waiter, &h3, 0, 0);
+
+ sys_sem_wait(&h1.sem);
+ sys_sem_wait(&h2.sem);
+ sys_sem_wait(&h3.sem);
+ sys_sem_wait(&h4.sem);
+
+ /* close */
+ ret = lwip_close(s1);
+ LWIP_ASSERT("ret == 0", ret == 0);
+ ret = lwip_close(s2);
+ LWIP_ASSERT("ret == 0", ret == 0);
+
+ printf("sockex_testtwoselects finished successfully\n");
+}
+#else
+static void
+sockex_testtwoselects(void *arg)
+{
+ LWIP_UNUSED_ARG(arg);
+}
+#endif
+
+#if !SOCKET_EXAMPLES_RUN_PARALLEL
+static void
+socket_example_test(void* arg)
+{
+ sys_msleep(1000);
+ sockex_nonblocking_connect(arg);
+ sockex_testrecv(arg);
+ sockex_testtwoselects(arg);
+ printf("all tests done, thread ending\n");
+}
+#endif
+
+void socket_examples_init(void)
+{
+ int addr_ok;
+#if LWIP_IPV6
+ IP_SET_TYPE_VAL(dstaddr, IPADDR_TYPE_V6);
+ addr_ok = ip6addr_aton(SOCK_TARGET_HOST6, ip_2_ip6(&dstaddr));
+#else /* LWIP_IPV6 */
+ IP_SET_TYPE_VAL(dstaddr, IPADDR_TYPE_V4);
+ addr_ok = ip4addr_aton(SOCK_TARGET_HOST4, ip_2_ip4(&dstaddr));
+#endif /* LWIP_IPV6 */
+ LWIP_ASSERT("invalid address", addr_ok);
+#if SOCKET_EXAMPLES_RUN_PARALLEL
+ sys_thread_new("sockex_nonblocking_connect", sockex_nonblocking_connect, &dstaddr, 0, 0);
+ sys_thread_new("sockex_testrecv", sockex_testrecv, &dstaddr, 0, 0);
+ sys_thread_new("sockex_testtwoselects", sockex_testtwoselects, &dstaddr, 0, 0);
+#else
+ sys_thread_new("socket_example_test", socket_example_test, &dstaddr, 0, 0);
+#endif
+}
+
+#endif /* LWIP_SOCKET */
diff --git a/contrib/apps/socket_examples/socket_examples.h b/contrib/apps/socket_examples/socket_examples.h
new file mode 100644
index 0000000..354d03a
--- /dev/null
+++ b/contrib/apps/socket_examples/socket_examples.h
@@ -0,0 +1,6 @@
+#ifndef LWIP_SOCKET_EXAMPLES_H
+#define LWIP_SOCKET_EXAMPLES_H
+
+void socket_examples_init(void);
+
+#endif /* LWIP_SOCKET_EXAMPLES_H */
diff --git a/contrib/apps/tcpecho/tcpecho.c b/contrib/apps/tcpecho/tcpecho.c
new file mode 100644
index 0000000..8fe1359
--- /dev/null
+++ b/contrib/apps/tcpecho/tcpecho.c
@@ -0,0 +1,101 @@
+/*
+ * 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 "tcpecho.h"
+
+#include "lwip/opt.h"
+
+#if LWIP_NETCONN
+
+#include "lwip/sys.h"
+#include "lwip/api.h"
+/*-----------------------------------------------------------------------------------*/
+static void
+tcpecho_thread(void *arg)
+{
+ struct netconn *conn, *newconn;
+ err_t err;
+ LWIP_UNUSED_ARG(arg);
+
+ /* Create a new connection identifier. */
+ /* Bind connection to well known port number 7. */
+#if LWIP_IPV6
+ conn = netconn_new(NETCONN_TCP_IPV6);
+ netconn_bind(conn, IP6_ADDR_ANY, 7);
+#else /* LWIP_IPV6 */
+ conn = netconn_new(NETCONN_TCP);
+ netconn_bind(conn, IP_ADDR_ANY, 7);
+#endif /* LWIP_IPV6 */
+ LWIP_ERROR("tcpecho: invalid conn", (conn != NULL), return;);
+
+ /* Tell connection to go into listening mode. */
+ netconn_listen(conn);
+
+ while (1) {
+
+ /* Grab new connection. */
+ err = netconn_accept(conn, &newconn);
+ /*printf("accepted new connection %p\n", newconn);*/
+ /* Process the new connection. */
+ if (err == ERR_OK) {
+ struct netbuf *buf;
+ void *data;
+ u16_t len;
+
+ while ((err = netconn_recv(newconn, &buf)) == ERR_OK) {
+ /*printf("Recved\n");*/
+ do {
+ netbuf_data(buf, &data, &len);
+ err = netconn_write(newconn, data, len, NETCONN_COPY);
+#if 0
+ if (err != ERR_OK) {
+ printf("tcpecho: netconn_write: error \"%s\"\n", lwip_strerr(err));
+ }
+#endif
+ } while (netbuf_next(buf) >= 0);
+ netbuf_delete(buf);
+ }
+ /*printf("Got EOF, looping\n");*/
+ /* Close connection and discard connection identifier. */
+ netconn_close(newconn);
+ netconn_delete(newconn);
+ }
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+tcpecho_init(void)
+{
+ sys_thread_new("tcpecho_thread", tcpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+}
+/*-----------------------------------------------------------------------------------*/
+
+#endif /* LWIP_NETCONN */
diff --git a/contrib/apps/tcpecho/tcpecho.h b/contrib/apps/tcpecho/tcpecho.h
new file mode 100644
index 0000000..b27c50f
--- /dev/null
+++ b/contrib/apps/tcpecho/tcpecho.h
@@ -0,0 +1,38 @@
+/*
+ * 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_TCPECHO_H
+#define LWIP_TCPECHO_H
+
+void tcpecho_init(void);
+
+#endif /* LWIP_TCPECHO_H */
diff --git a/contrib/apps/tcpecho_raw/tcpecho_raw.c b/contrib/apps/tcpecho_raw/tcpecho_raw.c
new file mode 100644
index 0000000..5a71d84
--- /dev/null
+++ b/contrib/apps/tcpecho_raw/tcpecho_raw.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of and a contribution to the lwIP TCP/IP stack.
+ *
+ * Credits go to Adam Dunkels (and the current maintainers) of this software.
+ *
+ * Christiaan Simons rewrote this file to get a more stable echo example.
+ */
+
+/**
+ * @file
+ * TCP echo server example using raw API.
+ *
+ * Echos all bytes sent by connecting client,
+ * and passively closes when client is done.
+ *
+ */
+
+#include "lwip/opt.h"
+#include "lwip/debug.h"
+#include "lwip/stats.h"
+#include "lwip/tcp.h"
+#include "tcpecho_raw.h"
+
+#if LWIP_TCP && LWIP_CALLBACK_API
+
+static struct tcp_pcb *tcpecho_raw_pcb;
+
+enum tcpecho_raw_states
+{
+ ES_NONE = 0,
+ ES_ACCEPTED,
+ ES_RECEIVED,
+ ES_CLOSING
+};
+
+struct tcpecho_raw_state
+{
+ u8_t state;
+ u8_t retries;
+ struct tcp_pcb *pcb;
+ /* pbuf (chain) to recycle */
+ struct pbuf *p;
+};
+
+static void
+tcpecho_raw_free(struct tcpecho_raw_state *es)
+{
+ if (es != NULL) {
+ if (es->p) {
+ /* free the buffer chain if present */
+ pbuf_free(es->p);
+ }
+
+ mem_free(es);
+ }
+}
+
+static void
+tcpecho_raw_close(struct tcp_pcb *tpcb, struct tcpecho_raw_state *es)
+{
+ tcp_arg(tpcb, NULL);
+ tcp_sent(tpcb, NULL);
+ tcp_recv(tpcb, NULL);
+ tcp_err(tpcb, NULL);
+ tcp_poll(tpcb, NULL, 0);
+
+ tcpecho_raw_free(es);
+
+ tcp_close(tpcb);
+}
+
+static void
+tcpecho_raw_send(struct tcp_pcb *tpcb, struct tcpecho_raw_state *es)
+{
+ struct pbuf *ptr;
+ err_t wr_err = ERR_OK;
+
+ while ((wr_err == ERR_OK) &&
+ (es->p != NULL) &&
+ (es->p->len <= tcp_sndbuf(tpcb))) {
+ ptr = es->p;
+
+ /* enqueue data for transmission */
+ wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
+ if (wr_err == ERR_OK) {
+ u16_t plen;
+
+ plen = ptr->len;
+ /* continue with next pbuf in chain (if any) */
+ es->p = ptr->next;
+ if(es->p != NULL) {
+ /* new reference! */
+ pbuf_ref(es->p);
+ }
+ /* chop first pbuf from chain */
+ pbuf_free(ptr);
+ /* we can read more data now */
+ tcp_recved(tpcb, plen);
+ } else if(wr_err == ERR_MEM) {
+ /* we are low on memory, try later / harder, defer to poll */
+ es->p = ptr;
+ } else {
+ /* other problem ?? */
+ }
+ }
+}
+
+static void
+tcpecho_raw_error(void *arg, err_t err)
+{
+ struct tcpecho_raw_state *es;
+
+ LWIP_UNUSED_ARG(err);
+
+ es = (struct tcpecho_raw_state *)arg;
+
+ tcpecho_raw_free(es);
+}
+
+static err_t
+tcpecho_raw_poll(void *arg, struct tcp_pcb *tpcb)
+{
+ err_t ret_err;
+ struct tcpecho_raw_state *es;
+
+ es = (struct tcpecho_raw_state *)arg;
+ if (es != NULL) {
+ if (es->p != NULL) {
+ /* there is a remaining pbuf (chain) */
+ tcpecho_raw_send(tpcb, es);
+ } else {
+ /* no remaining pbuf (chain) */
+ if(es->state == ES_CLOSING) {
+ tcpecho_raw_close(tpcb, es);
+ }
+ }
+ ret_err = ERR_OK;
+ } else {
+ /* nothing to be done */
+ tcp_abort(tpcb);
+ ret_err = ERR_ABRT;
+ }
+ return ret_err;
+}
+
+static err_t
+tcpecho_raw_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
+{
+ struct tcpecho_raw_state *es;
+
+ LWIP_UNUSED_ARG(len);
+
+ es = (struct tcpecho_raw_state *)arg;
+ es->retries = 0;
+
+ if(es->p != NULL) {
+ /* still got pbufs to send */
+ tcp_sent(tpcb, tcpecho_raw_sent);
+ tcpecho_raw_send(tpcb, es);
+ } else {
+ /* no more pbufs to send */
+ if(es->state == ES_CLOSING) {
+ tcpecho_raw_close(tpcb, es);
+ }
+ }
+ return ERR_OK;
+}
+
+static err_t
+tcpecho_raw_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
+{
+ struct tcpecho_raw_state *es;
+ err_t ret_err;
+
+ LWIP_ASSERT("arg != NULL",arg != NULL);
+ es = (struct tcpecho_raw_state *)arg;
+ if (p == NULL) {
+ /* remote host closed connection */
+ es->state = ES_CLOSING;
+ if(es->p == NULL) {
+ /* we're done sending, close it */
+ tcpecho_raw_close(tpcb, es);
+ } else {
+ /* we're not done yet */
+ tcpecho_raw_send(tpcb, es);
+ }
+ ret_err = ERR_OK;
+ } else if(err != ERR_OK) {
+ /* cleanup, for unknown reason */
+ LWIP_ASSERT("no pbuf expected here", p == NULL);
+ ret_err = err;
+ }
+ else if(es->state == ES_ACCEPTED) {
+ /* first data chunk in p->payload */
+ es->state = ES_RECEIVED;
+ /* store reference to incoming pbuf (chain) */
+ es->p = p;
+ tcpecho_raw_send(tpcb, es);
+ ret_err = ERR_OK;
+ } else if (es->state == ES_RECEIVED) {
+ /* read some more data */
+ if(es->p == NULL) {
+ es->p = p;
+ tcpecho_raw_send(tpcb, es);
+ } else {
+ struct pbuf *ptr;
+
+ /* chain pbufs to the end of what we recv'ed previously */
+ ptr = es->p;
+ pbuf_cat(ptr,p);
+ }
+ ret_err = ERR_OK;
+ } else {
+ /* unknown es->state, trash data */
+ tcp_recved(tpcb, p->tot_len);
+ pbuf_free(p);
+ ret_err = ERR_OK;
+ }
+ return ret_err;
+}
+
+static err_t
+tcpecho_raw_accept(void *arg, struct tcp_pcb *newpcb, err_t err)
+{
+ err_t ret_err;
+ struct tcpecho_raw_state *es;
+
+ LWIP_UNUSED_ARG(arg);
+ if ((err != ERR_OK) || (newpcb == NULL)) {
+ return ERR_VAL;
+ }
+
+ /* Unless this pcb should have NORMAL priority, set its priority now.
+ When running out of pcbs, low priority pcbs can be aborted to create
+ new pcbs of higher priority. */
+ tcp_setprio(newpcb, TCP_PRIO_MIN);
+
+ es = (struct tcpecho_raw_state *)mem_malloc(sizeof(struct tcpecho_raw_state));
+ if (es != NULL) {
+ es->state = ES_ACCEPTED;
+ es->pcb = newpcb;
+ es->retries = 0;
+ es->p = NULL;
+ /* pass newly allocated es to our callbacks */
+ tcp_arg(newpcb, es);
+ tcp_recv(newpcb, tcpecho_raw_recv);
+ tcp_err(newpcb, tcpecho_raw_error);
+ tcp_poll(newpcb, tcpecho_raw_poll, 0);
+ tcp_sent(newpcb, tcpecho_raw_sent);
+ ret_err = ERR_OK;
+ } else {
+ ret_err = ERR_MEM;
+ }
+ return ret_err;
+}
+
+void
+tcpecho_raw_init(void)
+{
+ tcpecho_raw_pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);
+ if (tcpecho_raw_pcb != NULL) {
+ err_t err;
+
+ err = tcp_bind(tcpecho_raw_pcb, IP_ANY_TYPE, 7);
+ if (err == ERR_OK) {
+ tcpecho_raw_pcb = tcp_listen(tcpecho_raw_pcb);
+ tcp_accept(tcpecho_raw_pcb, tcpecho_raw_accept);
+ } else {
+ /* abort? output diagnostic? */
+ }
+ } else {
+ /* abort? output diagnostic? */
+ }
+}
+
+#endif /* LWIP_TCP && LWIP_CALLBACK_API */
diff --git a/contrib/apps/tcpecho_raw/tcpecho_raw.h b/contrib/apps/tcpecho_raw/tcpecho_raw.h
new file mode 100644
index 0000000..d1e3b33
--- /dev/null
+++ b/contrib/apps/tcpecho_raw/tcpecho_raw.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ */
+#ifndef LWIP_TCPECHO_RAW_H
+#define LWIP_TCPECHO_RAW_H
+
+void tcpecho_raw_init(void);
+
+#endif /* LWIP_TCPECHO_RAW_H */
diff --git a/contrib/apps/udpecho/udpecho.c b/contrib/apps/udpecho/udpecho.c
new file mode 100644
index 0000000..b68301e
--- /dev/null
+++ b/contrib/apps/udpecho/udpecho.c
@@ -0,0 +1,88 @@
+/*
+ * 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 "udpecho.h"
+
+#include "lwip/opt.h"
+
+#if LWIP_NETCONN
+
+#include "lwip/api.h"
+#include "lwip/sys.h"
+
+/*-----------------------------------------------------------------------------------*/
+static void
+udpecho_thread(void *arg)
+{
+ struct netconn *conn;
+ struct netbuf *buf;
+ char buffer[4096];
+ err_t err;
+ LWIP_UNUSED_ARG(arg);
+
+#if LWIP_IPV6
+ conn = netconn_new(NETCONN_UDP_IPV6);
+ LWIP_ERROR("udpecho: invalid conn", (conn != NULL), return;);
+ netconn_bind(conn, IP6_ADDR_ANY, 7);
+#else /* LWIP_IPV6 */
+ conn = netconn_new(NETCONN_UDP);
+ LWIP_ERROR("udpecho: invalid conn", (conn != NULL), return;);
+ netconn_bind(conn, IP_ADDR_ANY, 7);
+#endif /* LWIP_IPV6 */
+
+ while (1) {
+ err = netconn_recv(conn, &buf);
+ if (err == ERR_OK) {
+ /* no need netconn_connect here, since the netbuf contains the address */
+ if(netbuf_copy(buf, buffer, sizeof(buffer)) != buf->p->tot_len) {
+ LWIP_DEBUGF(LWIP_DBG_ON, ("netbuf_copy failed\n"));
+ } else {
+ buffer[buf->p->tot_len] = '\0';
+ err = netconn_send(conn, buf);
+ if(err != ERR_OK) {
+ LWIP_DEBUGF(LWIP_DBG_ON, ("netconn_send failed: %d\n", (int)err));
+ } else {
+ LWIP_DEBUGF(LWIP_DBG_ON, ("got %s\n", buffer));
+ }
+ }
+ netbuf_delete(buf);
+ }
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+void
+udpecho_init(void)
+{
+ sys_thread_new("udpecho_thread", udpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+}
+
+#endif /* LWIP_NETCONN */
diff --git a/contrib/apps/udpecho/udpecho.h b/contrib/apps/udpecho/udpecho.h
new file mode 100644
index 0000000..c438911
--- /dev/null
+++ b/contrib/apps/udpecho/udpecho.h
@@ -0,0 +1,37 @@
+/*
+ * 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_UDPECHO_H
+#define LWIP_UDPECHO_H
+
+void udpecho_init(void);
+
+#endif /* LWIP_UDPECHO_H */
diff --git a/contrib/apps/udpecho_raw/udpecho_raw.c b/contrib/apps/udpecho_raw/udpecho_raw.c
new file mode 100644
index 0000000..43c9f0b
--- /dev/null
+++ b/contrib/apps/udpecho_raw/udpecho_raw.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016 Stephan Linz <linz@li-pro.net>, Li-Pro.Net
+ * All rights reserved.
+ *
+ * Based on examples provided by
+ * Iwan Budi Kusnanto <ibk@labhijau.net> (https://gist.github.com/iwanbk/1399729)
+ * Juri Haberland <juri@sapienti-sat.org> (https://lists.gnu.org/archive/html/lwip-users/2007-06/msg00078.html)
+ *
+ * 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 and a contribution to the lwIP TCP/IP stack.
+ *
+ * Credits go to Adam Dunkels (and the current maintainers) of this software.
+ *
+ * Stephan Linz rewrote this file to get a basic echo example.
+ */
+
+/**
+ * @file
+ * UDP echo server example using raw API.
+ *
+ * Echos all bytes sent by connecting client,
+ * and passively closes when client is done.
+ *
+ */
+
+#include "lwip/opt.h"
+#include "lwip/debug.h"
+#include "lwip/stats.h"
+#include "lwip/udp.h"
+#include "udpecho_raw.h"
+
+#if LWIP_UDP
+
+static struct udp_pcb *udpecho_raw_pcb;
+
+static void
+udpecho_raw_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
+ const ip_addr_t *addr, u16_t port)
+{
+ LWIP_UNUSED_ARG(arg);
+ if (p != NULL) {
+ /* send received packet back to sender */
+ udp_sendto(upcb, p, addr, port);
+ /* free the pbuf */
+ pbuf_free(p);
+ }
+}
+
+void
+udpecho_raw_init(void)
+{
+ udpecho_raw_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);
+ if (udpecho_raw_pcb != NULL) {
+ err_t err;
+
+ err = udp_bind(udpecho_raw_pcb, IP_ANY_TYPE, 7);
+ if (err == ERR_OK) {
+ udp_recv(udpecho_raw_pcb, udpecho_raw_recv, NULL);
+ } else {
+ /* abort? output diagnostic? */
+ }
+ } else {
+ /* abort? output diagnostic? */
+ }
+}
+
+#endif /* LWIP_UDP */
diff --git a/contrib/apps/udpecho_raw/udpecho_raw.h b/contrib/apps/udpecho_raw/udpecho_raw.h
new file mode 100644
index 0000000..4a98b74
--- /dev/null
+++ b/contrib/apps/udpecho_raw/udpecho_raw.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016 Stephan Linz <linz@li-pro.net>, Li-Pro.Net
+ * All rights reserved.
+ *
+ * Based on examples provided by
+ * Iwan Budi Kusnanto <ibk@labhijau.net> (https://gist.github.com/iwanbk/1399729)
+ * Juri Haberland <juri@sapienti-sat.org> (https://lists.gnu.org/archive/html/lwip-users/2007-06/msg00078.html)
+ *
+ * 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.
+ *
+ */
+#ifndef LWIP_UDPECHO_RAW_H
+#define LWIP_UDPECHO_RAW_H
+
+void udpecho_raw_init(void);
+
+#endif /* LWIP_UDPECHO_RAW_H */
diff --git a/contrib/examples/ethernetif/ethernetif.c b/contrib/examples/ethernetif/ethernetif.c
new file mode 100644
index 0000000..79763e8
--- /dev/null
+++ b/contrib/examples/ethernetif/ethernetif.c
@@ -0,0 +1,337 @@
+/**
+ * @file
+ * Ethernet Interface Skeleton
+ *
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+
+/*
+ * This file is a skeleton for developing Ethernet network interface
+ * drivers for lwIP. Add code to the low_level functions and do a
+ * search-and-replace for the word "ethernetif" to replace it with
+ * something that better describes your network interface.
+ */
+
+#include "lwip/opt.h"
+
+#if 0 /* don't build, this is only a skeleton, see previous comment */
+
+#include "lwip/def.h"
+#include "lwip/mem.h"
+#include "lwip/pbuf.h"
+#include "lwip/stats.h"
+#include "lwip/snmp.h"
+#include "lwip/ethip6.h"
+#include "lwip/etharp.h"
+#include "netif/ppp/pppoe.h"
+
+/* Define those to better describe your network interface. */
+#define IFNAME0 'e'
+#define IFNAME1 'n'
+
+/**
+ * Helper struct to hold private data used to operate your ethernet interface.
+ * Keeping the ethernet address of the MAC in this struct is not necessary
+ * as it is already kept in the struct netif.
+ * But this is only an example, anyway...
+ */
+struct ethernetif {
+ struct eth_addr *ethaddr;
+ /* Add whatever per-interface state that is needed here. */
+};
+
+/* Forward declarations. */
+static void ethernetif_input(struct netif *netif);
+
+/**
+ * In this function, the hardware should be initialized.
+ * Called from ethernetif_init().
+ *
+ * @param netif the already initialized lwip network interface structure
+ * for this ethernetif
+ */
+static void
+low_level_init(struct netif *netif)
+{
+ struct ethernetif *ethernetif = netif->state;
+
+ /* set MAC hardware address length */
+ netif->hwaddr_len = ETHARP_HWADDR_LEN;
+
+ /* set MAC hardware address */
+ netif->hwaddr[0] = ;
+ ...
+ netif->hwaddr[5] = ;
+
+ /* maximum transfer unit */
+ netif->mtu = 1500;
+
+ /* device capabilities */
+ /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+
+#if LWIP_IPV6 && LWIP_IPV6_MLD
+ /*
+ * For hardware/netifs that implement MAC filtering.
+ * All-nodes link-local is handled by default, so we must let the hardware know
+ * to allow multicast packets in.
+ * Should set mld_mac_filter previously. */
+ if (netif->mld_mac_filter != NULL) {
+ ip6_addr_t ip6_allnodes_ll;
+ ip6_addr_set_allnodes_linklocal(&ip6_allnodes_ll);
+ netif->mld_mac_filter(netif, &ip6_allnodes_ll, NETIF_ADD_MAC_FILTER);
+ }
+#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
+
+ /* Do whatever else is needed to initialize interface. */
+}
+
+/**
+ * This function should do the actual transmission of the packet. The packet is
+ * contained in the pbuf that is passed to the function. This pbuf
+ * might be chained.
+ *
+ * @param netif the lwip network interface structure for this ethernetif
+ * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)
+ * @return ERR_OK if the packet could be sent
+ * an err_t value if the packet couldn't be sent
+ *
+ * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to
+ * strange results. You might consider waiting for space in the DMA queue
+ * to become available since the stack doesn't retry to send a packet
+ * dropped because of memory failure (except for the TCP timers).
+ */
+
+static err_t
+low_level_output(struct netif *netif, struct pbuf *p)
+{
+ struct ethernetif *ethernetif = netif->state;
+ struct pbuf *q;
+
+ initiate transfer();
+
+#if ETH_PAD_SIZE
+ pbuf_remove_header(p, ETH_PAD_SIZE); /* drop the padding word */
+#endif
+
+ 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);
+ }
+
+ signal that packet should be sent();
+
+ MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);
+ if (((u8_t *)p->payload)[0] & 1) {
+ /* broadcast or multicast packet*/
+ MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);
+ } else {
+ /* unicast packet */
+ MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);
+ }
+ /* increase ifoutdiscards or ifouterrors on error */
+
+#if ETH_PAD_SIZE
+ pbuf_add_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
+#endif
+
+ LINK_STATS_INC(link.xmit);
+
+ return ERR_OK;
+}
+
+/**
+ * Should allocate a pbuf and transfer the bytes of the incoming
+ * packet from the interface into the pbuf.
+ *
+ * @param netif the lwip network interface structure for this ethernetif
+ * @return a pbuf filled with the received packet (including MAC header)
+ * NULL on memory error
+ */
+static struct pbuf *
+low_level_input(struct netif *netif)
+{
+ struct ethernetif *ethernetif = netif->state;
+ struct pbuf *p, *q;
+ u16_t len;
+
+ /* Obtain the size of the packet and put it into the "len"
+ variable. */
+ len = ;
+
+#if ETH_PAD_SIZE
+ len += ETH_PAD_SIZE; /* allow room for Ethernet padding */
+#endif
+
+ /* We allocate a pbuf chain of pbufs from the pool. */
+ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
+
+ if (p != NULL) {
+
+#if ETH_PAD_SIZE
+ pbuf_remove_header(p, ETH_PAD_SIZE); /* drop the padding word */
+#endif
+
+ /* We iterate over the pbuf chain until we have read the entire
+ * packet into the pbuf. */
+ for (q = p; q != NULL; q = q->next) {
+ /* Read enough bytes to fill this pbuf in the chain. The
+ * available data in the pbuf is given by the q->len
+ * variable.
+ * This does not necessarily have to be a memcpy, you can also preallocate
+ * pbufs for a DMA-enabled MAC and after receiving truncate it to the
+ * actually received size. In this case, ensure the tot_len member of the
+ * pbuf is the sum of the chained pbuf len members.
+ */
+ read data into(q->payload, q->len);
+ }
+ acknowledge that packet has been read();
+
+ MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
+ if (((u8_t *)p->payload)[0] & 1) {
+ /* broadcast or multicast packet*/
+ MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);
+ } else {
+ /* unicast packet*/
+ MIB2_STATS_NETIF_INC(netif, ifinucastpkts);
+ }
+#if ETH_PAD_SIZE
+ pbuf_add_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
+#endif
+
+ LINK_STATS_INC(link.recv);
+ } else {
+ drop packet();
+ LINK_STATS_INC(link.memerr);
+ LINK_STATS_INC(link.drop);
+ MIB2_STATS_NETIF_INC(netif, ifindiscards);
+ }
+
+ return p;
+}
+
+/**
+ * This function should be 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. Then the type of the received packet is determined and
+ * the appropriate input function is called.
+ *
+ * @param netif the lwip network interface structure for this ethernetif
+ */
+static void
+ethernetif_input(struct netif *netif)
+{
+ struct ethernetif *ethernetif;
+ struct eth_hdr *ethhdr;
+ struct pbuf *p;
+
+ ethernetif = netif->state;
+
+ /* move received packet into a new pbuf */
+ p = low_level_input(netif);
+ /* if no packet could be read, silently ignore this */
+ if (p != NULL) {
+ /* 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);
+ p = NULL;
+ }
+ }
+}
+
+/**
+ * Should be called at the beginning of the program to set up the
+ * network interface. It calls the function low_level_init() to do the
+ * actual setup of the hardware.
+ *
+ * This function should be passed as a parameter to netif_add().
+ *
+ * @param netif the lwip network interface structure for this ethernetif
+ * @return ERR_OK if the loopif is initialized
+ * ERR_MEM if private data couldn't be allocated
+ * any other err_t on error
+ */
+err_t
+ethernetif_init(struct netif *netif)
+{
+ struct ethernetif *ethernetif;
+
+ LWIP_ASSERT("netif != NULL", (netif != NULL));
+
+ ethernetif = mem_malloc(sizeof(struct ethernetif));
+ if (ethernetif == NULL) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
+ return ERR_MEM;
+ }
+
+#if LWIP_NETIF_HOSTNAME
+ /* Initialize interface hostname */
+ netif->hostname = "lwip";
+#endif /* LWIP_NETIF_HOSTNAME */
+
+ /*
+ * Initialize the snmp variables and counters inside the struct netif.
+ * The last argument should be replaced with your link speed, in units
+ * of bits per second.
+ */
+ MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);
+
+ netif->state = ethernetif;
+ netif->name[0] = IFNAME0;
+ netif->name[1] = IFNAME1;
+ /* We directly use etharp_output() here to save a function call.
+ * You can instead declare your own function an call etharp_output()
+ * from it if you have to do some checks before sending (e.g. if link
+ * is available...) */
+#if LWIP_IPV4
+ netif->output = etharp_output;
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ netif->output_ip6 = ethip6_output;
+#endif /* LWIP_IPV6 */
+ netif->linkoutput = low_level_output;
+
+ ethernetif->ethaddr = (struct eth_addr *) & (netif->hwaddr[0]);
+
+ /* initialize the hardware */
+ low_level_init(netif);
+
+ return ERR_OK;
+}
+
+#endif /* 0 */
diff --git a/contrib/examples/example_app/default_netif.h b/contrib/examples/example_app/default_netif.h
new file mode 100644
index 0000000..1a64f02
--- /dev/null
+++ b/contrib/examples/example_app/default_netif.h
@@ -0,0 +1,47 @@
+/*
+ * 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_DEFAULT_NETIF_H
+#define LWIP_DEFAULT_NETIF_H
+
+#include "lwip/ip_addr.h"
+
+#if LWIP_IPV4
+void init_default_netif(const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw);
+#else
+void init_default_netif(void);
+#endif
+
+void default_netif_poll(void);
+void default_netif_shutdown(void);
+
+#endif
diff --git a/contrib/examples/example_app/lwipcfg.h.ci b/contrib/examples/example_app/lwipcfg.h.ci
new file mode 100644
index 0000000..dc8477c
--- /dev/null
+++ b/contrib/examples/example_app/lwipcfg.h.ci
@@ -0,0 +1,73 @@
+/**
+ * Additional settings for the example app.
+ * Copy this to lwipcfg.h and make the config changes you need.
+ */
+
+/* configuration for this port */
+#define PPP_USERNAME "Admin"
+#define PPP_PASSWORD "pass"
+
+/** Define this to the index of the windows network adapter to use */
+#define PACKET_LIB_ADAPTER_NR 1
+/** Define this to the GUID of the windows network adapter to use
+ * or NOT define this if you want PACKET_LIB_ADAPTER_NR to be used */
+/*#define PACKET_LIB_ADAPTER_GUID "00000000-0000-0000-0000-000000000000"*/
+/*#define PACKET_LIB_GET_ADAPTER_NETADDRESS(addr) IP4_ADDR((addr), 192,168,1,0)*/
+/*#define PACKET_LIB_QUIET*/
+
+/* #define USE_PCAPIF 1 */
+#define LWIP_PORT_INIT_IPADDR(addr) IP4_ADDR((addr), 192,168,1,200)
+#define LWIP_PORT_INIT_GW(addr) IP4_ADDR((addr), 192,168,1,1)
+#define LWIP_PORT_INIT_NETMASK(addr) IP4_ADDR((addr), 255,255,255,0)
+
+/* remember to change this MAC address to suit your needs!
+ the last octet will be increased by netif->num for each netif */
+#define LWIP_MAC_ADDR_BASE {0x00,0x01,0x02,0x03,0x04,0x05}
+
+/* #define USE_SLIPIF 0 */
+/* #define SIO_USE_COMPORT 0 */
+#ifdef USE_SLIPIF
+#if USE_SLIPIF
+#define LWIP_PORT_INIT_SLIP1_IPADDR(addr) IP4_ADDR((addr), 192, 168, 2, 2)
+#define LWIP_PORT_INIT_SLIP1_GW(addr) IP4_ADDR((addr), 192, 168, 2, 1)
+#define LWIP_PORT_INIT_SLIP1_NETMASK(addr) IP4_ADDR((addr), 255, 255, 255, 0)
+#if USE_SLIPIF > 1
+#define LWIP_PORT_INIT_SLIP2_IPADDR(addr) IP4_ADDR((addr), 192, 168, 2, 1)
+#define LWIP_PORT_INIT_SLIP2_GW(addr) IP4_ADDR((addr), 0, 0, 0, 0)
+#define LWIP_PORT_INIT_SLIP2_NETMASK(addr) IP4_ADDR((addr), 255, 255, 255, 0)*/
+#endif /* USE_SLIPIF > 1 */
+#endif /* USE_SLIPIF */
+#endif /* USE_SLIPIF */
+
+/* configuration for applications */
+
+#define LWIP_CHARGEN_APP 1
+#define LWIP_DNS_APP 1
+#define LWIP_HTTPD_APP LWIP_TCP
+/* Set this to 1 to use the netconn http server,
+ * otherwise the raw api server will be used. */
+/*#define LWIP_HTTPD_APP_NETCONN */
+#define LWIP_NETBIOS_APP LWIP_IPV4 && LWIP_UDP
+#define LWIP_NETIO_APP 1
+#define LWIP_MDNS_APP LWIP_UDP
+#define LWIP_MQTT_APP LWIP_TCP
+#define LWIP_PING_APP 1
+#define LWIP_RTP_APP 1
+#define LWIP_SHELL_APP LWIP_TCP
+#define LWIP_SNMP_APP LWIP_UDP
+#define LWIP_SNTP_APP LWIP_UDP
+#define LWIP_SOCKET_EXAMPLES_APP 1
+#define LWIP_TCPECHO_APP LWIP_TCP
+/* Set this to 1 to use the netconn tcpecho server,
+ * otherwise the raw api server will be used. */
+/*#define LWIP_TCPECHO_APP_NETCONN */
+#define LWIP_TFTP_APP LWIP_UDP
+#define LWIP_TFTP_CLIENT_APP LWIP_UDP
+#define LWIP_UDPECHO_APP LWIP_UDP
+#define LWIP_LWIPERF_APP LWIP_TCP
+
+#define USE_DHCP LWIP_DHCP
+#define USE_AUTOIP LWIP_AUTOIP
+
+/* define this to your custom application-init function */
+/* #define LWIP_APP_INIT my_app_init() */
diff --git a/contrib/examples/example_app/lwipcfg.h.example b/contrib/examples/example_app/lwipcfg.h.example
new file mode 100644
index 0000000..b21e19b
--- /dev/null
+++ b/contrib/examples/example_app/lwipcfg.h.example
@@ -0,0 +1,77 @@
+/**
+ * Additional settings for the example app.
+ * Copy this to lwipcfg.h and make the config changes you need.
+ */
+
+/* configuration for this port */
+#define PPP_USERNAME "Admin"
+#define PPP_PASSWORD "pass"
+
+/** Define this to the index of the windows network adapter to use */
+#define PACKET_LIB_ADAPTER_NR 1
+/** Define this to the GUID of the windows network adapter to use
+ * or NOT define this if you want PACKET_LIB_ADAPTER_NR to be used */
+/*#define PACKET_LIB_ADAPTER_GUID "00000000-0000-0000-0000-000000000000"*/
+/*#define PACKET_LIB_GET_ADAPTER_NETADDRESS(addr) IP4_ADDR((addr), 192,168,1,0)*/
+/*#define PACKET_LIB_QUIET*/
+
+/* If these 2 are not defined, the corresponding config setting is used */
+/* #define USE_DHCP 0 */
+/* #define USE_AUTOIP 0 */
+
+/* #define USE_PCAPIF 1 */
+#define LWIP_PORT_INIT_IPADDR(addr) IP4_ADDR((addr), 192,168,1,200)
+#define LWIP_PORT_INIT_GW(addr) IP4_ADDR((addr), 192,168,1,1)
+#define LWIP_PORT_INIT_NETMASK(addr) IP4_ADDR((addr), 255,255,255,0)
+
+/* remember to change this MAC address to suit your needs!
+ the last octet will be increased by netif->num for each netif */
+#define LWIP_MAC_ADDR_BASE {0x00,0x01,0x02,0x03,0x04,0x05}
+
+/* #define USE_SLIPIF 0 */
+/* #define SIO_USE_COMPORT 0 */
+#ifdef USE_SLIPIF
+#if USE_SLIPIF
+#define LWIP_PORT_INIT_SLIP1_IPADDR(addr) IP4_ADDR((addr), 192, 168, 2, 2)
+#define LWIP_PORT_INIT_SLIP1_GW(addr) IP4_ADDR((addr), 192, 168, 2, 1)
+#define LWIP_PORT_INIT_SLIP1_NETMASK(addr) IP4_ADDR((addr), 255, 255, 255, 0)
+#if USE_SLIPIF > 1
+#define LWIP_PORT_INIT_SLIP2_IPADDR(addr) IP4_ADDR((addr), 192, 168, 2, 1)
+#define LWIP_PORT_INIT_SLIP2_GW(addr) IP4_ADDR((addr), 0, 0, 0, 0)
+#define LWIP_PORT_INIT_SLIP2_NETMASK(addr) IP4_ADDR((addr), 255, 255, 255, 0)*/
+#endif /* USE_SLIPIF > 1 */
+#endif /* USE_SLIPIF */
+#endif /* USE_SLIPIF */
+
+/* configuration for applications */
+
+#define LWIP_CHARGEN_APP 0
+#define LWIP_DNS_APP 0
+#define LWIP_HTTPD_APP 0
+/* Set this to 1 to use the netconn http server,
+ * otherwise the raw api server will be used. */
+/*#define LWIP_HTTPD_APP_NETCONN */
+#define LWIP_NETBIOS_APP 0
+#define LWIP_NETIO_APP 0
+#define LWIP_MDNS_APP 0
+#define LWIP_MQTT_APP 0
+#define LWIP_PING_APP 0
+#define LWIP_RTP_APP 0
+#define LWIP_SHELL_APP 0
+#define LWIP_SNMP_APP 0
+#define LWIP_SNTP_APP 0
+#define LWIP_SOCKET_EXAMPLES_APP 0
+#define LWIP_TCPECHO_APP 0
+/* Set this to 1 to use the netconn tcpecho server,
+ * otherwise the raw api server will be used. */
+/*#define LWIP_TCPECHO_APP_NETCONN */
+#define LWIP_TFTP_APP 0
+#define LWIP_TFTP_CLIENT_APP 0
+#define LWIP_UDPECHO_APP 0
+#define LWIP_LWIPERF_APP 0
+
+/*#define USE_DHCP 1*/
+/*#define USE_AUTOIP 1*/
+
+/* define this to your custom application-init function */
+/* #define LWIP_APP_INIT my_app_init() */
diff --git a/contrib/examples/example_app/lwipopts.h b/contrib/examples/example_app/lwipopts.h
new file mode 100644
index 0000000..ea2ca4bdae
--- /dev/null
+++ b/contrib/examples/example_app/lwipopts.h
@@ -0,0 +1,326 @@
+/*
+ * 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_LWIPOPTS_H
+#define LWIP_LWIPOPTS_H
+
+#ifdef LWIP_OPTTEST_FILE
+#include "lwipopts_test.h"
+#else /* LWIP_OPTTEST_FILE */
+
+#define LWIP_IPV4 1
+#define LWIP_IPV6 1
+
+#define NO_SYS 0
+#define LWIP_SOCKET (NO_SYS==0)
+#define LWIP_NETCONN (NO_SYS==0)
+#define LWIP_NETIF_API (NO_SYS==0)
+
+#define LWIP_IGMP LWIP_IPV4
+#define LWIP_ICMP LWIP_IPV4
+
+#define LWIP_SNMP LWIP_UDP
+#define MIB2_STATS LWIP_SNMP
+#ifdef LWIP_HAVE_MBEDTLS
+#define LWIP_SNMP_V3 (LWIP_SNMP)
+#endif
+
+#define LWIP_DNS LWIP_UDP
+#define LWIP_MDNS_RESPONDER LWIP_UDP
+
+#define LWIP_NUM_NETIF_CLIENT_DATA (LWIP_MDNS_RESPONDER)
+
+#define LWIP_HAVE_LOOPIF 1
+#define LWIP_NETIF_LOOPBACK 1
+#define LWIP_LOOPBACK_MAX_PBUFS 10
+
+#define TCP_LISTEN_BACKLOG 1
+
+#define LWIP_COMPAT_SOCKETS 1
+#define LWIP_SO_RCVTIMEO 1
+#define LWIP_SO_RCVBUF 1
+
+#define LWIP_TCPIP_CORE_LOCKING 1
+
+#define LWIP_NETIF_LINK_CALLBACK 1
+#define LWIP_NETIF_STATUS_CALLBACK 1
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 1
+
+#ifdef LWIP_DEBUG
+
+#define LWIP_DBG_MIN_LEVEL 0
+#define PPP_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#endif
+
+#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT)
+
+
+/* ---------- Memory options ---------- */
+/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
+ lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
+ byte alignment -> define MEM_ALIGNMENT to 2. */
+/* MSVC port: intel processors don't need 4-byte alignment,
+ but are faster that way! */
+#define MEM_ALIGNMENT 4U
+
+/* MEM_SIZE: the size of the heap memory. If the application will send
+a lot of data that needs to be copied, this should be set high. */
+#define MEM_SIZE 10240
+
+/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
+ sends a lot of data out of ROM (or other static memory), this
+ should be set high. */
+#define MEMP_NUM_PBUF 16
+/* MEMP_NUM_RAW_PCB: the number of UDP protocol control blocks. One
+ per active RAW "connection". */
+#define MEMP_NUM_RAW_PCB 3
+/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
+ per active UDP "connection". */
+#define MEMP_NUM_UDP_PCB 8
+/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
+ connections. */
+#define MEMP_NUM_TCP_PCB 5
+/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
+ connections. */
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
+ segments. */
+#define MEMP_NUM_TCP_SEG 16
+/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
+ timeouts. */
+#define MEMP_NUM_SYS_TIMEOUT 17
+
+/* The following four are used only with the sequential API and can be
+ set to 0 if the application only will use the raw API. */
+/* MEMP_NUM_NETBUF: the number of struct netbufs. */
+#define MEMP_NUM_NETBUF 2
+/* MEMP_NUM_NETCONN: the number of struct netconns. */
+#define MEMP_NUM_NETCONN 12
+/* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used
+ for sequential API communication and incoming packets. Used in
+ src/api/tcpip.c. */
+#define MEMP_NUM_TCPIP_MSG_API 16
+#define MEMP_NUM_TCPIP_MSG_INPKT 16
+
+
+/* ---------- Pbuf options ---------- */
+/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
+#define PBUF_POOL_SIZE 120
+
+/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
+#define PBUF_POOL_BUFSIZE 256
+
+/** SYS_LIGHTWEIGHT_PROT
+ * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
+ * for certain critical regions during buffer allocation, deallocation and memory
+ * allocation and deallocation.
+ */
+#define SYS_LIGHTWEIGHT_PROT (NO_SYS==0)
+
+
+/* ---------- TCP options ---------- */
+#define LWIP_TCP 1
+#define TCP_TTL 255
+
+#define LWIP_ALTCP (LWIP_TCP)
+#ifdef LWIP_HAVE_MBEDTLS
+#define LWIP_ALTCP_TLS (LWIP_TCP)
+#define LWIP_ALTCP_TLS_MBEDTLS (LWIP_TCP)
+#endif
+
+
+/* Controls if TCP should queue segments that arrive out of
+ order. Define to 0 if your device is low on memory. */
+#define TCP_QUEUE_OOSEQ 1
+
+/* TCP Maximum segment size. */
+#define TCP_MSS 1024
+
+/* TCP sender buffer space (bytes). */
+#define TCP_SND_BUF 2048
+
+/* TCP sender buffer space (pbufs). This must be at least = 2 *
+ TCP_SND_BUF/TCP_MSS for things to work. */
+#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF/TCP_MSS)
+
+/* TCP writable space (bytes). This must be less than or equal
+ to TCP_SND_BUF. It is the amount of space which must be
+ available in the tcp snd_buf for select to return writable */
+#define TCP_SNDLOWAT (TCP_SND_BUF/2)
+
+/* TCP receive window. */
+#define TCP_WND (20 * 1024)
+
+/* Maximum number of retransmissions of data segments. */
+#define TCP_MAXRTX 12
+
+/* Maximum number of retransmissions of SYN segments. */
+#define TCP_SYNMAXRTX 4
+
+
+/* ---------- ARP options ---------- */
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_QUEUEING 1
+
+
+/* ---------- IP options ---------- */
+/* Define IP_FORWARD to 1 if you wish to have the ability to forward
+ IP packets across network interfaces. If you are going to run lwIP
+ on a device with only one network interface, define this to 0. */
+#define IP_FORWARD 1
+
+/* IP reassembly and segmentation.These are orthogonal even
+ * if they both deal with IP fragments */
+#define IP_REASSEMBLY 1
+#define IP_REASS_MAX_PBUFS (10 * ((1500 + PBUF_POOL_BUFSIZE - 1) / PBUF_POOL_BUFSIZE))
+#define MEMP_NUM_REASSDATA IP_REASS_MAX_PBUFS
+#define IP_FRAG 1
+#define IPV6_FRAG_COPYHEADER 1
+
+/* ---------- ICMP options ---------- */
+#define ICMP_TTL 255
+
+
+/* ---------- DHCP options ---------- */
+/* Define LWIP_DHCP to 1 if you want DHCP configuration of
+ interfaces. */
+#define LWIP_DHCP LWIP_UDP
+
+/* 1 if you want to do an ARP check on the offered address
+ (recommended). */
+#define DHCP_DOES_ARP_CHECK (LWIP_DHCP)
+
+
+/* ---------- AUTOIP options ------- */
+#define LWIP_AUTOIP (LWIP_DHCP)
+#define LWIP_DHCP_AUTOIP_COOP (LWIP_DHCP && LWIP_AUTOIP)
+
+
+/* ---------- UDP options ---------- */
+#define LWIP_UDP 1
+#define LWIP_UDPLITE LWIP_UDP
+#define UDP_TTL 255
+
+
+/* ---------- RAW options ---------- */
+#define LWIP_RAW 1
+
+
+/* ---------- Statistics options ---------- */
+
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 1
+
+#if LWIP_STATS
+#define LINK_STATS 1
+#define IP_STATS 1
+#define ICMP_STATS 1
+#define IGMP_STATS 1
+#define IPFRAG_STATS 1
+#define UDP_STATS 1
+#define TCP_STATS 1
+#define MEM_STATS 1
+#define MEMP_STATS 1
+#define PBUF_STATS 1
+#define SYS_STATS 1
+#endif /* LWIP_STATS */
+
+/* ---------- NETBIOS options ---------- */
+#define LWIP_NETBIOS_RESPOND_NAME_QUERY 1
+
+/* ---------- PPP options ---------- */
+
+#define PPP_SUPPORT 1 /* Set > 0 for PPP */
+
+#if PPP_SUPPORT
+
+#define NUM_PPP 1 /* Max PPP sessions. */
+
+
+/* Select modules to enable. Ideally these would be set in the makefile but
+ * we're limited by the command line length so you need to modify the settings
+ * in this file.
+ */
+#define PPPOE_SUPPORT 1
+#define PPPOS_SUPPORT 1
+
+#define PAP_SUPPORT 1 /* Set > 0 for PAP. */
+#define CHAP_SUPPORT 1 /* Set > 0 for CHAP. */
+#define MSCHAP_SUPPORT 0 /* Set > 0 for MSCHAP */
+#define CBCP_SUPPORT 0 /* Set > 0 for CBCP (NOT FUNCTIONAL!) */
+#define CCP_SUPPORT 0 /* Set > 0 for CCP */
+#define VJ_SUPPORT 0 /* Set > 0 for VJ header compression. */
+#define MD5_SUPPORT 1 /* Set > 0 for MD5 (see also CHAP) */
+
+#endif /* PPP_SUPPORT */
+
+#endif /* LWIP_OPTTEST_FILE */
+
+/* The following defines must be done even in OPTTEST mode: */
+
+#if !defined(NO_SYS) || !NO_SYS /* default is 0 */
+void sys_check_core_locking(void);
+#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking()
+#endif
+
+#ifndef LWIP_PLATFORM_ASSERT
+/* Define LWIP_PLATFORM_ASSERT to something to catch missing stdio.h includes */
+void lwip_example_app_platform_assert(const char *msg, int line, const char *file);
+#define LWIP_PLATFORM_ASSERT(x) lwip_example_app_platform_assert(x, __LINE__, __FILE__)
+#endif
+
+#endif /* LWIP_LWIPOPTS_H */
diff --git a/contrib/examples/example_app/lwippools.h b/contrib/examples/example_app/lwippools.h
new file mode 100644
index 0000000..f58aa59
--- /dev/null
+++ b/contrib/examples/example_app/lwippools.h
@@ -0,0 +1,20 @@
+/* OPTIONAL: Pools to replace heap allocation
+ * Optional: Pools can be used instead of the heap for mem_malloc. If
+ * so, these should be defined here, in increasing order according to
+ * the pool element size.
+ *
+ * LWIP_MALLOC_MEMPOOL(number_elements, element_size)
+ */
+#if MEM_USE_POOLS
+LWIP_MALLOC_MEMPOOL_START
+LWIP_MALLOC_MEMPOOL(100, 256)
+LWIP_MALLOC_MEMPOOL(50, 512)
+LWIP_MALLOC_MEMPOOL(20, 1024)
+LWIP_MALLOC_MEMPOOL(20, 1536)
+LWIP_MALLOC_MEMPOOL_END
+#endif /* MEM_USE_POOLS */
+
+/* Optional: Your custom pools can go here if you would like to use
+ * lwIP's memory pools for anything else.
+ */
+LWIP_MEMPOOL(SYS_MBOX, 22, 100, "SYS_MBOX")
diff --git a/contrib/examples/example_app/ppp_settings.h b/contrib/examples/example_app/ppp_settings.h
new file mode 100644
index 0000000..7b3ee1a
--- /dev/null
+++ b/contrib/examples/example_app/ppp_settings.h
@@ -0,0 +1,6 @@
+#ifdef _MSC_VER
+#pragma warning (disable: 4242) /* PPP only: conversion from 'x' to 'y', possible loss of data */
+#pragma warning (disable: 4244) /* PPP only: conversion from 'x' to 'y', possible loss of data (again?) */
+#pragma warning (disable: 4310) /* PPP only: cast truncates constant value */
+#pragma warning (disable: 4706) /* PPP only: assignment within conditional expression */
+#endif /* MSC_VER */
diff --git a/contrib/examples/example_app/test.c b/contrib/examples/example_app/test.c
new file mode 100644
index 0000000..4f4b5d7
--- /dev/null
+++ b/contrib/examples/example_app/test.c
@@ -0,0 +1,773 @@
+/*
+ * Copyright (c) 2001,2002 Florian Schulze.
+ * 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 authors nor the names of the contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS 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 AUTHORS 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.
+ *
+ * test.c - This file is part of lwIP test
+ *
+ */
+
+/* C runtime includes */
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+
+/* lwIP core includes */
+#include "lwip/opt.h"
+
+#include "lwip/sys.h"
+#include "lwip/timeouts.h"
+#include "lwip/debug.h"
+#include "lwip/stats.h"
+#include "lwip/init.h"
+#include "lwip/tcpip.h"
+#include "lwip/netif.h"
+#include "lwip/api.h"
+
+#include "lwip/tcp.h"
+#include "lwip/udp.h"
+#include "lwip/dns.h"
+#include "lwip/dhcp.h"
+#include "lwip/autoip.h"
+
+/* lwIP netif includes */
+#include "lwip/etharp.h"
+#include "netif/ethernet.h"
+
+/* applications includes */
+#include "lwip/apps/netbiosns.h"
+#include "lwip/apps/httpd.h"
+#include "apps/httpserver/httpserver-netconn.h"
+#include "apps/netio/netio.h"
+#include "apps/ping/ping.h"
+#include "apps/rtp/rtp.h"
+#include "apps/chargen/chargen.h"
+#include "apps/shell/shell.h"
+#include "apps/tcpecho/tcpecho.h"
+#include "apps/udpecho/udpecho.h"
+#include "apps/tcpecho_raw/tcpecho_raw.h"
+#include "apps/socket_examples/socket_examples.h"
+
+#include "examples/lwiperf/lwiperf_example.h"
+#include "examples/mdns/mdns_example.h"
+#include "examples/snmp/snmp_example.h"
+#include "examples/tftp/tftp_example.h"
+#include "examples/sntp/sntp_example.h"
+#include "examples/mqtt/mqtt_example.h"
+
+#include "examples/httpd/cgi_example/cgi_example.h"
+#include "examples/httpd/fs_example/fs_example.h"
+#include "examples/httpd/https_example/https_example.h"
+#include "examples/httpd/ssi_example/ssi_example.h"
+
+#include "default_netif.h"
+
+#if NO_SYS
+/* ... then we need information about the timer intervals: */
+#include "lwip/ip4_frag.h"
+#include "lwip/igmp.h"
+#endif /* NO_SYS */
+
+#include "netif/ppp/ppp_opts.h"
+#if PPP_SUPPORT
+/* PPP includes */
+#include "lwip/sio.h"
+#include "netif/ppp/pppapi.h"
+#include "netif/ppp/pppos.h"
+#include "netif/ppp/pppoe.h"
+#if !NO_SYS && !LWIP_PPP_API
+#error With NO_SYS==0, LWIP_PPP_API==1 is required.
+#endif
+#endif /* PPP_SUPPORT */
+
+/* include the port-dependent configuration */
+#include "lwipcfg.h"
+
+#ifndef LWIP_EXAMPLE_APP_ABORT
+#define LWIP_EXAMPLE_APP_ABORT() 0
+#endif
+
+/** Define this to 1 to enable a port-specific ethernet interface as default interface. */
+#ifndef USE_DEFAULT_ETH_NETIF
+#define USE_DEFAULT_ETH_NETIF 1
+#endif
+
+/** Define this to 1 to enable a PPP interface. */
+#ifndef USE_PPP
+#define USE_PPP 0
+#endif
+
+/** Define this to 1 or 2 to support 1 or 2 SLIP interfaces. */
+#ifndef USE_SLIPIF
+#define USE_SLIPIF 0
+#endif
+
+/** Use an ethernet adapter? Default to enabled if port-specific ethernet netif or PPPoE are used. */
+#ifndef USE_ETHERNET
+#define USE_ETHERNET (USE_DEFAULT_ETH_NETIF || PPPOE_SUPPORT)
+#endif
+
+/** Use an ethernet adapter for TCP/IP? By default only if port-specific ethernet netif is used. */
+#ifndef USE_ETHERNET_TCPIP
+#define USE_ETHERNET_TCPIP (USE_DEFAULT_ETH_NETIF)
+#endif
+
+#if USE_SLIPIF
+#include <netif/slipif.h>
+#endif /* USE_SLIPIF */
+
+#ifndef USE_DHCP
+#define USE_DHCP LWIP_DHCP
+#endif
+#ifndef USE_AUTOIP
+#define USE_AUTOIP LWIP_AUTOIP
+#endif
+
+/* global variables for netifs */
+#if USE_ETHERNET
+#if LWIP_DHCP
+/* dhcp struct for the ethernet netif */
+static struct dhcp netif_dhcp;
+#endif /* LWIP_DHCP */
+#if LWIP_AUTOIP
+/* autoip struct for the ethernet netif */
+static struct autoip netif_autoip;
+#endif /* LWIP_AUTOIP */
+#endif /* USE_ETHERNET */
+#if USE_PPP
+/* THE PPP PCB */
+static ppp_pcb *ppp;
+/* THE PPP interface */
+static struct netif ppp_netif;
+/* THE PPP descriptor */
+static u8_t sio_idx = 0;
+static sio_fd_t ppp_sio;
+#endif /* USE_PPP */
+#if USE_SLIPIF
+static struct netif slipif1;
+#if USE_SLIPIF > 1
+static struct netif slipif2;
+#endif /* USE_SLIPIF > 1 */
+#endif /* USE_SLIPIF */
+
+
+#if USE_PPP
+static void
+pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx)
+{
+ struct netif *pppif = ppp_netif(pcb);
+ LWIP_UNUSED_ARG(ctx);
+
+ switch(errCode) {
+ case PPPERR_NONE: { /* No error. */
+ printf("pppLinkStatusCallback: PPPERR_NONE\n");
+#if LWIP_IPV4
+ printf(" our_ipaddr = %s\n", ip4addr_ntoa(netif_ip4_addr(pppif)));
+ printf(" his_ipaddr = %s\n", ip4addr_ntoa(netif_ip4_gw(pppif)));
+ printf(" netmask = %s\n", ip4addr_ntoa(netif_ip4_netmask(pppif)));
+#endif /* LWIP_IPV4 */
+#if LWIP_DNS
+ printf(" dns1 = %s\n", ipaddr_ntoa(dns_getserver(0)));
+ printf(" dns2 = %s\n", ipaddr_ntoa(dns_getserver(1)));
+#endif /* LWIP_DNS */
+#if PPP_IPV6_SUPPORT
+ printf(" our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
+#endif /* PPP_IPV6_SUPPORT */
+ break;
+ }
+ case PPPERR_PARAM: { /* Invalid parameter. */
+ printf("pppLinkStatusCallback: PPPERR_PARAM\n");
+ break;
+ }
+ case PPPERR_OPEN: { /* Unable to open PPP session. */
+ printf("pppLinkStatusCallback: PPPERR_OPEN\n");
+ break;
+ }
+ case PPPERR_DEVICE: { /* Invalid I/O device for PPP. */
+ printf("pppLinkStatusCallback: PPPERR_DEVICE\n");
+ break;
+ }
+ case PPPERR_ALLOC: { /* Unable to allocate resources. */
+ printf("pppLinkStatusCallback: PPPERR_ALLOC\n");
+ break;
+ }
+ case PPPERR_USER: { /* User interrupt. */
+ printf("pppLinkStatusCallback: PPPERR_USER\n");
+ break;
+ }
+ case PPPERR_CONNECT: { /* Connection lost. */
+ printf("pppLinkStatusCallback: PPPERR_CONNECT\n");
+ break;
+ }
+ case PPPERR_AUTHFAIL: { /* Failed authentication challenge. */
+ printf("pppLinkStatusCallback: PPPERR_AUTHFAIL\n");
+ break;
+ }
+ case PPPERR_PROTOCOL: { /* Failed to meet protocol. */
+ printf("pppLinkStatusCallback: PPPERR_PROTOCOL\n");
+ break;
+ }
+ case PPPERR_PEERDEAD: { /* Connection timeout */
+ printf("pppLinkStatusCallback: PPPERR_PEERDEAD\n");
+ break;
+ }
+ case PPPERR_IDLETIMEOUT: { /* Idle Timeout */
+ printf("pppLinkStatusCallback: PPPERR_IDLETIMEOUT\n");
+ break;
+ }
+ case PPPERR_CONNECTTIME: { /* Max connect time reached */
+ printf("pppLinkStatusCallback: PPPERR_CONNECTTIME\n");
+ break;
+ }
+ case PPPERR_LOOPBACK: { /* Loopback detected */
+ printf("pppLinkStatusCallback: PPPERR_LOOPBACK\n");
+ break;
+ }
+ default: {
+ printf("pppLinkStatusCallback: unknown errCode %d\n", errCode);
+ break;
+ }
+ }
+}
+
+#if PPPOS_SUPPORT
+static u32_t
+ppp_output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx)
+{
+ LWIP_UNUSED_ARG(pcb);
+ LWIP_UNUSED_ARG(ctx);
+ return sio_write(ppp_sio, (const u8_t*)data, len);
+}
+#endif /* PPPOS_SUPPORT */
+#endif /* USE_PPP */
+
+#if LWIP_NETIF_STATUS_CALLBACK
+static void
+status_callback(struct netif *state_netif)
+{
+ if (netif_is_up(state_netif)) {
+#if LWIP_IPV4
+ printf("status_callback==UP, local interface IP is %s\n", ip4addr_ntoa(netif_ip4_addr(state_netif)));
+#else
+ printf("status_callback==UP\n");
+#endif
+ } else {
+ printf("status_callback==DOWN\n");
+ }
+}
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+
+#if LWIP_NETIF_LINK_CALLBACK
+static void
+link_callback(struct netif *state_netif)
+{
+ if (netif_is_link_up(state_netif)) {
+ printf("link_callback==UP\n");
+ } else {
+ printf("link_callback==DOWN\n");
+ }
+}
+#endif /* LWIP_NETIF_LINK_CALLBACK */
+
+/* This function initializes all network interfaces */
+static void
+test_netif_init(void)
+{
+#if LWIP_IPV4 && USE_ETHERNET
+ ip4_addr_t ipaddr, netmask, gw;
+#endif /* LWIP_IPV4 && USE_ETHERNET */
+#if USE_SLIPIF
+ u8_t num_slip1 = 0;
+#if LWIP_IPV4
+ ip4_addr_t ipaddr_slip1, netmask_slip1, gw_slip1;
+#endif
+#if USE_SLIPIF > 1
+ u8_t num_slip2 = 1;
+#if LWIP_IPV4
+ ip4_addr_t ipaddr_slip2, netmask_slip2, gw_slip2;
+#endif
+#endif /* USE_SLIPIF > 1 */
+#endif /* USE_SLIPIF */
+#if USE_DHCP || USE_AUTOIP
+ err_t err;
+#endif
+
+#if USE_PPP
+ const char *username = NULL, *password = NULL;
+#ifdef PPP_USERNAME
+ username = PPP_USERNAME;
+#endif
+#ifdef PPP_PASSWORD
+ password = PPP_PASSWORD;
+#endif
+ printf("ppp_connect: COM%d\n", (int)sio_idx);
+#if PPPOS_SUPPORT
+ ppp_sio = sio_open(sio_idx);
+ if (ppp_sio == NULL) {
+ printf("sio_open error\n");
+ } else {
+ ppp = pppos_create(&ppp_netif, ppp_output_cb, pppLinkStatusCallback, NULL);
+ if (ppp == NULL) {
+ printf("pppos_create error\n");
+ } else {
+ ppp_set_auth(ppp, PPPAUTHTYPE_ANY, username, password);
+ ppp_connect(ppp, 0);
+ }
+ }
+#endif /* PPPOS_SUPPORT */
+#endif /* USE_PPP */
+
+#if USE_ETHERNET
+#if LWIP_IPV4
+ ip4_addr_set_zero(&gw);
+ ip4_addr_set_zero(&ipaddr);
+ ip4_addr_set_zero(&netmask);
+#if USE_ETHERNET_TCPIP
+#if USE_DHCP
+ printf("Starting lwIP, local interface IP is dhcp-enabled\n");
+#elif USE_AUTOIP
+ printf("Starting lwIP, local interface IP is autoip-enabled\n");
+#else /* USE_DHCP */
+ LWIP_PORT_INIT_GW(&gw);
+ LWIP_PORT_INIT_IPADDR(&ipaddr);
+ LWIP_PORT_INIT_NETMASK(&netmask);
+ printf("Starting lwIP, local interface IP is %s\n", ip4addr_ntoa(&ipaddr));
+#endif /* USE_DHCP */
+#endif /* USE_ETHERNET_TCPIP */
+#else /* LWIP_IPV4 */
+ printf("Starting lwIP, IPv4 disable\n");
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV4
+ init_default_netif(&ipaddr, &netmask, &gw);
+#else
+ init_default_netif();
+#endif
+#if LWIP_IPV6
+ netif_create_ip6_linklocal_address(netif_default, 1);
+ printf("ip6 linklocal address: %s\n", ip6addr_ntoa(netif_ip6_addr(netif_default, 0)));
+#endif /* LWIP_IPV6 */
+#if LWIP_NETIF_STATUS_CALLBACK
+ netif_set_status_callback(netif_default, status_callback);
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+#if LWIP_NETIF_LINK_CALLBACK
+ netif_set_link_callback(netif_default, link_callback);
+#endif /* LWIP_NETIF_LINK_CALLBACK */
+
+#if USE_ETHERNET_TCPIP
+#if LWIP_AUTOIP
+ autoip_set_struct(netif_default, &netif_autoip);
+#endif /* LWIP_AUTOIP */
+#if LWIP_DHCP
+ dhcp_set_struct(netif_default, &netif_dhcp);
+#endif /* LWIP_DHCP */
+ netif_set_up(netif_default);
+#if USE_DHCP
+ err = dhcp_start(netif_default);
+ LWIP_ASSERT("dhcp_start failed", err == ERR_OK);
+#elif USE_AUTOIP
+ err = autoip_start(netif_default);
+ LWIP_ASSERT("autoip_start failed", err == ERR_OK);
+#endif /* USE_DHCP */
+#else /* USE_ETHERNET_TCPIP */
+ /* Use ethernet for PPPoE only */
+ netif.flags &= ~(NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP); /* no ARP */
+ netif.flags |= NETIF_FLAG_ETHERNET; /* but pure ethernet */
+#endif /* USE_ETHERNET_TCPIP */
+
+#if USE_PPP && PPPOE_SUPPORT
+ /* start PPPoE after ethernet netif is added! */
+ ppp = pppoe_create(&ppp_netif, netif_default, NULL, NULL, pppLinkStatusCallback, NULL);
+ if (ppp == NULL) {
+ printf("pppoe_create error\n");
+ } else {
+ ppp_set_auth(ppp, PPPAUTHTYPE_ANY, username, password);
+ ppp_connect(ppp, 0);
+ }
+#endif /* USE_PPP && PPPOE_SUPPORT */
+
+#endif /* USE_ETHERNET */
+#if USE_SLIPIF
+#if LWIP_IPV4
+#define SLIP1_ADDRS &ipaddr_slip1, &netmask_slip1, &gw_slip1,
+ LWIP_PORT_INIT_SLIP1_IPADDR(&ipaddr_slip1);
+ LWIP_PORT_INIT_SLIP1_GW(&gw_slip1);
+ LWIP_PORT_INIT_SLIP1_NETMASK(&netmask_slip1);
+ printf("Starting lwIP slipif, local interface IP is %s\n", ip4addr_ntoa(&ipaddr_slip1));
+#else
+#define SLIP1_ADDRS
+ printf("Starting lwIP slipif\n");
+#endif
+#if defined(SIO_USE_COMPORT) && SIO_USE_COMPORT
+ num_slip1++; /* COM ports cannot be 0-based */
+#endif
+ netif_add(&slipif1, SLIP1_ADDRS &num_slip1, slipif_init, ip_input);
+#if !USE_ETHERNET
+ netif_set_default(&slipif1);
+#endif /* !USE_ETHERNET */
+#if LWIP_IPV6
+ netif_create_ip6_linklocal_address(&slipif1, 1);
+ printf("SLIP ip6 linklocal address: %s\n", ip6addr_ntoa(netif_ip6_addr(&slipif1, 0)));
+#endif /* LWIP_IPV6 */
+#if LWIP_NETIF_STATUS_CALLBACK
+ netif_set_status_callback(&slipif1, status_callback);
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+#if LWIP_NETIF_LINK_CALLBACK
+ netif_set_link_callback(&slipif1, link_callback);
+#endif /* LWIP_NETIF_LINK_CALLBACK */
+ netif_set_up(&slipif1);
+
+#if USE_SLIPIF > 1
+#if LWIP_IPV4
+#define SLIP2_ADDRS &ipaddr_slip2, &netmask_slip2, &gw_slip2,
+ LWIP_PORT_INIT_SLIP2_IPADDR(&ipaddr_slip2);
+ LWIP_PORT_INIT_SLIP2_GW(&gw_slip2);
+ LWIP_PORT_INIT_SLIP2_NETMASK(&netmask_slip2);
+ printf("Starting lwIP SLIP if #2, local interface IP is %s\n", ip4addr_ntoa(&ipaddr_slip2));
+#else
+#define SLIP2_ADDRS
+ printf("Starting lwIP SLIP if #2\n");
+#endif
+#if defined(SIO_USE_COMPORT) && SIO_USE_COMPORT
+ num_slip2++; /* COM ports cannot be 0-based */
+#endif
+ netif_add(&slipif2, SLIP2_ADDRS &num_slip2, slipif_init, ip_input);
+#if LWIP_IPV6
+ netif_create_ip6_linklocal_address(&slipif1, 1);
+ printf("SLIP2 ip6 linklocal address: ");
+ ip6_addr_debug_print(0xFFFFFFFF & ~LWIP_DBG_HALT, netif_ip6_addr(&slipif2, 0));
+ printf("\n");
+#endif /* LWIP_IPV6 */
+#if LWIP_NETIF_STATUS_CALLBACK
+ netif_set_status_callback(&slipif2, status_callback);
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+#if LWIP_NETIF_LINK_CALLBACK
+ netif_set_link_callback(&slipif2, link_callback);
+#endif /* LWIP_NETIF_LINK_CALLBACK */
+ netif_set_up(&slipif2);
+#endif /* USE_SLIPIF > 1*/
+#endif /* USE_SLIPIF */
+}
+
+#if LWIP_DNS_APP && LWIP_DNS
+static void
+dns_found(const char *name, const ip_addr_t *addr, void *arg)
+{
+ LWIP_UNUSED_ARG(arg);
+ printf("%s: %s\n", name, addr ? ipaddr_ntoa(addr) : "<not found>");
+}
+
+static void
+dns_dorequest(void *arg)
+{
+ const char* dnsname = "3com.com";
+ ip_addr_t dnsresp;
+ LWIP_UNUSED_ARG(arg);
+
+ if (dns_gethostbyname(dnsname, &dnsresp, dns_found, NULL) == ERR_OK) {
+ dns_found(dnsname, &dnsresp, NULL);
+ }
+}
+#endif /* LWIP_DNS_APP && LWIP_DNS */
+
+/* This function initializes applications */
+static void
+apps_init(void)
+{
+#if LWIP_DNS_APP && LWIP_DNS
+ /* wait until the netif is up (for dhcp, autoip or ppp) */
+ sys_timeout(5000, dns_dorequest, NULL);
+#endif /* LWIP_DNS_APP && LWIP_DNS */
+
+#if LWIP_CHARGEN_APP && LWIP_SOCKET
+ chargen_init();
+#endif /* LWIP_CHARGEN_APP && LWIP_SOCKET */
+
+#if LWIP_PING_APP && LWIP_RAW && LWIP_ICMP
+ ping_init(&netif_default->gw);
+#endif /* LWIP_PING_APP && LWIP_RAW && LWIP_ICMP */
+
+#if LWIP_NETBIOS_APP && LWIP_UDP
+ netbiosns_init();
+#ifndef NETBIOS_LWIP_NAME
+#if LWIP_NETIF_HOSTNAME
+ netbiosns_set_name(netif_default->hostname);
+#else
+ netbiosns_set_name("NETBIOSLWIPDEV");
+#endif
+#endif
+#endif /* LWIP_NETBIOS_APP && LWIP_UDP */
+
+#if LWIP_HTTPD_APP && LWIP_TCP
+#ifdef LWIP_HTTPD_APP_NETCONN
+ http_server_netconn_init();
+#else /* LWIP_HTTPD_APP_NETCONN */
+#if defined(LWIP_HTTPD_EXAMPLE_CUSTOMFILES) && LWIP_HTTPD_EXAMPLE_CUSTOMFILES && defined(LWIP_HTTPD_EXAMPLE_CUSTOMFILES_ROOTDIR)
+ fs_ex_init(LWIP_HTTPD_EXAMPLE_CUSTOMFILES_ROOTDIR);
+#endif
+ httpd_init();
+#if defined(LWIP_HTTPD_EXAMPLE_SSI_SIMPLE) && LWIP_HTTPD_EXAMPLE_SSI_SIMPLE
+ ssi_ex_init();
+#endif
+#if defined(LWIP_HTTPD_EXAMPLE_CGI_SIMPLE) && LWIP_HTTPD_EXAMPLE_CGI_SIMPLE
+ cgi_ex_init();
+#endif
+#if defined(LWIP_HTTPD_EXAMPLE_HTTPS) && LWIP_HTTPD_EXAMPLE_HTTPS
+ https_ex_init();
+#endif
+#endif /* LWIP_HTTPD_APP_NETCONN */
+#endif /* LWIP_HTTPD_APP && LWIP_TCP */
+
+#if LWIP_NETIO_APP && LWIP_TCP
+ netio_init();
+#endif /* LWIP_NETIO_APP && LWIP_TCP */
+
+#if LWIP_RTP_APP && LWIP_SOCKET && LWIP_IGMP
+ rtp_init();
+#endif /* LWIP_RTP_APP && LWIP_SOCKET && LWIP_IGMP */
+
+#if LWIP_SHELL_APP && LWIP_NETCONN
+ shell_init();
+#endif /* LWIP_SHELL_APP && LWIP_NETCONN */
+#if LWIP_TCPECHO_APP
+#if LWIP_NETCONN && defined(LWIP_TCPECHO_APP_NETCONN)
+ tcpecho_init();
+#else /* LWIP_NETCONN && defined(LWIP_TCPECHO_APP_NETCONN) */
+ tcpecho_raw_init();
+#endif
+#endif /* LWIP_TCPECHO_APP && LWIP_NETCONN */
+#if LWIP_UDPECHO_APP && LWIP_NETCONN
+ udpecho_init();
+#endif /* LWIP_UDPECHO_APP && LWIP_NETCONN */
+#if LWIP_SOCKET_EXAMPLES_APP && LWIP_SOCKET
+ socket_examples_init();
+#endif /* LWIP_SOCKET_EXAMPLES_APP && LWIP_SOCKET */
+#if LWIP_MDNS_APP
+ mdns_example_init();
+#endif
+#if LWIP_SNMP_APP
+ snmp_example_init();
+#endif
+#if LWIP_SNTP_APP
+ sntp_example_init();
+#endif
+#if LWIP_TFTP_APP
+ tftp_example_init_server();
+#endif
+#if LWIP_TFTP_CLIENT_APP
+ tftp_example_init_client();
+#endif
+#if LWIP_LWIPERF_APP
+ lwiperf_example_init();
+#endif
+#if LWIP_MQTT_APP
+ mqtt_example_init();
+#endif
+
+#ifdef LWIP_APP_INIT
+ LWIP_APP_INIT();
+#endif
+}
+
+/* This function initializes this lwIP test. When NO_SYS=1, this is done in
+ * the main_loop context (there is no other one), when NO_SYS=0, this is done
+ * in the tcpip_thread context */
+static void
+test_init(void * arg)
+{ /* remove compiler warning */
+#if NO_SYS
+ LWIP_UNUSED_ARG(arg);
+#else /* NO_SYS */
+ sys_sem_t *init_sem;
+ LWIP_ASSERT("arg != NULL", arg != NULL);
+ init_sem = (sys_sem_t*)arg;
+#endif /* NO_SYS */
+
+ /* init randomizer again (seed per thread) */
+ srand((unsigned int)time(NULL));
+
+ /* init network interfaces */
+ test_netif_init();
+
+ /* init apps */
+ apps_init();
+
+#if !NO_SYS
+ sys_sem_signal(init_sem);
+#endif /* !NO_SYS */
+}
+
+/* This is somewhat different to other ports: we have a main loop here:
+ * a dedicated task that waits for packets to arrive. This would normally be
+ * done from interrupt context with embedded hardware, but we don't get an
+ * interrupt in windows for that :-) */
+static void
+main_loop(void)
+{
+#if !NO_SYS
+ err_t err;
+ sys_sem_t init_sem;
+#endif /* NO_SYS */
+#if USE_PPP
+#if !USE_ETHERNET
+ int count;
+ u8_t rxbuf[1024];
+#endif
+ volatile int callClosePpp = 0;
+#endif /* USE_PPP */
+
+ /* initialize lwIP stack, network interfaces and applications */
+#if NO_SYS
+ lwip_init();
+ test_init(NULL);
+#else /* NO_SYS */
+ err = sys_sem_new(&init_sem, 0);
+ LWIP_ASSERT("failed to create init_sem", err == ERR_OK);
+ LWIP_UNUSED_ARG(err);
+ tcpip_init(test_init, &init_sem);
+ /* we have to wait for initialization to finish before
+ * calling update_adapter()! */
+ sys_sem_wait(&init_sem);
+ sys_sem_free(&init_sem);
+#endif /* NO_SYS */
+
+#if (LWIP_SOCKET || LWIP_NETCONN) && LWIP_NETCONN_SEM_PER_THREAD
+ netconn_thread_init();
+#endif
+
+ /* MAIN LOOP for driver update (and timers if NO_SYS) */
+ while (!LWIP_EXAMPLE_APP_ABORT()) {
+#if NO_SYS
+ /* handle timers (already done in tcpip.c when NO_SYS=0) */
+ sys_check_timeouts();
+#endif /* NO_SYS */
+
+#if USE_ETHERNET
+ default_netif_poll();
+#else /* USE_ETHERNET */
+ /* try to read characters from serial line and pass them to PPPoS */
+ count = sio_read(ppp_sio, (u8_t*)rxbuf, 1024);
+ if(count > 0) {
+ pppos_input(ppp, rxbuf, count);
+ } else {
+ /* nothing received, give other tasks a chance to run */
+ sys_msleep(1);
+ }
+
+#endif /* USE_ETHERNET */
+#if USE_SLIPIF
+ slipif_poll(&slipif1);
+#if USE_SLIPIF > 1
+ slipif_poll(&slipif2);
+#endif /* USE_SLIPIF > 1 */
+#endif /* USE_SLIPIF */
+#if ENABLE_LOOPBACK && !LWIP_NETIF_LOOPBACK_MULTITHREADING
+ /* check for loopback packets on all netifs */
+ netif_poll_all();
+#endif /* ENABLE_LOOPBACK && !LWIP_NETIF_LOOPBACK_MULTITHREADING */
+#if USE_PPP
+ {
+ int do_hup = 0;
+ if(do_hup) {
+ ppp_close(ppp, 1);
+ do_hup = 0;
+ }
+ }
+ if(callClosePpp && ppp) {
+ /* make sure to disconnect PPP before stopping the program... */
+ callClosePpp = 0;
+#if NO_SYS
+ ppp_close(ppp, 0);
+#else
+ pppapi_close(ppp, 0);
+#endif
+ ppp = NULL;
+ }
+#endif /* USE_PPP */
+ }
+
+#if USE_PPP
+ if(ppp) {
+ u32_t started;
+ printf("Closing PPP connection...\n");
+ /* make sure to disconnect PPP before stopping the program... */
+#if NO_SYS
+ ppp_close(ppp, 0);
+#else
+ pppapi_close(ppp, 0);
+#endif
+ ppp = NULL;
+ /* Wait for some time to let PPP finish... */
+ started = sys_now();
+ do
+ {
+#if USE_ETHERNET
+ default_netif_poll();
+#endif
+ /* @todo: need a better check here: only wait until PPP is down */
+ } while(sys_now() - started < 5000);
+ }
+#endif /* USE_PPP */
+#if (LWIP_SOCKET || LWIP_NETCONN) && LWIP_NETCONN_SEM_PER_THREAD
+ netconn_thread_cleanup();
+#endif
+#if USE_ETHERNET
+ default_netif_shutdown();
+#endif /* USE_ETHERNET */
+}
+
+#if USE_PPP && PPPOS_SUPPORT
+int main(int argc, char **argv)
+#else /* USE_PPP && PPPOS_SUPPORT */
+int main(void)
+#endif /* USE_PPP && PPPOS_SUPPORT */
+{
+#if USE_PPP && PPPOS_SUPPORT
+ if(argc > 1) {
+ sio_idx = (u8_t)atoi(argv[1]);
+ }
+ printf("Using serial port %d for PPP\n", sio_idx);
+#endif /* USE_PPP && PPPOS_SUPPORT */
+ /* no stdio-buffering, please! */
+ setvbuf(stdout, NULL,_IONBF, 0);
+
+ main_loop();
+
+ return 0;
+}
+
+/* This function is only required to prevent arch.h including stdio.h
+ * (which it does if LWIP_PLATFORM_ASSERT is undefined)
+ */
+void lwip_example_app_platform_assert(const char *msg, int line, const char *file)
+{
+ printf("Assertion \"%s\" failed at line %d in %s\n", msg, line, file);
+ fflush(NULL);
+ abort();
+}
diff --git a/contrib/examples/example_app/test_configs/opt_default.h b/contrib/examples/example_app/test_configs/opt_default.h
new file mode 100644
index 0000000..67b69d2
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_default.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 1
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP 1
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 1
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 1
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 0
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_dualstack.h b/contrib/examples/example_app/test_configs/opt_dualstack.h
new file mode 100644
index 0000000..4caf490
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_dualstack.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 1
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP LWIP_UDP
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 1
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 1
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 1
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_ipv4only.h b/contrib/examples/example_app/test_configs/opt_ipv4only.h
new file mode 100644
index 0000000..82ba467
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_ipv4only.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 1
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP LWIP_UDP
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 1
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 1
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 0
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_ipv6only.h b/contrib/examples/example_app/test_configs/opt_ipv6only.h
new file mode 100644
index 0000000..b3cb1e0
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_ipv6only.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 0
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP 0
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 1
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 1
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 1
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_tcp_dualstack.h b/contrib/examples/example_app/test_configs/opt_no_tcp_dualstack.h
new file mode 100644
index 0000000..9d70ace
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_tcp_dualstack.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_dualstack.h"
+
+#undef LWIP_TCP
+#define LWIP_TCP 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_tcp_ipv4only.h b/contrib/examples/example_app/test_configs/opt_no_tcp_ipv4only.h
new file mode 100644
index 0000000..bd22831
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_tcp_ipv4only.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_ipv4only.h"
+
+#undef LWIP_TCP
+#define LWIP_TCP 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_tcp_ipv6only.h b/contrib/examples/example_app/test_configs/opt_no_tcp_ipv6only.h
new file mode 100644
index 0000000..9f956e3
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_tcp_ipv6only.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_ipv6only.h"
+
+#undef LWIP_TCP
+#define LWIP_TCP 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_udp_dualstack.h b/contrib/examples/example_app/test_configs/opt_no_udp_dualstack.h
new file mode 100644
index 0000000..c9b9e9a
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_udp_dualstack.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_dualstack.h"
+
+#undef LWIP_UDP
+#define LWIP_UDP 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_udp_ipv4only.h b/contrib/examples/example_app/test_configs/opt_no_udp_ipv4only.h
new file mode 100644
index 0000000..7aa3ace
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_udp_ipv4only.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_ipv4only.h"
+
+#undef LWIP_UDP
+#define LWIP_UDP 0
diff --git a/contrib/examples/example_app/test_configs/opt_no_udp_ipv6only.h b/contrib/examples/example_app/test_configs/opt_no_udp_ipv6only.h
new file mode 100644
index 0000000..0572798
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_no_udp_ipv6only.h
@@ -0,0 +1,4 @@
+#include "test_configs/opt_ipv6only.h"
+
+#undef LWIP_UDP
+#define LWIP_UDP 0
diff --git a/contrib/examples/example_app/test_configs/opt_none.h b/contrib/examples/example_app/test_configs/opt_none.h
new file mode 100644
index 0000000..3c39321
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_none.h
@@ -0,0 +1,2 @@
+/* test and empty lwipopts.h file */
+
diff --git a/contrib/examples/example_app/test_configs/opt_nosys_dual.h b/contrib/examples/example_app/test_configs/opt_nosys_dual.h
new file mode 100644
index 0000000..17ee97f
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_nosys_dual.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 1
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP 1
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 0
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 0
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 1
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_nosys_ipv4.h b/contrib/examples/example_app/test_configs/opt_nosys_ipv4.h
new file mode 100644
index 0000000..024d79b
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_nosys_ipv4.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 1
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP 1
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 0
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 0
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 0
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/example_app/test_configs/opt_nosys_ipv6.h b/contrib/examples/example_app/test_configs/opt_nosys_ipv6.h
new file mode 100644
index 0000000..d027352
--- /dev/null
+++ b/contrib/examples/example_app/test_configs/opt_nosys_ipv6.h
@@ -0,0 +1,295 @@
+/* test an lwipopts.h file with default contents */
+#define NO_SYS 0
+#define NO_SYS_NO_TIMERS 0
+#define LWIP_TIMERS 1
+#define LWIP_TIMERS_CUSTOM 0
+#define LWIP_MPU_COMPATIBLE 0
+#define LWIP_TCPIP_CORE_LOCKING 1
+#define LWIP_TCPIP_CORE_LOCKING_INPUT 0
+#define SYS_LIGHTWEIGHT_PROT 1
+#define MEM_LIBC_MALLOC 0
+#define MEMP_MEM_MALLOC 0
+#define MEMP_MEM_INIT 0
+#define MEM_ALIGNMENT 1
+#define MEM_SIZE 1600
+#define MEMP_OVERFLOW_CHECK 0
+#define MEMP_SANITY_CHECK 0
+#define MEM_OVERFLOW_CHECK 0
+#define MEM_SANITY_CHECK 0
+#define MEM_USE_POOLS 0
+#define MEM_USE_POOLS_TRY_BIGGER_POOL 0
+#define MEMP_USE_CUSTOM_POOLS 0
+#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0
+/*#define MEMP_NUM_PBUF 16
+#define MEMP_NUM_RAW_PCB 4
+#define MEMP_NUM_UDP_PCB 4
+#define MEMP_NUM_TCP_PCB 5
+#define MEMP_NUM_TCP_PCB_LISTEN 8
+#define MEMP_NUM_TCP_SEG 16
+#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB
+#define MEMP_NUM_REASSDATA 5
+#define MEMP_NUM_FRAG_PBUF 15
+#define MEMP_NUM_ARP_QUEUE 30
+#define MEMP_NUM_IGMP_GROUP 8
+#define MEMP_NUM_SYS_TIMEOUT (LWIP_NUM_SYS_TIMEOUT_INTERNAL + 2)
+#define MEMP_NUM_NETBUF 2
+#define MEMP_NUM_NETCONN 4
+#define MEMP_NUM_SELECT_CB 4
+#define MEMP_NUM_TCPIP_MSG_API 8
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+#define MEMP_NUM_NETDB 1
+#define MEMP_NUM_LOCALHOSTLIST 1
+#define PBUF_POOL_SIZE 16
+#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API
+#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API*/
+#define LWIP_ARP 1
+#define ARP_TABLE_SIZE 10
+#define ARP_MAXAGE 300
+#define ARP_QUEUEING 0
+#define ARP_QUEUE_LEN 3
+#define ETHARP_SUPPORT_VLAN 0
+#define LWIP_ETHERNET LWIP_ARP
+#define ETH_PAD_SIZE 0
+#define ETHARP_SUPPORT_STATIC_ENTRIES 0
+#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF
+#define LWIP_IPV4 0
+#define IP_FORWARD 0
+#define IP_REASSEMBLY 1
+#define IP_FRAG 1
+#define IP_OPTIONS_ALLOWED 1
+#define IP_REASS_MAXAGE 15
+#define IP_REASS_MAX_PBUFS 10
+#define IP_DEFAULT_TTL 255
+#define IP_SOF_BROADCAST 0
+#define IP_SOF_BROADCAST_RECV 0
+#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0
+#define LWIP_ICMP 1
+#define ICMP_TTL (IP_DEFAULT_TTL)
+#define LWIP_BROADCAST_PING 0
+#define LWIP_MULTICAST_PING 0
+#define LWIP_RAW 0
+#define RAW_TTL (IP_DEFAULT_TTL)
+#define LWIP_DHCP 0
+#define LWIP_DHCP_CHECK_LINK_UP 0
+#define LWIP_DHCP_BOOTP_FILE 0
+#define LWIP_DHCP_GET_NTP_SRV 0
+#define LWIP_DHCP_MAX_NTP_SERVERS 1
+#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS
+#define LWIP_AUTOIP 0
+#define LWIP_DHCP_AUTOIP_COOP 0
+#define LWIP_DHCP_AUTOIP_COOP_TRIES 9
+#define LWIP_MIB2_CALLBACKS 0
+#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW))
+#define LWIP_IGMP 0
+#define LWIP_DNS 0
+#define DNS_TABLE_SIZE 4
+#define DNS_MAX_NAME_LENGTH 256
+#define DNS_MAX_SERVERS 2
+#define DNS_MAX_RETRIES 4
+#define DNS_DOES_NAME_CHECK 1
+#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)
+#define DNS_LOCAL_HOSTLIST 0
+#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0
+#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 0
+#define UDP_TTL (IP_DEFAULT_TTL)
+#define LWIP_NETBUF_RECVINFO 0
+#define LWIP_TCP 1
+#define TCP_TTL (IP_DEFAULT_TTL)
+#define TCP_WND (4 * TCP_MSS)
+#define TCP_MAXRTX 12
+#define TCP_SYNMAXRTX 6
+#define TCP_QUEUE_OOSEQ (LWIP_TCP)
+#define LWIP_TCP_SACK_OUT 0
+#define LWIP_TCP_MAX_SACK_NUM 4
+#define TCP_MSS 536
+#define TCP_CALCULATE_EFF_SEND_MSS 1
+#define TCP_SND_BUF (2 * TCP_MSS)
+#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))
+#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)
+#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)
+#define TCP_OOSEQ_MAX_BYTES 0
+#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES
+#define TCP_OOSEQ_MAX_PBUFS 0
+#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS
+#define TCP_LISTEN_BACKLOG 0
+#define TCP_DEFAULT_LISTEN_BACKLOG 0xff
+#define TCP_OVERSIZE TCP_MSS
+#define LWIP_TCP_TIMESTAMPS 0
+#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))
+#define LWIP_EVENT_API 0
+#define LWIP_CALLBACK_API 1
+#define LWIP_WND_SCALE 0
+#define TCP_RCV_SCALE 0
+#define LWIP_TCP_PCB_NUM_EXT_ARGS 0
+#define LWIP_ALTCP 0
+#define LWIP_ALTCP_TLS 0
+#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE)
+#define PBUF_LINK_ENCAPSULATION_HLEN 0
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)
+#define LWIP_PBUF_REF_T u8_t
+#define LWIP_SINGLE_NETIF 0
+#define LWIP_NETIF_HOSTNAME 0
+#define LWIP_NETIF_API 0
+#define LWIP_NETIF_STATUS_CALLBACK 0
+#define LWIP_NETIF_EXT_STATUS_CALLBACK 0
+#define LWIP_NETIF_LINK_CALLBACK 0
+#define LWIP_NETIF_REMOVE_CALLBACK 0
+#define LWIP_NETIF_HWADDRHINT 0
+#define LWIP_NETIF_TX_SINGLE_PBUF 0
+#define LWIP_NUM_NETIF_CLIENT_DATA 0
+#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF)
+#define LWIP_LOOPIF_MULTICAST 0
+#define LWIP_NETIF_LOOPBACK 0
+#define LWIP_LOOPBACK_MAX_PBUFS 0
+#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS)
+/*#define TCPIP_THREAD_NAME "tcpip_thread"
+#define TCPIP_THREAD_STACKSIZE 0
+#define TCPIP_THREAD_PRIO 1
+#define TCPIP_MBOX_SIZE 0
+#define LWIP_TCPIP_THREAD_ALIVE()
+#define SLIPIF_THREAD_NAME "slipif_loop"
+#define SLIPIF_THREAD_STACKSIZE 0
+#define SLIPIF_THREAD_PRIO 1
+#define DEFAULT_THREAD_NAME "lwIP"
+#define DEFAULT_THREAD_STACKSIZE 0
+#define DEFAULT_THREAD_PRIO 1
+#define DEFAULT_RAW_RECVMBOX_SIZE 0
+#define DEFAULT_UDP_RECVMBOX_SIZE 0
+#define DEFAULT_TCP_RECVMBOX_SIZE 0
+#define DEFAULT_ACCEPTMBOX_SIZE 0*/
+#define LWIP_NETCONN 0
+#define LWIP_TCPIP_TIMEOUT 0
+#define LWIP_NETCONN_SEM_PER_THREAD 0
+#define LWIP_NETCONN_FULLDUPLEX 0
+#define LWIP_SOCKET 0
+#define LWIP_COMPAT_SOCKETS 1 /* 0..2 */
+#define LWIP_POSIX_SOCKETS_IO_NAMES 1
+#define LWIP_SOCKET_OFFSET 0
+#define LWIP_TCP_KEEPALIVE 0
+#define LWIP_SO_SNDTIMEO 0
+#define LWIP_SO_RCVTIMEO 0
+#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0
+#define LWIP_SO_RCVBUF 0
+#define LWIP_SO_LINGER 0
+#define RECV_BUFSIZE_DEFAULT INT_MAX
+#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000
+#define SO_REUSE 0
+#define SO_REUSE_RXTOALL 0
+#define LWIP_FIONREAD_LINUXMODE 0
+#define LWIP_SOCKET_SELECT 1
+#define LWIP_SOCKET_POLL 1
+#define LWIP_STATS 1
+#define LWIP_STATS_DISPLAY 0
+#define LINK_STATS 1
+#define ETHARP_STATS (LWIP_ARP)
+#define IP_STATS 1
+#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG)
+#define ICMP_STATS 1
+#define IGMP_STATS (LWIP_IGMP)
+#define UDP_STATS (LWIP_UDP)
+#define TCP_STATS (LWIP_TCP)
+#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))
+#define MEMP_STATS (MEMP_MEM_MALLOC == 0)
+#define SYS_STATS (NO_SYS == 0)
+#define IP6_STATS (LWIP_IPV6)
+#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6)
+#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))
+#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD)
+#define ND6_STATS (LWIP_IPV6)
+#define MIB2_STATS 0
+#define LWIP_CHECKSUM_CTRL_PER_NETIF 0
+#define CHECKSUM_GEN_IP 1
+#define CHECKSUM_GEN_UDP 1
+#define CHECKSUM_GEN_TCP 1
+#define CHECKSUM_GEN_ICMP 1
+#define CHECKSUM_GEN_ICMP6 1
+#define CHECKSUM_CHECK_IP 1
+#define CHECKSUM_CHECK_UDP 1
+#define CHECKSUM_CHECK_TCP 1
+#define CHECKSUM_CHECK_ICMP 1
+#define CHECKSUM_CHECK_ICMP6 1
+#define LWIP_CHECKSUM_ON_COPY 0
+#define LWIP_IPV6 1
+#define IPV6_REASS_MAXAGE 60
+#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF)
+#define LWIP_IPV6_SCOPES_DEBUG 0
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_IPV6_FORWARD 0
+#define LWIP_IPV6_FRAG 1
+#define LWIP_IPV6_REASS (LWIP_IPV6)
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6)
+#define LWIP_IPV6_ADDRESS_LIFETIMES (LWIP_IPV6_AUTOCONFIG)
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_ICMP6 (LWIP_IPV6)
+#define LWIP_ICMP6_DATASIZE 8
+#define LWIP_ICMP6_HL 255
+#define LWIP_IPV6_MLD (LWIP_IPV6)
+#define MEMP_NUM_MLD6_GROUP 4
+#define LWIP_ND6_QUEUEING (LWIP_IPV6)
+#define MEMP_NUM_ND6_QUEUE 20
+#define LWIP_ND6_NUM_NEIGHBORS 10
+#define LWIP_ND6_NUM_DESTINATIONS 10
+#define LWIP_ND6_NUM_PREFIXES 5
+#define LWIP_ND6_NUM_ROUTERS 3
+#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3
+#define LWIP_ND6_MAX_UNICAST_SOLICIT 3
+#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000
+#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3
+#define LWIP_ND6_REACHABLE_TIME 30000
+#define LWIP_ND6_RETRANS_TIMER 1000
+#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000
+#define LWIP_ND6_ALLOW_RA_UPDATES 1
+#define LWIP_ND6_TCP_REACHABILITY_HINTS 1
+#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0
+#define LWIP_IPV6_DHCP6 0
+#define LWIP_IPV6_DHCP6_STATEFUL 0
+#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6
+#define LWIP_DHCP6_GET_NTP_SRV 0
+#define LWIP_DHCP6_MAX_NTP_SERVERS 1
+#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS
+
+/* TODO: check hooks */
+
+#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#define DHCP6_DEBUG LWIP_DBG_OFF
+#define LWIP_TESTMODE 0
+
+#define LWIP_PERF 0
diff --git a/contrib/examples/httpd/cgi_example/cgi_example.c b/contrib/examples/httpd/cgi_example/cgi_example.c
new file mode 100644
index 0000000..c9c7476
--- /dev/null
+++ b/contrib/examples/httpd/cgi_example/cgi_example.c
@@ -0,0 +1,107 @@
+/**
+ * @file
+ * HTTPD simple CGI example
+ *
+ * This file demonstrates how to add support for basic CGI.
+ */
+
+ /*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+#include "cgi_example.h"
+
+#include "lwip/apps/httpd.h"
+
+#include "lwip/def.h"
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_CGI_SIMPLE to 1 to enable this cgi example */
+#ifndef LWIP_HTTPD_EXAMPLE_CGI_SIMPLE
+#define LWIP_HTTPD_EXAMPLE_CGI_SIMPLE 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_CGI_SIMPLE
+
+#if !LWIP_HTTPD_CGI
+#error LWIP_HTTPD_EXAMPLE_CGI_SIMPLE needs LWIP_HTTPD_CGI
+#endif
+
+static const char *cgi_handler_basic(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]);
+
+static const tCGI cgi_handlers[] = {
+ {
+ "/basic_cgi",
+ cgi_handler_basic
+ },
+ {
+ "/basic_cgi_2",
+ cgi_handler_basic
+ }
+};
+
+void
+cgi_ex_init(void)
+{
+ http_set_cgi_handlers(cgi_handlers, LWIP_ARRAYSIZE(cgi_handlers));
+}
+
+/** This basic CGI function can parse param/value pairs and return an url that
+ * is sent as a response by httpd.
+ *
+ * This example function just checks that the input url has two key value
+ * parameter pairs: "foo=bar" and "test=123"
+ * If not, it returns 404
+ */
+static const char *
+cgi_handler_basic(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
+{
+ LWIP_ASSERT("check index", iIndex < LWIP_ARRAYSIZE(cgi_handlers));
+
+ if (iNumParams == 2) {
+ if (!strcmp(pcParam[0], "foo")) {
+ if (!strcmp(pcValue[0], "bar")) {
+ if (!strcmp(pcParam[1], "test")) {
+ if (!strcmp(pcValue[1], "123")) {
+ return "/index.html";
+ }
+ }
+ }
+ }
+ }
+ return "/404.html";
+}
+
+#endif /* LWIP_HTTPD_EXAMPLE_CGI_SIMPLE */
diff --git a/contrib/examples/httpd/cgi_example/cgi_example.h b/contrib/examples/httpd/cgi_example/cgi_example.h
new file mode 100644
index 0000000..b655661
--- /dev/null
+++ b/contrib/examples/httpd/cgi_example/cgi_example.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE
+#define LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE
+
+void cgi_ex_init(void);
+
+#endif /* LWIP_HDR_HTTP_EXAMPLES_CGI_EXAMPLE */
diff --git a/contrib/examples/httpd/examples_fs/404.html b/contrib/examples/httpd/examples_fs/404.html
new file mode 100644
index 0000000..40b343a
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/404.html
@@ -0,0 +1,21 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+ <table width="100%">
+ <tr valign="top"><td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif"
+ border="0" alt="SICS logo" title="SICS logo"></a>
+ </td><td width="500">
+ <h1>lwIP - A Lightweight TCP/IP Stack</h1>
+ <h2>404 - Page not found</h2>
+ <p>
+ Sorry, the page you are requesting was not found on this
+ server.
+ </p>
+ </td><td>
+
+ </td></tr>
+ </table>
+</body>
+</html>
diff --git a/contrib/examples/httpd/examples_fs/img/sics.gif b/contrib/examples/httpd/examples_fs/img/sics.gif
new file mode 100644
index 0000000..0a4fc7b
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/img/sics.gif
Binary files differ
diff --git a/contrib/examples/httpd/examples_fs/index.html b/contrib/examples/httpd/examples_fs/index.html
new file mode 100644
index 0000000..ab575ef
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/index.html
@@ -0,0 +1,47 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+ <table width="100%">
+ <tr valign="top"><td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif"
+ border="0" alt="SICS logo" title="SICS logo"></a>
+ </td><td width="500">
+ <h1>lwIP - A Lightweight TCP/IP Stack</h1>
+ <p>
+ The web page you are watching was served by a simple web
+ server running on top of the lightweight TCP/IP stack <a
+ href="http://www.sics.se/~adam/lwip/">lwIP</a>.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ The focus of the lwIP TCP/IP implementation is to reduce
+ the RAM usage while still having a full scale TCP. This
+ makes lwIP suitable for use in embedded systems with tens
+ of kilobytes of free RAM and room for around 40 kilobytes
+ of code ROM.
+ </p>
+ <p>
+ More information about lwIP can be found at the lwIP
+ homepage at <a
+ href="http://savannah.nongnu.org/projects/lwip/">http://savannah.nongnu.org/projects/lwip/</a>
+ or at the lwIP wiki at <a
+ href="http://lwip.wikia.com/">http://lwip.wikia.com/</a>.
+ </p>
+ </td><td>
+
+ </td></tr>
+ </table>
+</body>
+</html>
+
diff --git a/contrib/examples/httpd/examples_fs/login.html b/contrib/examples/httpd/examples_fs/login.html
new file mode 100644
index 0000000..71c535b
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/login.html
@@ -0,0 +1,28 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+<table width="100%">
+ <tr valign="top">
+ <td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif" border="0" alt="SICS logo" title="SICS logo"/></a>
+ </td>
+ <td width="500">
+ <h1>Login</h1>
+ <form name="login" action="login.cgi" method="post">
+ <div>
+ <label><b>Username</b></label>
+ <input type="text" placeholder="Enter Username" name="user" required>
+ <label><b>Password</b></label>
+ <input type="password" placeholder="Enter Password" name="pass" required>
+ <button type="submit">Login</button>
+ </div>
+ </form>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/contrib/examples/httpd/examples_fs/loginfail.html b/contrib/examples/httpd/examples_fs/loginfail.html
new file mode 100644
index 0000000..6d5c742
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/loginfail.html
@@ -0,0 +1,25 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+ <table width="100%">
+ <tr valign="top">
+ <td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif" border="0" alt="SICS logo" title="SICS logo"/></a>
+ </td>
+ <td width="500">
+ <h1>lwIP - A Lightweight TCP/IP Stack</h1>
+ <p>
+ Login failed.
+ </p>
+ <p>
+ Click <a href="login.html">here</a> to retry login.
+ </p>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/contrib/examples/httpd/examples_fs/session.html b/contrib/examples/httpd/examples_fs/session.html
new file mode 100644
index 0000000..72d3bff
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/session.html
@@ -0,0 +1,25 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+ <table width="100%">
+ <tr valign="top">
+ <td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif" border="0" alt="SICS logo" title="SICS logo"/></a>
+ </td>
+ <td width="500">
+ <h1>lwIP - A Lightweight TCP/IP Stack</h1>
+ <p>
+ Login succeeded, session active.
+ </p>
+ <p>
+ Click <a href="login.html">here</a> to retry login.
+ </p>
+ </td>
+ <td>
+
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/contrib/examples/httpd/examples_fs/ssi.shtml b/contrib/examples/httpd/examples_fs/ssi.shtml
new file mode 100644
index 0000000..153d016
--- /dev/null
+++ b/contrib/examples/httpd/examples_fs/ssi.shtml
@@ -0,0 +1,315 @@
+<html>
+<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>
+<body bgcolor="white" text="black">
+
+ <table width="100%">
+ <tr valign="top"><td width="80">
+ <a href="http://www.sics.se/"><img src="/img/sics.gif"
+ border="0" alt="SICS logo" title="SICS logo"></a>
+ </td><td width="500">
+ <h1>lwIP - A Lightweight TCP/IP Stack</h1>
+ <h1><!--#HellWorl--></h1>
+ <p>
+ The web page you are watching was served by a simple web
+ server running on top of the lightweight TCP/IP stack <a
+ href="http://www.sics.se/~adam/lwip/">lwIP</a>.
+ </p>
+ <p>
+ This page is here to test SSI, so here is a counter as
+ an example of content changing for every request:
+ "<!--#counter-->"
+ </p>
+ <p>
+ And here is an example of a tag result buffer return in
+ multiple parts: "<!--#MultPart-->"
+ </p>
+ <p>
+ To test LWIP_HTTPD_CGI_SSI, here are the CGI parameters:
+ <!--#CgiParam-->
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ lwIP is an open source implementation of the TCP/IP
+ protocol suite that was originally written by <a
+ href="http://www.sics.se/~adam/lwip/">Adam Dunkels
+ of the Swedish Institute of Computer Science</a> but now is
+ being actively developed by a team of developers
+ distributed world-wide. Since it's release, lwIP has
+ spurred a lot of interest and has been ported to several
+ platforms and operating systems. lwIP can be used either
+ with or without an underlying OS.
+ </p>
+ <p>
+ The focus of the lwIP TCP/IP implementation is to reduce
+ the RAM usage while still having a full scale TCP. This
+ makes lwIP suitable for use in embedded systems with tens
+ of kilobytes of free RAM and room for around 40 kilobytes
+ of code ROM.
+ </p>
+ <p>
+ More information about lwIP can be found at the lwIP
+ homepage at <a
+ href="http://savannah.nongnu.org/projects/lwip/">http://savannah.nongnu.org/projects/lwip/</a>
+ or at the lwIP wiki at <a
+ href="http://lwip.wikia.com/">http://lwip.wikia.com/</a>.
+ </p>
+ </td><td>
+
+ </td></tr>
+ </table>
+</body>
+</html>
+
diff --git a/contrib/examples/httpd/examples_fsdata.c b/contrib/examples/httpd/examples_fsdata.c
new file mode 100644
index 0000000..7eed926
--- /dev/null
+++ b/contrib/examples/httpd/examples_fsdata.c
@@ -0,0 +1,1543 @@
+#include "lwip/apps/fs.h"
+#include "lwip/def.h"
+
+
+#define file_NULL (struct fsdata_file *) NULL
+
+
+#ifndef FS_FILE_FLAGS_HEADER_INCLUDED
+#define FS_FILE_FLAGS_HEADER_INCLUDED 1
+#endif
+#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT
+#define FS_FILE_FLAGS_HEADER_PERSISTENT 0
+#endif
+/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */
+#ifndef FSDATA_FILE_ALIGNMENT
+#define FSDATA_FILE_ALIGNMENT 0
+#endif
+#ifndef FSDATA_ALIGN_PRE
+#define FSDATA_ALIGN_PRE
+#endif
+#ifndef FSDATA_ALIGN_POST
+#define FSDATA_ALIGN_POST
+#endif
+#if FSDATA_FILE_ALIGNMENT==2
+#include "fsdata_alignment.h"
+#endif
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__img_sics_gif = 0;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__img_sics_gif[] FSDATA_ALIGN_POST = {
+/* /img/sics.gif (14 chars) */
+0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x00,0x00,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 724
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x37,0x32,0x34,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: image/gif
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d,
+0x61,0x67,0x65,0x2f,0x67,0x69,0x66,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (724 bytes) */
+0x47,0x49,0x46,0x38,0x39,0x61,0x46,0x00,0x22,0x00,0xa5,0x00,0x00,0xd9,0x2b,0x39,
+0x6a,0x6a,0x6a,0xbf,0xbf,0xbf,0x93,0x93,0x93,0x0f,0x0f,0x0f,0xb0,0xb0,0xb0,0xa6,
+0xa6,0xa6,0x80,0x80,0x80,0x76,0x76,0x76,0x1e,0x1e,0x1e,0x9d,0x9d,0x9d,0x2e,0x2e,
+0x2e,0x49,0x49,0x49,0x54,0x54,0x54,0x8a,0x8a,0x8a,0x60,0x60,0x60,0xc6,0xa6,0x99,
+0xbd,0xb5,0xb2,0xc2,0xab,0xa1,0xd9,0x41,0x40,0xd5,0x67,0x55,0xc0,0xb0,0xaa,0xd5,
+0x5e,0x4e,0xd6,0x50,0x45,0xcc,0x93,0x7d,0xc8,0xa1,0x90,0xce,0x8b,0x76,0xd2,0x7b,
+0x65,0xd1,0x84,0x6d,0xc9,0x99,0x86,0x3a,0x3a,0x3a,0x00,0x00,0x00,0xb8,0xb8,0xb8,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2c,0x00,0x00,
+0x00,0x00,0x46,0x00,0x22,0x00,0x00,0x06,0xfe,0x40,0x90,0x70,0x48,0x2c,0x1a,0x8f,
+0xc8,0xa4,0x72,0xc9,0x6c,0x3a,0x9f,0xd0,0xa8,0x74,0x4a,0xad,0x5a,0xaf,0xd8,0xac,
+0x76,0xa9,0x40,0x04,0xbe,0x83,0xe2,0x60,0x3c,0x50,0x20,0x0d,0x8e,0x6f,0x00,0x31,
+0x28,0x1c,0x0d,0x07,0xb5,0xc3,0x60,0x75,0x24,0x3e,0xf8,0xfc,0x87,0x11,0x06,0xe9,
+0x3d,0x46,0x07,0x0b,0x7a,0x7a,0x7c,0x43,0x06,0x1e,0x84,0x78,0x0b,0x07,0x6e,0x51,
+0x01,0x8a,0x84,0x08,0x7e,0x79,0x80,0x87,0x89,0x91,0x7a,0x93,0x0a,0x04,0x99,0x78,
+0x96,0x4f,0x03,0x9e,0x79,0x01,0x94,0x9f,0x43,0x9c,0xa3,0xa4,0x05,0x77,0xa3,0xa0,
+0x4e,0x98,0x79,0x0b,0x1e,0x83,0xa4,0xa6,0x1f,0x96,0x05,0x9d,0xaa,0x78,0x01,0x07,
+0x84,0x04,0x1e,0x1e,0xbb,0xb8,0x51,0x84,0x0e,0x43,0x05,0x07,0x77,0xa5,0x7f,0x42,
+0xb1,0xb2,0x01,0x63,0x08,0x0d,0xbb,0x01,0x0c,0x7a,0x0d,0x44,0x0e,0xd8,0xaf,0x4c,
+0x05,0x7a,0x04,0x47,0x07,0x07,0xb7,0x80,0xa2,0xe1,0x7d,0x44,0x05,0x01,0x04,0x01,
+0xd0,0xea,0x87,0x93,0x4f,0xe0,0x9a,0x49,0xce,0xd8,0x79,0x04,0x66,0x20,0x15,0x10,
+0x10,0x11,0x92,0x29,0x80,0xb6,0xc0,0x91,0x15,0x45,0x1e,0x90,0x19,0x71,0x46,0xa8,
+0x5c,0x04,0x0e,0x00,0x22,0x4e,0xe8,0x40,0x24,0x9f,0x3e,0x04,0x06,0xa7,0x58,0xd4,
+0x93,0xa0,0x1c,0x91,0x3f,0xe8,0xf0,0x88,0x03,0xb1,0x21,0xa2,0x49,0x00,0x19,0x86,
+0xfc,0x52,0x44,0xe0,0x01,0x9d,0x29,0x21,0x15,0x25,0x50,0xf7,0x67,0x25,0x1e,0x06,
+0xfd,0x4e,0x9a,0xb4,0x90,0xac,0x15,0xfa,0xcb,0x52,0x53,0x1e,0x8c,0xf2,0xf8,0x07,
+0x92,0x2d,0x08,0x3a,0x4d,0x12,0x49,0x95,0x49,0xdb,0x14,0x04,0xc4,0x14,0x85,0x29,
+0xaa,0xe7,0x01,0x08,0xa4,0x49,0x01,0x14,0x51,0xe0,0x53,0x91,0xd5,0x29,0x06,0x1a,
+0x64,0x02,0xf4,0xc7,0x81,0x9e,0x05,0x20,0x22,0x64,0xa5,0x30,0xae,0xab,0x9e,0x97,
+0x53,0xd8,0xb9,0xfd,0x50,0xef,0x93,0x02,0x42,0x74,0x34,0xe8,0x9c,0x20,0x21,0xc9,
+0x01,0x68,0x78,0xe6,0x55,0x29,0x20,0x56,0x4f,0x4c,0x40,0x51,0x71,0x82,0xc0,0x70,
+0x21,0x22,0x85,0xbe,0x4b,0x1c,0x44,0x05,0xea,0xa4,0x01,0xbf,0x22,0xb5,0xf0,0x1c,
+0x06,0x51,0x38,0x8f,0xe0,0x22,0xec,0x18,0xac,0x39,0x22,0xd4,0xd6,0x93,0x44,0x01,
+0x32,0x82,0xc8,0xfc,0x61,0xb3,0x01,0x45,0x0c,0x2e,0x83,0x30,0xd0,0x0e,0x17,0x24,
+0x0f,0x70,0x85,0x94,0xee,0x05,0x05,0x53,0x4b,0x32,0x1b,0x3f,0x98,0xd3,0x1d,0x29,
+0x81,0xb0,0xae,0x1e,0x8c,0x7e,0x68,0xe0,0x60,0x5a,0x54,0x8f,0xb0,0x78,0x69,0x73,
+0x06,0xa2,0x00,0x6b,0x57,0xca,0x3d,0x11,0x50,0xbd,0x04,0x30,0x4b,0x3a,0xd4,0xab,
+0x5f,0x1f,0x9b,0x3d,0x13,0x74,0x27,0x88,0x3c,0x25,0xe0,0x17,0xbe,0x7a,0x79,0x45,
+0x0d,0x0c,0xb0,0x8b,0xda,0x90,0xca,0x80,0x06,0x5d,0x17,0x60,0x1c,0x22,0x4c,0xd8,
+0x57,0x22,0x06,0x20,0x00,0x98,0x07,0x08,0xe4,0x56,0x80,0x80,0x1c,0xc5,0xb7,0xc5,
+0x82,0x0c,0x36,0xe8,0xe0,0x83,0x10,0x46,0x28,0xe1,0x84,0x14,0x56,0x68,0xa1,0x10,
+0x41,0x00,0x00,0x3b,};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__404_html = 1;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__404_html[] FSDATA_ALIGN_POST = {
+/* /404.html (10 chars) */
+0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 404 File not found
+" (29 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c,
+0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 565
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x35,0x36,0x35,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (565 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,
+0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,
+0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c,
+0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20,
+0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,
+0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20,
+0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,
+0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,
+0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f,
+0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,
+0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,
+0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x68,0x32,0x3e,0x34,0x30,0x34,0x20,0x2d,0x20,0x50,0x61,0x67,0x65,0x20,
+0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x3c,0x2f,0x68,0x32,0x3e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x53,0x6f,0x72,
+0x72,0x79,0x2c,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,
+0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x20,
+0x77,0x61,0x73,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x6f,0x6e,
+0x20,0x74,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,
+0x65,0x72,0x2e,0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e,
+0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,
+0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,
+0x6d,0x6c,0x3e,0x0d,0x0a,};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__index_html = 2;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__index_html[] FSDATA_ALIGN_POST = {
+/* /index.html (12 chars) */
+0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 1751
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x31,0x37,0x35,0x31,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (1751 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,
+0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,
+0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c,
+0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20,
+0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,
+0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20,
+0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,
+0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,
+0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f,
+0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,
+0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,
+0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x77,
+0x65,0x62,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,0x20,0x61,0x72,0x65,0x20,
+0x77,0x61,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x77,0x61,0x73,0x20,0x73,0x65,0x72,
+0x76,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x73,0x69,0x6d,0x70,0x6c,0x65,0x20,
+0x77,0x65,0x62,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72,
+0x20,0x72,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x20,0x74,0x6f,0x70,0x20,
+0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,
+0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x73,0x74,0x61,0x63,0x6b,0x20,
+0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x6c,
+0x77,0x49,0x50,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,
+0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,
+0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,
+0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,
+0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,
+0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,
+0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,
+0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,
+0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,
+0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,
+0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,
+0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,
+0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,
+0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,
+0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,
+0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,
+0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,
+0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,
+0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,
+0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,
+0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,
+0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,
+0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,
+0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,
+0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,
+0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,
+0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,
+0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,
+0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,
+0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x66,0x6f,0x63,0x75,0x73,0x20,0x6f,
+0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x54,0x43,0x50,0x2f,0x49,
+0x50,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,
+0x20,0x69,0x73,0x20,0x74,0x6f,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x74,0x68,0x65,0x20,0x52,0x41,0x4d,0x20,0x75,0x73,0x61,0x67,
+0x65,0x20,0x77,0x68,0x69,0x6c,0x65,0x20,0x73,0x74,0x69,0x6c,0x6c,0x20,0x68,0x61,
+0x76,0x69,0x6e,0x67,0x20,0x61,0x20,0x66,0x75,0x6c,0x6c,0x20,0x73,0x63,0x61,0x6c,
+0x65,0x20,0x54,0x43,0x50,0x2e,0x20,0x54,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6d,0x61,0x6b,0x65,0x73,0x20,0x6c,0x77,0x49,0x50,0x20,0x73,0x75,0x69,
+0x74,0x61,0x62,0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,0x75,0x73,0x65,0x20,0x69,0x6e,
+0x20,0x65,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,
+0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x65,0x6e,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6f,0x66,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x20,0x6f,
+0x66,0x20,0x66,0x72,0x65,0x65,0x20,0x52,0x41,0x4d,0x20,0x61,0x6e,0x64,0x20,0x72,
+0x6f,0x6f,0x6d,0x20,0x66,0x6f,0x72,0x20,0x61,0x72,0x6f,0x75,0x6e,0x64,0x20,0x34,
+0x30,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6f,0x66,0x20,0x63,0x6f,0x64,0x65,0x20,0x52,0x4f,0x4d,0x2e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x4d,0x6f,0x72,0x65,0x20,0x69,0x6e,0x66,0x6f,0x72,
+0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x62,0x6f,0x75,0x74,0x20,0x6c,0x77,0x49,
+0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61,
+0x74,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x68,0x6f,0x6d,0x65,0x70,0x61,0x67,0x65,0x20,0x61,0x74,0x20,0x3c,0x61,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,
+0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,
+0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,
+0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,
+0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,
+0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x2f,
+0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x72,0x20,0x61,0x74,
+0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x77,0x69,0x6b,0x69,0x20,0x61,
+0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,
+0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,
+0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,
+0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x3c,
+0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e,
+0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,
+0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,
+0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__login_html = 3;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__login_html[] FSDATA_ALIGN_POST = {
+/* /login.html (12 chars) */
+0x2f,0x6c,0x6f,0x67,0x69,0x6e,0x2e,0x68,0x74,0x6d,0x6c,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 768
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x37,0x36,0x38,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (768 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x3c,0x74,
+0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x30,0x25,
+0x22,0x3e,0x0d,0x0a,0x20,0x3c,0x74,0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,
+0x22,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x61,
+0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,
+0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,
+0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,
+0x67,0x69,0x66,0x22,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,
+0x61,0x6c,0x74,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,
+0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,
+0x22,0x2f,0x3e,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,
+0x0d,0x0a,0x20,0x20,0x3c,0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x35,
+0x30,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x68,0x31,0x3e,0x4c,0x6f,0x67,
+0x69,0x6e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x66,0x6f,0x72,
+0x6d,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x6c,0x6f,0x67,0x69,0x6e,0x22,0x20,0x61,
+0x63,0x74,0x69,0x6f,0x6e,0x3d,0x22,0x6c,0x6f,0x67,0x69,0x6e,0x2e,0x63,0x67,0x69,
+0x22,0x20,0x6d,0x65,0x74,0x68,0x6f,0x64,0x3d,0x22,0x70,0x6f,0x73,0x74,0x22,0x3e,
+0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,
+0x20,0x20,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x62,0x3e,0x55,0x73,0x65,0x72,
+0x6e,0x61,0x6d,0x65,0x3c,0x2f,0x62,0x3e,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,0x3e,
+0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,0x79,
+0x70,0x65,0x3d,0x22,0x74,0x65,0x78,0x74,0x22,0x20,0x70,0x6c,0x61,0x63,0x65,0x68,
+0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x45,0x6e,0x74,0x65,0x72,0x20,0x55,0x73,0x65,
+0x72,0x6e,0x61,0x6d,0x65,0x22,0x20,0x6e,0x61,0x6d,0x65,0x3d,0x22,0x75,0x73,0x65,
+0x72,0x22,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x3e,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x20,0x3c,0x6c,0x61,0x62,0x65,0x6c,0x3e,0x3c,0x62,0x3e,0x50,0x61,0x73,
+0x73,0x77,0x6f,0x72,0x64,0x3c,0x2f,0x62,0x3e,0x3c,0x2f,0x6c,0x61,0x62,0x65,0x6c,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x3c,0x69,0x6e,0x70,0x75,0x74,0x20,0x74,
+0x79,0x70,0x65,0x3d,0x22,0x70,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x70,
+0x6c,0x61,0x63,0x65,0x68,0x6f,0x6c,0x64,0x65,0x72,0x3d,0x22,0x45,0x6e,0x74,0x65,
+0x72,0x20,0x50,0x61,0x73,0x73,0x77,0x6f,0x72,0x64,0x22,0x20,0x6e,0x61,0x6d,0x65,
+0x3d,0x22,0x70,0x61,0x73,0x73,0x22,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x3c,0x62,0x75,0x74,0x74,0x6f,0x6e,0x20,
+0x74,0x79,0x70,0x65,0x3d,0x22,0x73,0x75,0x62,0x6d,0x69,0x74,0x22,0x3e,0x4c,0x6f,
+0x67,0x69,0x6e,0x3c,0x2f,0x62,0x75,0x74,0x74,0x6f,0x6e,0x3e,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x2f,0x64,0x69,0x76,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x66,
+0x6f,0x72,0x6d,0x3e,0x20,0x0d,0x0a,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,
+0x20,0x20,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x26,0x6e,0x62,0x73,0x70,
+0x3b,0x0d,0x0a,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x3c,0x2f,0x74,
+0x72,0x3e,0x0d,0x0a,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,0x3c,0x2f,
+0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,
+};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__loginfail_html = 4;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__loginfail_html[] FSDATA_ALIGN_POST = {
+/* /loginfail.html (16 chars) */
+0x2f,0x6c,0x6f,0x67,0x69,0x6e,0x66,0x61,0x69,0x6c,0x2e,0x68,0x74,0x6d,0x6c,0x00,
+
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 559
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x35,0x35,0x39,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (559 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x3c,
+0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x30,
+0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x74,0x72,0x20,0x76,0x61,0x6c,0x69,0x67,
+0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x74,0x64,
+0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,
+0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x22,0x3e,
+0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,0x6d,0x67,0x2f,0x73,
+0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,
+0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,
+0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,
+0x6c,0x6f,0x67,0x6f,0x22,0x2f,0x3e,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20,0x20,
+0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,0x67,
+0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,
+0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x3c,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x67,0x69,0x6e,0x20,
+0x66,0x61,0x69,0x6c,0x65,0x64,0x2e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x20,0x43,0x6c,0x69,0x63,0x6b,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,
+0x6c,0x6f,0x67,0x69,0x6e,0x2e,0x68,0x74,0x6d,0x6c,0x22,0x3e,0x68,0x65,0x72,0x65,
+0x3c,0x2f,0x61,0x3e,0x20,0x74,0x6f,0x20,0x72,0x65,0x74,0x72,0x79,0x20,0x6c,0x6f,
+0x67,0x69,0x6e,0x2e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,
+0x20,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x74,0x64,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x26,0x6e,0x62,0x73,0x70,0x3b,0x0d,0x0a,0x20,
+0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x2f,0x74,0x72,0x3e,
+0x0d,0x0a,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,0x3c,0x2f,0x62,
+0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__session_html = 5;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__session_html[] FSDATA_ALIGN_POST = {
+/* /session.html (14 chars) */
+0x2f,0x73,0x65,0x73,0x73,0x69,0x6f,0x6e,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Content-Length: 578
+" (18+ bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20,
+0x35,0x37,0x38,0x0d,0x0a,
+/* "Connection: keep-alive
+" (24 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x6b,0x65,0x65,0x70,
+0x2d,0x61,0x6c,0x69,0x76,0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+
+" (27 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (578 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x3c,
+0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x31,0x30,0x30,
+0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x74,0x72,0x20,0x76,0x61,0x6c,0x69,0x67,
+0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x74,0x64,
+0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,
+0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x22,0x3e,
+0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,0x6d,0x67,0x2f,0x73,
+0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,
+0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,
+0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,
+0x6c,0x6f,0x67,0x6f,0x22,0x2f,0x3e,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x20,0x20,0x20,
+0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,0x67,
+0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,
+0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x3c,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x4c,0x6f,0x67,0x69,0x6e,0x20,
+0x73,0x75,0x63,0x63,0x65,0x65,0x64,0x65,0x64,0x2c,0x20,0x73,0x65,0x73,0x73,0x69,
+0x6f,0x6e,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x2e,0x0d,0x0a,0x20,0x20,0x20,0x20,
+0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x20,
+0x20,0x20,0x20,0x20,0x43,0x6c,0x69,0x63,0x6b,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,
+0x66,0x3d,0x22,0x6c,0x6f,0x67,0x69,0x6e,0x2e,0x68,0x74,0x6d,0x6c,0x22,0x3e,0x68,
+0x65,0x72,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x74,0x6f,0x20,0x72,0x65,0x74,0x72,0x79,
+0x20,0x6c,0x6f,0x67,0x69,0x6e,0x2e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x3c,0x2f,0x70,
+0x3e,0x0d,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,
+0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x26,0x6e,0x62,0x73,0x70,0x3b,
+0x0d,0x0a,0x20,0x20,0x20,0x3c,0x2f,0x74,0x64,0x3e,0x0d,0x0a,0x20,0x20,0x3c,0x2f,
+0x74,0x72,0x3e,0x0d,0x0a,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,
+0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,
+0x0d,0x0a,};
+
+#if FSDATA_FILE_ALIGNMENT==1
+static const unsigned int dummy_align__ssi_shtml = 6;
+#endif
+static const unsigned char FSDATA_ALIGN_PRE data__ssi_shtml[] FSDATA_ALIGN_POST = {
+/* /ssi.shtml (11 chars) */
+0x2f,0x73,0x73,0x69,0x2e,0x73,0x68,0x74,0x6d,0x6c,0x00,0x00,
+
+/* HTTP header */
+/* "HTTP/1.1 200 OK
+" (17 bytes) */
+0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x31,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,
+0x0a,
+/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip)
+" (64 bytes) */
+0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30,
+0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,
+0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,
+0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,
+
+/* "Connection: Close
+" (19 bytes) */
+0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x3a,0x20,0x43,0x6c,0x6f,0x73,
+0x65,0x0d,0x0a,
+/* "Content-Type: text/html
+Expires: Fri, 10 Apr 2008 14:00:00 GMT
+Pragma: no-cache
+
+" (85 bytes) */
+0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,
+0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x45,0x78,0x70,0x69,0x72,0x65,0x73,
+0x3a,0x20,0x46,0x72,0x69,0x2c,0x20,0x31,0x30,0x20,0x41,0x70,0x72,0x20,0x32,0x30,
+0x30,0x38,0x20,0x31,0x34,0x3a,0x30,0x30,0x3a,0x30,0x30,0x20,0x47,0x4d,0x54,0x0d,
+0x0a,0x50,0x72,0x61,0x67,0x6d,0x61,0x3a,0x20,0x6e,0x6f,0x2d,0x63,0x61,0x63,0x68,
+0x65,0x0d,0x0a,0x0d,0x0a,
+/* raw file data (14429 bytes) */
+0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,
+0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,
+0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,
+0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,
+0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,
+0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,
+0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,
+0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,
+0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c,
+0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20,
+0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,
+0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20,
+0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,
+0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,
+0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f,
+0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69,
+0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,
+0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,
+0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x68,0x31,0x3e,0x3c,0x21,0x2d,0x2d,0x23,0x48,0x65,0x6c,0x6c,0x57,0x6f,
+0x72,0x6c,0x2d,0x2d,0x3e,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,
+0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x77,0x65,0x62,
+0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,0x20,0x61,0x72,0x65,0x20,0x77,0x61,
+0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x77,0x61,0x73,0x20,0x73,0x65,0x72,0x76,0x65,
+0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x73,0x69,0x6d,0x70,0x6c,0x65,0x20,0x77,0x65,
+0x62,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72,0x20,0x72,
+0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x20,0x74,0x6f,0x70,0x20,0x6f,0x66,
+0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,
+0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x73,0x74,0x61,0x63,0x6b,0x20,0x3c,0x61,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,
+0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,
+0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x6c,0x77,0x49,
+0x50,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,
+0x69,0x73,0x20,0x70,0x61,0x67,0x65,0x20,0x69,0x73,0x20,0x68,0x65,0x72,0x65,0x20,
+0x74,0x6f,0x20,0x74,0x65,0x73,0x74,0x20,0x53,0x53,0x49,0x2c,0x20,0x73,0x6f,0x20,
+0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x61,0x20,0x63,0x6f,0x75,0x6e,0x74,0x65,
+0x72,0x20,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x61,0x6e,0x20,0x65,0x78,
+0x61,0x6d,0x70,0x6c,0x65,0x20,0x6f,0x66,0x20,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,
+0x20,0x63,0x68,0x61,0x6e,0x67,0x69,0x6e,0x67,0x20,0x66,0x6f,0x72,0x20,0x65,0x76,
+0x65,0x72,0x79,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x3a,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x22,0x3c,0x21,0x2d,0x2d,0x23,0x63,0x6f,0x75,0x6e,0x74,0x65,0x72,
+0x2d,0x2d,0x3e,0x22,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x41,0x6e,0x64,0x20,
+0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x65,0x78,0x61,0x6d,0x70,
+0x6c,0x65,0x20,0x6f,0x66,0x20,0x61,0x20,0x74,0x61,0x67,0x20,0x72,0x65,0x73,0x75,
+0x6c,0x74,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,
+0x20,0x69,0x6e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6d,0x75,0x6c,0x74,0x69,0x70,
+0x6c,0x65,0x20,0x70,0x61,0x72,0x74,0x73,0x3a,0x20,0x22,0x3c,0x21,0x2d,0x2d,0x23,
+0x4d,0x75,0x6c,0x74,0x50,0x61,0x72,0x74,0x2d,0x2d,0x3e,0x22,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x54,0x6f,0x20,0x74,0x65,0x73,0x74,0x20,0x4c,0x57,0x49,0x50,
+0x5f,0x48,0x54,0x54,0x50,0x44,0x5f,0x43,0x47,0x49,0x5f,0x53,0x53,0x49,0x2c,0x20,
+0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x74,0x68,0x65,0x20,0x43,0x47,0x49,
+0x20,0x70,0x61,0x72,0x61,0x6d,0x65,0x74,0x65,0x72,0x73,0x3a,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x3c,0x21,0x2d,0x2d,0x23,0x43,0x67,0x69,0x50,0x61,0x72,0x61,0x6d,
+0x2d,0x2d,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,
+0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,
+0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,
+0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,
+0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,
+0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,
+0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,
+0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,
+0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,
+0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,
+0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,
+0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,
+0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,
+0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,
+0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,
+0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,
+0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,
+0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,
+0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,
+0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,
+0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,
+0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,
+0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,
+0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,
+0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,
+0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,
+0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,
+0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,
+0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,
+0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,
+0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,
+0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,
+0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,
+0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,
+0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,
+0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,
+0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,
+0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,
+0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,
+0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,
+0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,
+0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,
+0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,
+0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,
+0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,
+0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,
+0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,
+0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,
+0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,
+0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,
+0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,
+0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,
+0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,
+0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,
+0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,
+0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,
+0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,
+0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,
+0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,
+0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,
+0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,
+0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,
+0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,
+0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,
+0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,
+0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,
+0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,
+0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,
+0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,
+0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,
+0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,
+0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,
+0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,
+0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,
+0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,
+0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,
+0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,
+0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,
+0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,
+0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,
+0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,
+0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,
+0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,
+0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,
+0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,
+0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,
+0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,
+0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,
+0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,
+0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,
+0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,
+0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,
+0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,
+0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,
+0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,
+0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,
+0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,
+0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,
+0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,
+0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,
+0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,
+0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,
+0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,
+0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,
+0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,
+0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,
+0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,
+0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,
+0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,
+0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,
+0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,
+0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,
+0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,
+0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,
+0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,
+0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,
+0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,
+0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,
+0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,
+0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,
+0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,
+0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,
+0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,
+0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,
+0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,
+0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,
+0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,
+0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,
+0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,
+0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,
+0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,
+0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,
+0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,
+0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,
+0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,
+0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,
+0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,
+0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,
+0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,
+0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,
+0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,
+0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,
+0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,
+0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,
+0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,
+0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,
+0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,
+0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,
+0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,
+0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,
+0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,
+0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,
+0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,
+0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,
+0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,
+0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,
+0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,
+0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,
+0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,
+0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,
+0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,
+0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,
+0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,
+0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,
+0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,
+0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,
+0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,
+0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,
+0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,
+0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,
+0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,
+0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,
+0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,
+0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,
+0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,
+0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,
+0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,
+0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,
+0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,
+0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,
+0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,
+0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,
+0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,
+0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,
+0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,
+0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,
+0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,
+0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,
+0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,
+0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,
+0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,
+0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,
+0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,
+0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,
+0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,
+0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,
+0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,
+0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,
+0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,
+0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,
+0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,
+0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,
+0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,
+0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,
+0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,
+0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,
+0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,
+0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,
+0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,
+0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,
+0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,
+0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,
+0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,
+0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,
+0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,
+0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,
+0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,
+0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,
+0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,
+0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,
+0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,
+0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,
+0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,
+0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,
+0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,
+0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,
+0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,
+0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,
+0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,
+0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,
+0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,
+0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,
+0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,
+0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,
+0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,
+0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,
+0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,
+0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,
+0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,
+0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,
+0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,
+0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,
+0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,
+0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,
+0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,
+0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,
+0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,
+0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,
+0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,
+0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,
+0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,
+0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,
+0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,
+0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,
+0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,
+0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,
+0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,
+0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,
+0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,
+0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,
+0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,
+0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,
+0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,
+0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,
+0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,
+0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,
+0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,
+0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,
+0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,
+0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,
+0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,
+0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,
+0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,
+0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,
+0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,
+0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,
+0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,
+0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,
+0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,
+0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,
+0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,
+0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,
+0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,
+0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,
+0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,
+0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,
+0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,
+0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,
+0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,
+0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,
+0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,
+0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,
+0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,
+0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,
+0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,
+0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,
+0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,
+0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,
+0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,
+0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,
+0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,
+0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,
+0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,
+0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,
+0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,
+0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,
+0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,
+0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,
+0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,
+0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,
+0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,
+0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,
+0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,
+0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,
+0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,
+0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,
+0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,
+0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,
+0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,
+0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,
+0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,
+0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,
+0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,
+0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,
+0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,
+0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,
+0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,
+0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,
+0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,
+0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,
+0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,
+0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,
+0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,
+0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,
+0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,
+0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,
+0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,
+0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,
+0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,
+0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,
+0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,
+0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,
+0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,
+0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,
+0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,
+0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,
+0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,
+0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,
+0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,
+0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,
+0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,
+0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,
+0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,
+0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,
+0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,
+0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,
+0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,
+0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,
+0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,
+0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,
+0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,
+0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,
+0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,
+0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,
+0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,
+0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,
+0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,
+0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,
+0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,
+0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,
+0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,
+0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,
+0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,
+0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,
+0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,
+0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,
+0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,
+0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,
+0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,
+0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,
+0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,
+0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,
+0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,
+0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,
+0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,
+0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,
+0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,
+0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,
+0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,
+0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,
+0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,
+0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,
+0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,
+0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,
+0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,
+0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,
+0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,
+0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,
+0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,
+0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,
+0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,
+0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,
+0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,
+0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,
+0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,
+0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,
+0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,
+0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,
+0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,
+0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,
+0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,
+0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,
+0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,
+0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,
+0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,
+0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,
+0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,
+0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,
+0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,
+0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,
+0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,
+0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,
+0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,
+0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,
+0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,
+0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,
+0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,
+0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,
+0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,
+0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,
+0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,
+0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,
+0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,
+0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,
+0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,
+0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,
+0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,
+0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,
+0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,
+0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,
+0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,
+0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,
+0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,
+0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,
+0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,
+0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,
+0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,
+0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,
+0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,
+0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,
+0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,
+0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,
+0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,
+0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,
+0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,
+0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,
+0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,
+0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,
+0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,
+0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,
+0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,
+0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,
+0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,
+0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,
+0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,
+0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,
+0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,
+0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,
+0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,
+0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,
+0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,
+0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,
+0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,
+0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,
+0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,
+0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,
+0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,
+0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,
+0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,
+0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,
+0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,
+0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,
+0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,
+0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,
+0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,
+0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,
+0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,
+0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,
+0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,
+0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,
+0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,
+0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,
+0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,
+0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,
+0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,
+0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,
+0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,
+0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,
+0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,
+0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,
+0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,
+0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,
+0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,
+0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,
+0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,
+0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,
+0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,
+0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,
+0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,
+0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,
+0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,
+0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,
+0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,
+0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,
+0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,
+0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,
+0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,
+0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,
+0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,
+0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,
+0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,
+0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,
+0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,
+0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,
+0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,
+0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,
+0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,
+0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,
+0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,
+0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,
+0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,
+0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,
+0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,
+0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,
+0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,
+0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,
+0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,
+0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,
+0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,
+0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,
+0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,
+0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,
+0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,
+0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,
+0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,
+0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,
+0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,
+0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,
+0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,
+0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,
+0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,
+0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,
+0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,
+0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,
+0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,
+0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,
+0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,
+0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,
+0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,
+0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,
+0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,
+0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,
+0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,
+0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,
+0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,
+0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,
+0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,
+0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,
+0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,
+0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,
+0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,
+0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,
+0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,
+0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,
+0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,
+0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,
+0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,
+0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,
+0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,
+0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,
+0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,
+0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,
+0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,
+0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,
+0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,
+0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,
+0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,
+0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,
+0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,
+0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,
+0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,
+0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,
+0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,
+0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,
+0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,
+0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,
+0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,
+0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,
+0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,
+0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,
+0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,
+0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,
+0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,
+0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,
+0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,
+0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,
+0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,
+0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,
+0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,
+0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,
+0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,
+0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,
+0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,
+0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,
+0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,
+0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,
+0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,
+0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,
+0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,
+0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,
+0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,
+0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,
+0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,
+0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,
+0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,
+0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,
+0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,
+0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x20,0x20,0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,
+0x20,0x6f,0x70,0x65,0x6e,0x20,0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,
+0x68,0x65,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x70,0x72,0x6f,0x74,0x6f,0x63,0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,
+0x68,0x61,0x74,0x20,0x77,0x61,0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,
+0x6c,0x79,0x20,0x77,0x72,0x69,0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,
+0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,
+0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,
+0x6d,0x20,0x44,0x75,0x6e,0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,
+0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,
+0x6e,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,
+0x75,0x74,0x65,0x72,0x20,0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,
+0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,
+0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,
+0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,
+0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,
+0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,
+0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,
+0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,
+0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,
+0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,
+0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,
+0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,
+0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,
+0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,
+0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,
+0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,
+0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,
+0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,
+0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,
+0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x66,
+0x6f,0x63,0x75,0x73,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,
+0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,
+0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x69,0x73,0x20,0x74,0x6f,0x20,0x72,0x65,0x64,
+0x75,0x63,0x65,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x74,0x68,0x65,0x20,0x52,0x41,
+0x4d,0x20,0x75,0x73,0x61,0x67,0x65,0x20,0x77,0x68,0x69,0x6c,0x65,0x20,0x73,0x74,
+0x69,0x6c,0x6c,0x20,0x68,0x61,0x76,0x69,0x6e,0x67,0x20,0x61,0x20,0x66,0x75,0x6c,
+0x6c,0x20,0x73,0x63,0x61,0x6c,0x65,0x20,0x54,0x43,0x50,0x2e,0x20,0x54,0x68,0x69,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6d,0x61,0x6b,0x65,0x73,0x20,0x6c,0x77,
+0x49,0x50,0x20,0x73,0x75,0x69,0x74,0x61,0x62,0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,
+0x75,0x73,0x65,0x20,0x69,0x6e,0x20,0x65,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,
+0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x65,0x6e,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x6b,0x69,0x6c,0x6f,0x62,
+0x79,0x74,0x65,0x73,0x20,0x6f,0x66,0x20,0x66,0x72,0x65,0x65,0x20,0x52,0x41,0x4d,
+0x20,0x61,0x6e,0x64,0x20,0x72,0x6f,0x6f,0x6d,0x20,0x66,0x6f,0x72,0x20,0x61,0x72,
+0x6f,0x75,0x6e,0x64,0x20,0x34,0x30,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,
+0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x63,0x6f,0x64,0x65,0x20,
+0x52,0x4f,0x4d,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,
+0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x4d,0x6f,0x72,0x65,
+0x20,0x69,0x6e,0x66,0x6f,0x72,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x62,0x6f,
+0x75,0x74,0x20,0x6c,0x77,0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x66,
+0x6f,0x75,0x6e,0x64,0x20,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,
+0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x6f,0x6d,0x65,0x70,0x61,0x67,0x65,0x20,
+0x61,0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,
+0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,0x6e,0x61,
+0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,0x72,0x6f,
+0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x68,0x74,0x74,
+0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,
+0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,
+0x2f,0x6c,0x77,0x69,0x70,0x2f,0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x6f,0x72,0x20,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,
+0x77,0x69,0x6b,0x69,0x20,0x61,0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,
+0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x77,
+0x69,0x70,0x2e,0x77,0x69,0x6b,0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x22,0x3e,0x68,
+0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,0x69,0x61,
+0x2e,0x63,0x6f,0x6d,0x2f,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,
+0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,
+0x0a,0x09,0x20,0x20,0x26,0x6e,0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,
+0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
+0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,
+0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,};
+
+
+
+const struct fsdata_file file__img_sics_gif[] = { {
+file_NULL,
+data__img_sics_gif,
+data__img_sics_gif + 16,
+sizeof(data__img_sics_gif) - 16,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__404_html[] = { {
+file__img_sics_gif,
+data__404_html,
+data__404_html + 12,
+sizeof(data__404_html) - 12,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__index_html[] = { {
+file__404_html,
+data__index_html,
+data__index_html + 12,
+sizeof(data__index_html) - 12,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__login_html[] = { {
+file__index_html,
+data__login_html,
+data__login_html + 12,
+sizeof(data__login_html) - 12,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__loginfail_html[] = { {
+file__login_html,
+data__loginfail_html,
+data__loginfail_html + 16,
+sizeof(data__loginfail_html) - 16,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__session_html[] = { {
+file__loginfail_html,
+data__session_html,
+data__session_html + 16,
+sizeof(data__session_html) - 16,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT | FS_FILE_FLAGS_HEADER_HTTPVER_1_1,
+}};
+
+const struct fsdata_file file__ssi_shtml[] = { {
+file__session_html,
+data__ssi_shtml,
+data__ssi_shtml + 12,
+sizeof(data__ssi_shtml) - 12,
+FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_SSI,
+}};
+
+#define FS_ROOT file__ssi_shtml
+#define FS_NUMFILES 7
+
diff --git a/contrib/examples/httpd/fs_example/fs_example.c b/contrib/examples/httpd/fs_example/fs_example.c
new file mode 100644
index 0000000..e3552b1
--- /dev/null
+++ b/contrib/examples/httpd/fs_example/fs_example.c
@@ -0,0 +1,324 @@
+/**
+ * @file
+ * HTTPD custom file system example
+ *
+ * This file demonstrates how to add support for an external file system to httpd.
+ * It provides access to the specified root directory and uses stdio.h file functions
+ * to read files.
+ *
+ * ATTENTION: This implementation is *not* secure: no checks are added to ensure
+ * files are only read below the specified root directory!
+ */
+
+ /*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+#include "fs_example.h"
+
+#include "lwip/apps/fs.h"
+#include "lwip/def.h"
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES to 1 to enable this file system */
+#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES
+#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES 0
+#endif
+
+/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED to 1 to delay open and read
+ * as if e.g. reading from external SPI flash */
+#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED 1
+#endif
+
+/** define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ to the number of bytes
+ * to read to emulate limited transfer buffers and don't read whole files in
+ * one chunk.
+ * WARNING: lowering this slows down the connection!
+ */
+#ifndef LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
+#define LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES
+
+#if !LWIP_HTTPD_CUSTOM_FILES
+#error This needs LWIP_HTTPD_CUSTOM_FILES
+#endif
+#if !LWIP_HTTPD_DYNAMIC_HEADERS
+#error This needs LWIP_HTTPD_DYNAMIC_HEADERS
+#endif
+#if !LWIP_HTTPD_DYNAMIC_FILE_READ
+#error This wants to demonstrate read-after-open, so LWIP_HTTPD_DYNAMIC_FILE_READ is required!
+#endif
+#if !LWIP_HTTPD_FS_ASYNC_READ
+#error This needs LWIP_HTTPD_FS_ASYNC_READ
+#endif
+#if !LWIP_HTTPD_FILE_EXTENSION
+#error This needs LWIP_HTTPD_FILE_EXTENSION
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+#include "lwip/tcpip.h"
+#endif
+
+struct fs_custom_data {
+ FILE *f;
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+ int delay_read;
+ fs_wait_cb callback_fn;
+ void *callback_arg;
+#endif
+};
+
+const char* fs_ex_root_dir;
+
+void
+fs_ex_init(const char *httpd_root_dir)
+{
+ fs_ex_root_dir = strdup(httpd_root_dir);
+}
+
+#if LWIP_HTTPD_CUSTOM_FILES
+int
+fs_open_custom(struct fs_file *file, const char *name)
+{
+ char full_filename[256];
+ FILE *f;
+
+ snprintf(full_filename, 255, "%s%s", fs_ex_root_dir, name);
+ full_filename[255] = 0;
+
+ f = fopen(full_filename, "rb");
+ if (f != NULL) {
+ if (!fseek(f, 0, SEEK_END)) {
+ int len = (int)ftell(f);
+ if(!fseek(f, 0, SEEK_SET)) {
+ struct fs_custom_data *data = (struct fs_custom_data *)mem_malloc(sizeof(struct fs_custom_data));
+ LWIP_ASSERT("out of memory?", data != NULL);
+ memset(file, 0, sizeof(struct fs_file));
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+ file->len = 0; /* read size delayed */
+ data->delay_read = 3;
+ LWIP_UNUSED_ARG(len);
+#else
+ file->len = len;
+#endif
+ file->flags = FS_FILE_FLAGS_HEADER_PERSISTENT;
+ data->f = f;
+ file->pextension = data;
+ return 1;
+ }
+ }
+ fclose(f);
+ }
+ return 0;
+}
+
+void
+fs_close_custom(struct fs_file *file)
+{
+ if (file && file->pextension) {
+ struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
+ if (data->f != NULL) {
+ fclose(data->f);
+ data->f = NULL;
+ }
+ mem_free(data);
+ }
+}
+
+#if LWIP_HTTPD_FS_ASYNC_READ
+u8_t
+fs_canread_custom(struct fs_file *file)
+{
+ /* This function is only necessary for asynchronous I/O:
+ If reading would block, return 0 and implement fs_wait_read_custom() to call the
+ supplied callback if reading works. */
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+ struct fs_custom_data *data;
+ LWIP_ASSERT("file != NULL", file != NULL);
+ data = (struct fs_custom_data *)file->pextension;
+ if (data == NULL) {
+ /* file transfer has been completed already */
+ LWIP_ASSERT("transfer complete", file->index == file->len);
+ return 1;
+ }
+ LWIP_ASSERT("data != NULL", data != NULL);
+ /* This just simulates a simple delay. This delay would normally come e.g. from SPI transfer */
+ if (data->delay_read == 3) {
+ /* delayed file size mode */
+ data->delay_read = 1;
+ LWIP_ASSERT("", file->len == 0);
+ if (!fseek(data->f, 0, SEEK_END)) {
+ int len = (int)ftell(data->f);
+ if(!fseek(data->f, 0, SEEK_SET)) {
+ file->len = len; /* read size delayed */
+ data->delay_read = 1;
+ return 0;
+ }
+ }
+ /* if we come here, something is wrong with the file */
+ LWIP_ASSERT("file error", 0);
+ }
+ if (data->delay_read == 1) {
+ /* tell read function to delay further */
+ }
+#endif
+ LWIP_UNUSED_ARG(file);
+ return 1;
+}
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+static void
+fs_example_read_cb(void *arg)
+{
+ struct fs_custom_data *data = (struct fs_custom_data *)arg;
+ fs_wait_cb callback_fn = data->callback_fn;
+ void *callback_arg = data->callback_arg;
+ data->callback_fn = NULL;
+ data->callback_arg = NULL;
+
+ LWIP_ASSERT("no callback_fn", callback_fn != NULL);
+
+ callback_fn(callback_arg);
+}
+#endif
+
+u8_t
+fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
+{
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+ err_t err;
+ struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
+ LWIP_ASSERT("data not set", data != NULL);
+ data->callback_fn = callback_fn;
+ data->callback_arg = callback_arg;
+ err = tcpip_try_callback(fs_example_read_cb, data);
+ LWIP_ASSERT("out of queue elements?", err == ERR_OK);
+ LWIP_UNUSED_ARG(err);
+#else
+ LWIP_ASSERT("not implemented in this example configuration", 0);
+#endif
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(callback_fn);
+ LWIP_UNUSED_ARG(callback_arg);
+ /* Return
+ - 0 if ready to read (at least one byte)
+ - 1 if reading should be delayed (call 'tcpip_callback(callback_fn, callback_arg)' when ready) */
+ return 1;
+}
+
+int
+fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)
+{
+ struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
+ FILE *f;
+ int len;
+ int read_count = count;
+ LWIP_ASSERT("data not set", data != NULL);
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_DELAYED
+ /* This just simulates a delay. This delay would normally come e.g. from SPI transfer */
+ LWIP_ASSERT("invalid state", data->delay_read >= 0 && data->delay_read <= 2);
+ if (data->delay_read == 2) {
+ /* no delay next time */
+ data->delay_read = 0;
+ return FS_READ_DELAYED;
+ } else if (data->delay_read == 1) {
+ err_t err;
+ /* execute requested delay */
+ data->delay_read = 2;
+ LWIP_ASSERT("duplicate callback request", data->callback_fn == NULL);
+ data->callback_fn = callback_fn;
+ data->callback_arg = callback_arg;
+ err = tcpip_try_callback(fs_example_read_cb, data);
+ LWIP_ASSERT("out of queue elements?", err == ERR_OK);
+ LWIP_UNUSED_ARG(err);
+ return FS_READ_DELAYED;
+ }
+ /* execute this read but delay the next one */
+ data->delay_read = 1;
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
+ read_count = LWIP_MIN(read_count, LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ);
+#endif
+
+ f = data->f;
+ len = (int)fread(buffer, 1, read_count, f);
+
+ LWIP_UNUSED_ARG(callback_fn);
+ LWIP_UNUSED_ARG(callback_arg);
+
+ file->index += len;
+
+ /* Return
+ - FS_READ_EOF if all bytes have been read
+ - FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
+ if (len == 0) {
+ /* all bytes read already */
+ return FS_READ_EOF;
+ }
+ return len;
+}
+
+#else /* LWIP_HTTPD_FS_ASYNC_READ */
+int
+fs_read_custom(struct fs_file *file, char *buffer, int count)
+{
+ struct fs_custom_data *data = (struct fs_custom_data *)file->pextension;
+ FILE *f;
+ int len;
+ int read_count = count;
+ LWIP_ASSERT("data not set", data != NULL);
+
+#if LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ
+ read_count = LWIP_MIN(read_count, LWIP_HTTPD_EXAMPLE_CUSTOMFILES_LIMIT_READ);
+#endif
+
+ f = data->f;
+ len = (int)fread(buffer, 1, read_count, f);
+
+ file->index += len;
+
+ /* Return FS_READ_EOF if all bytes have been read */
+ return len;
+}
+
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+#endif /* LWIP_HTTPD_CUSTOM_FILES */
+
+#endif /* LWIP_HTTPD_EXAMPLE_CUSTOMFILES */
diff --git a/contrib/examples/httpd/fs_example/fs_example.h b/contrib/examples/httpd/fs_example/fs_example.h
new file mode 100644
index 0000000..b399e4d
--- /dev/null
+++ b/contrib/examples/httpd/fs_example/fs_example.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE
+#define LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE
+
+void fs_ex_init(const char *httpd_root_dir);
+
+#endif /* LWIP_HDR_HTTP_EXAMPLES_FS_EXAMPLE */
diff --git a/contrib/examples/httpd/genfiles_example/genfiles_example.c b/contrib/examples/httpd/genfiles_example/genfiles_example.c
new file mode 100644
index 0000000..b96df2a
--- /dev/null
+++ b/contrib/examples/httpd/genfiles_example/genfiles_example.c
@@ -0,0 +1,186 @@
+/**
+ * @file
+ * HTTPD custom file system example for runtime generated files
+ *
+ * This file demonstrates how to add support for generated files to httpd.
+ */
+
+ /*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+#include "genfiles_example.h"
+
+#include "lwip/apps/fs.h"
+#include "lwip/def.h"
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_GENERATEDFILES to 1 to enable this file system */
+#ifndef LWIP_HTTPD_EXAMPLE_GENERATEDFILES
+#define LWIP_HTTPD_EXAMPLE_GENERATEDFILES 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_GENERATEDFILES
+
+#if !LWIP_HTTPD_CUSTOM_FILES
+#error This needs LWIP_HTTPD_CUSTOM_FILES
+#endif
+#if !LWIP_HTTPD_FILE_EXTENSION
+#error This needs LWIP_HTTPD_FILE_EXTENSION
+#endif
+#if !LWIP_HTTPD_DYNAMIC_HEADERS
+#error This needs LWIP_HTTPD_DYNAMIC_HEADERS
+#endif
+
+/* This is the page we send. It's not generated, as you see.
+ * Generating custom things instead of memcpy is left to your imagination :-)
+ */
+const char generated_html[] =
+"<html>\n"
+"<head><title>lwIP - A Lightweight TCP/IP Stack</title></head>\n"
+" <body bgcolor=\"white\" text=\"black\">\n"
+" <table width=\"100%\">\n"
+" <tr valign=\"top\">\n"
+" <td width=\"80\">\n"
+" <a href=\"http://www.sics.se/\"><img src=\"/img/sics.gif\"\n"
+" border=\"0\" alt=\"SICS logo\" title=\"SICS logo\"></a>\n"
+" </td>\n"
+" <td width=\"500\">\n"
+" <h1>lwIP - A Lightweight TCP/IP Stack</h1>\n"
+" <h2>Generated page</h2>\n"
+" <p>This page might be generated in-memory at runtime</p>\n"
+" </td>\n"
+" <td>\n"
+" \n"
+" </td>\n"
+" </tr>\n"
+" </table>\n"
+" </body>\n"
+"</html>";
+
+
+void
+genfiles_ex_init(void)
+{
+ /* nothing to do here yet */
+}
+
+int
+fs_open_custom(struct fs_file *file, const char *name)
+{
+ /* this example only provides one file */
+ if (!strcmp(name, "/generated.html")) {
+ /* initialize fs_file correctly */
+ memset(file, 0, sizeof(struct fs_file));
+ file->pextension = mem_malloc(sizeof(generated_html));
+ if (file->pextension != NULL) {
+ /* instead of doing memcpy, you would generate e.g. a JSON here */
+ memcpy(file->pextension, generated_html, sizeof(generated_html));
+ file->data = (const char *)file->pextension;
+ file->len = sizeof(generated_html) - 1; /* don't send the trailing 0 */
+ file->index = file->len;
+ /* allow persisteng connections */
+ file->flags = FS_FILE_FLAGS_HEADER_PERSISTENT;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void
+fs_close_custom(struct fs_file *file)
+{
+ if (file && file->pextension) {
+ mem_free(file->pextension);
+ file->pextension = NULL;
+ }
+}
+
+#if LWIP_HTTPD_FS_ASYNC_READ
+u8_t
+fs_canread_custom(struct fs_file *file)
+{
+ LWIP_UNUSED_ARG(file);
+ /* This example does not use delayed/async reading */
+ return 1;
+}
+
+u8_t
+fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
+{
+ LWIP_ASSERT("not implemented in this example configuration", 0);
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(callback_fn);
+ LWIP_UNUSED_ARG(callback_arg);
+ /* Return
+ - 1 if ready to read (at least one byte)
+ - 0 if reading should be delayed (call 'tcpip_callback(callback_fn, callback_arg)' when ready) */
+ return 1;
+}
+
+int
+fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)
+{
+ LWIP_ASSERT("not implemented in this example configuration", 0);
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(buffer);
+ LWIP_UNUSED_ARG(count);
+ LWIP_UNUSED_ARG(callback_fn);
+ LWIP_UNUSED_ARG(callback_arg);
+ /* Return
+ - FS_READ_EOF if all bytes have been read
+ - FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
+ /* all bytes read already */
+ return FS_READ_EOF;
+}
+
+#else /* LWIP_HTTPD_FS_ASYNC_READ */
+int
+fs_read_custom(struct fs_file *file, char *buffer, int count)
+{
+ LWIP_ASSERT("not implemented in this example configuration", 0);
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(buffer);
+ LWIP_UNUSED_ARG(count);
+ /* Return
+ - FS_READ_EOF if all bytes have been read
+ - FS_READ_DELAYED if reading is delayed (call 'tcpip_callback(callback_fn, callback_arg)' when done) */
+ /* all bytes read already */
+ return FS_READ_EOF;
+}
+
+#endif /* LWIP_HTTPD_FS_ASYNC_READ */
+
+#endif /* LWIP_HTTPD_EXAMPLE_GENERATEDFILES */
diff --git a/contrib/examples/httpd/genfiles_example/genfiles_example.h b/contrib/examples/httpd/genfiles_example/genfiles_example.h
new file mode 100644
index 0000000..dd9731e
--- /dev/null
+++ b/contrib/examples/httpd/genfiles_example/genfiles_example.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE
+#define LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE
+
+void genfiles_ex_init(void);
+
+#endif /* LWIP_HDR_HTTP_EXAMPLES_GENFILES_EXAMPLE */
diff --git a/contrib/examples/httpd/https_example/https_example.c b/contrib/examples/httpd/https_example/https_example.c
new file mode 100644
index 0000000..7619896
--- /dev/null
+++ b/contrib/examples/httpd/https_example/https_example.c
@@ -0,0 +1,144 @@
+/**
+ * @file
+ * HTTPD https example
+ *
+ * This file demonstrates how to initialize httpd for https.
+ * To do this, it needs 2 files:
+ * - server certificate
+ * - server private key
+ *
+ * In addition to that, watch out for resource shortage. You'll need plenty of
+ * heap (start with MEM_SIZE >= 200 KByte or monitor its err counters) and be
+ * sure to at least set the following settings high enough (monitor
+ * lwip_stats for an idea of what's needed):
+ * - MEMP_NUM_TCP_PCB/MEMP_NUM_ALTCP_PCB
+ * - MEMP_NUM_TCPIP_MSG_INPKT
+ * - MEMP_NUM_TCP_SEG
+ */
+
+ /*
+ * Copyright (c) 2017-2019 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+#include "https_example.h"
+
+#include "lwip/altcp_tls.h"
+#include "lwip/apps/httpd.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_HTTPS to 1 to enable this file system */
+#ifndef LWIP_HTTPD_EXAMPLE_HTTPS
+#define LWIP_HTTPD_EXAMPLE_HTTPS 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_HTTPS && LWIP_ALTCP_TLS
+
+#ifndef LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE
+#error "define LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE to the created server private key"
+#endif
+
+/* If the key file is password-protected, define LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS */
+#ifdef LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS
+#ifndef LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS_LEN
+#define LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS_LEN strlen(LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS)
+#endif
+#else
+#define LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS NULL
+#define LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS_LEN 0
+#endif
+
+#ifndef LWIP_HTTPD_EXAMPLE_HTTPS_CERT_FILE
+#error "define LWIP_HTTPD_EXAMPLE_HTTPS_CERT_FILE to the created server certificate"
+#endif
+
+static u8_t *read_file(const char *filename, size_t *file_size)
+{
+ u8_t *buf;
+ long fsize;
+ FILE *f = fopen(filename, "rb");
+ if (!f) {
+ return NULL;
+ }
+ fseek(f, 0, SEEK_END);
+ fsize = ftell(f);
+ fseek(f, 0, SEEK_SET);
+
+ buf = (u8_t *)malloc(fsize + 1);
+ if (!buf) {
+ fclose(f);
+ return NULL;
+ }
+ fread(buf, 1, fsize, f);
+ fclose(f);
+
+ buf[fsize] = 0;
+ if (file_size) {
+ /* Note: the '+ 1' is required for mbedTLS to correctly parse the buffer */
+ *file_size = (size_t)(fsize + 1);
+ }
+ return buf;
+}
+
+/** This function loads a server certificate and private key as x509 from disk.
+ * For information how to create such files, see mbedTLS tutorial ("How to
+ * generate a self-signed certificate") or OpenSSL documentation ("How to
+ * generate a self-signed certificate and private key using OpenSSL"), e.g.
+ * 'openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt'
+ * Copy the resulting files and define the path to them
+ */
+void
+https_ex_init(void)
+{
+ struct altcp_tls_config *conf;
+ u8_t *privkey, *cert;
+ size_t privkey_size, cert_size;
+
+ privkey = read_file(LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE, &privkey_size);
+ LWIP_ASSERT("Failed to open https server private key", privkey != NULL);
+ cert = read_file(LWIP_HTTPD_EXAMPLE_HTTPS_CERT_FILE, &cert_size);
+ LWIP_ASSERT("Failed to open https server certificate", cert != NULL);
+
+ conf = altcp_tls_create_config_server_privkey_cert(privkey, privkey_size,
+ LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS, LWIP_HTTPD_EXAMPLE_HTTPS_KEY_FILE_PASS_LEN, cert, cert_size);
+ LWIP_ASSERT("Failed to create https server config", conf != NULL);
+
+ httpd_inits(conf);
+
+ /* secure erase should be done in production environment */
+ free(privkey);
+ free(cert);
+}
+
+#endif /* LWIP_HTTPD_EXAMPLE_HTTPS */
diff --git a/contrib/examples/httpd/https_example/https_example.h b/contrib/examples/httpd/https_example/https_example.h
new file mode 100644
index 0000000..c1525e6
--- /dev/null
+++ b/contrib/examples/httpd/https_example/https_example.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_HTTP_EXAMPLES_HTTPS_EXAMPLE
+#define LWIP_HDR_HTTP_EXAMPLES_HTTPS_EXAMPLE
+
+void https_ex_init(void);
+
+#endif /* LWIP_HDR_HTTP_EXAMPLES_HTTPS_EXAMPLE */
diff --git a/contrib/examples/httpd/post_example/post_example.c b/contrib/examples/httpd/post_example/post_example.c
new file mode 100644
index 0000000..f4e4369
--- /dev/null
+++ b/contrib/examples/httpd/post_example/post_example.c
@@ -0,0 +1,167 @@
+/**
+ * @file
+ * HTTPD example for simple POST
+ */
+
+ /*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+
+#include "lwip/apps/httpd.h"
+#include "lwip/def.h"
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_GENERATEDFILES to 1 to enable this file system */
+#ifndef LWIP_HTTPD_EXAMPLE_SIMPLEPOST
+#define LWIP_HTTPD_EXAMPLE_SIMPLEPOST 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_SIMPLEPOST
+
+#if !LWIP_HTTPD_SUPPORT_POST
+#error This needs LWIP_HTTPD_SUPPORT_POST
+#endif
+
+#define USER_PASS_BUFSIZE 16
+
+static void *current_connection;
+static void *valid_connection;
+static char last_user[USER_PASS_BUFSIZE];
+
+err_t
+httpd_post_begin(void *connection, const char *uri, const char *http_request,
+ u16_t http_request_len, int content_len, char *response_uri,
+ u16_t response_uri_len, u8_t *post_auto_wnd)
+{
+ LWIP_UNUSED_ARG(connection);
+ LWIP_UNUSED_ARG(http_request);
+ LWIP_UNUSED_ARG(http_request_len);
+ LWIP_UNUSED_ARG(content_len);
+ LWIP_UNUSED_ARG(post_auto_wnd);
+ if (!memcmp(uri, "/login.cgi", 11)) {
+ if (current_connection != connection) {
+ current_connection = connection;
+ valid_connection = NULL;
+ /* default page is "login failed" */
+ snprintf(response_uri, response_uri_len, "/loginfail.html");
+ /* e.g. for large uploads to slow flash over a fast connection, you should
+ manually update the rx window. That way, a sender can only send a full
+ tcp window at a time. If this is required, set 'post_aut_wnd' to 0.
+ We do not need to throttle upload speed here, so: */
+ *post_auto_wnd = 1;
+ return ERR_OK;
+ }
+ }
+ return ERR_VAL;
+}
+
+err_t
+httpd_post_receive_data(void *connection, struct pbuf *p)
+{
+ err_t ret;
+
+ LWIP_ASSERT("NULL pbuf", p != NULL);
+
+ if (current_connection == connection) {
+ u16_t token_user = pbuf_memfind(p, "user=", 5, 0);
+ u16_t token_pass = pbuf_memfind(p, "pass=", 5, 0);
+ if ((token_user != 0xFFFF) && (token_pass != 0xFFFF)) {
+ u16_t value_user = token_user + 5;
+ u16_t value_pass = token_pass + 5;
+ u16_t len_user = 0;
+ u16_t len_pass = 0;
+ u16_t tmp;
+ /* find user len */
+ tmp = pbuf_memfind(p, "&", 1, value_user);
+ if (tmp != 0xFFFF) {
+ len_user = tmp - value_user;
+ } else {
+ len_user = p->tot_len - value_user;
+ }
+ /* find pass len */
+ tmp = pbuf_memfind(p, "&", 1, value_pass);
+ if (tmp != 0xFFFF) {
+ len_pass = tmp - value_pass;
+ } else {
+ len_pass = p->tot_len - value_pass;
+ }
+ if ((len_user > 0) && (len_user < USER_PASS_BUFSIZE) &&
+ (len_pass > 0) && (len_pass < USER_PASS_BUFSIZE)) {
+ /* provide contiguous storage if p is a chained pbuf */
+ char buf_user[USER_PASS_BUFSIZE];
+ char buf_pass[USER_PASS_BUFSIZE];
+ char *user = (char *)pbuf_get_contiguous(p, buf_user, sizeof(buf_user), len_user, value_user);
+ char *pass = (char *)pbuf_get_contiguous(p, buf_pass, sizeof(buf_pass), len_pass, value_pass);
+ if (user && pass) {
+ user[len_user] = 0;
+ pass[len_pass] = 0;
+ if (!strcmp(user, "lwip") && !strcmp(pass, "post")) {
+ /* user and password are correct, create a "session" */
+ valid_connection = connection;
+ memcpy(last_user, user, sizeof(last_user));
+ }
+ }
+ }
+ }
+ /* not returning ERR_OK aborts the connection, so return ERR_OK unless the
+ connection is unknown */
+ ret = ERR_OK;
+ } else {
+ ret = ERR_VAL;
+ }
+
+ /* this function must ALWAYS free the pbuf it is passed or it will leak memory */
+ pbuf_free(p);
+
+ return ret;
+}
+
+void
+httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len)
+{
+ /* default page is "login failed" */
+ snprintf(response_uri, response_uri_len, "/loginfail.html");
+ if (current_connection == connection) {
+ if (valid_connection == connection) {
+ /* login succeeded */
+ snprintf(response_uri, response_uri_len, "/session.html");
+ }
+ current_connection = NULL;
+ valid_connection = NULL;
+ }
+}
+
+#endif /* LWIP_HTTPD_EXAMPLE_SIMPLEPOST*/
diff --git a/contrib/examples/httpd/ssi_example/ssi_example.c b/contrib/examples/httpd/ssi_example/ssi_example.c
new file mode 100644
index 0000000..2024e2e
--- /dev/null
+++ b/contrib/examples/httpd/ssi_example/ssi_example.c
@@ -0,0 +1,264 @@
+/**
+ * @file
+ * HTTPD simple SSI example
+ *
+ * This file demonstrates how to add support for SSI.
+ * It does this in a very simple way by providing the three tags 'HelloWorld'
+ * 'counter', and 'MultiPart'.
+ *
+ * This file also demonstrates how to integrate CGI with SSI.
+ */
+
+ /*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#include "lwip/opt.h"
+#include "ssi_example.h"
+
+#include "lwip/apps/httpd.h"
+
+#include "lwip/def.h"
+#include "lwip/mem.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/** define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE to 1 to enable this ssi example*/
+#ifndef LWIP_HTTPD_EXAMPLE_SSI_SIMPLE
+#define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE 0
+#endif
+
+/** define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION to 1 to show how to
+ * integrate CGI into SSI (LWIP_HTTPD_CGI_SSI) */
+#ifndef LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
+#define LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION 0
+#endif
+
+#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE
+
+#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
+#if !LWIP_HTTPD_FILE_STATE
+#error LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION needs LWIP_HTTPD_FILE_STATE
+#endif
+#if !LWIP_HTTPD_CGI_SSI
+#error LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION needs LWIP_HTTPD_CGI_SSI
+#endif
+
+#define MAX_CGI_LEN 16
+#endif
+
+const char * ssi_example_tags[] = {
+ "HellWorl",
+ "counter",
+ "MultPart"
+#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
+ ,"CgiParam"
+#endif
+};
+
+u16_t ssi_example_ssi_handler(
+#if LWIP_HTTPD_SSI_RAW
+ const char* ssi_tag_name,
+#else /* LWIP_HTTPD_SSI_RAW */
+ int iIndex,
+#endif /* LWIP_HTTPD_SSI_RAW */
+ char *pcInsert, int iInsertLen
+#if LWIP_HTTPD_SSI_MULTIPART
+ , u16_t current_tag_part, u16_t *next_tag_part
+#endif /* LWIP_HTTPD_SSI_MULTIPART */
+#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
+ , void *connection_state
+#endif /* LWIP_HTTPD_FILE_STATE */
+ )
+{
+ size_t printed;
+#if LWIP_HTTPD_SSI_RAW
+ /* a real application could use if(!strcmp) blocks here, but we want to keep
+ the differences between configurations small, so translate string to index here */
+ int iIndex;
+ for (iIndex = 0; iIndex < LWIP_ARRAYSIZE(ssi_example_tags); iIndex++) {
+ if(!strcmp(ssi_tag_name, ssi_example_tags[iIndex])) {
+ break;
+ }
+ }
+#endif
+#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
+ LWIP_UNUSED_ARG(connection_state);
+#endif
+
+ switch (iIndex) {
+ case 0: /* "HelloWorld" */
+ printed = snprintf(pcInsert, iInsertLen, "Hello World!");
+ break;
+ case 1: /* "counter" */
+ {
+ static int counter;
+ counter++;
+ printed = snprintf(pcInsert, iInsertLen, "%d", counter);
+ }
+ break;
+ case 2: /* "MultPart" */
+#if LWIP_HTTPD_SSI_MULTIPART
+ switch (current_tag_part) {
+ case 0:
+ printed = snprintf(pcInsert, iInsertLen, "part0");
+ *next_tag_part = 1;
+ break;
+ case 1:
+ printed = snprintf(pcInsert, iInsertLen, "part1");
+ *next_tag_part = 2;
+ break;
+ case 2:
+ printed = snprintf(pcInsert, iInsertLen, "part2");
+ break;
+ default:
+ printed = snprintf(pcInsert, iInsertLen, "unhandled part: %d", (int)current_tag_part);
+ break;
+ }
+#else
+ printed = snprintf(pcInsert, iInsertLen, "LWIP_HTTPD_SSI_MULTIPART disabled");
+#endif
+ break;
+#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
+ case 3:
+ if (connection_state) {
+ char *params = (char *)connection_state;
+ if (*params) {
+ printed = snprintf(pcInsert, iInsertLen, "%s", (char *)params);
+ } else {
+ printed = snprintf(pcInsert, iInsertLen, "none");
+ }
+ } else {
+ printed = snprintf(pcInsert, iInsertLen, "NULL");
+ }
+ break;
+#endif
+ default: /* unknown tag */
+ printed = 0;
+ break;
+ }
+ LWIP_ASSERT("sane length", printed <= 0xFFFF);
+ return (u16_t)printed;
+}
+
+void
+ssi_ex_init(void)
+{
+ int i;
+ for (i = 0; i < LWIP_ARRAYSIZE(ssi_example_tags); i++) {
+ LWIP_ASSERT("tag too long for LWIP_HTTPD_MAX_TAG_NAME_LEN",
+ strlen(ssi_example_tags[i]) <= LWIP_HTTPD_MAX_TAG_NAME_LEN);
+ }
+
+ http_set_ssi_handler(ssi_example_ssi_handler,
+#if LWIP_HTTPD_SSI_RAW
+ NULL, 0
+#else
+ ssi_example_tags, LWIP_ARRAYSIZE(ssi_example_tags)
+#endif
+ );
+}
+
+#if LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION
+void *
+fs_state_init(struct fs_file *file, const char *name)
+{
+ char *ret;
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(name);
+ ret = (char *)mem_malloc(MAX_CGI_LEN);
+ if (ret) {
+ *ret = 0;
+ }
+ return ret;
+}
+
+void
+fs_state_free(struct fs_file *file, void *state)
+{
+ LWIP_UNUSED_ARG(file);
+ if (state != NULL) {
+ mem_free(state);
+ }
+}
+
+void
+httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumParams,
+ char **pcParam, char **pcValue
+#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
+ , void *connection_state
+#endif /* LWIP_HTTPD_FILE_STATE */
+ )
+{
+ LWIP_UNUSED_ARG(file);
+ LWIP_UNUSED_ARG(uri);
+ if (connection_state != NULL) {
+ char *start = (char *)connection_state;
+ char *end = start + MAX_CGI_LEN;
+ int i;
+ memset(start, 0, MAX_CGI_LEN);
+ /* print a string of the arguments: */
+ for (i = 0; i < iNumParams; i++) {
+ size_t len;
+ len = end - start;
+ if (len) {
+ size_t inlen = strlen(pcParam[i]);
+ size_t copylen = LWIP_MIN(inlen, len);
+ memcpy(start, pcParam[i], copylen);
+ start += copylen;
+ len -= copylen;
+ }
+ if (len) {
+ *start = '=';
+ start++;
+ len--;
+ }
+ if (len) {
+ size_t inlen = strlen(pcValue[i]);
+ size_t copylen = LWIP_MIN(inlen, len);
+ memcpy(start, pcValue[i], copylen);
+ start += copylen;
+ len -= copylen;
+ }
+ if (len) {
+ *start = ';';
+ len--;
+ }
+ /* ensure NULL termination */
+ end--;
+ *end = 0;
+ }
+ }
+}
+#endif /* LWIP_HTTPD_EXAMPLE_SSI_SIMPLE_CGI_INTEGRATION */
+
+#endif /* LWIP_HTTPD_EXAMPLE_SSI_SIMPLE */
diff --git a/contrib/examples/httpd/ssi_example/ssi_example.h b/contrib/examples/httpd/ssi_example/ssi_example.h
new file mode 100644
index 0000000..b7ec298
--- /dev/null
+++ b/contrib/examples/httpd/ssi_example/ssi_example.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+#ifndef LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE
+#define LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE
+
+void ssi_ex_init(void);
+
+#endif /* LWIP_HDR_HTTP_EXAMPLES_SSI_EXAMPLE */
diff --git a/contrib/examples/lwiperf/lwiperf_example.c b/contrib/examples/lwiperf/lwiperf_example.c
new file mode 100644
index 0000000..a33bc6f
--- /dev/null
+++ b/contrib/examples/lwiperf/lwiperf_example.c
@@ -0,0 +1,50 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include "lwip/apps/lwiperf.h"
+#include "lwiperf_example.h"
+
+static void
+lwiperf_report(void *arg, enum lwiperf_report_type report_type,
+ const ip_addr_t* local_addr, u16_t local_port, const ip_addr_t* remote_addr, u16_t remote_port,
+ u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec)
+{
+ LWIP_UNUSED_ARG(arg);
+ LWIP_UNUSED_ARG(local_addr);
+ LWIP_UNUSED_ARG(local_port);
+
+ LWIP_PLATFORM_DIAG(("IPERF report: type=%d, remote: %s:%d, total bytes: %"U32_F", duration in ms: %"U32_F", kbits/s: %"U32_F"\n",
+ (int)report_type, ipaddr_ntoa(remote_addr), (int)remote_port, bytes_transferred, ms_duration, bandwidth_kbitpsec));
+}
+
+void
+lwiperf_example_init(void)
+{
+ lwiperf_start_tcp_server_default(lwiperf_report, NULL);
+}
diff --git a/contrib/examples/lwiperf/lwiperf_example.h b/contrib/examples/lwiperf/lwiperf_example.h
new file mode 100644
index 0000000..d7b35c8
--- /dev/null
+++ b/contrib/examples/lwiperf/lwiperf_example.h
@@ -0,0 +1,43 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef LWIPERF_EXAMPLE_H
+#define LWIPERF_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void lwiperf_example_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LWIPERF_EXAMPLE_H */
diff --git a/contrib/examples/mdns/mdns_example.c b/contrib/examples/mdns/mdns_example.c
new file mode 100644
index 0000000..49625ef
--- /dev/null
+++ b/contrib/examples/mdns/mdns_example.c
@@ -0,0 +1,63 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include "lwip/apps/mdns.h"
+#include "mdns_example.h"
+
+#if LWIP_MDNS_RESPONDER
+static void
+srv_txt(struct mdns_service *service, void *txt_userdata)
+{
+ err_t res;
+ LWIP_UNUSED_ARG(txt_userdata);
+
+ res = mdns_resp_add_service_txtitem(service, "path=/", 6);
+ LWIP_ERROR("mdns add service txt failed\n", (res == ERR_OK), return);
+}
+#endif
+
+#if LWIP_MDNS_RESPONDER
+static void
+mdns_example_report(struct netif* netif, u8_t result, s8_t service)
+{
+ LWIP_PLATFORM_DIAG(("mdns status[netif %d][service %d]: %d\n", netif->num, service, result));
+}
+#endif
+
+void
+mdns_example_init(void)
+{
+#if LWIP_MDNS_RESPONDER
+ mdns_resp_register_name_result_cb(mdns_example_report);
+ mdns_resp_init();
+ mdns_resp_add_netif(netif_default, "lwip");
+ mdns_resp_add_service(netif_default, "myweb", "_http", DNSSD_PROTO_TCP, 80, srv_txt, NULL);
+ mdns_resp_announce(netif_default);
+#endif
+}
diff --git a/contrib/examples/mdns/mdns_example.h b/contrib/examples/mdns/mdns_example.h
new file mode 100644
index 0000000..ab51ade
--- /dev/null
+++ b/contrib/examples/mdns/mdns_example.h
@@ -0,0 +1,43 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef MDNS_EXAMPLE_H
+#define MDNS_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mdns_example_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MDNS_EXAMPLE_H */
diff --git a/contrib/examples/mqtt/mqtt_example.c b/contrib/examples/mqtt/mqtt_example.c
new file mode 100644
index 0000000..bb277d6
--- /dev/null
+++ b/contrib/examples/mqtt/mqtt_example.c
@@ -0,0 +1,128 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include "lwip/apps/mqtt.h"
+#include "mqtt_example.h"
+
+#if LWIP_TCP
+
+/** Define this to a compile-time IP address initialization
+ * to connect anything else than IPv4 loopback
+ */
+#ifndef LWIP_MQTT_EXAMPLE_IPADDR_INIT
+#if LWIP_IPV4
+#define LWIP_MQTT_EXAMPLE_IPADDR_INIT = IPADDR4_INIT(PP_HTONL(IPADDR_LOOPBACK))
+#else
+#define LWIP_MQTT_EXAMPLE_IPADDR_INIT
+#endif
+#endif
+
+static ip_addr_t mqtt_ip LWIP_MQTT_EXAMPLE_IPADDR_INIT;
+static mqtt_client_t* mqtt_client;
+
+static const struct mqtt_connect_client_info_t mqtt_client_info =
+{
+ "test",
+ NULL, /* user */
+ NULL, /* pass */
+ 100, /* keep alive */
+ NULL, /* will_topic */
+ NULL, /* will_msg */
+ 0, /* will_qos */
+ 0 /* will_retain */
+#if LWIP_ALTCP && LWIP_ALTCP_TLS
+ , NULL
+#endif
+};
+
+static void
+mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)
+{
+ const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
+ LWIP_UNUSED_ARG(data);
+
+ LWIP_PLATFORM_DIAG(("MQTT client \"%s\" data cb: len %d, flags %d\n", client_info->client_id,
+ (int)len, (int)flags));
+}
+
+static void
+mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)
+{
+ const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
+
+ LWIP_PLATFORM_DIAG(("MQTT client \"%s\" publish cb: topic %s, len %d\n", client_info->client_id,
+ topic, (int)tot_len));
+}
+
+static void
+mqtt_request_cb(void *arg, err_t err)
+{
+ const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
+
+ LWIP_PLATFORM_DIAG(("MQTT client \"%s\" request cb: err %d\n", client_info->client_id, (int)err));
+}
+
+static void
+mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
+{
+ const struct mqtt_connect_client_info_t* client_info = (const struct mqtt_connect_client_info_t*)arg;
+ LWIP_UNUSED_ARG(client);
+
+ LWIP_PLATFORM_DIAG(("MQTT client \"%s\" connection cb: status %d\n", client_info->client_id, (int)status));
+
+ if (status == MQTT_CONNECT_ACCEPTED) {
+ mqtt_sub_unsub(client,
+ "topic_qos1", 1,
+ mqtt_request_cb, LWIP_CONST_CAST(void*, client_info),
+ 1);
+ mqtt_sub_unsub(client,
+ "topic_qos0", 0,
+ mqtt_request_cb, LWIP_CONST_CAST(void*, client_info),
+ 1);
+ }
+}
+#endif /* LWIP_TCP */
+
+void
+mqtt_example_init(void)
+{
+#if LWIP_TCP
+ mqtt_client = mqtt_client_new();
+
+ mqtt_set_inpub_callback(mqtt_client,
+ mqtt_incoming_publish_cb,
+ mqtt_incoming_data_cb,
+ LWIP_CONST_CAST(void*, &mqtt_client_info));
+
+ mqtt_client_connect(mqtt_client,
+ &mqtt_ip, MQTT_PORT,
+ mqtt_connection_cb, LWIP_CONST_CAST(void*, &mqtt_client_info),
+ &mqtt_client_info);
+#endif /* LWIP_TCP */
+}
diff --git a/contrib/examples/mqtt/mqtt_example.h b/contrib/examples/mqtt/mqtt_example.h
new file mode 100644
index 0000000..797678b
--- /dev/null
+++ b/contrib/examples/mqtt/mqtt_example.h
@@ -0,0 +1,43 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef MQTT_EXAMPLE_H
+#define MQTT_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mqtt_example_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MQTT_EXAMPLE_H */
diff --git a/contrib/examples/ppp/pppos_example.c b/contrib/examples/ppp/pppos_example.c
new file mode 100644
index 0000000..0d18ce5
--- /dev/null
+++ b/contrib/examples/ppp/pppos_example.c
@@ -0,0 +1,221 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include "lwip/dns.h"
+
+#ifndef PPPOS_SUPPORT
+#define PPPOS_SUPPORT 0
+#endif /* PPPOS_SUPPORT */
+
+#if PPPOS_SUPPORT
+#include "netif/ppp/pppos.h"
+#include "lwip/sio.h"
+#define PPP_PTY_TEST 1
+#endif /* PPPOS_SUPPORT */
+
+#include "pppos_example.h"
+
+#include <stdio.h>
+
+#if PPPOS_SUPPORT
+static sio_fd_t ppp_sio;
+static ppp_pcb *ppp;
+static struct netif pppos_netif;
+
+static void
+pppos_rx_thread(void *arg)
+{
+ u32_t len;
+ u8_t buffer[128];
+ LWIP_UNUSED_ARG(arg);
+
+ /* Please read the "PPPoS input path" chapter in the PPP documentation. */
+ while (1) {
+ len = sio_read(ppp_sio, buffer, sizeof(buffer));
+ if (len > 0) {
+ /* Pass received raw characters from PPPoS to be decoded through lwIP
+ * TCPIP thread using the TCPIP API. This is thread safe in all cases
+ * but you should avoid passing data byte after byte. */
+ pppos_input_tcpip(ppp, buffer, len);
+ }
+ }
+}
+
+static void
+ppp_link_status_cb(ppp_pcb *pcb, int err_code, void *ctx)
+{
+ struct netif *pppif = ppp_netif(pcb);
+ LWIP_UNUSED_ARG(ctx);
+
+ switch(err_code) {
+ case PPPERR_NONE: /* No error. */
+ {
+#if LWIP_DNS
+ const ip_addr_t *ns;
+#endif /* LWIP_DNS */
+ fprintf(stderr, "ppp_link_status_cb: PPPERR_NONE\n\r");
+#if LWIP_IPV4
+ fprintf(stderr, " our_ip4addr = %s\n\r", ip4addr_ntoa(netif_ip4_addr(pppif)));
+ fprintf(stderr, " his_ipaddr = %s\n\r", ip4addr_ntoa(netif_ip4_gw(pppif)));
+ fprintf(stderr, " netmask = %s\n\r", ip4addr_ntoa(netif_ip4_netmask(pppif)));
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ fprintf(stderr, " our_ip6addr = %s\n\r", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
+#endif /* LWIP_IPV6 */
+
+#if LWIP_DNS
+ ns = dns_getserver(0);
+ fprintf(stderr, " dns1 = %s\n\r", ipaddr_ntoa(ns));
+ ns = dns_getserver(1);
+ fprintf(stderr, " dns2 = %s\n\r", ipaddr_ntoa(ns));
+#endif /* LWIP_DNS */
+#if PPP_IPV6_SUPPORT
+ fprintf(stderr, " our6_ipaddr = %s\n\r", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
+#endif /* PPP_IPV6_SUPPORT */
+ }
+ break;
+
+ case PPPERR_PARAM: /* Invalid parameter. */
+ printf("ppp_link_status_cb: PPPERR_PARAM\n");
+ break;
+
+ case PPPERR_OPEN: /* Unable to open PPP session. */
+ printf("ppp_link_status_cb: PPPERR_OPEN\n");
+ break;
+
+ case PPPERR_DEVICE: /* Invalid I/O device for PPP. */
+ printf("ppp_link_status_cb: PPPERR_DEVICE\n");
+ break;
+
+ case PPPERR_ALLOC: /* Unable to allocate resources. */
+ printf("ppp_link_status_cb: PPPERR_ALLOC\n");
+ break;
+
+ case PPPERR_USER: /* User interrupt. */
+ printf("ppp_link_status_cb: PPPERR_USER\n");
+ break;
+
+ case PPPERR_CONNECT: /* Connection lost. */
+ printf("ppp_link_status_cb: PPPERR_CONNECT\n");
+ break;
+
+ case PPPERR_AUTHFAIL: /* Failed authentication challenge. */
+ printf("ppp_link_status_cb: PPPERR_AUTHFAIL\n");
+ break;
+
+ case PPPERR_PROTOCOL: /* Failed to meet protocol. */
+ printf("ppp_link_status_cb: PPPERR_PROTOCOL\n");
+ break;
+
+ case PPPERR_PEERDEAD: /* Connection timeout. */
+ printf("ppp_link_status_cb: PPPERR_PEERDEAD\n");
+ break;
+
+ case PPPERR_IDLETIMEOUT: /* Idle Timeout. */
+ printf("ppp_link_status_cb: PPPERR_IDLETIMEOUT\n");
+ break;
+
+ case PPPERR_CONNECTTIME: /* PPPERR_CONNECTTIME. */
+ printf("ppp_link_status_cb: PPPERR_CONNECTTIME\n");
+ break;
+
+ case PPPERR_LOOPBACK: /* Connection timeout. */
+ printf("ppp_link_status_cb: PPPERR_LOOPBACK\n");
+ break;
+
+ default:
+ printf("ppp_link_status_cb: unknown errCode %d\n", err_code);
+ break;
+ }
+}
+
+static u32_t
+ppp_output_cb(ppp_pcb *pcb, const void *data, u32_t len, void *ctx)
+{
+ LWIP_UNUSED_ARG(pcb);
+ LWIP_UNUSED_ARG(ctx);
+ return sio_write(ppp_sio, (const u8_t*)data, len);
+}
+
+#if LWIP_NETIF_STATUS_CALLBACK
+static void
+netif_status_callback(struct netif *nif)
+{
+ printf("PPPNETIF: %c%c%d is %s\n", nif->name[0], nif->name[1], nif->num,
+ netif_is_up(nif) ? "UP" : "DOWN");
+#if LWIP_IPV4
+ printf("IPV4: Host at %s ", ip4addr_ntoa(netif_ip4_addr(nif)));
+ printf("mask %s ", ip4addr_ntoa(netif_ip4_netmask(nif)));
+ printf("gateway %s\n", ip4addr_ntoa(netif_ip4_gw(nif)));
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ printf("IPV6: Host at %s\n", ip6addr_ntoa(netif_ip6_addr(nif, 0)));
+#endif /* LWIP_IPV6 */
+#if LWIP_NETIF_HOSTNAME
+ printf("FQDN: %s\n", netif_get_hostname(nif));
+#endif /* LWIP_NETIF_HOSTNAME */
+}
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+#endif
+
+void
+pppos_example_init(void)
+{
+#if PPPOS_SUPPORT
+#if PPP_PTY_TEST
+ ppp_sio = sio_open(2);
+#else
+ ppp_sio = sio_open(0);
+#endif
+ if(!ppp_sio)
+ {
+ perror("PPPOS example: Error opening device");
+ return;
+ }
+
+ ppp = pppos_create(&pppos_netif, ppp_output_cb, ppp_link_status_cb, NULL);
+ if (!ppp)
+ {
+ printf("PPPOS example: Could not create PPP control interface");
+ return;
+ }
+
+#ifdef LWIP_PPP_CHAP_TEST
+ ppp_set_auth(ppp, PPPAUTHTYPE_CHAP, "lwip", "mysecret");
+#endif
+
+ ppp_connect(ppp, 0);
+
+#if LWIP_NETIF_STATUS_CALLBACK
+ netif_set_status_callback(&pppos_netif, netif_status_callback);
+#endif /* LWIP_NETIF_STATUS_CALLBACK */
+
+ sys_thread_new("pppos_rx_thread", pppos_rx_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+#endif /* PPPOS_SUPPORT */
+}
diff --git a/contrib/examples/ppp/pppos_example.h b/contrib/examples/ppp/pppos_example.h
new file mode 100644
index 0000000..726961c
--- /dev/null
+++ b/contrib/examples/ppp/pppos_example.h
@@ -0,0 +1,43 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef PPPOS_EXAMPLE_H
+#define PPPOS_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void pppos_example_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PPPOS_EXAMPLE_H */
diff --git a/contrib/examples/snmp/snmp_example.c b/contrib/examples/snmp/snmp_example.c
new file mode 100644
index 0000000..5952474
--- /dev/null
+++ b/contrib/examples/snmp/snmp_example.c
@@ -0,0 +1,80 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include "lwip/netif.h"
+#include "lwip/apps/snmp.h"
+#include "lwip/apps/snmp_mib2.h"
+#include "lwip/apps/snmpv3.h"
+#include "lwip/apps/snmp_snmpv2_framework.h"
+#include "lwip/apps/snmp_snmpv2_usm.h"
+#include "examples/snmp/snmp_v3/snmpv3_dummy.h"
+#include "examples/snmp/snmp_private_mib/private_mib.h"
+#include "snmp_example.h"
+
+#if LWIP_SNMP
+static const struct snmp_mib *mibs[] = {
+ &mib2,
+ &mib_private
+#if LWIP_SNMP_V3
+ , &snmpframeworkmib
+ , &snmpusmmib
+#endif
+};
+#endif /* LWIP_SNMP */
+
+void
+snmp_example_init(void)
+{
+#if LWIP_SNMP
+ s32_t req_nr;
+ lwip_privmib_init();
+#if SNMP_LWIP_MIB2
+#if SNMP_USE_NETCONN
+ snmp_threadsync_init(&snmp_mib2_lwip_locks, snmp_mib2_lwip_synchronizer);
+#endif /* SNMP_USE_NETCONN */
+ snmp_mib2_set_syscontact_readonly((const u8_t*)"root", NULL);
+ snmp_mib2_set_syslocation_readonly((const u8_t*)"lwIP development PC", NULL);
+ snmp_mib2_set_sysdescr((const u8_t*)"lwIP example", NULL);
+#endif /* SNMP_LWIP_MIB2 */
+
+#if LWIP_SNMP_V3
+ snmpv3_dummy_init();
+#endif
+
+ snmp_set_mibs(mibs, LWIP_ARRAYSIZE(mibs));
+ snmp_init();
+
+ snmp_trap_dst_ip_set(0, &netif_default->gw);
+ snmp_trap_dst_enable(0, 1);
+
+ snmp_send_inform_generic(SNMP_GENTRAP_COLDSTART, NULL, &req_nr);
+ snmp_send_trap_generic(SNMP_GENTRAP_COLDSTART);
+
+#endif /* LWIP_SNMP */
+}
diff --git a/contrib/examples/snmp/snmp_example.h b/contrib/examples/snmp/snmp_example.h
new file mode 100644
index 0000000..fafcd68
--- /dev/null
+++ b/contrib/examples/snmp/snmp_example.h
@@ -0,0 +1,43 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef SNMP_EXAMPLE_H
+#define SNMP_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void snmp_example_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SNMP_EXAMPLE_H */
diff --git a/contrib/examples/snmp/snmp_private_mib/lwip_prvmib.c b/contrib/examples/snmp/snmp_private_mib/lwip_prvmib.c
new file mode 100644
index 0000000..51a49fe
--- /dev/null
+++ b/contrib/examples/snmp/snmp_private_mib/lwip_prvmib.c
@@ -0,0 +1,401 @@
+/**
+ * @file
+ * lwip Private MIB
+ *
+ * @todo create MIB file for this example
+ * @note the lwip enterprise tree root (26381) is owned by the lwIP project.
+ * It is NOT allowed to allocate new objects under this ID (26381) without our,
+ * the lwip developers, permission!
+ *
+ * Please apply for your own ID with IANA: http://www.iana.org/numbers.html
+ *
+ * lwip OBJECT IDENTIFIER ::= { enterprises 26381 }
+ * example OBJECT IDENTIFIER ::= { lwip 1 }
+ */
+
+/*
+ * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
+ * 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.
+ *
+ * Author: Christiaan Simons <christiaan.simons@axon.tv>
+ */
+
+#include "private_mib.h"
+
+#if LWIP_SNMP
+
+/** Directory where the sensor files are */
+#define SENSORS_DIR "w:\\sensors"
+/** Set to 1 to read sensor values from files (in directory defined by SENSORS_DIR) */
+#define SENSORS_USE_FILES 0
+/** Set to 1 to search sensor files at startup (in directory defined by SENSORS_DIR) */
+#define SENSORS_SEARCH_FILES 0
+
+#if SENSORS_SEARCH_FILES
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#endif /* SENSORS_SEARCH_FILES */
+
+#include <string.h>
+#include <stdio.h>
+
+#include "lwip/apps/snmp_table.h"
+#include "lwip/apps/snmp_scalar.h"
+
+#if !SENSORS_USE_FILES || !SENSORS_SEARCH_FILES
+/** When not using & searching files, defines the number of sensors */
+#define SENSOR_COUNT 4
+#endif /* !SENSORS_USE_FILES || !SENSORS_SEARCH_FILES */
+
+/*
+ This example presents a table for a few (at most 10) sensors.
+ Sensor detection takes place at initialization (once only).
+ Sensors may and can not be added or removed after agent
+ has started. Note this is only a limitation of this crude example,
+ the agent does support dynamic object insertions and removals.
+
+ You'll need to manually create a directory called "sensors" and
+ a few single line text files with an integer temperature value.
+ The files must be called [0..9].txt.
+
+ ./sensors/0.txt [content: 20]
+ ./sensors/3.txt [content: 75]
+
+ The sensor values may be changed in runtime by editing the
+ text files in the "sensors" directory.
+*/
+
+#define SENSOR_MAX 10
+#define SENSOR_NAME_LEN 20
+
+struct sensor_inf
+{
+ u8_t num;
+
+ char file[SENSOR_NAME_LEN + 1];
+
+#if !SENSORS_USE_FILES
+ /** When not using files, contains the value of the sensor */
+ s32_t value;
+#endif /* !SENSORS_USE_FILES */
+};
+
+static struct sensor_inf sensors[SENSOR_MAX];
+
+static s16_t sensor_count_get_value(struct snmp_node_instance* instance, void* value);
+static snmp_err_t sensor_table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance);
+static snmp_err_t sensor_table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance);
+static s16_t sensor_table_get_value(struct snmp_node_instance* instance, void* value);
+static snmp_err_t sensor_table_set_value(struct snmp_node_instance* instance, u16_t len, void *value);
+
+/* sensorentry .1.3.6.1.4.1.26381.1.1.1 (.level0.level1)
+ where level 0 is the table column (temperature/file name)
+ and level 1 the table row (sensor index) */
+static const struct snmp_table_col_def sensor_table_columns[] = {
+ { 1, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE },
+ { 2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY }
+};
+
+/* sensortable .1.3.6.1.4.1.26381.1.1 */
+static const struct snmp_table_node sensor_table = SNMP_TABLE_CREATE(
+ 1, sensor_table_columns,
+ sensor_table_get_cell_instance, sensor_table_get_next_cell_instance,
+ sensor_table_get_value, snmp_set_test_ok, sensor_table_set_value);
+
+/* sensorcount .1.3.6.1.4.1.26381.1.2 */
+static const struct snmp_scalar_node sensor_count = SNMP_SCALAR_CREATE_NODE_READONLY(
+ 2, SNMP_ASN1_TYPE_INTEGER, sensor_count_get_value);
+
+/* example .1.3.6.1.4.1.26381.1 */
+static const struct snmp_node* const example_nodes[] = {
+ &sensor_table.node.node,
+ &sensor_count.node.node
+};
+static const struct snmp_tree_node example_node = SNMP_CREATE_TREE_NODE(1, example_nodes);
+
+static const u32_t prvmib_base_oid[] = { 1,3,6,1,4,1,26381,1 };
+const struct snmp_mib mib_private = SNMP_MIB_CREATE(prvmib_base_oid, &example_node.node);
+
+#if 0
+/* for reference: we could also have expressed it like this: */
+
+/* lwip .1.3.6.1.4.1.26381 */
+static const struct snmp_node* const lwip_nodes[] = {
+ &example_node.node
+};
+static const struct snmp_tree_node lwip_node = SNMP_CREATE_TREE_NODE(26381, lwip_nodes);
+
+/* enterprises .1.3.6.1.4.1 */
+static const struct snmp_node* const enterprises_nodes[] = {
+ &lwip_node.node
+};
+static const struct snmp_tree_node enterprises_node = SNMP_CREATE_TREE_NODE(1, enterprises_nodes);
+
+/* private .1.3.6.1.4 */
+static const struct snmp_node* const private_nodes[] = {
+ &enterprises_node.node
+};
+static const struct snmp_tree_node private_root = SNMP_CREATE_TREE_NODE(4, private_nodes);
+
+static const u32_t prvmib_base_oid[] = { 1,3,6,1,4 };
+const struct snmp_mib mib_private = SNMP_MIB_CREATE(prvmib_base_oid, &private_root.node);
+#endif
+
+/**
+ * Initialises this private MIB before use.
+ * @see main.c
+ */
+void
+lwip_privmib_init(void)
+{
+#if SENSORS_USE_FILES && SENSORS_SEARCH_FILES
+ char *buf, *ebuf, *cp;
+ size_t bufsize;
+ int nbytes;
+ struct stat sb;
+ struct dirent *dp;
+ int fd;
+#else /* SENSORS_USE_FILES && SENSORS_SEARCH_FILES */
+ u8_t i;
+#endif /* SENSORS_USE_FILES && SENSORS_SEARCH_FILES */
+
+ memset(sensors, 0, sizeof(sensors));
+
+ printf("SNMP private MIB start, detecting sensors.\n");
+
+#if SENSORS_USE_FILES && SENSORS_SEARCH_FILES
+ /* look for sensors in sensors directory */
+ fd = open(SENSORS_DIR, O_RDONLY);
+ if (fd > -1)
+ {
+ fstat(fd, &sb);
+ bufsize = sb.st_size;
+ if (bufsize < (size_t)sb.st_blksize)
+ {
+ bufsize = sb.st_blksize;
+ }
+ buf = (char*)malloc(bufsize);
+ if (buf != NULL)
+ {
+ do
+ {
+ long base;
+
+ nbytes = getdirentries(fd, buf, bufsize, &base);
+ if (nbytes > 0)
+ {
+ ebuf = buf + nbytes;
+ cp = buf;
+ while (cp < ebuf)
+ {
+ dp = (struct dirent *)cp;
+ if (lwip_isdigit(dp->d_name[0]))
+ {
+ unsigned char idx = dp->d_name[0] - '0';
+
+ sensors[idx].num = idx+1;
+ strncpy(&sensors[idx].file[0], dp->d_name, SENSOR_NAME_LEN);
+ printf("%s\n", sensors[idx].file);
+ }
+ cp += dp->d_reclen;
+ }
+ }
+ }
+ while (nbytes > 0);
+
+ free(buf);
+ }
+ close(fd);
+ }
+#else /* SENSORS_USE_FILES && SENSORS_SEARCH_FILES */
+ for (i = 0; i < SENSOR_COUNT; i++) {
+ sensors[i].num = (u8_t)(i + 1);
+ snprintf(sensors[i].file, sizeof(sensors[i].file), "%d.txt", i);
+
+#if !SENSORS_USE_FILES
+ /* initialize sensor value to != zero */
+ sensors[i].value = 11 * (i+1);
+#endif /* !SENSORS_USE_FILES */
+ }
+#endif /* SENSORS_USE_FILE && SENSORS_SEARCH_FILES */
+}
+
+/* sensorcount .1.3.6.1.4.1.26381.1.2 */
+static s16_t
+sensor_count_get_value(struct snmp_node_instance* instance, void* value)
+{
+ size_t count = 0;
+ u32_t *uint_ptr = (u32_t*)value;
+
+ LWIP_UNUSED_ARG(instance);
+
+ for(count=0; count<LWIP_ARRAYSIZE(sensors); count++) {
+ if(sensors[count].num == 0) {
+ *uint_ptr = (u32_t)count;
+ return sizeof(*uint_ptr);
+ }
+ }
+
+ return 0;
+}
+
+/* sensortable .1.3.6.1.4.1.26381.1.1 */
+/* list of allowed value ranges for incoming OID */
+static const struct snmp_oid_range sensor_table_oid_ranges[] = {
+ { 1, SENSOR_MAX+1 }
+};
+
+static snmp_err_t
+sensor_table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance)
+{
+ u32_t sensor_num;
+ size_t i;
+
+ LWIP_UNUSED_ARG(column);
+
+ /* check if incoming OID length and if values are in plausible range */
+ if(!snmp_oid_in_range(row_oid, row_oid_len, sensor_table_oid_ranges, LWIP_ARRAYSIZE(sensor_table_oid_ranges))) {
+ return SNMP_ERR_NOSUCHINSTANCE;
+ }
+
+ /* get sensor index from incoming OID */
+ sensor_num = row_oid[0];
+
+ /* find sensor with index */
+ for(i=0; i<LWIP_ARRAYSIZE(sensors); i++) {
+ if(sensors[i].num != 0) {
+ if(sensors[i].num == sensor_num) {
+ /* store sensor index for subsequent operations (get/test/set) */
+ cell_instance->reference.u32 = (u32_t)i;
+ return SNMP_ERR_NOERROR;
+ }
+ }
+ }
+
+ /* not found */
+ return SNMP_ERR_NOSUCHINSTANCE;
+}
+
+static snmp_err_t
+sensor_table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance)
+{
+ size_t i;
+ struct snmp_next_oid_state state;
+ u32_t result_temp[LWIP_ARRAYSIZE(sensor_table_oid_ranges)];
+
+ LWIP_UNUSED_ARG(column);
+
+ /* init struct to search next oid */
+ snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(sensor_table_oid_ranges));
+
+ /* iterate over all possible OIDs to find the next one */
+ for(i=0; i<LWIP_ARRAYSIZE(sensors); i++) {
+ if(sensors[i].num != 0) {
+ u32_t test_oid[LWIP_ARRAYSIZE(sensor_table_oid_ranges)];
+
+ test_oid[0] = sensors[i].num;
+
+ /* check generated OID: is it a candidate for the next one? */
+ snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(sensor_table_oid_ranges), (void*)i);
+ }
+ }
+
+ /* did we find a next one? */
+ if(state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {
+ snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
+ /* store sensor index for subsequent operations (get/test/set) */
+ cell_instance->reference.u32 = LWIP_CONST_CAST(u32_t, state.reference);
+ return SNMP_ERR_NOERROR;
+ }
+
+ /* not found */
+ return SNMP_ERR_NOSUCHINSTANCE;
+}
+
+static s16_t
+sensor_table_get_value(struct snmp_node_instance* instance, void* value)
+{
+ u32_t i = instance->reference.u32;
+ s32_t *temperature = (s32_t *)value;
+
+ switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id))
+ {
+ case 1: /* sensor value */
+#if SENSORS_USE_FILES
+ FILE* sensf;
+ char senspath[sizeof(SENSORS_DIR)+1+SENSOR_NAME_LEN+1] = SENSORS_DIR"/";
+
+ strncpy(&senspath[sizeof(SENSORS_DIR)],
+ sensors[i].file,
+ SENSOR_NAME_LEN);
+ sensf = fopen(senspath,"r");
+ if (sensf != NULL)
+ {
+ fscanf(sensf,"%"S32_F,temperature);
+ fclose(sensf);
+ }
+#else /* SENSORS_USE_FILES */
+ *temperature = sensors[i].value;
+#endif /* SENSORS_USE_FILES */
+ return sizeof(s32_t);
+ case 2: /* file name */
+ MEMCPY(value, sensors[i].file, strlen(sensors[i].file));
+ return (s16_t)strlen(sensors[i].file);
+ default:
+ return 0;
+ }
+}
+
+static snmp_err_t
+sensor_table_set_value(struct snmp_node_instance* instance, u16_t len, void *value)
+{
+ u32_t i = instance->reference.u32;
+ s32_t *temperature = (s32_t *)value;
+#if SENSORS_USE_FILES
+ FILE* sensf;
+ char senspath[sizeof(SENSORS_DIR)+1+SENSOR_NAME_LEN+1] = SENSORS_DIR"/";
+
+ strncpy(&senspath[sizeof(SENSORS_DIR)],
+ sensors[i].file,
+ SENSOR_NAME_LEN);
+ sensf = fopen(senspath, "w");
+ if (sensf != NULL)
+ {
+ fprintf(sensf, "%"S32_F, *temperature);
+ fclose(sensf);
+ }
+#else /* SENSORS_USE_FILES */
+ sensors[i].value = *temperature;
+#endif /* SENSORS_USE_FILES */
+
+ LWIP_UNUSED_ARG(len);
+
+ return SNMP_ERR_NOERROR;
+}
+
+#endif /* LWIP_SNMP */
diff --git a/contrib/examples/snmp/snmp_private_mib/private_mib.h b/contrib/examples/snmp/snmp_private_mib/private_mib.h
new file mode 100644
index 0000000..69be8a4
--- /dev/null
+++ b/contrib/examples/snmp/snmp_private_mib/private_mib.h
@@ -0,0 +1,26 @@
+/**
+ * @file
+ * Exports Private lwIP MIB
+ */
+
+#ifndef LWIP_HDR_PRIVATE_MIB_H
+#define LWIP_HDR_PRIVATE_MIB_H
+
+#include "lwip/apps/snmp_opts.h"
+
+#include "lwip/apps/snmp_core.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* export MIB */
+extern const struct snmp_mib mib_private;
+
+void lwip_privmib_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/contrib/examples/snmp/snmp_v3/snmpv3_dummy.c b/contrib/examples/snmp/snmp_v3/snmpv3_dummy.c
new file mode 100644
index 0000000..a7c53ed
--- /dev/null
+++ b/contrib/examples/snmp/snmp_v3/snmpv3_dummy.c
@@ -0,0 +1,395 @@
+/**
+ * @file
+ * Dummy SNMPv3 functions.
+ */
+
+/*
+ * Copyright (c) 2016 Elias Oenal.
+ * 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.
+ *
+ * Author: Elias Oenal <lwip@eliasoenal.com>
+ * Dirk Ziegelmeier <dirk@ziegelmeier.net>
+ */
+
+#include "lwip/apps/snmpv3.h"
+#include "snmpv3_dummy.h"
+#include <string.h>
+#include "lwip/err.h"
+#include "lwip/def.h"
+#include "lwip/timeouts.h"
+
+#if LWIP_SNMP && LWIP_SNMP_V3
+
+struct user_table_entry {
+ char username[32];
+ snmpv3_auth_algo_t auth_algo;
+ u8_t auth_key[20];
+ snmpv3_priv_algo_t priv_algo;
+ u8_t priv_key[20];
+};
+
+static struct user_table_entry user_table[] = {
+ { "lwip", SNMP_V3_AUTH_ALGO_INVAL, "" , SNMP_V3_PRIV_ALGO_INVAL, "" },
+ { "piwl", SNMP_V3_AUTH_ALGO_INVAL, "" , SNMP_V3_PRIV_ALGO_INVAL, "" },
+ { "test", SNMP_V3_AUTH_ALGO_INVAL, "" , SNMP_V3_PRIV_ALGO_INVAL, "" }
+};
+
+static char snmpv3_engineid[32];
+static u8_t snmpv3_engineid_len;
+
+static u32_t enginetime = 0;
+
+/* In this implementation engineboots is volatile. In a real world application this value should be stored in non-volatile memory.*/
+static u32_t engineboots = 0;
+
+/**
+ * @brief Get the user table entry for the given username.
+ *
+ * @param[in] username pointer to the username
+ *
+ * @return pointer to the user table entry or NULL if not found.
+ */
+static struct user_table_entry*
+get_user(const char *username)
+{
+ size_t i;
+
+ for (i = 0; i < LWIP_ARRAYSIZE(user_table); i++) {
+ if (strnlen(username, 32) != strnlen(user_table[i].username, 32)) {
+ continue;
+ }
+
+ if (memcmp(username, user_table[i].username, strnlen(username, 32)) == 0) {
+ return &user_table[i];
+ }
+ }
+
+ return NULL;
+}
+
+u8_t
+snmpv3_get_amount_of_users(void)
+{
+ return LWIP_ARRAYSIZE(user_table);
+}
+
+/**
+ * @brief Get the username of a user number (index)
+ * @param username is a pointer to a string.
+ * @param index is the user index.
+ * @return ERR_OK if user is found, ERR_VAL is user is not found.
+ */
+err_t
+snmpv3_get_username(char *username, u8_t index)
+{
+ if (index < LWIP_ARRAYSIZE(user_table)) {
+ MEMCPY(username, user_table[index].username, sizeof(user_table[0].username));
+ return ERR_OK;
+ }
+
+ return ERR_VAL;
+}
+
+/**
+ * Timer callback function that increments enginetime and reschedules itself.
+ *
+ * @param arg unused argument
+ */
+static void
+snmpv3_enginetime_timer(void *arg)
+{
+ LWIP_UNUSED_ARG(arg);
+
+ enginetime++;
+
+ /* This handles the engine time reset */
+ snmpv3_get_engine_time_internal();
+
+ /* restart timer */
+ sys_timeout(1000, snmpv3_enginetime_timer, NULL);
+}
+
+err_t
+snmpv3_set_user_auth_algo(const char *username, snmpv3_auth_algo_t algo)
+{
+ struct user_table_entry *p = get_user(username);
+
+ if (p) {
+ switch (algo) {
+ case SNMP_V3_AUTH_ALGO_INVAL:
+ if (p->priv_algo != SNMP_V3_PRIV_ALGO_INVAL) {
+ /* Privacy MUST be disabled before configuring authentication */
+ break;
+ } else {
+ p->auth_algo = algo;
+ return ERR_OK;
+ }
+#if LWIP_SNMP_V3_CRYPTO
+ case SNMP_V3_AUTH_ALGO_MD5:
+ case SNMP_V3_AUTH_ALGO_SHA:
+#endif
+ p->auth_algo = algo;
+ return ERR_OK;
+ default:
+ break;
+ }
+ }
+
+ return ERR_VAL;
+}
+
+err_t
+snmpv3_set_user_priv_algo(const char *username, snmpv3_priv_algo_t algo)
+{
+ struct user_table_entry *p = get_user(username);
+
+ if (p) {
+ switch (algo) {
+#if LWIP_SNMP_V3_CRYPTO
+ case SNMP_V3_PRIV_ALGO_AES:
+ case SNMP_V3_PRIV_ALGO_DES:
+ if (p->auth_algo == SNMP_V3_AUTH_ALGO_INVAL) {
+ /* Authentication MUST be enabled before configuring privacy */
+ break;
+ } else {
+ p->priv_algo = algo;
+ return ERR_OK;
+ }
+#endif
+ case SNMP_V3_PRIV_ALGO_INVAL:
+ p->priv_algo = algo;
+ return ERR_OK;
+ default:
+ break;
+ }
+ }
+
+ return ERR_VAL;
+}
+
+err_t
+snmpv3_set_user_auth_key(const char *username, const char *password)
+{
+ struct user_table_entry *p = get_user(username);
+ const char *engineid;
+ u8_t engineid_len;
+
+ if (p) {
+ /* password should be at least 8 characters long */
+ if (strlen(password) >= 8) {
+ memset(p->auth_key, 0, sizeof(p->auth_key));
+ snmpv3_get_engine_id(&engineid, &engineid_len);
+ switch (p->auth_algo) {
+ case SNMP_V3_AUTH_ALGO_INVAL:
+ return ERR_OK;
+#if LWIP_SNMP_V3_CRYPTO
+ case SNMP_V3_AUTH_ALGO_MD5:
+ snmpv3_password_to_key_md5((const u8_t*)password, strlen(password), (const u8_t*)engineid, engineid_len, p->auth_key);
+ return ERR_OK;
+ case SNMP_V3_AUTH_ALGO_SHA:
+ snmpv3_password_to_key_sha((const u8_t*)password, strlen(password), (const u8_t*)engineid, engineid_len, p->auth_key);
+ return ERR_OK;
+#endif
+ default:
+ return ERR_VAL;
+ }
+ }
+ }
+
+ return ERR_VAL;
+}
+
+err_t
+snmpv3_set_user_priv_key(const char *username, const char *password)
+{
+ struct user_table_entry *p = get_user(username);
+ const char *engineid;
+ u8_t engineid_len;
+
+ if (p) {
+ /* password should be at least 8 characters long */
+ if (strlen(password) >= 8) {
+ memset(p->priv_key, 0, sizeof(p->priv_key));
+ snmpv3_get_engine_id(&engineid, &engineid_len);
+ switch (p->auth_algo) {
+ case SNMP_V3_AUTH_ALGO_INVAL:
+ return ERR_OK;
+#if LWIP_SNMP_V3_CRYPTO
+ case SNMP_V3_AUTH_ALGO_MD5:
+ snmpv3_password_to_key_md5((const u8_t*)password, strlen(password), (const u8_t*)engineid, engineid_len, p->priv_key);
+ return ERR_OK;
+ case SNMP_V3_AUTH_ALGO_SHA:
+ snmpv3_password_to_key_sha((const u8_t*)password, strlen(password), (const u8_t*)engineid, engineid_len, p->priv_key);
+ return ERR_OK;
+#endif
+ default:
+ return ERR_VAL;
+ }
+ }
+ }
+
+ return ERR_VAL;
+}
+
+/**
+ * @brief Get the storage type of the given username.
+ *
+ * @param[in] username pointer to the username
+ * @param[out] type the storage type
+ *
+ * @return ERR_OK if the user was found, ERR_VAL if not.
+ */
+err_t
+snmpv3_get_user_storagetype(const char *username, snmpv3_user_storagetype_t *type)
+{
+ if (get_user(username) != NULL) {
+ /* Found user in user table
+ * In this dummy implementation, storage is permanent because no user can be deleted.
+ * All changes to users are lost after a reboot.*/
+ *type = SNMP_V3_USER_STORAGETYPE_PERMANENT;
+ return ERR_OK;
+ }
+
+ return ERR_VAL;
+}
+
+/**
+ * @param username is a pointer to a string.
+ * @param auth_algo is a pointer to u8_t. The implementation has to set this if user was found.
+ * @param auth_key is a pointer to a pointer to a string. Implementation has to set this if user was found.
+ * @param priv_algo is a pointer to u8_t. The implementation has to set this if user was found.
+ * @param priv_key is a pointer to a pointer to a string. Implementation has to set this if user was found.
+ */
+err_t
+snmpv3_get_user(const char* username, snmpv3_auth_algo_t *auth_algo, u8_t *auth_key, snmpv3_priv_algo_t *priv_algo, u8_t *priv_key)
+{
+ const struct user_table_entry *p;
+
+ /* The msgUserName specifies the user (principal) on whose behalf the
+ message is being exchanged. Note that a zero-length userName will
+ not match any user, but it can be used for snmpEngineID discovery. */
+ if(strlen(username) == 0) {
+ return ERR_OK;
+ }
+
+ p = get_user(username);
+
+ if (!p) {
+ return ERR_VAL;
+ }
+
+ if (auth_algo != NULL) {
+ *auth_algo = p->auth_algo;
+ }
+ if(auth_key != NULL) {
+ MEMCPY(auth_key, p->auth_key, sizeof(p->auth_key));
+ }
+ if (priv_algo != NULL) {
+ *priv_algo = p->priv_algo;
+ }
+ if(priv_key != NULL) {
+ MEMCPY(priv_key, p->priv_key, sizeof(p->priv_key));
+ }
+ return ERR_OK;
+}
+
+/**
+ * Get engine ID from persistence
+ */
+void
+snmpv3_get_engine_id(const char **id, u8_t *len)
+{
+ *id = snmpv3_engineid;
+ *len = snmpv3_engineid_len;
+}
+
+/**
+ * Store engine ID in persistence
+ */
+err_t
+snmpv3_set_engine_id(const char *id, u8_t len)
+{
+ MEMCPY(snmpv3_engineid, id, len);
+ snmpv3_engineid_len = len;
+ return ERR_OK;
+}
+
+/**
+ * Get engine boots from persistence. Must be increased on each boot.
+ */
+u32_t
+snmpv3_get_engine_boots(void)
+{
+ return engineboots;
+}
+
+/**
+ * Store engine boots in persistence
+ */
+void
+snmpv3_set_engine_boots(u32_t boots)
+{
+ engineboots = boots;
+}
+
+/**
+ * RFC3414 2.2.2.
+ * Once the timer reaches 2147483647 it gets reset to zero and the
+ * engine boot ups get incremented.
+ */
+u32_t
+snmpv3_get_engine_time(void)
+{
+ return enginetime;
+}
+
+/**
+ * Reset current engine time to 0
+ */
+void
+snmpv3_reset_engine_time(void)
+{
+ enginetime = 0;
+}
+
+/**
+ * Initialize dummy SNMPv3 implementation
+ */
+void
+snmpv3_dummy_init(void)
+{
+ snmpv3_set_engine_id("FOO", 3);
+
+ snmpv3_set_user_auth_algo("lwip", SNMP_V3_AUTH_ALGO_SHA);
+ snmpv3_set_user_auth_key("lwip", "maplesyrup");
+
+ snmpv3_set_user_priv_algo("lwip", SNMP_V3_PRIV_ALGO_DES);
+ snmpv3_set_user_priv_key("lwip", "maplesyrup");
+
+ /* Start the engine time timer */
+ snmpv3_enginetime_timer(NULL);
+}
+
+#endif /* LWIP_SNMP && LWIP_SNMP_V3 */
diff --git a/contrib/examples/snmp/snmp_v3/snmpv3_dummy.h b/contrib/examples/snmp/snmp_v3/snmpv3_dummy.h
new file mode 100644
index 0000000..ba25b6d
--- /dev/null
+++ b/contrib/examples/snmp/snmp_v3/snmpv3_dummy.h
@@ -0,0 +1,53 @@
+/**
+ * @file
+ * Dummy SNMPv3 functions.
+ */
+
+/*
+ * Copyright (c) 2017 Dirk Ziegelmeier.
+ * 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.
+ *
+ * Author: Dirk Ziegelmeier <dziegel@gmx.de>
+ */
+
+#ifndef LWIP_HDR_APPS_SNMP_V3_DUMMY_H
+#define LWIP_HDR_APPS_SNMP_V3_DUMMY_H
+
+#include "lwip/apps/snmp_opts.h"
+#include "lwip/err.h"
+#include "lwip/apps/snmpv3.h"
+
+#if LWIP_SNMP && LWIP_SNMP_V3
+
+err_t snmpv3_set_user_auth_algo(const char *username, snmpv3_auth_algo_t algo);
+err_t snmpv3_set_user_priv_algo(const char *username, snmpv3_priv_algo_t algo);
+err_t snmpv3_set_user_auth_key(const char *username, const char *password);
+err_t snmpv3_set_user_priv_key(const char *username, const char *password);
+
+void snmpv3_dummy_init(void);
+
+#endif /* LWIP_SNMP && LWIP_SNMP_V3 */
+
+#endif /* LWIP_HDR_APPS_SNMP_V3_DUMMY_H */
diff --git a/contrib/examples/sntp/sntp_example.c b/contrib/examples/sntp/sntp_example.c
new file mode 100644
index 0000000..e9f6ac8
--- /dev/null
+++ b/contrib/examples/sntp/sntp_example.c
@@ -0,0 +1,66 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include <time.h>
+
+#include "lwip/opt.h"
+#include "lwip/apps/sntp.h"
+#include "sntp_example.h"
+#include "lwip/netif.h"
+
+void
+sntp_set_system_time(u32_t sec)
+{
+ char buf[32];
+ struct tm current_time_val;
+ time_t current_time = (time_t)sec;
+
+#if defined(_WIN32) || defined(WIN32)
+ localtime_s(¤t_time_val, ¤t_time);
+#else
+ localtime_r(¤t_time, ¤t_time_val);
+#endif
+
+ strftime(buf, sizeof(buf), "%d.%m.%Y %H:%M:%S", ¤t_time_val);
+ LWIP_PLATFORM_DIAG(("SNTP time: %s\n", buf));
+}
+
+void
+sntp_example_init(void)
+{
+ sntp_setoperatingmode(SNTP_OPMODE_POLL);
+#if LWIP_DHCP
+ sntp_servermode_dhcp(1); /* get SNTP server via DHCP */
+#else /* LWIP_DHCP */
+#if LWIP_IPV4
+ sntp_setserver(0, netif_ip_gw4(netif_default));
+#endif /* LWIP_IPV4 */
+#endif /* LWIP_DHCP */
+ sntp_init();
+}
diff --git a/contrib/examples/sntp/sntp_example.h b/contrib/examples/sntp/sntp_example.h
new file mode 100644
index 0000000..94fc10d
--- /dev/null
+++ b/contrib/examples/sntp/sntp_example.h
@@ -0,0 +1,45 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#ifndef SNTP_EXAMPLE_H
+#define SNTP_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void sntp_example_init(void);
+
+void sntp_set_system_time(u32_t sec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SNTP_EXAMPLE_H */
diff --git a/contrib/examples/tftp/tftp_example.c b/contrib/examples/tftp/tftp_example.c
new file mode 100644
index 0000000..3e14014
--- /dev/null
+++ b/contrib/examples/tftp/tftp_example.c
@@ -0,0 +1,155 @@
+/*
+ * 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: Dirk Ziegelmeier <dziegel@gmx.de>
+ *
+ */
+
+#include <stdio.h>
+
+#include "lwip/apps/tftp_client.h"
+#include "lwip/apps/tftp_server.h"
+#include "tftp_example.h"
+
+#include <string.h>
+
+#if LWIP_UDP
+
+/* Define a base directory for TFTP access
+ * ATTENTION: This code does NOT check for sandboxing,
+ * i.e. '..' in paths is not checked! */
+#ifndef LWIP_TFTP_EXAMPLE_BASE_DIR
+#define LWIP_TFTP_EXAMPLE_BASE_DIR ""
+#endif
+
+/* Define this to a file to get via tftp client */
+#ifndef LWIP_TFTP_EXAMPLE_CLIENT_FILENAME
+#define LWIP_TFTP_EXAMPLE_CLIENT_FILENAME "test.bin"
+#endif
+
+/* Define this to a server IP string */
+#ifndef LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP
+#define LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP "192.168.0.1"
+#endif
+
+static char full_filename[256];
+
+static void *
+tftp_open_file(const char* fname, u8_t is_write)
+{
+ snprintf(full_filename, sizeof(full_filename), "%s%s", LWIP_TFTP_EXAMPLE_BASE_DIR, fname);
+ full_filename[sizeof(full_filename)-1] = 0;
+
+ if (is_write) {
+ return (void*)fopen(full_filename, "wb");
+ } else {
+ return (void*)fopen(full_filename, "rb");
+ }
+}
+
+static void*
+tftp_open(const char* fname, const char* mode, u8_t is_write)
+{
+ LWIP_UNUSED_ARG(mode);
+ return tftp_open_file(fname, is_write);
+}
+
+static void
+tftp_close(void* handle)
+{
+ fclose((FILE*)handle);
+}
+
+static int
+tftp_read(void* handle, void* buf, int bytes)
+{
+ int ret = fread(buf, 1, bytes, (FILE*)handle);
+ if (ret <= 0) {
+ return -1;
+ }
+ return ret;
+}
+
+static int
+tftp_write(void* handle, struct pbuf* p)
+{
+ while (p != NULL) {
+ if (fwrite(p->payload, 1, p->len, (FILE*)handle) != (size_t)p->len) {
+ return -1;
+ }
+ p = p->next;
+ }
+
+ return 0;
+}
+
+/* For TFTP client only */
+static void
+tftp_error(void* handle, int err, const char* msg, int size)
+{
+ char message[100];
+
+ LWIP_UNUSED_ARG(handle);
+
+ memset(message, 0, sizeof(message));
+ MEMCPY(message, msg, LWIP_MIN(sizeof(message)-1, (size_t)size));
+
+ printf("TFTP error: %d (%s)", err, message);
+}
+
+static const struct tftp_context tftp = {
+ tftp_open,
+ tftp_close,
+ tftp_read,
+ tftp_write,
+ tftp_error
+};
+
+void
+tftp_example_init_server(void)
+{
+ tftp_init_server(&tftp);
+}
+
+void
+tftp_example_init_client(void)
+{
+ void *f;
+ err_t err;
+ ip_addr_t srv;
+ int ret = ipaddr_aton(LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP, &srv);
+ LWIP_ASSERT("ipaddr_aton failed", ret == 1);
+
+ err = tftp_init_client(&tftp);
+ LWIP_ASSERT("tftp_init_client failed", err == ERR_OK);
+
+ f = tftp_open_file(LWIP_TFTP_EXAMPLE_CLIENT_FILENAME, 1);
+ LWIP_ASSERT("failed to create file", f != NULL);
+
+ err = tftp_get(f, &srv, TFTP_PORT, LWIP_TFTP_EXAMPLE_CLIENT_FILENAME, TFTP_MODE_OCTET);
+ LWIP_ASSERT("tftp_get failed", err == ERR_OK);
+}
+
+#endif /* LWIP_UDP */
diff --git a/contrib/examples/tftp/tftp_example.h b/contrib/examples/tftp/tftp_example.h
new file mode 100644
index 0000000..7340700
--- /dev/null
+++ b/contrib/examples/tftp/tftp_example.h
@@ -0,0 +1,29 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * File: tftp_example.h
+ * Author: dziegel
+ *
+ * Created on February 17, 2018, 3:43 PM
+ */
+
+#ifndef TFTP_EXAMPLE_H
+#define TFTP_EXAMPLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void tftp_example_init_server(void);
+void tftp_example_init_client(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TFTP_EXAMPLE_H */
+
diff --git a/contrib/ports/CMakeCommon.cmake b/contrib/ports/CMakeCommon.cmake
new file mode 100644
index 0000000..a56b59c
--- /dev/null
+++ b/contrib/ports/CMakeCommon.cmake
@@ -0,0 +1,128 @@
+if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
+ include_guard(GLOBAL)
+endif()
+
+if(NOT CMAKE_BUILD_TYPE)
+ message(STATUS "CMAKE_BUILD_TYPE not set - defaulting to Debug build.")
+ set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build, options are: ${CMAKE_CONFIGURATION_TYPES}." FORCE)
+endif()
+message (STATUS "Build type: ${CMAKE_BUILD_TYPE}")
+
+set(LWIP_CONTRIB_DIR ${LWIP_DIR}/contrib)
+
+# ARM mbedtls support https://tls.mbed.org/
+if(NOT DEFINED LWIP_MBEDTLSDIR)
+ set(LWIP_MBEDTLSDIR ${LWIP_DIR}/../mbedtls)
+ message(STATUS "LWIP_MBEDTLSDIR not set - using default location ${LWIP_MBEDTLSDIR}")
+endif()
+if(EXISTS ${LWIP_MBEDTLSDIR}/CMakeLists.txt)
+ set(LWIP_HAVE_MBEDTLS ON BOOL)
+
+ # Prevent building MBEDTLS programs and tests
+ set(ENABLE_PROGRAMS OFF CACHE BOOL "")
+ set(ENABLE_TESTING OFF CACHE BOOL "")
+
+ # mbedtls uses cmake. Sweet!
+ add_subdirectory(${LWIP_MBEDTLSDIR} mbedtls)
+
+ set (LWIP_MBEDTLS_DEFINITIONS
+ LWIP_HAVE_MBEDTLS=1
+ )
+ set (LWIP_MBEDTLS_INCLUDE_DIRS
+ ${LWIP_MBEDTLSDIR}/include
+ )
+ set (LWIP_MBEDTLS_LINK_LIBRARIES
+ mbedtls
+ mbedcrypto
+ mbedx509
+ )
+endif()
+
+set(LWIP_COMPILER_FLAGS_GNU_CLANG
+ $<$<CONFIG:Debug>:-Og>
+ $<$<CONFIG:Debug>:-g>
+ $<$<CONFIG:Release>:-O3>
+ -Wall
+ -pedantic
+ -Werror
+ -Wparentheses
+ -Wsequence-point
+ -Wswitch-default
+ -Wextra
+ -Wundef
+ -Wshadow
+ -Wpointer-arith
+ -Wcast-qual
+ -Wwrite-strings
+ $<$<COMPILE_LANGUAGE:C>:-Wold-style-definition>
+ -Wcast-align
+ $<$<COMPILE_LANGUAGE:C>:-Wmissing-prototypes>
+ $<$<COMPILE_LANGUAGE:C>:-Wnested-externs>
+ -Wunreachable-code
+ -Wuninitialized
+ -Wmissing-prototypes
+ -Waggregate-return
+ -Wlogical-not-parentheses
+)
+
+if (NOT LWIP_HAVE_MBEDTLS)
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ -Wredundant-decls
+ $<$<COMPILE_LANGUAGE:C>:-Wc++-compat>
+ )
+endif()
+
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ -Wlogical-op
+ -Wtrampolines
+ )
+
+ if (NOT LWIP_HAVE_MBEDTLS)
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ $<$<COMPILE_LANGUAGE:C>:-Wc90-c99-compat>
+ )
+ endif()
+
+ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9)
+ if(LWIP_USE_SANITIZERS)
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ -fsanitize=address
+ -fsanitize=undefined
+ -fno-sanitize=alignment
+ -fstack-protector
+ -fstack-check
+ )
+ set(LWIP_SANITIZER_LIBS asan ubsan)
+ endif()
+ endif()
+
+ set(LWIP_COMPILER_FLAGS ${LWIP_COMPILER_FLAGS_GNU_CLANG})
+endif()
+
+if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ -Wdocumentation
+ -Wno-documentation-deprecated-sync
+ )
+
+ if(LWIP_USE_SANITIZERS)
+ list(APPEND LWIP_COMPILER_FLAGS_GNU_CLANG
+ -fsanitize=address
+ -fsanitize=undefined
+ -fno-sanitize=alignment
+ )
+ set(LWIP_SANITIZER_LIBS asan ubsan)
+ endif()
+
+ set(LWIP_COMPILER_FLAGS ${LWIP_COMPILER_FLAGS_GNU_CLANG})
+endif()
+
+if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
+ set(LWIP_COMPILER_FLAGS
+ $<$<CONFIG:Debug>:/Od>
+ $<$<CONFIG:Release>:/Ox>
+ /W4
+ /WX
+ )
+endif()
diff --git a/contrib/ports/Common.allports.mk b/contrib/ports/Common.allports.mk
new file mode 100644
index 0000000..049ba6a
--- /dev/null
+++ b/contrib/ports/Common.allports.mk
@@ -0,0 +1,91 @@
+#
+# 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
+#CC=clang
+CCDEP?=$(CC)
+
+CFLAGS+=-g -DLWIP_DEBUG -Wall -pedantic -Werror \
+ -Wparentheses -Wsequence-point -Wswitch-default \
+ -Wextra -Wundef -Wshadow -Wpointer-arith -Wcast-qual \
+ -Wc++-compat -Wwrite-strings -Wold-style-definition -Wcast-align \
+ -Wmissing-prototypes -Wnested-externs \
+ -Wunreachable-code -Wuninitialized -Wmissing-prototypes \
+ -Wredundant-decls -Waggregate-return -Wlogical-not-parentheses
+# -Wconversion -Wsign-compare -Wmissing-include-dirs
+
+ifeq (,$(findstring clang,$(CC)))
+CFLAGS+= -Wlogical-op -Wc90-c99-compat -Wtrampolines
+# if GCC is newer than 4.8/4.9 you may use:
+#CFLAGS:=$(CFLAGS) -fsanitize=address -fstack-protector -fstack-check -fsanitize=undefined -fno-sanitize=alignment
+else
+# we cannot sanitize alignment on x86-64 targets because clang wants 64 bit alignment
+CFLAGS+= -fsanitize=address -fsanitize=undefined -fno-sanitize=alignment -Wdocumentation -Wno-documentation-deprecated-sync
+endif
+
+CONTRIBDIR?=../../..
+ARFLAGS?=rs
+
+#Set this to where you have the lwip core module checked out from git
+#default assumes it's a dir above the contrib module
+LWIPDIR?=$(CONTRIBDIR)/..
+
+CFLAGS+=-I. \
+ -I$(CONTRIBDIR) \
+ -I$(LWIPDIR)/include \
+ -I$(LWIPARCH)/include
+
+# Add include path and link to mbedTLS lib if available
+MBEDTLSDIR?=$(LWIPDIR)/../mbedtls
+ifneq (,$(wildcard $(MBEDTLSDIR)/include/mbedtls/*.h))
+LDFLAGS+=-L$(MBEDTLSDIR)/library -lmbedtls -lmbedcrypto -lmbedx509
+CFLAGS+=-I$(MBEDTLSDIR)/include -Wno-redundant-decls -DLWIP_HAVE_MBEDTLS=1 -Wno-c90-c99-compat
+endif
+
+include $(CONTRIBDIR)/Filelists.mk
+include $(LWIPDIR)/Filelists.mk
+
+# LWIPFILES: All the above.
+LWIPFILES=$(LWIPNOAPPSFILES) $(ARCHFILES)
+LWIPOBJS=$(notdir $(LWIPFILES:.c=.o))
+
+LWIPLIBCOMMON=liblwipcommon.a
+$(LWIPLIBCOMMON): $(LWIPOBJS)
+ $(AR) $(ARFLAGS) $(LWIPLIBCOMMON) $?
+
+APPFILES=$(CONTRIBAPPFILES) $(LWIPAPPFILES)
+APPLIB=liblwipapps.a
+APPOBJS=$(notdir $(APPFILES:.c=.o))
+$(APPLIB): $(APPOBJS)
+ $(AR) $(ARFLAGS) $(APPLIB) $?
+
+%.o:
+ $(CC) $(CFLAGS) -c $<
diff --git a/contrib/ports/freertos/include/arch/sys_arch.h b/contrib/ports/freertos/include/arch/sys_arch.h
new file mode 100644
index 0000000..0cfc889
--- /dev/null
+++ b/contrib/ports/freertos/include/arch/sys_arch.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmdit <goldsimon@gmx.de>
+ *
+ */
+#ifndef LWIP_ARCH_SYS_ARCH_H
+#define LWIP_ARCH_SYS_ARCH_H
+
+#include "lwip/opt.h"
+#include "lwip/arch.h"
+
+/** This is returned by _fromisr() sys functions to tell the outermost function
+ * that a higher priority task was woken and the scheduler needs to be invoked.
+ */
+#define ERR_NEED_SCHED 123
+
+/* This port includes FreeRTOS headers in sys_arch.c only.
+ * FreeRTOS uses pointers as object types. We use wrapper structs instead of
+ * void pointers directly to get a tiny bit of type safety.
+ */
+
+void sys_arch_msleep(u32_t delay_ms);
+#define sys_msleep(ms) sys_arch_msleep(ms)
+
+#if SYS_LIGHTWEIGHT_PROT
+typedef u32_t sys_prot_t;
+#endif /* SYS_LIGHTWEIGHT_PROT */
+
+#if !LWIP_COMPAT_MUTEX
+struct _sys_mut {
+ void *mut;
+};
+typedef struct _sys_mut sys_mutex_t;
+#define sys_mutex_valid_val(mutex) ((mutex).mut != NULL)
+#define sys_mutex_valid(mutex) (((mutex) != NULL) && sys_mutex_valid_val(*(mutex)))
+#define sys_mutex_set_invalid(mutex) ((mutex)->mut = NULL)
+#endif /* !LWIP_COMPAT_MUTEX */
+
+struct _sys_sem {
+ void *sem;
+};
+typedef struct _sys_sem sys_sem_t;
+#define sys_sem_valid_val(sema) ((sema).sem != NULL)
+#define sys_sem_valid(sema) (((sema) != NULL) && sys_sem_valid_val(*(sema)))
+#define sys_sem_set_invalid(sema) ((sema)->sem = NULL)
+
+struct _sys_mbox {
+ void *mbx;
+};
+typedef struct _sys_mbox sys_mbox_t;
+#define sys_mbox_valid_val(mbox) ((mbox).mbx != NULL)
+#define sys_mbox_valid(mbox) (((mbox) != NULL) && sys_mbox_valid_val(*(mbox)))
+#define sys_mbox_set_invalid(mbox) ((mbox)->mbx = NULL)
+
+struct _sys_thread {
+ void *thread_handle;
+};
+typedef struct _sys_thread sys_thread_t;
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+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()
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+#endif /* LWIP_ARCH_SYS_ARCH_H */
diff --git a/contrib/ports/freertos/sys_arch.c b/contrib/ports/freertos/sys_arch.c
new file mode 100644
index 0000000..8568353
--- /dev/null
+++ b/contrib/ports/freertos/sys_arch.c
@@ -0,0 +1,607 @@
+/*
+ * Copyright (c) 2017 Simon Goldschmidt
+ * 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: Simon Goldschmidt <goldsimon@gmx.de>
+ *
+ */
+
+/* lwIP includes. */
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/sys.h"
+#include "lwip/mem.h"
+#include "lwip/stats.h"
+#include "lwip/tcpip.h"
+#include "FreeRTOS.h"
+#include "semphr.h"
+#include "task.h"
+
+/** Set this to 1 if you want the stack size passed to sys_thread_new() to be
+ * interpreted as number of stack words (FreeRTOS-like).
+ * Default is that they are interpreted as byte count (lwIP-like).
+ */
+#ifndef LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS
+#define LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS 0
+#endif
+
+/** Set this to 1 to use a mutex for SYS_ARCH_PROTECT() critical regions.
+ * Default is 0 and locks interrupts/scheduler for SYS_ARCH_PROTECT().
+ */
+#ifndef LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+#define LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX 0
+#endif
+
+/** Set this to 1 to include a sanity check that SYS_ARCH_PROTECT() and
+ * SYS_ARCH_UNPROTECT() are called matching.
+ */
+#ifndef LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK
+#define LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK 0
+#endif
+
+/** Set this to 1 to let sys_mbox_free check that queues are empty when freed */
+#ifndef LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE
+#define LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE 0
+#endif
+
+/** Set this to 1 to enable core locking check functions in this port.
+ * For this to work, you'll have to define LWIP_ASSERT_CORE_LOCKED()
+ * and LWIP_MARK_TCPIP_THREAD() correctly in your lwipopts.h! */
+#ifndef LWIP_FREERTOS_CHECK_CORE_LOCKING
+#define LWIP_FREERTOS_CHECK_CORE_LOCKING 0
+#endif
+
+/** Set this to 0 to implement sys_now() yourself, e.g. using a hw timer.
+ * Default is 1, where FreeRTOS ticks are used to calculate back to ms.
+ */
+#ifndef LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS
+#define LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS 1
+#endif
+
+#if !configSUPPORT_DYNAMIC_ALLOCATION
+# error "lwIP FreeRTOS port requires configSUPPORT_DYNAMIC_ALLOCATION"
+#endif
+#if !INCLUDE_vTaskDelay
+# error "lwIP FreeRTOS port requires INCLUDE_vTaskDelay"
+#endif
+#if !INCLUDE_vTaskSuspend
+# error "lwIP FreeRTOS port requires INCLUDE_vTaskSuspend"
+#endif
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX || !LWIP_COMPAT_MUTEX
+#if !configUSE_MUTEXES
+# error "lwIP FreeRTOS port requires configUSE_MUTEXES"
+#endif
+#endif
+
+#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+static SemaphoreHandle_t sys_arch_protect_mutex;
+#endif
+#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK
+static sys_prot_t sys_arch_protect_nesting;
+#endif
+
+/* Initialize this module (see description in sys.h) */
+void
+sys_init(void)
+{
+#if SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+ /* initialize sys_arch_protect global mutex */
+ sys_arch_protect_mutex = xSemaphoreCreateRecursiveMutex();
+ LWIP_ASSERT("failed to create sys_arch_protect mutex",
+ sys_arch_protect_mutex != NULL);
+#endif /* SYS_LIGHTWEIGHT_PROT && LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */
+}
+
+#if configUSE_16_BIT_TICKS == 1
+#error This port requires 32 bit ticks or timer overflow will fail
+#endif
+
+#if LWIP_FREERTOS_SYS_NOW_FROM_FREERTOS
+u32_t
+sys_now(void)
+{
+ return xTaskGetTickCount() * portTICK_PERIOD_MS;
+}
+#endif
+
+u32_t
+sys_jiffies(void)
+{
+ return xTaskGetTickCount();
+}
+
+#if SYS_LIGHTWEIGHT_PROT
+
+sys_prot_t
+sys_arch_protect(void)
+{
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+ BaseType_t ret;
+ LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL);
+
+ ret = xSemaphoreTakeRecursive(sys_arch_protect_mutex, portMAX_DELAY);
+ LWIP_ASSERT("sys_arch_protect failed to take the mutex", ret == pdTRUE);
+#else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */
+ taskENTER_CRITICAL();
+#endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK
+ {
+ /* every nested call to sys_arch_protect() returns an increased number */
+ sys_prot_t ret = sys_arch_protect_nesting;
+ sys_arch_protect_nesting++;
+ LWIP_ASSERT("sys_arch_protect overflow", sys_arch_protect_nesting > ret);
+ return ret;
+ }
+#else
+ return 1;
+#endif
+}
+
+void
+sys_arch_unprotect(sys_prot_t pval)
+{
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+ BaseType_t ret;
+#endif
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK
+ LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting > 0);
+ sys_arch_protect_nesting--;
+ LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting == pval);
+#endif
+
+#if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX
+ LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL);
+
+ ret = xSemaphoreGiveRecursive(sys_arch_protect_mutex);
+ LWIP_ASSERT("sys_arch_unprotect failed to give the mutex", ret == pdTRUE);
+#else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */
+ taskEXIT_CRITICAL();
+#endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */
+ LWIP_UNUSED_ARG(pval);
+}
+
+#endif /* SYS_LIGHTWEIGHT_PROT */
+
+void
+sys_arch_msleep(u32_t delay_ms)
+{
+ TickType_t delay_ticks = delay_ms / portTICK_RATE_MS;
+ vTaskDelay(delay_ticks);
+}
+
+#if !LWIP_COMPAT_MUTEX
+
+/* Create a new mutex*/
+err_t
+sys_mutex_new(sys_mutex_t *mutex)
+{
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+
+ mutex->mut = xSemaphoreCreateRecursiveMutex();
+ if(mutex->mut == NULL) {
+ SYS_STATS_INC(mutex.err);
+ return ERR_MEM;
+ }
+ SYS_STATS_INC_USED(mutex);
+ return ERR_OK;
+}
+
+void
+sys_mutex_lock(sys_mutex_t *mutex)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+
+ ret = xSemaphoreTakeRecursive(mutex->mut, portMAX_DELAY);
+ LWIP_ASSERT("failed to take the mutex", ret == pdTRUE);
+}
+
+void
+sys_mutex_unlock(sys_mutex_t *mutex)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+
+ ret = xSemaphoreGiveRecursive(mutex->mut);
+ LWIP_ASSERT("failed to give the mutex", ret == pdTRUE);
+}
+
+void
+sys_mutex_free(sys_mutex_t *mutex)
+{
+ LWIP_ASSERT("mutex != NULL", mutex != NULL);
+ LWIP_ASSERT("mutex->mut != NULL", mutex->mut != NULL);
+
+ SYS_STATS_DEC(mutex.used);
+ vSemaphoreDelete(mutex->mut);
+ mutex->mut = NULL;
+}
+
+#endif /* !LWIP_COMPAT_MUTEX */
+
+err_t
+sys_sem_new(sys_sem_t *sem, u8_t initial_count)
+{
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("initial_count invalid (not 0 or 1)",
+ (initial_count == 0) || (initial_count == 1));
+
+ sem->sem = xSemaphoreCreateBinary();
+ if(sem->sem == NULL) {
+ SYS_STATS_INC(sem.err);
+ return ERR_MEM;
+ }
+ SYS_STATS_INC_USED(sem);
+
+ if(initial_count == 1) {
+ BaseType_t ret = xSemaphoreGive(sem->sem);
+ LWIP_ASSERT("sys_sem_new: initial give failed", ret == pdTRUE);
+ }
+ return ERR_OK;
+}
+
+void
+sys_sem_signal(sys_sem_t *sem)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+
+ ret = xSemaphoreGive(sem->sem);
+ /* queue full is OK, this is a signal only... */
+ LWIP_ASSERT("sys_sem_signal: sane return value",
+ (ret == pdTRUE) || (ret == errQUEUE_FULL));
+}
+
+u32_t
+sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout_ms)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+
+ if(!timeout_ms) {
+ /* wait infinite */
+ ret = xSemaphoreTake(sem->sem, portMAX_DELAY);
+ LWIP_ASSERT("taking semaphore failed", ret == pdTRUE);
+ } else {
+ TickType_t timeout_ticks = timeout_ms / portTICK_RATE_MS;
+ ret = xSemaphoreTake(sem->sem, timeout_ticks);
+ if (ret == errQUEUE_EMPTY) {
+ /* timed out */
+ return SYS_ARCH_TIMEOUT;
+ }
+ LWIP_ASSERT("taking semaphore failed", ret == pdTRUE);
+ }
+
+ /* Old versions of lwIP required us to return the time waited.
+ This is not the case any more. Just returning != SYS_ARCH_TIMEOUT
+ here is enough. */
+ return 1;
+}
+
+void
+sys_sem_free(sys_sem_t *sem)
+{
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ LWIP_ASSERT("sem->sem != NULL", sem->sem != NULL);
+
+ SYS_STATS_DEC(sem.used);
+ vSemaphoreDelete(sem->sem);
+ sem->sem = NULL;
+}
+
+err_t
+sys_mbox_new(sys_mbox_t *mbox, int size)
+{
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("size > 0", size > 0);
+
+ mbox->mbx = xQueueCreate((UBaseType_t)size, sizeof(void *));
+ if(mbox->mbx == NULL) {
+ SYS_STATS_INC(mbox.err);
+ return ERR_MEM;
+ }
+ SYS_STATS_INC_USED(mbox);
+ return ERR_OK;
+}
+
+void
+sys_mbox_post(sys_mbox_t *mbox, void *msg)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+ ret = xQueueSendToBack(mbox->mbx, &msg, portMAX_DELAY);
+ LWIP_ASSERT("mbox post failed", ret == pdTRUE);
+}
+
+err_t
+sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
+{
+ BaseType_t ret;
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+ ret = xQueueSendToBack(mbox->mbx, &msg, 0);
+ if (ret == pdTRUE) {
+ return ERR_OK;
+ } else {
+ LWIP_ASSERT("mbox trypost failed", ret == errQUEUE_FULL);
+ SYS_STATS_INC(mbox.err);
+ return ERR_MEM;
+ }
+}
+
+err_t
+sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg)
+{
+ BaseType_t ret;
+ BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+ ret = xQueueSendToBackFromISR(mbox->mbx, &msg, &xHigherPriorityTaskWoken);
+ if (ret == pdTRUE) {
+ if (xHigherPriorityTaskWoken == pdTRUE) {
+ return ERR_NEED_SCHED;
+ }
+ return ERR_OK;
+ } else {
+ LWIP_ASSERT("mbox trypost failed", ret == errQUEUE_FULL);
+ SYS_STATS_INC(mbox.err);
+ return ERR_MEM;
+ }
+}
+
+u32_t
+sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout_ms)
+{
+ BaseType_t ret;
+ void *msg_dummy;
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+ if (!msg) {
+ msg = &msg_dummy;
+ }
+
+ if (!timeout_ms) {
+ /* wait infinite */
+ ret = xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY);
+ LWIP_ASSERT("mbox fetch failed", ret == pdTRUE);
+ } else {
+ TickType_t timeout_ticks = timeout_ms / portTICK_RATE_MS;
+ ret = xQueueReceive(mbox->mbx, &(*msg), timeout_ticks);
+ if (ret == errQUEUE_EMPTY) {
+ /* timed out */
+ *msg = NULL;
+ return SYS_ARCH_TIMEOUT;
+ }
+ LWIP_ASSERT("mbox fetch failed", ret == pdTRUE);
+ }
+
+ /* Old versions of lwIP required us to return the time waited.
+ This is not the case any more. Just returning != SYS_ARCH_TIMEOUT
+ here is enough. */
+ return 1;
+}
+
+u32_t
+sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
+{
+ BaseType_t ret;
+ void *msg_dummy;
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+ if (!msg) {
+ msg = &msg_dummy;
+ }
+
+ ret = xQueueReceive(mbox->mbx, &(*msg), 0);
+ if (ret == errQUEUE_EMPTY) {
+ *msg = NULL;
+ return SYS_MBOX_EMPTY;
+ }
+ LWIP_ASSERT("mbox fetch failed", ret == pdTRUE);
+
+ return 0;
+}
+
+void
+sys_mbox_free(sys_mbox_t *mbox)
+{
+ LWIP_ASSERT("mbox != NULL", mbox != NULL);
+ LWIP_ASSERT("mbox->mbx != NULL", mbox->mbx != NULL);
+
+#if LWIP_FREERTOS_CHECK_QUEUE_EMPTY_ON_FREE
+ {
+ UBaseType_t msgs_waiting = uxQueueMessagesWaiting(mbox->mbx);
+ LWIP_ASSERT("mbox quence not empty", msgs_waiting == 0);
+
+ if (msgs_waiting != 0) {
+ SYS_STATS_INC(mbox.err);
+ }
+ }
+#endif
+
+ vQueueDelete(mbox->mbx);
+
+ SYS_STATS_DEC(mbox.used);
+}
+
+sys_thread_t
+sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
+{
+ TaskHandle_t rtos_task;
+ BaseType_t ret;
+ sys_thread_t lwip_thread;
+ size_t rtos_stacksize;
+
+ LWIP_ASSERT("invalid stacksize", stacksize > 0);
+#if LWIP_FREERTOS_THREAD_STACKSIZE_IS_STACKWORDS
+ rtos_stacksize = (size_t)stacksize;
+#else
+ rtos_stacksize = (size_t)stacksize / sizeof(StackType_t);
+#endif
+
+ /* lwIP's lwip_thread_fn matches FreeRTOS' TaskFunction_t, so we can pass the
+ thread function without adaption here. */
+ ret = xTaskCreate(thread, name, (configSTACK_DEPTH_TYPE)rtos_stacksize, arg, prio, &rtos_task);
+ LWIP_ASSERT("task creation failed", ret == pdTRUE);
+
+ lwip_thread.thread_handle = rtos_task;
+ return lwip_thread;
+}
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+#if configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0
+
+sys_sem_t *
+sys_arch_netconn_sem_get(void)
+{
+ void* ret;
+ TaskHandle_t task = xTaskGetCurrentTaskHandle();
+ LWIP_ASSERT("task != NULL", task != NULL);
+
+ ret = pvTaskGetThreadLocalStoragePointer(task, 0);
+ return ret;
+}
+
+void
+sys_arch_netconn_sem_alloc(void)
+{
+ void *ret;
+ TaskHandle_t task = xTaskGetCurrentTaskHandle();
+ LWIP_ASSERT("task != NULL", task != NULL);
+
+ ret = pvTaskGetThreadLocalStoragePointer(task, 0);
+ if(ret == NULL) {
+ sys_sem_t *sem;
+ err_t err;
+ /* need to allocate the memory for this semaphore */
+ sem = mem_malloc(sizeof(sys_sem_t));
+ LWIP_ASSERT("sem != NULL", sem != NULL);
+ err = sys_sem_new(sem, 0);
+ LWIP_ASSERT("err == ERR_OK", err == ERR_OK);
+ LWIP_ASSERT("sem invalid", sys_sem_valid(sem));
+ vTaskSetThreadLocalStoragePointer(task, 0, sem);
+ }
+}
+
+void sys_arch_netconn_sem_free(void)
+{
+ void* ret;
+ TaskHandle_t task = xTaskGetCurrentTaskHandle();
+ LWIP_ASSERT("task != NULL", task != NULL);
+
+ ret = pvTaskGetThreadLocalStoragePointer(task, 0);
+ if(ret != NULL) {
+ sys_sem_t *sem = ret;
+ sys_sem_free(sem);
+ mem_free(sem);
+ vTaskSetThreadLocalStoragePointer(task, 0, NULL);
+ }
+}
+
+#else /* configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 */
+#error LWIP_NETCONN_SEM_PER_THREAD needs configNUM_THREAD_LOCAL_STORAGE_POINTERS
+#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 */
+
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+#if LWIP_FREERTOS_CHECK_CORE_LOCKING
+#if LWIP_TCPIP_CORE_LOCKING
+
+/** Flag the core lock held. A counter for recursive locks. */
+static u8_t lwip_core_lock_count;
+static TaskHandle_t lwip_core_lock_holder_thread;
+
+void
+sys_lock_tcpip_core(void)
+{
+ sys_mutex_lock(&lock_tcpip_core);
+ if (lwip_core_lock_count == 0) {
+ lwip_core_lock_holder_thread = xTaskGetCurrentTaskHandle();
+ }
+ lwip_core_lock_count++;
+}
+
+void
+sys_unlock_tcpip_core(void)
+{
+ lwip_core_lock_count--;
+ if (lwip_core_lock_count == 0) {
+ lwip_core_lock_holder_thread = 0;
+ }
+ sys_mutex_unlock(&lock_tcpip_core);
+}
+
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+
+#if !NO_SYS
+static TaskHandle_t lwip_tcpip_thread;
+#endif
+
+void
+sys_mark_tcpip_thread(void)
+{
+#if !NO_SYS
+ lwip_tcpip_thread = xTaskGetCurrentTaskHandle();
+#endif
+}
+
+void
+sys_check_core_locking(void)
+{
+ /* Embedded systems should check we are NOT in an interrupt context here */
+ /* E.g. core Cortex-M3/M4 ports:
+ configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
+
+ Instead, we use more generic FreeRTOS functions here, which should fail from ISR: */
+ taskENTER_CRITICAL();
+ taskEXIT_CRITICAL();
+
+#if !NO_SYS
+ if (lwip_tcpip_thread != 0) {
+ TaskHandle_t current_thread = xTaskGetCurrentTaskHandle();
+
+#if LWIP_TCPIP_CORE_LOCKING
+ LWIP_ASSERT("Function called without core lock",
+ current_thread == lwip_core_lock_holder_thread && lwip_core_lock_count > 0);
+#else /* LWIP_TCPIP_CORE_LOCKING */
+ LWIP_ASSERT("Function called from wrong thread", current_thread == lwip_tcpip_thread);
+#endif /* LWIP_TCPIP_CORE_LOCKING */
+ }
+#endif /* !NO_SYS */
+}
+
+#endif /* LWIP_FREERTOS_CHECK_CORE_LOCKING*/
diff --git a/contrib/ports/unix/Common.mk b/contrib/ports/unix/Common.mk
new file mode 100644
index 0000000..f80a980
--- /dev/null
+++ b/contrib/ports/unix/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>
+#
+
+# Architecture specific files.
+LWIPARCH?=$(CONTRIBDIR)/ports/unix/port
+SYSARCH?=$(LWIPARCH)/sys_arch.c
+ARCHFILES=$(LWIPARCH)/perf.c \
+ $(SYSARCH) \
+ $(LWIPARCH)/netif/tapif.c \
+ $(LWIPARCH)/netif/list.c \
+ $(LWIPARCH)/netif/sio.c \
+ $(LWIPARCH)/netif/fifo.c
+
+UNIX_COMMON_MK_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+include $(UNIX_COMMON_MK_DIR)../Common.allports.mk
+
+LDFLAGS+=-lutil
+
+UNAME_S:= $(shell uname -s)
+ifneq ($(UNAME_S),Darwin)
+# Darwin doesn't have pthreads or POSIX real-time extensions libs
+LDFLAGS+=-pthread -lrt
+endif
diff --git a/contrib/ports/unix/Filelists.cmake b/contrib/ports/unix/Filelists.cmake
new file mode 100644
index 0000000..84bfded
--- /dev/null
+++ b/contrib/ports/unix/Filelists.cmake
@@ -0,0 +1,44 @@
+# 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(lwipcontribportunix_SRCS
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/sys_arch.c
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/perf.c
+)
+
+set(lwipcontribportunixnetifs_SRCS
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/netif/tapif.c
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/netif/list.c
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/netif/sio.c
+ ${LWIP_CONTRIB_DIR}/ports/unix/port/netif/fifo.c
+)
+
+add_library(lwipcontribportunix EXCLUDE_FROM_ALL ${lwipcontribportunix_SRCS} ${lwipcontribportunixnetifs_SRCS})
+target_include_directories(lwipcontribportunix PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+target_compile_options(lwipcontribportunix PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwipcontribportunix PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_link_libraries(lwipcontribportunix PUBLIC ${LWIP_MBEDTLS_LINK_LIBRARIES})
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ find_library(LIBUTIL util)
+ find_library(LIBPTHREAD pthread)
+ find_library(LIBRT rt)
+ target_link_libraries(lwipcontribportunix PUBLIC ${LIBUTIL} ${LIBPTHREAD} ${LIBRT})
+endif()
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # Darwin doesn't have pthreads or POSIX real-time extensions libs
+ find_library(LIBUTIL util)
+ target_link_libraries(lwipcontribportunix PUBLIC ${LIBUTIL})
+endif()
diff --git a/contrib/ports/unix/README b/contrib/ports/unix/README
new file mode 100644
index 0000000..3b8f995
--- /dev/null
+++ b/contrib/ports/unix/README
@@ -0,0 +1,25 @@
+This port contains infrastructure and examples for running lwIP on Unix-like
+operating systems (Linux, OpenBSD, cygwin). Much of this is targeted towards
+testing lwIP applications.
+
+* port/sys_arch.c, port/perf.c, port/include/arch/: Generic platform porting,
+ for both states of NO_SYS. (Mapping debugging to printf, providing
+ sys_now & co from the system time etc.)
+
+* check: Runs the unit tests shipped with main lwIP on the Unix port.
+
+* port/netif, port/include/netif: Various network interface implementations and
+ their helpers, some explicitly for Unix infrastructure, some generic (but most
+ useful on an easy to debug system):
+
+ * fifo: Helper for sio
+
+ * list: Helper for unixif
+
+ * pcapif: Network interface that replays packages from a PCAP dump file, and
+ discards packages sent out from it
+
+ * sio: Mapping Unix character devices to lwIP's sio mechanisms
+
+ * tapif: Network interface that is mapped to a tap interface (Unix user
+ space layer 2 network device). Uses lwIP threads.
diff --git a/contrib/ports/unix/check/CMakeLists.txt b/contrib/ports/unix/check/CMakeLists.txt
new file mode 100644
index 0000000..9cf8d05
--- /dev/null
+++ b/contrib/ports/unix/check/CMakeLists.txt
@@ -0,0 +1,61 @@
+cmake_minimum_required(VERSION 3.8)
+
+set (CMAKE_CONFIGURATION_TYPES "Debug;Release")
+
+project(lwipunittests C)
+
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_NAME STREQUAL "GNU")
+ message(FATAL_ERROR "Unit test are currently only working on Linux, Darwin or Hurd")
+endif()
+
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "GNU")
+ set(LWIP_USE_SANITIZERS true)
+endif()
+include(${LWIP_DIR}/contrib/ports/CMakeCommon.cmake)
+
+if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ # check.h causes 'error: token pasting of ',' and __VA_ARGS__ is a GNU extension' with clang 9.0.0
+ list(LWIP_COMPILER_FLAGS APPEND -Wno-gnu-zero-variadic-macro-arguments)
+endif()
+
+set (LWIP_DEFINITIONS -DLWIP_DEBUG -DLWIP_NOASSERT_ON_ERROR)
+set (LWIP_INCLUDE_DIRS
+ "${LWIP_DIR}/test/unit"
+ "${LWIP_DIR}/src/include"
+ "${LWIP_CONTRIB_DIR}/"
+ "${LWIP_CONTRIB_DIR}/ports/unix/port/include"
+ "${CMAKE_CURRENT_SOURCE_DIR}/"
+)
+
+include(${LWIP_CONTRIB_DIR}/ports/unix/Filelists.cmake)
+include(${LWIP_DIR}/src/Filelists.cmake)
+include(${LWIP_DIR}/test/unit/Filelists.cmake)
+
+add_executable(lwip_unittests ${LWIP_TESTFILES})
+target_include_directories(lwip_unittests PRIVATE ${LWIP_INCLUDE_DIRS})
+target_compile_options(lwip_unittests PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwip_unittests PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+
+find_library(LIBCHECK check)
+find_library(LIBM m)
+target_link_libraries(lwip_unittests ${LWIP_SANITIZER_LIBS} lwipallapps lwipcore ${LIBCHECK} ${LIBM})
+
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # check installed via brew on Darwin doesn't have a separate subunit library (must be statically linked)
+ find_library(LIBSUBUNIT subunit)
+ target_link_libraries(lwip_unittests ${LIBSUBUNIT})
+endif()
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
+ find_library(LIBUTIL util)
+ find_library(LIBPTHREAD pthread)
+ find_library(LIBRT rt)
+ target_link_libraries(lwip_unittests ${LIBUTIL} ${LIBPTHREAD} ${LIBRT})
+endif()
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ # Darwin doesn't have pthreads or POSIX real-time extensions libs
+ find_library(LIBUTIL util)
+ target_link_libraries(lwip_unittests ${LIBUTIL})
+endif()
diff --git a/contrib/ports/unix/check/Makefile b/contrib/ports/unix/check/Makefile
new file mode 100644
index 0000000..81e22e5
--- /dev/null
+++ b/contrib/ports/unix/check/Makefile
@@ -0,0 +1,94 @@
+#
+# 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: lwip_unittests
+.PHONY: all clean check
+
+LWIPDIR=../../../../src
+
+# The include path to sys_arch.h and lwipopts.h must be first, so this must be before Common.mk
+CFLAGS=-DLWIP_NOASSERT_ON_ERROR -I/usr/include/check -I$(LWIPDIR)/../test/unit
+
+# Ignore 'too many arguments for format' warnings which happen with GCCs
+# from check 0.15.2 on fail_if/fail_unless macros with text.
+# See https://github.com/libcheck/check/pull/298/commits/82540c5428d3818b64d
+CFLAGS+=-Wno-error=format-extra-args
+
+ifeq (clang,$(findstring clang,$(CC)))
+# check.h causes 'error: token pasting of ',' and __VA_ARGS__ is a GNU extension' with clang 9.0.0
+CFLAGS+=-Wno-gnu-zero-variadic-macro-arguments
+endif
+
+# Prevent compiling sys_arch.c of unix port because unit test provide their own port
+SYSARCH?=
+include ../Common.mk
+
+LDFLAGS:=-lcheck -lm $(LDFLAGS)
+
+ifneq ($(UNAME_S),Darwin)
+# check installed via brew on Darwin doesn't have a separate subunit library (must be statically linked)
+LDFLAGS+=-lsubunit
+endif
+
+TESTDIR=$(LWIPDIR)/../test/unit
+include $(TESTDIR)/Filelists.mk
+TESTOBJS=$(notdir $(TESTFILES:.c=.o))
+
+DEPFILES=.depend_test .depend_lwip .depend_app
+
+clean:
+ @rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) lwip_unittests *.s $(DEPFILES) *.core core lwip_unittests.xml
+
+depend dep: $(DEPFILES)
+ @true
+
+ifneq ($(MAKECMDGOALS),clean)
+include $(DEPFILES)
+endif
+
+.depend_test: $(TESTFILES)
+ $(CCDEP) $(CFLAGS) -MM $^ > .depend_test || rm -f .depend_test
+.depend_lwip: $(LWIPFILES)
+ $(CCDEP) $(CFLAGS) -MM $^ > .depend_lwip || rm -f .depend_lwip
+.depend_app: $(APPFILES)
+ $(CCDEP) $(CFLAGS) -MM $^ > .depend_app || rm -f .depend_app
+
+ifneq ($(UNAME_S),Darwin)
+# clang on Darwin doesn't support --start-group
+lwip_unittests: $(DEPFILES) $(TESTOBJS) $(LWIPLIBCOMMON) $(APPLIB)
+ $(CC) $(CFLAGS) -o lwip_unittests $(TESTOBJS) -Wl,--start-group $(LWIPLIBCOMMON) $(APPLIB) $(LDFLAGS) -Wl,--end-group
+else
+lwip_unittests: $(DEPFILES) $(TESTOBJS) $(LWIPLIBCOMMON) $(APPLIB)
+ $(CC) $(CFLAGS) -o lwip_unittests $(TESTOBJS) $(LWIPLIBCOMMON) $(APPLIB) $(LDFLAGS)
+endif
+
+check: lwip_unittests
+ @./lwip_unittests
diff --git a/contrib/ports/unix/check/README b/contrib/ports/unix/check/README
new file mode 100644
index 0000000..8b32672
--- /dev/null
+++ b/contrib/ports/unix/check/README
@@ -0,0 +1,8 @@
+
+Helper files to run lwIP unit tests on unix-like systems.
+
+1. Install the check library, through a package manager or from https://libcheck.github.io/check/
+2. Put the lwip code in a directory called 'lwip'
+3. Run `make check`
+4. Make sure all tests pass
+
diff --git a/contrib/ports/unix/check/config.h b/contrib/ports/unix/check/config.h
new file mode 100644
index 0000000..0d84b36
--- /dev/null
+++ b/contrib/ports/unix/check/config.h
@@ -0,0 +1,2 @@
+/* Enable this to simplify debugging */
+/* #define LWIP_UNITTESTS_NOFORK */
diff --git a/contrib/ports/unix/example_app/CMakeLists.txt b/contrib/ports/unix/example_app/CMakeLists.txt
new file mode 100644
index 0000000..961be1b
--- /dev/null
+++ b/contrib/ports/unix/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/unix/port/include"
+ "${LWIP_DIR}/contrib/examples/example_app"
+)
+
+include(${LWIP_DIR}/src/Filelists.cmake)
+include(${LWIP_DIR}/contrib/Filelists.cmake)
+include(${LWIP_DIR}/contrib/ports/unix/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} lwipcontribexamples lwipcontribapps lwipcontribaddons lwipallapps lwipcontribportunix 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})
diff --git a/contrib/ports/unix/example_app/Makefile b/contrib/ports/unix/example_app/Makefile
new file mode 100644
index 0000000..38aaba1
--- /dev/null
+++ b/contrib/ports/unix/example_app/Makefile
@@ -0,0 +1,60 @@
+#
+# 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
+
+LWIPDIR=../../../../src
+
+include ../Common.mk
+
+CFLAGS+=-I$(CONTRIBDIR)/examples/example_app
+
+TESTFLAGS?=
+CFLAGS+=$(TESTFLAGS)
+
+MAKEFSDATAOBJS=$(notdir $(MAKEFSDATAFILES:.c=.o))
+
+clean:
+ rm -f *.o $(LWIPLIBCOMMON) $(APPLIB) example_app makefsdata *.s .depend* *.core core
+
+depend dep: .depend
+
+include .depend
+
+.depend: $(CONTRIBDIR)/examples/example_app/test.c default_netif.c $(LWIPFILES) $(APPFILES) $(MAKEFSDATAFILES)
+ $(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .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)
+
+makefsdata: .depend $(MAKEFSDATAOBJS)
+ $(CC) $(CFLAGS) -o makefsdata $(MAKEFSDATAOBJS)
diff --git a/contrib/ports/unix/example_app/default_netif.c b/contrib/ports/unix/example_app/default_netif.c
new file mode 100644
index 0000000..4c7eb6a
--- /dev/null
+++ b/contrib/ports/unix/example_app/default_netif.c
@@ -0,0 +1,68 @@
+/*
+ * 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/tcpip.h"
+#include "netif/tapif.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, tapif_init, netif_input);
+#else
+ netif_add(&netif, NETIF_ADDRS NULL, tapif_init, tcpip_input);
+#endif
+ netif_set_default(&netif);
+}
+
+void
+default_netif_poll(void)
+{
+ tapif_poll(&netif);
+}
+
+void
+default_netif_shutdown(void)
+{
+}
diff --git a/contrib/ports/unix/example_app/iteropts.sh b/contrib/ports/unix/example_app/iteropts.sh
new file mode 100755
index 0000000..3856141
--- /dev/null
+++ b/contrib/ports/unix/example_app/iteropts.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+LOGFILE=iteropts.log
+EXAPPDIR=../../../examples/example_app
+RETVAL=0
+
+pushd `dirname "$0"`
+pwd
+echo Starting Iteropts run >> $LOGFILE
+for f in $EXAPPDIR/test_configs/*.h
+do
+ echo Cleaning...
+ make clean > /dev/null
+ BUILDLOG=$(basename "$f" ".h").log
+ echo testing $f
+ echo testing $f >> $LOGFILE
+ rm -f $EXAPPDIR/lwipopts_test.h
+ # cat the file to update its timestamp
+ cat $f > $EXAPPDIR/lwipopts_test.h
+ make TESTFLAGS="-DLWIP_OPTTEST_FILE -Wno-documentation" -j 4 1> $BUILDLOG 2>&1
+ ERR=$?
+ if [ $ERR != 0 ]; then
+ cat $BUILDLOG
+ echo file $f failed with $ERR >> $LOGFILE
+ echo ++++++++ $f FAILED +++++++
+ RETVAL=1
+ fi
+ echo test $f done >> $LOGFILE
+done
+echo done, cleaning
+make clean > /dev/null
+popd
+echo Exit value: $RETVAL
+exit $RETVAL
diff --git a/contrib/ports/unix/lib/CMakeLists.txt b/contrib/ports/unix/lib/CMakeLists.txt
new file mode 100644
index 0000000..40229c4
--- /dev/null
+++ b/contrib/ports/unix/lib/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 3.8)
+
+project(lwip C)
+
+set (BUILD_SHARED_LIBS ON)
+
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_SYSTEM_NAME STREQUAL "GNU")
+ message(FATAL_ERROR "Lwip shared library is only working on Linux or the Hurd")
+endif()
+
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
+include(${LWIP_DIR}/contrib/ports/CMakeCommon.cmake)
+
+set (LWIP_DEFINITIONS -DLWIP_DEBUG)
+set (LWIP_INCLUDE_DIRS
+ "${LWIP_DIR}/src/include"
+ "${LWIP_CONTRIB_DIR}/"
+ "${LWIP_CONTRIB_DIR}/ports/unix/port/include"
+ "${CMAKE_CURRENT_SOURCE_DIR}/"
+)
+
+set (LWIP_EXCLUDE_SLIPIF TRUE)
+include(${LWIP_CONTRIB_DIR}/ports/unix/Filelists.cmake)
+include(${LWIP_DIR}/src/Filelists.cmake)
+
+add_library(lwip ${lwipnoapps_SRCS} ${lwipcontribportunix_SRCS} ${lwipcontribportunixnetifs_SRCS})
+target_compile_options(lwip PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwip PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwip PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+target_link_libraries(lwip ${LWIP_SANITIZER_LIBS})
+
+find_library(LIBPTHREAD pthread)
+target_link_libraries(lwip ${LIBPTHREAD})
diff --git a/contrib/ports/unix/lib/README b/contrib/ports/unix/lib/README
new file mode 100644
index 0000000..3e6d0b1
--- /dev/null
+++ b/contrib/ports/unix/lib/README
@@ -0,0 +1,28 @@
+This directory contains an example of how to compile lwIP as a shared library
+on Linux.
+
+Some brief instructions:
+
+* Compile the code:
+
+ > mkdir build
+ > cd build
+ > cmake ..
+ > make clean all
+
+ This should produce liblwip.so. This is the shared library.
+
+* Link an application against the shared library
+
+ If you're using gcc you can do this by including -llwip in your link command.
+
+* Run your application
+
+ Ensure that LD_LIBRARY_PATH includes the directory that contains liblwip.so
+ (ie. this directory)
+
+
+If you are unsure about shared libraries and libraries on linux in
+general, you might find this HOWTO useful:
+
+<http://www.tldp.org/HOWTO/Program-Library-HOWTO/>
diff --git a/contrib/ports/unix/lib/lwipopts.h b/contrib/ports/unix/lib/lwipopts.h
new file mode 100644
index 0000000..231fc77
--- /dev/null
+++ b/contrib/ports/unix/lib/lwipopts.h
@@ -0,0 +1,436 @@
+/**
+ * @file
+ *
+ * lwIP Options Configuration
+ */
+
+/*
+ * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ *
+ * This file is part of the lwIP TCP/IP stack.
+ *
+ * Author: Adam Dunkels <adam@sics.se>
+ *
+ */
+#ifndef LWIP_LWIPOPTS_H
+#define LWIP_LWIPOPTS_H
+
+/*
+ * Include user defined options first. Anything not defined in these files
+ * will be set to standard values. Override anything you don't like!
+ */
+#include "lwipopts.h"
+#include "lwip/debug.h"
+
+/*
+ -----------------------------------------------
+ ---------- Platform specific locking ----------
+ -----------------------------------------------
+*/
+
+/**
+ * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
+ * critical regions during buffer allocation, deallocation and memory
+ * allocation and deallocation.
+ */
+#define SYS_LIGHTWEIGHT_PROT 0
+
+/**
+ * NO_SYS==1: Provides VERY minimal functionality. Otherwise,
+ * use lwIP facilities.
+ */
+#define NO_SYS 0
+
+/*
+ ------------------------------------
+ ---------- Memory options ----------
+ ------------------------------------
+*/
+
+/**
+ * MEM_ALIGNMENT: should be set to the alignment of the CPU
+ * 4 byte alignment -> #define MEM_ALIGNMENT 4
+ * 2 byte alignment -> #define MEM_ALIGNMENT 2
+ */
+#define MEM_ALIGNMENT 1U
+
+/**
+ * MEM_SIZE: the size of the heap memory. If the application will send
+ * a lot of data that needs to be copied, this should be set high.
+ */
+#define MEM_SIZE 1600
+
+/*
+ ------------------------------------------------
+ ---------- Internal Memory Pool Sizes ----------
+ ------------------------------------------------
+*/
+/**
+ * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF).
+ * If the application sends a lot of data out of ROM (or other static memory),
+ * this should be set high.
+ */
+#define MEMP_NUM_PBUF 16
+
+/**
+ * MEMP_NUM_RAW_PCB: Number of raw connection PCBs
+ * (requires the LWIP_RAW option)
+ */
+#define MEMP_NUM_RAW_PCB 4
+
+/**
+ * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
+ * per active UDP "connection".
+ * (requires the LWIP_UDP option)
+ */
+#define MEMP_NUM_UDP_PCB 4
+
+/**
+ * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_PCB 4
+
+/**
+ * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_PCB_LISTEN 4
+
+/**
+ * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.
+ * (requires the LWIP_TCP option)
+ */
+#define MEMP_NUM_TCP_SEG 16
+
+/**
+ * MEMP_NUM_REASSDATA: the number of simultaneously IP packets queued for
+ * reassembly (whole packets, not fragments!)
+ */
+#define MEMP_NUM_REASSDATA 1
+
+/**
+ * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing
+ * packets (pbufs) that are waiting for an ARP request (to resolve
+ * their destination address) to finish.
+ * (requires the ARP_QUEUEING option)
+ */
+#define MEMP_NUM_ARP_QUEUE 2
+
+/**
+ * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts.
+ * (requires NO_SYS==0)
+ */
+#define MEMP_NUM_SYS_TIMEOUT 8
+
+/**
+ * MEMP_NUM_NETBUF: the number of struct netbufs.
+ * (only needed if you use the sequential API, like api_lib.c)
+ */
+#define MEMP_NUM_NETBUF 2
+
+/**
+ * MEMP_NUM_NETCONN: the number of struct netconns.
+ * (only needed if you use the sequential API, like api_lib.c)
+ */
+#define MEMP_NUM_NETCONN 32
+
+/**
+ * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used
+ * for callback/timeout API communication.
+ * (only needed if you use tcpip.c)
+ */
+#define MEMP_NUM_TCPIP_MSG_API 8
+
+/**
+ * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used
+ * for incoming packets.
+ * (only needed if you use tcpip.c)
+ */
+#define MEMP_NUM_TCPIP_MSG_INPKT 8
+
+/**
+ * PBUF_POOL_SIZE: the number of buffers in the pbuf pool.
+ */
+#define PBUF_POOL_SIZE 8
+
+/*
+ ---------------------------------
+ ---------- ARP options ----------
+ ---------------------------------
+*/
+/**
+ * LWIP_ARP==1: Enable ARP functionality.
+ */
+#define LWIP_ARP 1
+
+/*
+ --------------------------------
+ ---------- IP options ----------
+ --------------------------------
+*/
+/**
+ * IP_FORWARD==1: Enables the ability to forward IP packets across network
+ * interfaces. If you are going to run lwIP on a device with only one network
+ * interface, define this to 0.
+ */
+#define IP_FORWARD 0
+
+/**
+ * IP_OPTIONS: Defines the behavior for IP options.
+ * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped.
+ * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed).
+ */
+#define IP_OPTIONS_ALLOWED 1
+
+/**
+ * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that
+ * this option does not affect outgoing packet sizes, which can be controlled
+ * via IP_FRAG.
+ */
+#define IP_REASSEMBLY 1
+
+/**
+ * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note
+ * that this option does not affect incoming packet sizes, which can be
+ * controlled via IP_REASSEMBLY.
+ */
+#define IP_FRAG 1
+
+/**
+ * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally)
+ * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived
+ * in this time, the whole packet is discarded.
+ */
+#define IP_REASS_MAXAGE 3
+
+/**
+ * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled.
+ * Since the received pbufs are enqueued, be sure to configure
+ * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive
+ * packets even if the maximum amount of fragments is enqueued for reassembly!
+ */
+#define IP_REASS_MAX_PBUFS 4
+
+/**
+ * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP
+ * fragmentation. Otherwise pbufs are allocated and reference the original
+ * packet data to be fragmented.
+*/
+#define IP_FRAG_USES_STATIC_BUF 0
+
+/**
+ * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers.
+ */
+#define IP_DEFAULT_TTL 255
+
+/*
+ ----------------------------------
+ ---------- ICMP options ----------
+ ----------------------------------
+*/
+/**
+ * LWIP_ICMP==1: Enable ICMP module inside the IP stack.
+ * Be careful, disable that make your product non-compliant to RFC1122
+ */
+#define LWIP_ICMP 1
+
+/*
+ ---------------------------------
+ ---------- RAW options ----------
+ ---------------------------------
+*/
+/**
+ * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.
+ */
+#define LWIP_RAW 1
+
+/*
+ ----------------------------------
+ ---------- DHCP options ----------
+ ----------------------------------
+*/
+/**
+ * LWIP_DHCP==1: Enable DHCP module.
+ */
+#define LWIP_DHCP 0
+
+
+/*
+ ------------------------------------
+ ---------- AUTOIP options ----------
+ ------------------------------------
+*/
+/**
+ * LWIP_AUTOIP==1: Enable AUTOIP module.
+ */
+#define LWIP_AUTOIP 0
+
+/*
+ ----------------------------------
+ ---------- SNMP options ----------
+ ----------------------------------
+*/
+/**
+ * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP
+ * transport.
+ */
+#define LWIP_SNMP 0
+
+/*
+ ----------------------------------
+ ---------- IGMP options ----------
+ ----------------------------------
+*/
+/**
+ * LWIP_IGMP==1: Turn on IGMP module.
+ */
+#define LWIP_IGMP 0
+
+/*
+ ----------------------------------
+ ---------- DNS options -----------
+ ----------------------------------
+*/
+/**
+ * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS
+ * transport.
+ */
+#define LWIP_DNS 0
+
+/*
+ ---------------------------------
+ ---------- UDP options ----------
+ ---------------------------------
+*/
+/**
+ * LWIP_UDP==1: Turn on UDP.
+ */
+#define LWIP_UDP 1
+
+/*
+ ---------------------------------
+ ---------- TCP options ----------
+ ---------------------------------
+*/
+/**
+ * LWIP_TCP==1: Turn on TCP.
+ */
+#define LWIP_TCP 1
+
+#define LWIP_LISTEN_BACKLOG 0
+
+/*
+ ----------------------------------
+ ---------- Pbuf options ----------
+ ----------------------------------
+*/
+/**
+ * PBUF_LINK_HLEN: the number of bytes that should be allocated for a
+ * link level header. The default is 14, the standard value for
+ * Ethernet.
+ */
+#define PBUF_LINK_HLEN 16
+
+/**
+ * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is
+ * designed to accommodate single full size TCP frame in one pbuf, including
+ * TCP_MSS, IP header, and link header.
+*
+ */
+#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN)
+
+/*
+ ------------------------------------
+ ---------- LOOPIF options ----------
+ ------------------------------------
+*/
+/**
+ * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c
+ */
+#define LWIP_HAVE_LOOPIF 0
+
+/*
+ ----------------------------------------------
+ ---------- Sequential layer options ----------
+ ----------------------------------------------
+*/
+
+/**
+ * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)
+ */
+#define LWIP_NETCONN 1
+
+/*
+ ------------------------------------
+ ---------- Socket options ----------
+ ------------------------------------
+*/
+/**
+ * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)
+ */
+#define LWIP_SOCKET 1
+
+/**
+ * SO_REUSE==1: Enable SO_REUSEADDR
+ */
+#define SO_REUSE 1
+
+/*
+ ----------------------------------------
+ ---------- Statistics options ----------
+ ----------------------------------------
+*/
+/**
+ * LWIP_STATS==1: Enable statistics collection in lwip_stats.
+ */
+#define LWIP_STATS 0
+/*
+ ---------------------------------
+ ---------- PPP options ----------
+ ---------------------------------
+*/
+/**
+ * PPP_SUPPORT==1: Enable PPP.
+ */
+#define PPP_SUPPORT 0
+
+
+
+/*
+ ---------------------------------------
+ ---------- Threading options ----------
+ ---------------------------------------
+*/
+
+#define LWIP_TCPIP_CORE_LOCKING 1
+
+#if !NO_SYS
+void sys_check_core_locking(void);
+#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking()
+#endif
+
+#endif /* LWIP_LWIPOPTS_H */
diff --git a/contrib/ports/unix/port/include/arch/cc.h b/contrib/ports/unix/port/include/arch/cc.h
new file mode 100644
index 0000000..7be900b
--- /dev/null
+++ b/contrib/ports/unix/port/include/arch/cc.h
@@ -0,0 +1,89 @@
+/*
+ * 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
+
+/* see https://sourceforge.net/p/predef/wiki/OperatingSystems/ */
+#if defined __ANDROID__
+#define LWIP_UNIX_ANDROID
+#elif defined __linux__
+#define LWIP_UNIX_LINUX
+#elif defined __APPLE__
+#define LWIP_UNIX_MACH
+#elif defined __OpenBSD__
+#define LWIP_UNIX_OPENBSD
+#elif defined __FreeBSD_kernel__ && __GLIBC__
+#define LWIP_UNIX_KFREEBSD
+#elif defined __CYGWIN__
+#define LWIP_UNIX_CYGWIN
+#elif defined __GNU__
+#define LWIP_UNIX_HURD
+#endif
+
+#define LWIP_TIMEVAL_PRIVATE 0
+#include <sys/time.h>
+
+#define LWIP_ERRNO_INCLUDE <errno.h>
+
+#if defined(LWIP_UNIX_LINUX) || defined(LWIP_UNIX_HURD) || defined(LWIP_UNIX_KFREEBSD)
+#define LWIP_ERRNO_STDINCLUDE 1
+#endif
+
+extern unsigned int lwip_port_rand(void);
+#define LWIP_RAND() (lwip_port_rand())
+
+/* different handling for unit test, normally not needed */
+#ifdef LWIP_NOASSERT_ON_ERROR
+#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
+ handler;}} while(0)
+#endif
+
+#if defined(LWIP_UNIX_ANDROID) && defined(FD_SET)
+typedef __kernel_fd_set fd_set;
+#endif
+
+#if defined(LWIP_UNIX_MACH)
+/* sys/types.h and signal.h bring in Darwin byte order macros. pull the
+ header here and disable LwIP's version so that apps still can get
+ the macros via LwIP headers and use system headers */
+#include <sys/types.h>
+#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS
+#endif
+
+struct sio_status_s;
+typedef struct sio_status_s sio_status_t;
+#define sio_fd_t sio_status_t*
+#define __sio_fd_t_defined
+
+typedef unsigned int sys_prot_t;
+
+#endif /* LWIP_ARCH_CC_H */
diff --git a/contrib/ports/unix/port/include/arch/perf.h b/contrib/ports/unix/port/include/arch/perf.h
new file mode 100644
index 0000000..364f316
--- /dev/null
+++ b/contrib/ports/unix/port/include/arch/perf.h
@@ -0,0 +1,63 @@
+/*
+ * 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_PERF_H
+#define LWIP_ARCH_PERF_H
+
+#include <sys/times.h>
+
+#ifdef PERF
+#define PERF_START { \
+ unsigned long __c1l, __c1h, __c2l, __c2h; \
+ __asm__(".byte 0x0f, 0x31" : "=a" (__c1l), "=d" (__c1h))
+#define PERF_STOP(x) __asm__(".byte 0x0f, 0x31" : "=a" (__c2l), "=d" (__c2h)); \
+ perf_print(__c1l, __c1h, __c2l, __c2h, x);}
+
+/*#define PERF_START do { \
+ struct tms __perf_start, __perf_end; \
+ times(&__perf_start)
+#define PERF_STOP(x) times(&__perf_end); \
+ perf_print_times(&__perf_start, &__perf_end, x);\
+ } while(0)*/
+#else /* PERF */
+#define PERF_START /* null definition */
+#define PERF_STOP(x) /* null definition */
+#endif /* PERF */
+
+void perf_print(unsigned long c1l, unsigned long c1h,
+ unsigned long c2l, unsigned long c2h,
+ char *key);
+
+void perf_print_times(struct tms *start, struct tms *end, char *key);
+
+void perf_init(char *fname);
+
+#endif /* LWIP_ARCH_PERF_H */
diff --git a/contrib/ports/unix/port/include/arch/sys_arch.h b/contrib/ports/unix/port/include/arch/sys_arch.h
new file mode 100644
index 0000000..567e125
--- /dev/null
+++ b/contrib/ports/unix/port/include/arch/sys_arch.h
@@ -0,0 +1,90 @@
+/*
+ * 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
+
+#define SYS_MBOX_NULL NULL
+#define SYS_SEM_NULL NULL
+
+/*typedef u32_t sys_prot_t;*/
+
+struct sys_sem;
+typedef struct sys_sem * sys_sem_t;
+#define sys_sem_valid(sem) (((sem) != NULL) && (*(sem) != NULL))
+#define sys_sem_valid_val(sem) ((sem) != NULL)
+#define sys_sem_set_invalid(sem) do { if((sem) != NULL) { *(sem) = NULL; }}while(0)
+#define sys_sem_set_invalid_val(sem) do { (sem) = NULL; }while(0)
+
+struct sys_mutex;
+typedef struct sys_mutex * sys_mutex_t;
+#define sys_mutex_valid(mutex) sys_sem_valid(mutex)
+#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex)
+
+struct sys_mbox;
+typedef struct sys_mbox * sys_mbox_t;
+#define sys_mbox_valid(mbox) sys_sem_valid(mbox)
+#define sys_mbox_valid_val(mbox) sys_sem_valid_val(mbox)
+#define sys_mbox_set_invalid(mbox) sys_sem_set_invalid(mbox)
+#define sys_mbox_set_invalid_val(mbox) sys_sem_set_invalid_val(mbox)
+
+struct sys_thread;
+typedef struct sys_thread * sys_thread_t;
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+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()
+#endif /* #if LWIP_NETCONN_SEM_PER_THREAD */
+
+#define LWIP_EXAMPLE_APP_ABORT() lwip_unix_keypressed()
+int lwip_unix_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/unix/port/include/netif/fifo.h b/contrib/ports/unix/port/include/netif/fifo.h
new file mode 100644
index 0000000..bda352a
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/fifo.h
@@ -0,0 +1,54 @@
+#ifndef FIFO_H
+#define FIFO_H
+
+#include "lwip/sys.h"
+
+/** How many bytes in fifo */
+#define FIFOSIZE 2048
+
+/** fifo data structure, this one is passed to all fifo functions */
+typedef struct fifo_t {
+ u8_t data[FIFOSIZE+10]; /* data segment, +10 is a hack probably not needed.. FIXME! */
+ int dataslot; /* index to next char to be read */
+ int emptyslot; /* index to next empty slot */
+ int len; /* len probably not needed, may be calculated from dataslot and emptyslot in conjunction with FIFOSIZE */
+
+ sys_sem_t sem; /* semaphore protecting simultaneous data manipulation */
+ sys_sem_t getSem; /* sepaphore used to signal new data if getWaiting is set */
+ u8_t getWaiting; /* flag used to indicate that fifoget is waiting for data. fifoput is supposed to clear */
+ /* this flag prior to signaling the getSem semaphore */
+} fifo_t;
+
+
+/**
+* Get a character from fifo
+* Blocking call.
+* @param fifo pointer to fifo data structure
+* @return character read from fifo
+*/
+u8_t fifoGet(fifo_t * fifo);
+
+/**
+* Get a character from fifo
+* Non blocking call.
+* @param fifo pointer to fifo data structure
+* @return character read from fifo, or < zero if non was available
+*/
+s16_t fifoGetNonBlock(fifo_t * fifo);
+
+/**
+* fifoput is called by the signalhandler when new data has arrived (or some other event is indicated)
+* fifoput reads directly from the serialport and is thus highly dependent on unix arch at this moment
+* @param fifo pointer to fifo data structure
+* @param fd unix file descriptor
+*/
+void fifoPut(fifo_t * fifo, int fd);
+
+/**
+* fifoinit initiate fifo
+* @param fifo pointer to fifo data structure, allocated by the user
+*/
+void fifoInit(fifo_t * fifo);
+
+#endif
+
diff --git a/contrib/ports/unix/port/include/netif/list.h b/contrib/ports/unix/port/include/netif/list.h
new file mode 100644
index 0000000..2c4d142
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/list.h
@@ -0,0 +1,26 @@
+
+#ifndef LWIP_LIST_H
+#define LWIP_LIST_H
+
+struct elem;
+
+struct list {
+ struct elem *first, *last;
+ int size, elems;
+};
+
+struct elem {
+ struct elem *next;
+ void *data;
+};
+
+struct list *list_new(int size);
+int list_push(struct list *list, void *data);
+void *list_pop(struct list *list);
+void *list_first(struct list *list);
+int list_elems(struct list *list);
+void list_delete(struct list *list);
+int list_remove(struct list *list, void *elem);
+void list_map(struct list *list, void (* func)(void *arg));
+
+#endif
diff --git a/contrib/ports/unix/port/include/netif/pcapif.h b/contrib/ports/unix/port/include/netif/pcapif.h
new file mode 100644
index 0000000..ef7abd5
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/pcapif.h
@@ -0,0 +1,39 @@
+/*
+ * 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_PCAPIF_H
+#define LWIP_PCAPIF_H
+
+#include "lwip/netif.h"
+
+err_t pcapif_init(struct netif *netif);
+
+#endif /* LWIP_PCAPIF_H */
diff --git a/contrib/ports/unix/port/include/netif/sio.h b/contrib/ports/unix/port/include/netif/sio.h
new file mode 100644
index 0000000..b9ff131
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/sio.h
@@ -0,0 +1,60 @@
+#ifndef SIO_UNIX_H
+#define SIO_UNIX_H
+
+#include "lwip/sys.h"
+#include "lwip/netif.h"
+#include "netif/fifo.h"
+/*#include "netif/pppif.h"*/
+
+struct sio_status_s {
+ int fd;
+ fifo_t myfifo;
+};
+
+/* BAUDRATE is defined in sio.c as it is implementation specific */
+/** Baudrates */
+typedef enum sioBaudrates {
+ SIO_BAUD_9600,
+ SIO_BAUD_19200,
+ SIO_BAUD_38400,
+ SIO_BAUD_57600,
+ SIO_BAUD_115200
+} sioBaudrates;
+
+/**
+* Poll for a new character from incoming data stream
+* @param siostat siostatus struct, contains sio instance data, given by sio_open
+* @return char read from input stream, or < 0 if no char was available
+*/
+s16_t sio_poll(sio_status_t * siostat);
+
+/**
+* Parse incoming characters until a string str is received, blocking call
+* @param str zero terminated string to expect
+* @param siostat siostatus struct, contains sio instance data, given by sio_open
+*/
+void sio_expect_string(u8_t *str, sio_status_t * siostat);
+
+/**
+* Write a char to output data stream
+* @param str pointer to a zero terminated string
+* @param siostat siostatus struct, contains sio instance data, given by sio_open
+*/
+void sio_send_string(u8_t *str, sio_status_t * siostat);
+
+/**
+* Flush outbuffer (send everything in buffer now), useful if some layer below is
+* holding on to data, waitng to fill a buffer
+* @param siostat siostatus struct, contains sio instance data, given by sio_open
+*/
+void sio_flush( sio_status_t * siostat );
+
+/**
+* Change baudrate of port, may close and reopen port
+* @param baud new baudrate
+* @param siostat siostatus struct, contains sio instance data, given by sio_open
+*/
+void sio_change_baud( sioBaudrates baud, sio_status_t * siostat );
+
+#endif
+
diff --git a/contrib/ports/unix/port/include/netif/tapif.h b/contrib/ports/unix/port/include/netif/tapif.h
new file mode 100644
index 0000000..4c0fa6b
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/tapif.h
@@ -0,0 +1,43 @@
+/*
+ * 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_TAPIF_H
+#define LWIP_TAPIF_H
+
+#include "lwip/netif.h"
+
+err_t tapif_init(struct netif *netif);
+void tapif_poll(struct netif *netif);
+#if NO_SYS
+int tapif_select(struct netif *netif);
+#endif /* NO_SYS */
+
+#endif /* LWIP_TAPIF_H */
diff --git a/contrib/ports/unix/port/include/netif/vdeif.h b/contrib/ports/unix/port/include/netif/vdeif.h
new file mode 100644
index 0000000..01df2d1
--- /dev/null
+++ b/contrib/ports/unix/port/include/netif/vdeif.h
@@ -0,0 +1,43 @@
+/*
+ * 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_VDEIF_H
+#define LWIP_VDEIF_H
+
+#include "lwip/netif.h"
+
+err_t vdeif_init(struct netif *netif);
+void vdeif_poll(struct netif *netif);
+#if NO_SYS
+int vdeif_select(struct netif *netif);
+#endif /* NO_SYS */
+
+#endif /* LWIP_VDEIF_H */
diff --git a/contrib/ports/unix/port/netif/fifo.c b/contrib/ports/unix/port/netif/fifo.c
new file mode 100644
index 0000000..350d3ea
--- /dev/null
+++ b/contrib/ports/unix/port/netif/fifo.c
@@ -0,0 +1,139 @@
+/* Author: Magnus Ivarsson <magnus.ivarsson@volvo.com> */
+
+/* ---------------------------------------------- */
+/* --- fifo 4 unix ------------------------------ */
+/* ---------------------------------------------- */
+#include "lwip/err.h"
+#include "netif/fifo.h"
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/sys.h"
+#include "lwip/arch.h"
+#include <unistd.h>
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef SIO_FIFO_DEBUG
+#define SIO_FIFO_DEBUG LWIP_DBG_OFF
+#endif
+
+u8_t fifoGet(fifo_t * fifo)
+{
+ u8_t c;
+
+ sys_sem_wait(&fifo->sem); /* enter critical section */
+
+ if (fifo->dataslot == fifo->emptyslot)
+ {
+ fifo->getWaiting = TRUE; /* tell putFifo to signal us when data is available */
+ sys_sem_signal(&fifo->sem); /* leave critical section (allow input from serial port..) */
+ sys_sem_wait(&fifo->getSem); /* wait 4 data */
+ sys_sem_wait(&fifo->sem); /* reenter critical section */
+ }
+
+ c = fifo->data[fifo->dataslot++];
+ fifo->len--;
+
+ if (fifo->dataslot == FIFOSIZE)
+ {
+ fifo->dataslot = 0;
+ }
+ sys_sem_signal(&fifo->sem); /* leave critical section */
+ return c;
+}
+
+
+s16_t fifoGetNonBlock(fifo_t * fifo)
+{
+ u16_t c;
+
+ sys_sem_wait(&fifo->sem); /* enter critical section */
+
+ if (fifo->dataslot == fifo->emptyslot)
+ {
+ /* empty fifo */
+ c = -1;
+ }
+ else
+ {
+ c = fifo->data[fifo->dataslot++];
+ fifo->len--;
+
+ if (fifo->dataslot == FIFOSIZE)
+ {
+ fifo->dataslot = 0;
+ }
+ }
+ sys_sem_signal(&fifo->sem); /* leave critical section */
+ return c;
+}
+
+
+void fifoPut(fifo_t * fifo, int fd)
+{
+ /* FIXME: mutex around struct data.. */
+ int cnt=0;
+
+ sys_sem_wait(&fifo->sem ); /* enter critical */
+
+ LWIP_DEBUGF( SIO_FIFO_DEBUG,("fifoput: len%d dat%d empt%d --> ", fifo->len, fifo->dataslot, fifo->emptyslot ) );
+
+ if ( fifo->emptyslot < fifo->dataslot )
+ {
+ cnt = read( fd, &fifo->data[fifo->emptyslot], fifo->dataslot - fifo->emptyslot );
+ }
+ else
+ {
+ cnt = read( fd, &fifo->data[fifo->emptyslot], FIFOSIZE-fifo->emptyslot );
+ }
+ fifo->emptyslot += cnt;
+ fifo->len += cnt;
+
+ LWIP_DEBUGF( SIO_FIFO_DEBUG,("len%d dat%d empt%d\n", fifo->len, fifo->dataslot, fifo->emptyslot ) );
+
+ if ( fifo->len > FIFOSIZE )
+ {
+ printf( "ERROR: fifo overrun detected len=%d, flushing\n", fifo->len );
+ fifo->dataslot = 0;
+ fifo->emptyslot = 0;
+ fifo->len = 0;
+ }
+
+ if ( fifo->emptyslot == FIFOSIZE )
+ {
+ fifo->emptyslot = 0;
+ LWIP_DEBUGF( SIO_FIFO_DEBUG, ("(WRAP) ") );
+
+ sys_sem_signal(&fifo->sem ); /* leave critical */
+ fifoPut( fifo, fd );
+ return;
+ }
+ if ( fifo->getWaiting )
+ {
+ fifo->getWaiting = FALSE;
+ sys_sem_signal(&fifo->getSem );
+ }
+
+ sys_sem_signal(&fifo->sem ); /* leave critical */
+ return;
+}
+
+
+void fifoInit(fifo_t * fifo)
+{
+ fifo->dataslot = 0;
+ fifo->emptyslot = 0;
+ fifo->len = 0;
+ if(sys_sem_new(&fifo->sem, 1) != ERR_OK) { /* critical section 1=free to enter */
+ LWIP_ASSERT("Failed to create semaphore", 0);
+ }
+ if(sys_sem_new(&fifo->getSem, 0) != ERR_OK) { /* 0 = no one waiting */
+ LWIP_ASSERT("Failed to create semaphore", 0);
+ }
+ fifo->getWaiting = FALSE;
+}
diff --git a/contrib/ports/unix/port/netif/list.c b/contrib/ports/unix/port/netif/list.c
new file mode 100644
index 0000000..77faab5
--- /dev/null
+++ b/contrib/ports/unix/port/netif/list.c
@@ -0,0 +1,152 @@
+/*
+ * 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 <stdlib.h>
+#include <netif/list.h>
+
+
+/*-----------------------------------------------------------------------------------*/
+struct list *
+list_new(int size)
+{
+ struct list *list;
+ list = (struct list *)malloc(sizeof(struct list));
+ list->first = list->last = NULL;
+ list->size = size;
+ list->elems = 0;
+ return list;
+}
+/*-----------------------------------------------------------------------------------*/
+int
+list_push(struct list *list, void *data)
+{
+ struct elem *elem;
+
+ if (list->elems < list->size) {
+ elem = (struct elem *)malloc(sizeof(struct elem));
+ elem->data = data;
+ elem->next = NULL;
+ if (list->last != NULL) {
+ list->last->next = elem;
+ }
+ list->last = elem;
+ if (list->first == NULL) {
+ list->first = elem;
+ }
+ list->elems++;
+ return 1;
+ }
+ return 0;
+}
+/*-----------------------------------------------------------------------------------*/
+void *
+list_pop(struct list *list)
+{
+ struct elem *elem;
+ void *data;
+
+ if (list->elems > 0) {
+ elem = list->first;
+ if (elem == list->last) {
+ list->last = elem->next;
+ }
+ list->first = elem->next;
+
+ list->elems--;
+
+ data = elem->data;
+ free(elem);
+
+ return data;
+ }
+ return NULL;
+}
+/*-----------------------------------------------------------------------------------*/
+void *
+list_first(struct list *list)
+{
+ return list->first;
+}
+/*-----------------------------------------------------------------------------------*/
+int
+list_elems(struct list *list)
+{
+ return list->elems;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+list_delete(struct list *list)
+{
+ while (list_pop(list) != NULL);
+ free(list);
+}
+/*-----------------------------------------------------------------------------------*/
+int
+list_remove(struct list *list, void *elem)
+{
+ struct elem *e, *p;
+
+ p = NULL;
+ for(e = list->first; e != NULL; e = e->next) {
+ if (e->data == elem) {
+ if (p != NULL) {
+ p->next = e->next;
+ } else {
+ list->first = e->next;
+ }
+ if (list->last == e) {
+ list->last = p;
+ if (p != NULL) {
+ p->next = NULL;
+ }
+ }
+ free(e);
+ list->elems--;
+ return 1;
+ }
+ p = e;
+ }
+ return 0;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+list_map(struct list *list, void (* func)(void *arg))
+{
+ struct elem *e;
+
+ for(e = list->first; e != NULL; e = e->next) {
+ func(e->data);
+ }
+}
+/*-----------------------------------------------------------------------------------*/
diff --git a/contrib/ports/unix/port/netif/pcapif.c b/contrib/ports/unix/port/netif/pcapif.c
new file mode 100644
index 0000000..2851c82
--- /dev/null
+++ b/contrib/ports/unix/port/netif/pcapif.c
@@ -0,0 +1,207 @@
+/*
+ * 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 linux /* Apparently, this doesn't work under Linux. */
+
+#include "lwip/debug.h"
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <pcap.h>
+
+#include "netif/etharp.h"
+
+#include "lwip/stats.h"
+
+#include "lwip/def.h"
+#include "lwip/mem.h"
+#include "lwip/pbuf.h"
+#include "lwip/sys.h"
+
+#include "lwip/ip.h"
+
+
+struct pcapif {
+ pcap_t *pd;
+ sys_sem_t sem;
+ u8_t pkt[2048];
+ u32_t len;
+ u32_t lasttime;
+ struct pbuf *p;
+ struct eth_addr *ethaddr;
+};
+
+static char errbuf[PCAP_ERRBUF_SIZE];
+
+/*-----------------------------------------------------------------------------------*/
+static err_t
+pcapif_output(struct netif *netif, struct pbuf *p,
+ ip_addr_t *ipaddr)
+{
+ return ERR_OK;
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+timeout(void *arg)
+{
+ struct netif *netif;
+ struct pcapif *pcapif;
+ struct pbuf *p;
+ struct eth_hdr *ethhdr;
+
+ netif = (struct netif *)arg;
+ pcapif = netif->state;
+ ethhdr = (struct eth_hdr *)pcapif->pkt;
+
+
+ if (lwip_htons(ethhdr->type) != ETHTYPE_IP ||
+ ip_lookup(pcapif->pkt + 14, netif)) {
+
+ /* We allocate a pbuf chain of pbufs from the pool. */
+ p = pbuf_alloc(PBUF_LINK, pcapif->len, PBUF_POOL);
+
+ if (p != NULL) {
+ pbuf_take(p, pcapif->pkt, pcapif->len);
+
+ ethhdr = p->payload;
+ switch (lwip_htons(ethhdr->type)) {
+ /* IP or ARP packet? */
+ case ETHTYPE_IP:
+ case ETHTYPE_ARP:
+#if PPPOE_SUPPORT
+ /* PPPoE packet? */
+ case ETHTYPE_PPPOEDISC:
+ case ETHTYPE_PPPOE:
+#endif /* PPPOE_SUPPORT */
+ /* full packet send to tcpip_thread to process */
+ if (netif->input(p, netif) != ERR_OK) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
+ pbuf_free(p);
+ p = NULL;
+ }
+ break;
+ default:
+ pbuf_free(p);
+ break;
+ }
+ }
+ } else {
+ printf("ip_lookup dropped\n");
+ }
+
+ sys_sem_signal(&pcapif->sem);
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+callback(u_char *arg, const struct pcap_pkthdr *hdr, const u_char *pkt)
+{
+ struct netif *netif;
+ struct pcapif *pcapif;
+ u32_t time, lasttime;
+
+ netif = (struct netif *)arg;
+ pcapif = netif->state;
+
+ pcapif->len = hdr->len;
+
+ bcopy(pkt, pcapif->pkt, hdr->len);
+
+ time = hdr->ts.tv_sec * 1000 + hdr->ts.tv_usec / 1000;
+
+ lasttime = pcapif->lasttime;
+ pcapif->lasttime = time;
+
+
+ if (lasttime == 0) {
+ sys_timeout(1000, timeout, netif);
+ } else {
+ sys_timeout(time - lasttime, timeout, netif);
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+static void
+pcapif_thread(void *arg)
+{
+ struct netif *netif;
+ struct pcapif *pcapif;
+ netif = arg;
+ pcapif = netif->state;
+
+ while (1) {
+ pcap_loop(pcapif->pd, 1, callback, (u_char *)netif);
+ sys_sem_wait(&pcapif->sem);
+ if (pcapif->p != NULL) {
+ netif->input(pcapif->p, netif);
+ }
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+err_t
+pcapif_init(struct netif *netif)
+{
+ struct pcapif *p;
+
+ p = malloc(sizeof(struct pcapif));
+ if (p == NULL)
+ return ERR_MEM;
+ netif->state = p;
+ netif->name[0] = 'p';
+ netif->name[1] = 'c';
+ netif->output = pcapif_output;
+
+ p->pd = pcap_open_offline("pcapdump", errbuf);
+ if (p->pd == NULL) {
+ printf("pcapif_init: failed %s\n", errbuf);
+ return ERR_IF;
+ }
+
+ if(sys_sem_new(&p->sem, 0) != ERR_OK) {
+ LWIP_ASSERT("Failed to create semaphore", 0);
+ }
+ p->p = NULL;
+ p->lasttime = 0;
+
+ sys_thread_new("pcapif_thread", pcapif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+ return ERR_OK;
+}
+/*-----------------------------------------------------------------------------------*/
+#endif /* linux */
diff --git a/contrib/ports/unix/port/netif/sio.c b/contrib/ports/unix/port/netif/sio.c
new file mode 100644
index 0000000..8d8be9b
--- /dev/null
+++ b/contrib/ports/unix/port/netif/sio.c
@@ -0,0 +1,485 @@
+/* Author: Magnus Ivarsson <magnus.ivarsson@volvo.com> */
+
+/* to get rid of implicit function declarations */
+#define _XOPEN_SOURCE 600
+#define _GNU_SOURCE
+
+/* build with Darwin C extensions not part of POSIX, i.e. FASYNC, SIGIO.
+ we can't use LWIP_UNIX_MACH because extensions need to be turned
+ on before any system headers (which are pulled in through cc.h)
+ are included */
+#if defined(__APPLE__)
+#define _DARWIN_C_SOURCE
+#endif
+
+#include "netif/sio.h"
+#include "netif/fifo.h"
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/sys.h"
+#include "lwip/arch.h"
+#include "lwip/sio.h"
+#include "netif/ppp/ppp_opts.h"
+
+/* Following #undefs are here to keep compiler from issuing warnings
+ about them being double defined. (They are defined in lwip/inet.h
+ as well as the Unix #includes below.) */
+#undef htonl
+#undef ntohl
+#undef htons
+#undef ntohs
+#undef HTONL
+#undef NTOHL
+#undef HTONS
+#undef NTOHS
+
+#include <stdlib.h>
+#include <stdio.h>
+#if defined(LWIP_UNIX_OPENBSD)
+#include <util.h>
+#endif
+#include <termios.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/signal.h>
+#include <sys/types.h>
+
+#ifndef LWIP_HAVE_SLIPIF
+#define LWIP_HAVE_SLIPIF 0
+#endif
+
+#if (PPP_SUPPORT || LWIP_HAVE_SLIPIF) && defined(LWIP_UNIX_LINUX)
+#include <pty.h>
+#endif
+
+/*#define BAUDRATE B19200 */
+/*#define BAUDRATE B57600 */
+#define BAUDRATE B115200
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/* for all of you who don't define SIO_DEBUG in debug.h */
+#ifndef SIO_DEBUG
+#define SIO_DEBUG 0
+#endif
+
+
+/* typedef struct siostruct_t */
+/* { */
+/* sio_status_t *sio; */
+/* } siostruct_t; */
+
+/** array of ((siostruct*)netif->state)->sio structs */
+static sio_status_t statusar[4];
+
+#if ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+/* --private-functions----------------------------------------------------------------- */
+/**
+ * Signal handler for ttyXX0 to indicate bytes received
+ * one per interface is needed since we cannot send a instance number / pointer as callback argument (?)
+ */
+static void signal_handler_IO_0( int status )
+{
+ LWIP_UNUSED_ARG(status);
+ LWIP_DEBUGF(SIO_DEBUG, ("SigHand: rxSignal channel 0\n"));
+ fifoPut( &statusar[0].myfifo, statusar[0].fd );
+}
+
+/**
+ * Signal handler for ttyXX1 to indicate bytes received
+ * one per interface is needed since we cannot send a instance number / pointer as callback argument (?)
+ */
+static void signal_handler_IO_1( int status )
+{
+ LWIP_UNUSED_ARG(status);
+ LWIP_DEBUGF(SIO_DEBUG, ("SigHand: rxSignal channel 1\n"));
+ fifoPut( &statusar[1].myfifo, statusar[1].fd );
+}
+#endif /* ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF) */
+
+/**
+* Initiation of serial device
+* @param device string with the device name and path, eg. "/dev/ttyS0"
+* @param devnum device number
+* @param siostat status
+* @return file handle to serial dev.
+*/
+static int sio_init( char * device, int devnum, sio_status_t * siostat )
+{
+ struct termios oldtio,newtio;
+#if ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+ struct sigaction saio; /* definition of signal action */
+#endif
+ int fd;
+ LWIP_UNUSED_ARG(siostat);
+ LWIP_UNUSED_ARG(devnum);
+
+ /* open the device to be non-blocking (read will return immediately) */
+ fd = open( device, O_RDWR | O_NOCTTY | O_NONBLOCK );
+ if ( fd < 0 )
+ {
+ perror( device );
+ exit( -1 );
+ }
+
+#if ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+ memset(&saio, 0, sizeof(struct sigaction));
+ /* install the signal handler before making the device asynchronous */
+ switch ( devnum )
+ {
+ case 0:
+ LWIP_DEBUGF( SIO_DEBUG, ("sioinit, signal_handler_IO_0\n") );
+ saio.sa_handler = signal_handler_IO_0;
+ break;
+ case 1:
+ LWIP_DEBUGF( SIO_DEBUG, ("sioinit, signal_handler_IO_1\n") );
+ saio.sa_handler = signal_handler_IO_1;
+ break;
+ default:
+ LWIP_DEBUGF( SIO_DEBUG,("sioinit, devnum not allowed\n") );
+ break;
+ }
+
+ sigaction( SIGIO,&saio,NULL );
+
+ /* allow the process to receive SIGIO */
+ if ( fcntl( fd, F_SETOWN, getpid( ) ) != 0)
+ {
+ perror( device );
+ exit( -1 );
+ }
+ /* Make the file descriptor asynchronous (the manual page says only
+ O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
+ if ( fcntl( fd, F_SETFL, FASYNC ) != 0)
+ {
+ perror( device );
+ exit( -1 );
+ }
+#else
+ if ( fcntl( fd, F_SETFL, 0 ) != 0)
+ {
+ perror( device );
+ exit( -1 );
+ }
+
+#endif /* ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF) */
+
+ tcgetattr( fd,&oldtio ); /* save current port settings */
+ /* set new port settings */
+ /* see 'man termios' for further settings */
+ memset(&newtio, 0, sizeof(newtio));
+ newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD | CRTSCTS;
+ newtio.c_iflag = 0;
+ newtio.c_oflag = 0;
+ newtio.c_lflag = 0; /*ECHO; */
+ newtio.c_cc[VMIN] = 1; /* Read 1 byte at a time, no timer */
+ newtio.c_cc[VTIME] = 0;
+
+ tcsetattr( fd,TCSANOW,&newtio );
+ tcflush( fd, TCIOFLUSH );
+
+ return fd;
+}
+
+/**
+*
+*/
+static void sio_speed( int fd, int speed )
+{
+ struct termios oldtio,newtio;
+ /* int fd; */
+
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_speed[%d]: baudcode:%d enter\n", fd, speed));
+
+ if ( fd < 0 )
+ {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_speed[%d]: fd ERROR\n", fd));
+ exit( -1 );
+ }
+
+ tcgetattr( fd,&oldtio ); /* get current port settings */
+
+ /* set new port settings
+ * see 'man termios' for further settings */
+ memset(&newtio, 0, sizeof(newtio));
+ newtio.c_cflag = speed | CS8 | CLOCAL | CREAD; /* | CRTSCTS; */
+ newtio.c_iflag = 0;
+ newtio.c_oflag = 0;
+ newtio.c_lflag = 0; /*ECHO; */
+ newtio.c_cc[VMIN] = 1; /* Read 1 byte at a time, no timer */
+ newtio.c_cc[VTIME] = 0;
+
+ tcsetattr( fd,TCSANOW,&newtio );
+ tcflush( fd, TCIOFLUSH );
+
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_speed[%d]: leave\n", fd));
+}
+
+/* --public-functions----------------------------------------------------------------------------- */
+void sio_send( u8_t c, sio_status_t * siostat )
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio; */
+
+ if ( write( siostat->fd, &c, 1 ) <= 0 )
+ {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_send[%d]: write refused\n", siostat->fd));
+ }
+}
+
+void sio_send_string( u8_t *str, sio_status_t * siostat )
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio; */
+ int len = strlen( (const char *)str );
+
+ if ( write( siostat->fd, str, len ) <= 0 )
+ {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_send_string[%d]: write refused\n", siostat->fd));
+ }
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_send_string[%d]: sent: %s\n", siostat->fd, str));
+}
+
+
+void sio_flush( sio_status_t * siostat )
+{
+ LWIP_UNUSED_ARG(siostat);
+ /* not implemented in unix as it is not needed */
+ /*sio_status_t * siostat = ((siostruct_t*)netif->state)->sio; */
+}
+
+
+#if ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+/*u8_t sio_recv( struct netif * netif )*/
+u8_t sio_recv( sio_status_t * siostat )
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio; */
+ return fifoGet( &(siostat->myfifo) );
+}
+
+s16_t sio_poll(sio_status_t * siostat)
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio;*/
+ return fifoGetNonBlock( &(siostat->myfifo) );
+}
+
+
+void sio_expect_string( u8_t *str, sio_status_t * siostat )
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio;*/
+ u8_t c;
+ int finger=0;
+
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_expect_string[%d]: %s\n", siostat->fd, str));
+ while ( 1 )
+ {
+ c=fifoGet( &(siostat->myfifo) );
+ LWIP_DEBUGF(SIO_DEBUG, ("_%c", c));
+ if ( c==str[finger] )
+ {
+ finger++;
+ } else if ( finger > 0 )
+ {
+ /*it might fit in the beginning? */
+ if ( str[0] == c )
+ {
+ finger = 1;
+ }
+ }
+ if ( 0 == str[finger] )
+ break; /* done, we have a match */
+ }
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_expect_string[%d]: [match]\n", siostat->fd));
+}
+#endif /* ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF) */
+
+#if (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+u32_t sio_write(sio_status_t * siostat, const u8_t *buf, u32_t size)
+{
+ ssize_t wsz = write( siostat->fd, buf, size );
+ return wsz < 0 ? 0 : wsz;
+}
+
+u32_t sio_read(sio_status_t * siostat, u8_t *buf, u32_t size)
+{
+ ssize_t rsz = read( siostat->fd, buf, size );
+ return rsz < 0 ? 0 : rsz;
+}
+
+void sio_read_abort(sio_status_t * siostat)
+{
+ LWIP_UNUSED_ARG(siostat);
+ printf("sio_read_abort[%d]: not yet implemented for unix\n", siostat->fd);
+}
+#endif /* (PPP_SUPPORT || LWIP_HAVE_SLIPIF) */
+
+sio_fd_t sio_open(u8_t devnum)
+{
+ char dev[20];
+
+ /* would be nice with dynamic memory alloc */
+ sio_status_t * siostate = &statusar[ devnum ];
+/* siostruct_t * tmp; */
+
+
+/* tmp = (siostruct_t*)(netif->state); */
+/* tmp->sio = siostate; */
+
+/* tmp = (siostruct_t*)(netif->state); */
+
+/* ((sio_status_t*)(tmp->sio))->fd = 0; */
+
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open: for devnum %d\n", devnum));
+
+#if ! (PPP_SUPPORT || LWIP_HAVE_SLIPIF)
+ fifoInit( &siostate->myfifo );
+#endif /* ! PPP_SUPPORT */
+
+ snprintf( dev, sizeof(dev), "/dev/ttyS%d", devnum );
+
+ if ( (devnum == 1) || (devnum == 0) )
+ {
+ if ( ( siostate->fd = sio_init( dev, devnum, siostate ) ) == 0 )
+ {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open: ERROR opening serial device dev=%s\n", dev));
+ abort( );
+ return NULL;
+ }
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open[%d]: dev=%s open.\n", siostate->fd, dev));
+ }
+#if PPP_SUPPORT
+ else if (devnum == 2) {
+ pid_t childpid;
+ char name[256];
+ childpid = forkpty(&siostate->fd, name, NULL, NULL);
+ if(childpid < 0) {
+ perror("forkpty");
+ exit (1);
+ }
+ if(childpid == 0) {
+ execl("/usr/sbin/pppd", "pppd",
+ "ms-dns", "198.168.100.7",
+ "local", "crtscts",
+ "debug",
+#ifdef LWIP_PPP_CHAP_TEST
+ "auth",
+ "require-chap",
+ "remotename", "lwip",
+#else
+ "noauth",
+#endif
+#if LWIP_IPV6
+ "+ipv6",
+#endif
+ "192.168.1.1:192.168.1.2",
+ NULL);
+ perror("execl pppd");
+ exit (1);
+ } else {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open[%d]: spawned pppd pid %d on %s\n",
+ siostate->fd, childpid, name));
+ }
+
+ }
+#endif
+#if LWIP_HAVE_SLIPIF
+ else if (devnum == 3) {
+ pid_t childpid;
+ /* create PTY pair */
+ siostate->fd = posix_openpt(O_RDWR | O_NOCTTY);
+ if (siostate->fd < 0) {
+ perror("open pty master");
+ exit (1);
+ }
+ if (grantpt(siostate->fd) != 0) {
+ perror("grant pty master");
+ exit (1);
+ }
+ if (unlockpt(siostate->fd) != 0) {
+ perror("unlock pty master");
+ exit (1);
+ }
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open[%d]: for %s\n",
+ siostate->fd, ptsname(siostate->fd)));
+ /* fork for slattach */
+ childpid = fork();
+ if(childpid < 0) {
+ perror("fork");
+ exit (1);
+ }
+ if(childpid == 0) {
+ /* esteblish SLIP interface on host side connected to PTY slave */
+ execl("/sbin/slattach", "slattach",
+ "-d", "-v", "-L", "-p", "slip",
+ ptsname(siostate->fd),
+ NULL);
+ perror("execl slattach");
+ exit (1);
+ } else {
+ int ret;
+ char buf[1024];
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open[%d]: spawned slattach pid %d on %s\n",
+ siostate->fd, childpid, ptsname(siostate->fd)));
+ /* wait a moment for slattach startup */
+ sleep(1);
+ /* configure SLIP interface on host side as P2P interface */
+ snprintf(buf, sizeof(buf),
+ "/sbin/ifconfig sl0 mtu %d %s pointopoint %s up",
+ SLIP_MAX_SIZE, "192.168.2.1", "192.168.2.2");
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open[%d]: system(\"%s\");\n", siostate->fd, buf));
+ ret = system(buf);
+ if (ret < 0) {
+ perror("ifconfig failed");
+ exit(1);
+ }
+ }
+ }
+#endif /* LWIP_HAVE_SLIPIF */
+ else
+ {
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_open: device %s (%d) is not supported\n", dev, devnum));
+ return NULL;
+ }
+
+ return siostate;
+}
+
+/**
+*
+*/
+void sio_change_baud( sioBaudrates baud, sio_status_t * siostat )
+{
+ /* sio_status_t * siostat = ((siostruct_t*)netif->state)->sio;*/
+
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_change_baud[%d]\n", siostat->fd));
+
+ switch ( baud )
+ {
+ case SIO_BAUD_9600:
+ sio_speed( siostat->fd, B9600 );
+ break;
+ case SIO_BAUD_19200:
+ sio_speed( siostat->fd, B19200 );
+ break;
+ case SIO_BAUD_38400:
+ sio_speed( siostat->fd, B38400 );
+ break;
+ case SIO_BAUD_57600:
+ sio_speed( siostat->fd, B57600 );
+ break;
+ case SIO_BAUD_115200:
+ sio_speed( siostat->fd, B115200 );
+ break;
+
+ default:
+ LWIP_DEBUGF(SIO_DEBUG, ("sio_change_baud[%d]: Unknown baudrate, code:%d\n",
+ siostat->fd, baud));
+ break;
+ }
+}
diff --git a/contrib/ports/unix/port/netif/tapif.c b/contrib/ports/unix/port/netif/tapif.c
new file mode 100644
index 0000000..cff0783
--- /dev/null
+++ b/contrib/ports/unix/port/netif/tapif.c
@@ -0,0 +1,432 @@
+/*
+ * 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 <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/socket.h>
+
+#include "lwip/opt.h"
+
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/ip.h"
+#include "lwip/mem.h"
+#include "lwip/stats.h"
+#include "lwip/snmp.h"
+#include "lwip/pbuf.h"
+#include "lwip/sys.h"
+#include "lwip/timeouts.h"
+#include "netif/etharp.h"
+#include "lwip/ethip6.h"
+
+#include "netif/tapif.h"
+
+#define IFCONFIG_BIN "/sbin/ifconfig "
+
+#if defined(LWIP_UNIX_LINUX)
+#include <sys/ioctl.h>
+#include <linux/if.h>
+#include <linux/if_tun.h>
+/*
+ * Creating a tap interface requires special privileges. If the interfaces
+ * is created in advance with `tunctl -u <user>` it can be opened as a regular
+ * user. The network must already be configured. If DEVTAP_IF is defined it
+ * will be opened instead of creating a new tap device.
+ *
+ * You can also use PRECONFIGURED_TAPIF environment variable to do so.
+ */
+#ifndef DEVTAP_DEFAULT_IF
+#define DEVTAP_DEFAULT_IF "tap0"
+#endif
+#ifndef DEVTAP
+#define DEVTAP "/dev/net/tun"
+#endif
+#define NETMASK_ARGS "netmask %d.%d.%d.%d"
+#define IFCONFIG_ARGS "tap0 inet %d.%d.%d.%d " NETMASK_ARGS
+#elif defined(LWIP_UNIX_OPENBSD)
+#define DEVTAP "/dev/tun0"
+#define NETMASK_ARGS "netmask %d.%d.%d.%d"
+#define IFCONFIG_ARGS "tun0 inet %d.%d.%d.%d " NETMASK_ARGS " link0"
+#else /* others */
+#define DEVTAP "/dev/tap0"
+#define NETMASK_ARGS "netmask %d.%d.%d.%d"
+#define IFCONFIG_ARGS "tap0 inet %d.%d.%d.%d " NETMASK_ARGS
+#endif
+
+/* Define those to better describe your network interface. */
+#define IFNAME0 't'
+#define IFNAME1 'p'
+
+#ifndef TAPIF_DEBUG
+#define TAPIF_DEBUG LWIP_DBG_OFF
+#endif
+
+struct tapif {
+ /* Add whatever per-interface state that is needed here. */
+ int fd;
+};
+
+/* Forward declarations. */
+static void tapif_input(struct netif *netif);
+#if !NO_SYS
+static void tapif_thread(void *arg);
+#endif /* !NO_SYS */
+
+/*-----------------------------------------------------------------------------------*/
+static void
+low_level_init(struct netif *netif)
+{
+ struct tapif *tapif;
+#if LWIP_IPV4
+ int ret;
+ char buf[1024];
+#endif /* LWIP_IPV4 */
+ char *preconfigured_tapif = getenv("PRECONFIGURED_TAPIF");
+
+ tapif = (struct tapif *)netif->state;
+
+ /* Obtain MAC address from network interface. */
+
+ /* (We just fake an address...) */
+ netif->hwaddr[0] = 0x02;
+ netif->hwaddr[1] = 0x12;
+ netif->hwaddr[2] = 0x34;
+ netif->hwaddr[3] = 0x56;
+ netif->hwaddr[4] = 0x78;
+ netif->hwaddr[5] = 0xab;
+ netif->hwaddr_len = 6;
+
+ /* device capabilities */
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
+
+ tapif->fd = open(DEVTAP, O_RDWR);
+ LWIP_DEBUGF(TAPIF_DEBUG, ("tapif_init: fd %d\n", tapif->fd));
+ if (tapif->fd == -1) {
+#ifdef LWIP_UNIX_LINUX
+ perror("tapif_init: try running \"modprobe tun\" or rebuilding your kernel with CONFIG_TUN; cannot open "DEVTAP);
+#else /* LWIP_UNIX_LINUX */
+ perror("tapif_init: cannot open "DEVTAP);
+#endif /* LWIP_UNIX_LINUX */
+ exit(1);
+ }
+
+#ifdef LWIP_UNIX_LINUX
+ {
+ struct ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+
+ if (preconfigured_tapif) {
+ strncpy(ifr.ifr_name, preconfigured_tapif, sizeof(ifr.ifr_name) - 1);
+ } else {
+ strncpy(ifr.ifr_name, DEVTAP_DEFAULT_IF, sizeof(ifr.ifr_name) - 1);
+ }
+ ifr.ifr_name[sizeof(ifr.ifr_name)-1] = 0; /* ensure \0 termination */
+
+ ifr.ifr_flags = IFF_TAP|IFF_NO_PI;
+ if (ioctl(tapif->fd, TUNSETIFF, (void *) &ifr) < 0) {
+ perror("tapif_init: "DEVTAP" ioctl TUNSETIFF");
+ exit(1);
+ }
+ }
+#endif /* LWIP_UNIX_LINUX */
+
+ netif_set_link_up(netif);
+
+ if (preconfigured_tapif == NULL) {
+#if LWIP_IPV4
+ snprintf(buf, 1024, IFCONFIG_BIN IFCONFIG_ARGS,
+ ip4_addr1(netif_ip4_gw(netif)),
+ ip4_addr2(netif_ip4_gw(netif)),
+ ip4_addr3(netif_ip4_gw(netif)),
+ ip4_addr4(netif_ip4_gw(netif))
+#ifdef NETMASK_ARGS
+ ,
+ ip4_addr1(netif_ip4_netmask(netif)),
+ ip4_addr2(netif_ip4_netmask(netif)),
+ ip4_addr3(netif_ip4_netmask(netif)),
+ ip4_addr4(netif_ip4_netmask(netif))
+#endif /* NETMASK_ARGS */
+ );
+
+ LWIP_DEBUGF(TAPIF_DEBUG, ("tapif_init: system(\"%s\");\n", buf));
+ ret = system(buf);
+ if (ret < 0) {
+ perror("ifconfig failed");
+ exit(1);
+ }
+ if (ret != 0) {
+ printf("ifconfig returned %d\n", ret);
+ }
+#else /* LWIP_IPV4 */
+ perror("todo: support IPv6 support for non-preconfigured tapif");
+ exit(1);
+#endif /* LWIP_IPV4 */
+ }
+
+#if !NO_SYS
+ sys_thread_new("tapif_thread", tapif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+#endif /* !NO_SYS */
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * low_level_output():
+ *
+ * Should do the actual transmission of the packet. The packet is
+ * contained in the pbuf that is passed to the function. This pbuf
+ * might be chained.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+
+static err_t
+low_level_output(struct netif *netif, struct pbuf *p)
+{
+ struct tapif *tapif = (struct tapif *)netif->state;
+ char buf[1518]; /* max packet size including VLAN excluding CRC */
+ ssize_t written;
+
+#if 0
+ if (((double)rand()/(double)RAND_MAX) < 0.2) {
+ printf("drop output\n");
+ return ERR_OK; /* ERR_OK because we simulate packet loss on cable */
+ }
+#endif
+
+ if (p->tot_len > sizeof(buf)) {
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ perror("tapif: packet too large");
+ return ERR_IF;
+ }
+
+ /* initiate transfer(); */
+ pbuf_copy_partial(p, buf, p->tot_len, 0);
+
+ /* signal that packet should be sent(); */
+ written = write(tapif->fd, buf, p->tot_len);
+ if (written < p->tot_len) {
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ perror("tapif: write");
+ return ERR_IF;
+ } else {
+ MIB2_STATS_NETIF_ADD(netif, ifoutoctets, (u32_t)written);
+ return ERR_OK;
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * low_level_input():
+ *
+ * Should allocate a pbuf and transfer the bytes of the incoming
+ * packet from the interface into the pbuf.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+static struct pbuf *
+low_level_input(struct netif *netif)
+{
+ struct pbuf *p;
+ u16_t len;
+ ssize_t readlen;
+ char buf[1518]; /* max packet size including VLAN excluding CRC */
+ struct tapif *tapif = (struct tapif *)netif->state;
+
+ /* Obtain the size of the packet and put it into the "len"
+ variable. */
+ readlen = read(tapif->fd, buf, sizeof(buf));
+ if (readlen < 0) {
+ perror("read returned -1");
+ exit(1);
+ }
+ len = (u16_t)readlen;
+
+ MIB2_STATS_NETIF_ADD(netif, ifinoctets, len);
+
+#if 0
+ if (((double)rand()/(double)RAND_MAX) < 0.2) {
+ printf("drop\n");
+ return NULL;
+ }
+#endif
+
+ /* We allocate a pbuf chain of pbufs from the pool. */
+ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
+ if (p != NULL) {
+ pbuf_take(p, buf, len);
+ /* acknowledge that packet has been read(); */
+ } else {
+ /* drop packet(); */
+ MIB2_STATS_NETIF_INC(netif, ifindiscards);
+ LWIP_DEBUGF(NETIF_DEBUG, ("tapif_input: could not allocate pbuf\n"));
+ }
+
+ return p;
+}
+
+/*-----------------------------------------------------------------------------------*/
+/*
+ * tapif_input():
+ *
+ * This function should be 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
+tapif_input(struct netif *netif)
+{
+ struct pbuf *p = low_level_input(netif);
+
+ if (p == NULL) {
+#if LINK_STATS
+ LINK_STATS_INC(link.recv);
+#endif /* LINK_STATS */
+ LWIP_DEBUGF(TAPIF_DEBUG, ("tapif_input: low_level_input returned NULL\n"));
+ return;
+ }
+
+ if (netif->input(p, netif) != ERR_OK) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("tapif_input: netif input error\n"));
+ pbuf_free(p);
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * tapif_init():
+ *
+ * Should be called at the beginning of the program to set up the
+ * network interface. It calls the function low_level_init() to do the
+ * actual setup of the hardware.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+err_t
+tapif_init(struct netif *netif)
+{
+ struct tapif *tapif = (struct tapif *)mem_malloc(sizeof(struct tapif));
+
+ if (tapif == NULL) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("tapif_init: out of memory for tapif\n"));
+ return ERR_MEM;
+ }
+ netif->state = tapif;
+ MIB2_INIT_NETIF(netif, snmp_ifType_other, 100000000);
+
+ netif->name[0] = IFNAME0;
+ netif->name[1] = IFNAME1;
+#if LWIP_IPV4
+ netif->output = etharp_output;
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ netif->output_ip6 = ethip6_output;
+#endif /* LWIP_IPV6 */
+ netif->linkoutput = low_level_output;
+ netif->mtu = 1500;
+
+ low_level_init(netif);
+
+ return ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------*/
+void
+tapif_poll(struct netif *netif)
+{
+ tapif_input(netif);
+}
+
+#if NO_SYS
+
+int
+tapif_select(struct netif *netif)
+{
+ fd_set fdset;
+ int ret;
+ struct timeval tv;
+ struct tapif *tapif;
+ u32_t msecs = sys_timeouts_sleeptime();
+
+ tapif = (struct tapif *)netif->state;
+
+ tv.tv_sec = msecs / 1000;
+ tv.tv_usec = (msecs % 1000) * 1000;
+
+ FD_ZERO(&fdset);
+ FD_SET(tapif->fd, &fdset);
+
+ ret = select(tapif->fd + 1, &fdset, NULL, NULL, &tv);
+ if (ret > 0) {
+ tapif_input(netif);
+ }
+ return ret;
+}
+
+#else /* NO_SYS */
+
+static void
+tapif_thread(void *arg)
+{
+ struct netif *netif;
+ struct tapif *tapif;
+ fd_set fdset;
+ int ret;
+
+ netif = (struct netif *)arg;
+ tapif = (struct tapif *)netif->state;
+
+ while(1) {
+ FD_ZERO(&fdset);
+ FD_SET(tapif->fd, &fdset);
+
+ /* Wait for a packet to arrive. */
+ ret = select(tapif->fd + 1, &fdset, NULL, NULL, NULL);
+
+ if(ret == 1) {
+ /* Handle incoming packet. */
+ tapif_input(netif);
+ } else if(ret == -1) {
+ perror("tapif_thread: select");
+ }
+ }
+}
+
+#endif /* NO_SYS */
diff --git a/contrib/ports/unix/port/netif/vdeif.c b/contrib/ports/unix/port/netif/vdeif.c
new file mode 100644
index 0000000..9b6b50e
--- /dev/null
+++ b/contrib/ports/unix/port/netif/vdeif.c
@@ -0,0 +1,344 @@
+/*
+ * VDE (virtual distributed ethernet) interface for ale4net
+ * (based on tapif interface Adam Dunkels <adam@sics.se>)
+ * 2005,2010,2011,2023 Renzo Davoli University of Bologna - Italy
+ */
+
+/*
+ * 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 <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/socket.h>
+
+#include "lwip/opt.h"
+
+#include "lwip/debug.h"
+#include "lwip/def.h"
+#include "lwip/ip.h"
+#include "lwip/mem.h"
+#include "lwip/stats.h"
+#include "lwip/snmp.h"
+#include "lwip/pbuf.h"
+#include "lwip/sys.h"
+#include "lwip/timeouts.h"
+#include "netif/etharp.h"
+#include "lwip/ethip6.h"
+#include <libvdeplug.h>
+
+#include "netif/vdeif.h"
+
+/* Define those to better describe your network interface. */
+#define IFNAME0 'v'
+#define IFNAME1 'd'
+
+#ifndef VDEIF_DEBUG
+#define VDEIF_DEBUG LWIP_DBG_OFF
+#endif
+
+static char vdedescr[] = "lwip";
+
+struct vdeif {
+ VDECONN *vdeconn;
+};
+
+/* Forward declarations. */
+static void vdeif_input(struct netif *netif);
+#if !NO_SYS
+static void vdeif_thread(void *arg);
+#endif /* !NO_SYS */
+
+/*-----------------------------------------------------------------------------------*/
+static void
+low_level_init(struct netif *netif, char *vderl)
+{
+ struct vdeif *vdeif;
+ int randaddr;
+ struct timeval now;
+
+ vdeif = (struct vdeif *)netif->state;
+ gettimeofday(&now, NULL);
+ srand(now.tv_sec + now.tv_usec);
+ randaddr = rand();
+
+ /* Obtain MAC address from network interface. */
+
+ /* (We just fake an address...) */
+ netif->hwaddr[0] = 0x02;
+ netif->hwaddr[1] = 0x2;
+ netif->hwaddr[2] = randaddr >> 24;
+ netif->hwaddr[3] = randaddr >> 16;
+ netif->hwaddr[4] = randaddr >> 8;
+ netif->hwaddr[5] = randaddr;
+ netif->hwaddr_len = 6;
+
+ /* device capabilities */
+ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;
+
+ vdeif->vdeconn = vde_open(vderl, vdedescr, NULL);
+ LWIP_DEBUGF(VDEIF_DEBUG, ("vdeif_init: ok = %d\n", !!vdeif->vdeconn));
+ if (vdeif->vdeconn == NULL) {
+ perror("vdeif_init: cannot open vde net");
+ exit(1);
+ }
+
+ netif_set_link_up(netif);
+
+#if !NO_SYS
+ sys_thread_new("vdeif_thread", vdeif_thread, netif, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
+#endif /* !NO_SYS */
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * low_level_output():
+ *
+ * Should do the actual transmission of the packet. The packet is
+ * contained in the pbuf that is passed to the function. This pbuf
+ * might be chained.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+
+static err_t
+low_level_output(struct netif *netif, struct pbuf *p)
+{
+ struct vdeif *vdeif = (struct vdeif *)netif->state;
+ char buf[1518]; /* max packet size including VLAN excluding CRC */
+ ssize_t written;
+
+ if (p->tot_len > sizeof(buf)) {
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ perror("vdeif: packet too large");
+ return ERR_IF;
+ }
+
+ /* initiate transfer(); */
+ pbuf_copy_partial(p, buf, p->tot_len, 0);
+
+ /* signal that packet should be sent(); */
+ written = vde_send(vdeif->vdeconn, buf, p->tot_len, 0);
+ if (written < p->tot_len) {
+ MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
+ perror("vdeif: write");
+ return ERR_IF;
+ } else {
+ MIB2_STATS_NETIF_ADD(netif, ifoutoctets, (u32_t)written);
+ return ERR_OK;
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * low_level_input():
+ *
+ * Should allocate a pbuf and transfer the bytes of the incoming
+ * packet from the interface into the pbuf.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+static struct pbuf *
+low_level_input(struct netif *netif)
+{
+ struct pbuf *p;
+ u16_t len;
+ ssize_t readlen;
+ char buf[1518]; /* max packet size including VLAN excluding CRC */
+ struct vdeif *vdeif = (struct vdeif *)netif->state;
+
+ /* Obtain the size of the packet and put it into the "len"
+ variable. */
+ readlen = vde_recv(vdeif->vdeconn, buf, sizeof(buf), 0);
+ if (readlen < 0) {
+ perror("read returned -1");
+ exit(1);
+ }
+ len = (u16_t)readlen;
+
+ MIB2_STATS_NETIF_ADD(netif, ifinoctets, len);
+
+ /* We allocate a pbuf chain of pbufs from the pool. */
+ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
+ if (p != NULL) {
+ pbuf_take(p, buf, len);
+ /* acknowledge that packet has been read(); */
+ } else {
+ /* drop packet(); */
+ MIB2_STATS_NETIF_INC(netif, ifindiscards);
+ LWIP_DEBUGF(NETIF_DEBUG, ("vdeif_input: could not allocate pbuf\n"));
+ }
+
+ return p;
+}
+
+/*-----------------------------------------------------------------------------------*/
+/*
+ * vdeif_input():
+ *
+ * This function should be 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
+vdeif_input(struct netif *netif)
+{
+ struct pbuf *p = low_level_input(netif);
+
+ if (p == NULL) {
+#if LINK_STATS
+ LINK_STATS_INC(link.recv);
+#endif /* LINK_STATS */
+ LWIP_DEBUGF(VDEIF_DEBUG, ("vdeif_input: low_level_input returned NULL\n"));
+ return;
+ }
+
+ if (netif->input(p, netif) != ERR_OK) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("vdeif_input: netif input error\n"));
+ pbuf_free(p);
+ }
+}
+/*-----------------------------------------------------------------------------------*/
+/*
+ * vdeif_init():
+ *
+ * Should be called at the beginning of the program to set up the
+ * network interface. It calls the function low_level_init() to do the
+ * actual setup of the hardware.
+ *
+ */
+/*-----------------------------------------------------------------------------------*/
+err_t
+vdeif_init(struct netif *netif)
+{
+ char *vderl = (char *) netif->state;
+ struct vdeif *vdeif = (struct vdeif *)mem_malloc(sizeof(struct vdeif));
+
+ if (vdeif == NULL) {
+ LWIP_DEBUGF(NETIF_DEBUG, ("vdeif_init: out of memory for vdeif\n"));
+ return ERR_MEM;
+ }
+ netif->state = vdeif;
+ MIB2_INIT_NETIF(netif, snmp_ifType_other, 100000000);
+
+ netif->name[0] = IFNAME0;
+ netif->name[1] = IFNAME1;
+#if LWIP_IPV4
+ netif->output = etharp_output;
+#endif /* LWIP_IPV4 */
+#if LWIP_IPV6
+ netif->output_ip6 = ethip6_output;
+#endif /* LWIP_IPV6 */
+ netif->linkoutput = low_level_output;
+ netif->mtu = 1500;
+
+ low_level_init(netif, vderl);
+
+ return ERR_OK;
+}
+
+
+/*-----------------------------------------------------------------------------------*/
+void
+vdeif_poll(struct netif *netif)
+{
+ vdeif_input(netif);
+}
+
+#if NO_SYS
+
+int
+vdeif_select(struct netif *netif)
+{
+ fd_set fdset;
+ int ret;
+ struct timeval tv;
+ struct vdeif *vdeif;
+ u32_t msecs = sys_timeouts_sleeptime();
+ int datafd;
+
+ vdeif = (struct vdeif *)netif->state;
+ datafd = vde_datafd(vdeif->vdeconn);
+
+ tv.tv_sec = msecs / 1000;
+ tv.tv_usec = (msecs % 1000) * 1000;
+
+ FD_ZERO(&fdset);
+ FD_SET(datafd, &fdset);
+
+ ret = select(datafd + 1, &fdset, NULL, NULL, &tv);
+ if (ret > 0) {
+ vdeif_input(netif);
+ }
+ return ret;
+}
+
+#else /* NO_SYS */
+
+static void
+vdeif_thread(void *arg)
+{
+ struct netif *netif;
+ struct vdeif *vdeif;
+ fd_set fdset;
+ int ret;
+ int datafd;
+
+ netif = (struct netif *)arg;
+ vdeif = (struct vdeif *)netif->state;
+ datafd = vde_datafd(vdeif->vdeconn);
+
+ while(1) {
+ FD_ZERO(&fdset);
+ FD_SET(datafd, &fdset);
+
+ /* Wait for a packet to arrive. */
+ ret = select(datafd + 1, &fdset, NULL, NULL, NULL);
+
+ if(ret == 1) {
+ /* Handle incoming packet. */
+ vdeif_input(netif);
+ } else if(ret == -1) {
+ perror("vdeif_thread: select");
+ }
+ }
+}
+
+#endif /* NO_SYS */
diff --git a/contrib/ports/unix/port/perf.c b/contrib/ports/unix/port/perf.c
new file mode 100644
index 0000000..bed4614
--- /dev/null
+++ b/contrib/ports/unix/port/perf.c
@@ -0,0 +1,65 @@
+/*
+ * 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 "arch/perf.h"
+
+#include <stdio.h>
+
+static FILE *f;
+
+void
+perf_print(unsigned long c1l, unsigned long c1h,
+ unsigned long c2l, unsigned long c2h,
+ char *key)
+{
+ unsigned long sub_ms, sub_ls;
+
+ sub_ms = c2h - c1h;
+ sub_ls = c2l - c1l;
+ if (c2l < c1l) sub_ms--;
+ fprintf(f, "%s: %.8lu%.8lu\n", key, sub_ms, sub_ls);
+ fflush(NULL);
+}
+
+void
+perf_print_times(struct tms *start, struct tms *end, char *key)
+{
+ fprintf(f, "%s: %lu\n", key, end->tms_stime - start->tms_stime);
+ fflush(NULL);
+}
+
+void
+perf_init(char *fname)
+{
+ f = fopen(fname, "w");
+}
+
diff --git a/contrib/ports/unix/port/sys_arch.c b/contrib/ports/unix/port/sys_arch.c
new file mode 100644
index 0000000..1e094e8
--- /dev/null
+++ b/contrib/ports/unix/port/sys_arch.c
@@ -0,0 +1,840 @@
+/*
+ * 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>
+ *
+ */
+
+/*
+ * Wed Apr 17 16:05:29 EDT 2002 (James Roth)
+ *
+ * - Fixed an unlikely sys_thread_new() race condition.
+ *
+ * - Made current_thread() work with threads which where
+ * not created with sys_thread_new(). This includes
+ * the main thread and threads made with pthread_create().
+ *
+ * - Catch overflows where more than SYS_MBOX_SIZE messages
+ * are waiting to be read. The sys_mbox_post() routine
+ * will block until there is more room instead of just
+ * leaking messages.
+ */
+#define _GNU_SOURCE /* pull in pthread_setname_np() on Linux */
+
+#include "lwip/debug.h"
+
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <errno.h>
+
+#include "lwip/def.h"
+
+#ifdef LWIP_UNIX_MACH
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#endif
+
+#include "lwip/sys.h"
+#include "lwip/opt.h"
+#include "lwip/stats.h"
+#include "lwip/tcpip.h"
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+/* pthread key to *our* thread local storage entry */
+static pthread_key_t sys_thread_sem_key;
+#endif
+
+/* Return code for an interrupted timed wait */
+#define SYS_ARCH_INTR 0xfffffffeUL
+
+u32_t
+lwip_port_rand(void)
+{
+ return (u32_t)rand();
+}
+
+static void
+get_monotonic_time(struct timespec *ts)
+{
+#ifdef LWIP_UNIX_MACH
+ /* darwin impl (no CLOCK_MONOTONIC) */
+ u64_t t = mach_absolute_time();
+ mach_timebase_info_data_t timebase_info = {0, 0};
+ mach_timebase_info(&timebase_info);
+ u64_t nano = (t * timebase_info.numer) / (timebase_info.denom);
+ u64_t sec = nano/1000000000L;
+ nano -= sec * 1000000000L;
+ ts->tv_sec = sec;
+ ts->tv_nsec = nano;
+#else
+ clock_gettime(CLOCK_MONOTONIC, ts);
+#endif
+}
+
+#if SYS_LIGHTWEIGHT_PROT
+static pthread_mutex_t lwprot_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_t lwprot_thread = (pthread_t)0xDEAD;
+static int lwprot_count = 0;
+#endif /* SYS_LIGHTWEIGHT_PROT */
+
+#if !NO_SYS
+
+static struct sys_thread *threads = NULL;
+static pthread_mutex_t threads_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+struct sys_mbox_msg {
+ struct sys_mbox_msg *next;
+ void *msg;
+};
+
+#define SYS_MBOX_SIZE 128
+
+struct sys_mbox {
+ int first, last;
+ void *msgs[SYS_MBOX_SIZE];
+ struct sys_sem *not_empty;
+ struct sys_sem *not_full;
+ struct sys_sem *mutex;
+ int wait_send;
+};
+
+struct sys_sem {
+ unsigned int c;
+ pthread_condattr_t condattr;
+ pthread_cond_t cond;
+ pthread_mutex_t mutex;
+};
+
+struct sys_mutex {
+ pthread_mutex_t mutex;
+};
+
+struct sys_thread {
+ struct sys_thread *next;
+ pthread_t pthread;
+};
+
+static struct sys_sem *sys_sem_new_internal(u8_t count);
+static void sys_sem_free_internal(struct sys_sem *sem);
+
+static u32_t cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex,
+ u32_t timeout);
+
+/*-----------------------------------------------------------------------------------*/
+/* Threads */
+static struct sys_thread *
+introduce_thread(pthread_t id)
+{
+ struct sys_thread *thread;
+
+ thread = (struct sys_thread *)malloc(sizeof(struct sys_thread));
+
+ if (thread != NULL) {
+ pthread_mutex_lock(&threads_mutex);
+ thread->next = threads;
+ thread->pthread = id;
+ threads = thread;
+ pthread_mutex_unlock(&threads_mutex);
+ }
+
+ return thread;
+}
+
+struct thread_wrapper_data
+{
+ lwip_thread_fn function;
+ void *arg;
+};
+
+static void *
+thread_wrapper(void *arg)
+{
+ struct thread_wrapper_data *thread_data = (struct thread_wrapper_data *)arg;
+
+ thread_data->function(thread_data->arg);
+
+ /* we should never get here */
+ free(arg);
+ return NULL;
+}
+
+sys_thread_t
+sys_thread_new(const char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)
+{
+ int code;
+ pthread_t tmp;
+ struct sys_thread *st = NULL;
+ struct thread_wrapper_data *thread_data;
+ LWIP_UNUSED_ARG(name);
+ LWIP_UNUSED_ARG(stacksize);
+ LWIP_UNUSED_ARG(prio);
+
+ thread_data = (struct thread_wrapper_data *)malloc(sizeof(struct thread_wrapper_data));
+ thread_data->arg = arg;
+ thread_data->function = function;
+ code = pthread_create(&tmp,
+ NULL,
+ thread_wrapper,
+ thread_data);
+
+#ifdef LWIP_UNIX_LINUX
+ pthread_setname_np(tmp, name);
+#endif
+
+ if (0 == code) {
+ st = introduce_thread(tmp);
+ }
+
+ if (NULL == st) {
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_new: pthread_create %d, st = 0x%lx\n",
+ code, (unsigned long)st));
+ abort();
+ }
+ return st;
+}
+
+#if LWIP_TCPIP_CORE_LOCKING
+static pthread_t lwip_core_lock_holder_thread_id;
+void sys_lock_tcpip_core(void)
+{
+ sys_mutex_lock(&lock_tcpip_core);
+ lwip_core_lock_holder_thread_id = pthread_self();
+}
+
+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 pthread_t lwip_tcpip_thread_id;
+void sys_mark_tcpip_thread(void)
+{
+ lwip_tcpip_thread_id = pthread_self();
+}
+
+void sys_check_core_locking(void)
+{
+ /* Embedded systems should check we are NOT in an interrupt context here */
+
+ if (lwip_tcpip_thread_id != 0) {
+ pthread_t current_thread_id = pthread_self();
+
+#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 */
+ }
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* Mailbox */
+err_t
+sys_mbox_new(struct sys_mbox **mb, int size)
+{
+ struct sys_mbox *mbox;
+ LWIP_UNUSED_ARG(size);
+
+ mbox = (struct sys_mbox *)malloc(sizeof(struct sys_mbox));
+ if (mbox == NULL) {
+ return ERR_MEM;
+ }
+ mbox->first = mbox->last = 0;
+ mbox->not_empty = sys_sem_new_internal(0);
+ mbox->not_full = sys_sem_new_internal(0);
+ mbox->mutex = sys_sem_new_internal(1);
+ mbox->wait_send = 0;
+
+ SYS_STATS_INC_USED(mbox);
+ *mb = mbox;
+ return ERR_OK;
+}
+
+void
+sys_mbox_free(struct sys_mbox **mb)
+{
+ if ((mb != NULL) && (*mb != SYS_MBOX_NULL)) {
+ struct sys_mbox *mbox = *mb;
+ SYS_STATS_DEC(mbox.used);
+ sys_arch_sem_wait(&mbox->mutex, 0);
+
+ sys_sem_free_internal(mbox->not_empty);
+ sys_sem_free_internal(mbox->not_full);
+ sys_sem_free_internal(mbox->mutex);
+ mbox->not_empty = mbox->not_full = mbox->mutex = NULL;
+ /* LWIP_DEBUGF("sys_mbox_free: mbox 0x%lx\n", mbox); */
+ free(mbox);
+ }
+}
+
+err_t
+sys_mbox_trypost(struct sys_mbox **mb, void *msg)
+{
+ u8_t first;
+ struct sys_mbox *mbox;
+ LWIP_ASSERT("invalid mbox", (mb != NULL) && (*mb != NULL));
+ mbox = *mb;
+
+ sys_arch_sem_wait(&mbox->mutex, 0);
+
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_trypost: mbox %p msg %p\n",
+ (void *)mbox, (void *)msg));
+
+ if ((mbox->last + 1) >= (mbox->first + SYS_MBOX_SIZE)) {
+ sys_sem_signal(&mbox->mutex);
+ return ERR_MEM;
+ }
+
+ mbox->msgs[mbox->last % SYS_MBOX_SIZE] = msg;
+
+ if (mbox->last == mbox->first) {
+ first = 1;
+ } else {
+ first = 0;
+ }
+
+ mbox->last++;
+
+ if (first) {
+ sys_sem_signal(&mbox->not_empty);
+ }
+
+ sys_sem_signal(&mbox->mutex);
+
+ return ERR_OK;
+}
+
+err_t
+sys_mbox_trypost_fromisr(sys_mbox_t *q, void *msg)
+{
+ return sys_mbox_trypost(q, msg);
+}
+
+void
+sys_mbox_post(struct sys_mbox **mb, void *msg)
+{
+ u8_t first;
+ struct sys_mbox *mbox;
+ LWIP_ASSERT("invalid mbox", (mb != NULL) && (*mb != NULL));
+ mbox = *mb;
+
+ sys_arch_sem_wait(&mbox->mutex, 0);
+
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_post: mbox %p msg %p\n", (void *)mbox, (void *)msg));
+
+ while ((mbox->last + 1) >= (mbox->first + SYS_MBOX_SIZE)) {
+ mbox->wait_send++;
+ sys_sem_signal(&mbox->mutex);
+ sys_arch_sem_wait(&mbox->not_full, 0);
+ sys_arch_sem_wait(&mbox->mutex, 0);
+ mbox->wait_send--;
+ }
+
+ mbox->msgs[mbox->last % SYS_MBOX_SIZE] = msg;
+
+ if (mbox->last == mbox->first) {
+ first = 1;
+ } else {
+ first = 0;
+ }
+
+ mbox->last++;
+
+ if (first) {
+ sys_sem_signal(&mbox->not_empty);
+ }
+
+ sys_sem_signal(&mbox->mutex);
+}
+
+u32_t
+sys_arch_mbox_tryfetch(struct sys_mbox **mb, void **msg)
+{
+ struct sys_mbox *mbox;
+ LWIP_ASSERT("invalid mbox", (mb != NULL) && (*mb != NULL));
+ mbox = *mb;
+
+ sys_arch_sem_wait(&mbox->mutex, 0);
+
+ if (mbox->first == mbox->last) {
+ sys_sem_signal(&mbox->mutex);
+ return SYS_MBOX_EMPTY;
+ }
+
+ if (msg != NULL) {
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_tryfetch: mbox %p msg %p\n", (void *)mbox, *msg));
+ *msg = mbox->msgs[mbox->first % SYS_MBOX_SIZE];
+ }
+ else{
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_tryfetch: mbox %p, null msg\n", (void *)mbox));
+ }
+
+ mbox->first++;
+
+ if (mbox->wait_send) {
+ sys_sem_signal(&mbox->not_full);
+ }
+
+ sys_sem_signal(&mbox->mutex);
+
+ return 0;
+}
+
+u32_t
+sys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, u32_t timeout)
+{
+ u32_t time_needed = 0;
+ struct sys_mbox *mbox;
+ LWIP_ASSERT("invalid mbox", (mb != NULL) && (*mb != NULL));
+ mbox = *mb;
+
+ /* The mutex lock is quick so we don't bother with the timeout
+ stuff here. */
+ sys_arch_sem_wait(&mbox->mutex, 0);
+
+ while (mbox->first == mbox->last) {
+ sys_sem_signal(&mbox->mutex);
+
+ /* We block while waiting for a mail to arrive in the mailbox. We
+ must be prepared to timeout. */
+ if (timeout != 0) {
+ time_needed = sys_arch_sem_wait(&mbox->not_empty, timeout);
+
+ if (time_needed == SYS_ARCH_TIMEOUT) {
+ return SYS_ARCH_TIMEOUT;
+ }
+ } else {
+ sys_arch_sem_wait(&mbox->not_empty, 0);
+ }
+
+ sys_arch_sem_wait(&mbox->mutex, 0);
+ }
+
+ if (msg != NULL) {
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p msg %p\n", (void *)mbox, *msg));
+ *msg = mbox->msgs[mbox->first % SYS_MBOX_SIZE];
+ }
+ else{
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p, null msg\n", (void *)mbox));
+ }
+
+ mbox->first++;
+
+ if (mbox->wait_send) {
+ sys_sem_signal(&mbox->not_full);
+ }
+
+ sys_sem_signal(&mbox->mutex);
+
+ return time_needed;
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* Semaphore */
+static struct sys_sem *
+sys_sem_new_internal(u8_t count)
+{
+ struct sys_sem *sem;
+
+ sem = (struct sys_sem *)malloc(sizeof(struct sys_sem));
+ if (sem != NULL) {
+ sem->c = count;
+ pthread_condattr_init(&(sem->condattr));
+#if !(defined(LWIP_UNIX_MACH) || (defined(LWIP_UNIX_ANDROID) && __ANDROID_API__ < 21))
+ pthread_condattr_setclock(&(sem->condattr), CLOCK_MONOTONIC);
+#endif
+ pthread_cond_init(&(sem->cond), &(sem->condattr));
+ pthread_mutex_init(&(sem->mutex), NULL);
+ }
+ return sem;
+}
+
+err_t
+sys_sem_new(struct sys_sem **sem, u8_t count)
+{
+ SYS_STATS_INC_USED(sem);
+ *sem = sys_sem_new_internal(count);
+ if (*sem == NULL) {
+ return ERR_MEM;
+ }
+ return ERR_OK;
+}
+
+static u32_t
+cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex, u32_t timeout)
+{
+ struct timespec rtime1, rtime2, ts;
+ int ret;
+
+#ifdef LWIP_UNIX_HURD
+ #define pthread_cond_wait pthread_hurd_cond_wait_np
+ #define pthread_cond_timedwait pthread_hurd_cond_timedwait_np
+#endif
+
+ if (timeout == 0) {
+ ret = pthread_cond_wait(cond, mutex);
+ return
+#ifdef LWIP_UNIX_HURD
+ /* On the Hurd, ret == 1 means the RPC has been cancelled.
+ * The thread is awakened (not terminated) and execution must continue */
+ ret == 1 ? SYS_ARCH_INTR :
+#endif
+ (u32_t)ret;
+ }
+
+ /* Get a timestamp and add the timeout value. */
+ get_monotonic_time(&rtime1);
+#if defined(LWIP_UNIX_MACH) || (defined(LWIP_UNIX_ANDROID) && __ANDROID_API__ < 21)
+ ts.tv_sec = timeout / 1000L;
+ ts.tv_nsec = (timeout % 1000L) * 1000000L;
+ ret = pthread_cond_timedwait_relative_np(cond, mutex, &ts);
+#else
+ ts.tv_sec = rtime1.tv_sec + timeout / 1000L;
+ ts.tv_nsec = rtime1.tv_nsec + (timeout % 1000L) * 1000000L;
+ if (ts.tv_nsec >= 1000000000L) {
+ ts.tv_sec++;
+ ts.tv_nsec -= 1000000000L;
+ }
+
+ ret = pthread_cond_timedwait(cond, mutex, &ts);
+#endif
+ if (ret == ETIMEDOUT) {
+ return SYS_ARCH_TIMEOUT;
+#ifdef LWIP_UNIX_HURD
+ /* On the Hurd, ret == 1 means the RPC has been cancelled.
+ * The thread is awakened (not terminated) and execution must continue */
+ } else if (ret == EINTR) {
+ return SYS_ARCH_INTR;
+#endif
+ }
+
+ /* Calculate for how long we waited for the cond. */
+ get_monotonic_time(&rtime2);
+ ts.tv_sec = rtime2.tv_sec - rtime1.tv_sec;
+ ts.tv_nsec = rtime2.tv_nsec - rtime1.tv_nsec;
+ if (ts.tv_nsec < 0) {
+ ts.tv_sec--;
+ ts.tv_nsec += 1000000000L;
+ }
+ return (u32_t)(ts.tv_sec * 1000L + ts.tv_nsec / 1000000L);
+}
+
+u32_t
+sys_arch_sem_wait(struct sys_sem **s, u32_t timeout)
+{
+ u32_t time_needed = 0;
+ struct sys_sem *sem;
+ LWIP_ASSERT("invalid sem", (s != NULL) && (*s != NULL));
+ sem = *s;
+
+ pthread_mutex_lock(&(sem->mutex));
+ while (sem->c <= 0) {
+ if (timeout > 0) {
+ time_needed = cond_wait(&(sem->cond), &(sem->mutex), timeout);
+
+ if (time_needed == SYS_ARCH_TIMEOUT) {
+ pthread_mutex_unlock(&(sem->mutex));
+ return SYS_ARCH_TIMEOUT;
+#ifdef LWIP_UNIX_HURD
+ } else if(time_needed == SYS_ARCH_INTR) {
+ pthread_mutex_unlock(&(sem->mutex));
+ return 0;
+#endif
+ }
+ /* pthread_mutex_unlock(&(sem->mutex));
+ return time_needed; */
+ } else if(cond_wait(&(sem->cond), &(sem->mutex), 0)) {
+ /* Some error happened or the thread has been awakened but not by lwip */
+ pthread_mutex_unlock(&(sem->mutex));
+ return 0;
+ }
+ }
+ sem->c--;
+ pthread_mutex_unlock(&(sem->mutex));
+ return (u32_t)time_needed;
+}
+
+void
+sys_sem_signal(struct sys_sem **s)
+{
+ struct sys_sem *sem;
+ LWIP_ASSERT("invalid sem", (s != NULL) && (*s != NULL));
+ sem = *s;
+
+ pthread_mutex_lock(&(sem->mutex));
+ sem->c++;
+
+ if (sem->c > 1) {
+ sem->c = 1;
+ }
+
+ pthread_cond_broadcast(&(sem->cond));
+ pthread_mutex_unlock(&(sem->mutex));
+}
+
+static void
+sys_sem_free_internal(struct sys_sem *sem)
+{
+ pthread_cond_destroy(&(sem->cond));
+ pthread_condattr_destroy(&(sem->condattr));
+ pthread_mutex_destroy(&(sem->mutex));
+ free(sem);
+}
+
+void
+sys_sem_free(struct sys_sem **sem)
+{
+ if ((sem != NULL) && (*sem != SYS_SEM_NULL)) {
+ SYS_STATS_DEC(sem.used);
+ sys_sem_free_internal(*sem);
+ }
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* Mutex */
+/** Create a new mutex
+ * @param mutex pointer to the mutex to create
+ * @return a new mutex */
+err_t
+sys_mutex_new(struct sys_mutex **mutex)
+{
+ struct sys_mutex *mtx;
+
+ mtx = (struct sys_mutex *)malloc(sizeof(struct sys_mutex));
+ if (mtx != NULL) {
+ pthread_mutex_init(&(mtx->mutex), NULL);
+ *mutex = mtx;
+ return ERR_OK;
+ }
+ else {
+ return ERR_MEM;
+ }
+}
+
+/** Lock a mutex
+ * @param mutex the mutex to lock */
+void
+sys_mutex_lock(struct sys_mutex **mutex)
+{
+ pthread_mutex_lock(&((*mutex)->mutex));
+}
+
+/** Unlock a mutex
+ * @param mutex the mutex to unlock */
+void
+sys_mutex_unlock(struct sys_mutex **mutex)
+{
+ pthread_mutex_unlock(&((*mutex)->mutex));
+}
+
+/** Delete a mutex
+ * @param mutex the mutex to delete */
+void
+sys_mutex_free(struct sys_mutex **mutex)
+{
+ pthread_mutex_destroy(&((*mutex)->mutex));
+ free(*mutex);
+}
+
+#endif /* !NO_SYS */
+
+#if LWIP_NETCONN_SEM_PER_THREAD
+/*-----------------------------------------------------------------------------------*/
+/* Semaphore per thread located TLS */
+
+static void
+sys_thread_sem_free(void* data)
+{
+ sys_sem_t *sem = (sys_sem_t*)(data);
+
+ if (sem) {
+ sys_sem_free(sem);
+ free(sem);
+ }
+}
+
+static sys_sem_t*
+sys_thread_sem_alloc(void)
+{
+ sys_sem_t *sem;
+ err_t err;
+ int ret;
+
+ 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);
+ ret = pthread_setspecific(sys_thread_sem_key, sem);
+ LWIP_ASSERT("failed to initialise TLS semaphore storage", ret == 0);
+ return sem;
+}
+
+sys_sem_t*
+sys_arch_netconn_sem_get(void)
+{
+ sys_sem_t* sem = (sys_sem_t*)pthread_getspecific(sys_thread_sem_key);
+ if (!sem) {
+ sem = sys_thread_sem_alloc();
+ }
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_sem_get s=%p\n", (void*)sem));
+ return sem;
+}
+
+void
+sys_arch_netconn_sem_alloc(void)
+{
+ sys_sem_t* sem = sys_thread_sem_alloc();
+ LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_sem created s=%p\n", (void*)sem));
+}
+
+void
+sys_arch_netconn_sem_free(void)
+{
+ int ret;
+
+ sys_sem_t *sem = (sys_sem_t *)pthread_getspecific(sys_thread_sem_key);
+ sys_thread_sem_free(sem);
+ ret = pthread_setspecific(sys_thread_sem_key, NULL);
+ LWIP_ASSERT("failed to de-init TLS semaphore storage", ret == 0);
+}
+#endif /* LWIP_NETCONN_SEM_PER_THREAD */
+
+/*-----------------------------------------------------------------------------------*/
+/* Time */
+u32_t
+sys_now(void)
+{
+ struct timespec ts;
+ u32_t now;
+
+ get_monotonic_time(&ts);
+ now = (u32_t)(ts.tv_sec * 1000L + ts.tv_nsec / 1000000L);
+#ifdef LWIP_FUZZ_SYS_NOW
+ now += sys_now_offset;
+#endif
+ return now;
+}
+
+u32_t
+sys_jiffies(void)
+{
+ struct timespec ts;
+
+ get_monotonic_time(&ts);
+ return (u32_t)(ts.tv_sec * 1000000000L + ts.tv_nsec);
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* Init */
+
+void
+sys_init(void)
+{
+#if LWIP_NETCONN_SEM_PER_THREAD
+ pthread_key_create(&sys_thread_sem_key, sys_thread_sem_free);
+#endif
+}
+
+/*-----------------------------------------------------------------------------------*/
+/* Critical section */
+#if SYS_LIGHTWEIGHT_PROT
+/** sys_prot_t sys_arch_protect(void)
+
+This optional function does a "fast" critical region protection and returns
+the previous protection level. This function is only called during very short
+critical regions. An embedded system which supports ISR-based drivers might
+want to implement this function by disabling interrupts. Task-based systems
+might want to implement this by using a mutex or disabling tasking. This
+function should support recursive calls from the same task or interrupt. In
+other words, sys_arch_protect() could be called while already protected. In
+that case the return value indicates that it is already protected.
+
+sys_arch_protect() is only required if your port is supporting an operating
+system.
+*/
+sys_prot_t
+sys_arch_protect(void)
+{
+ /* Note that for the UNIX port, we are using a lightweight mutex, and our
+ * own counter (which is locked by the mutex). The return code is not actually
+ * used. */
+ if (lwprot_thread != pthread_self())
+ {
+ /* We are locking the mutex where it has not been locked before *
+ * or is being locked by another thread */
+ pthread_mutex_lock(&lwprot_mutex);
+ lwprot_thread = pthread_self();
+ lwprot_count = 1;
+ }
+ else
+ /* It is already locked by THIS thread */
+ lwprot_count++;
+ return 0;
+}
+
+/** void sys_arch_unprotect(sys_prot_t pval)
+
+This optional function does a "fast" set of critical region protection to the
+value specified by pval. See the documentation for sys_arch_protect() for
+more information. This function is only required if your port is supporting
+an operating system.
+*/
+void
+sys_arch_unprotect(sys_prot_t pval)
+{
+ LWIP_UNUSED_ARG(pval);
+ if (lwprot_thread == pthread_self())
+ {
+ lwprot_count--;
+ if (lwprot_count == 0)
+ {
+ lwprot_thread = (pthread_t) 0xDEAD;
+ pthread_mutex_unlock(&lwprot_mutex);
+ }
+ }
+}
+#endif /* SYS_LIGHTWEIGHT_PROT */
+
+#if !NO_SYS
+/* get keyboard state to terminate the debug app by using select */
+int
+lwip_unix_keypressed(void)
+{
+ struct timeval tv = { 0L, 0L };
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(0, &fds);
+ return select(1, &fds, NULL, NULL, &tv);
+}
+#endif /* !NO_SYS */
diff --git a/contrib/ports/unix/posixlib/CMakeLists.txt b/contrib/ports/unix/posixlib/CMakeLists.txt
new file mode 100644
index 0000000..cf35f7e
--- /dev/null
+++ b/contrib/ports/unix/posixlib/CMakeLists.txt
@@ -0,0 +1,94 @@
+cmake_minimum_required(VERSION 3.8)
+project(liblwip
+ VERSION 2.2.0
+ DESCRIPTION "lwip library for linux"
+ HOMEPAGE_URL "http://wiki.virtualsquare.org"
+ LANGUAGES C)
+
+include(GNUInstallDirs)
+include(CheckIncludeFile)
+
+set (BUILD_SHARED_LIBS ON)
+
+if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ message(FATAL_ERROR "Lwip shared library is only working on Linux or the Hurd")
+endif()
+
+set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
+
+find_library(LIB_VDEPLUGOK vdeplug)
+check_include_file(libvdeplug.h INCLUDE_VDEPLUGOK)
+if (LIB_VDEPLUGOK AND INCLUDE_VDEPLUGOK)
+ message(STATUS "Found libvdeplug: vde support added")
+else()
+ message(STATUS "Libvdeplug needs to be installed to add vde support")
+endif()
+
+include(${LWIP_DIR}/contrib/ports/CMakeCommon.cmake)
+
+set (LWIP_DEFINITIONS -DLWIP_DEBUG)
+set (LWIP_INCLUDE_DIRS
+ "include"
+ "${LWIP_DIR}/src/include"
+ "${LWIP_CONTRIB_DIR}/"
+ "${LWIP_CONTRIB_DIR}/ports/unix/port/include"
+ "${CMAKE_CURRENT_SOURCE_DIR}/"
+)
+
+set (LWIP_EXCLUDE_SLIPIF TRUE)
+include(${LWIP_CONTRIB_DIR}/ports/unix/Filelists.cmake)
+include(${LWIP_DIR}/src/Filelists.cmake)
+if (LIB_VDEPLUGOK AND INCLUDE_VDEPLUGOK)
+set(lwipnoapps_SRCS ${lwipnoapps_SRCS}
+ ${LWIP_DIR}/contrib/ports/unix/port/netif/vdeif.c)
+endif()
+
+add_library(lwip ${lwipnoapps_SRCS} ${lwipcontribportunix_SRCS} ${lwipcontribportunixnetifs_SRCS})
+target_compile_options(lwip PRIVATE ${LWIP_COMPILER_FLAGS})
+target_compile_definitions(lwip PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS})
+target_include_directories(lwip PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS})
+if (LIB_VDEPLUGOK AND INCLUDE_VDEPLUGOK)
+ target_link_libraries(lwip ${LWIP_SANITIZER_LIBS} vdeplug)
+else()
+ target_link_libraries(lwip ${LWIP_SANITIZER_LIBS})
+endif()
+
+find_library(LIBPTHREAD pthread)
+target_link_libraries(lwip ${LIBPTHREAD})
+
+install(TARGETS lwip
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
+set_target_properties(lwip PROPERTIES VERSION ${PROJECT_VERSION}
+ SOVERSION ${PROJECT_VERSION_MAJOR})
+
+install(DIRECTORY "${LWIP_DIR}/src/include/lwip"
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip"
+ FILES_MATCHING PATTERN "*.h"
+)
+
+install(DIRECTORY "${LWIP_DIR}/src/include/netif"
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip"
+ FILES_MATCHING PATTERN "*.h"
+)
+
+install(FILES lwipopts.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip")
+
+install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/port/include/arch"
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip"
+ FILES_MATCHING PATTERN "*.h"
+)
+
+install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/port/include/netif"
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip"
+ FILES_MATCHING PATTERN "*.h"
+)
+
+install(DIRECTORY "${LWIP_DIR}/contrib/ports/unix/linuxlib/include/posix"
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lwip"
+ FILES_MATCHING PATTERN "*.h"
+)
+
+add_custom_target(uninstall
+ "${CMAKE_COMMAND}" -P "${PROJECT_SOURCE_DIR}/Uninstall.cmake")
+
diff --git a/contrib/ports/unix/posixlib/Uninstall.cmake b/contrib/ports/unix/posixlib/Uninstall.cmake
new file mode 100644
index 0000000..466ee4e
--- /dev/null
+++ b/contrib/ports/unix/posixlib/Uninstall.cmake
@@ -0,0 +1,22 @@
+cmake_minimum_required(VERSION 3.13)
+set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt")
+
+if(NOT EXISTS ${MANIFEST})
+ message(FATAL_ERROR "Cannot find install manifest: '${MANIFEST}'")
+endif()
+
+file(STRINGS ${MANIFEST} files)
+foreach(file ${files})
+ if(EXISTS ${file} OR IS_SYMLINK ${file})
+ message(STATUS "Removing: ${file}")
+
+ execute_process(
+ COMMAND rm -f ${file}
+ RESULT_VARIABLE retcode
+ )
+
+ if(NOT "${retcode}" STREQUAL "0")
+ message(WARNING "Failed to remove: ${file}")
+ endif()
+ endif()
+endforeach(file)
diff --git a/contrib/ports/unix/posixlib/include/posix/inet.h b/contrib/ports/unix/posixlib/include/posix/inet.h
new file mode 100644
index 0000000..c7bc124
--- /dev/null
+++ b/contrib/ports/unix/posixlib/include/posix/inet.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 Joan Lledó <jlledom@member.fsf.org>
+ *
+ * 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.
+ */
+
+#ifndef HURD_LWIP_POSIX_INET_H
+#define HURD_LWIP_POSIX_INET_H
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <net/if.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if LWIP_IPV4
+
+#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))
+#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))
+
+#ifdef LWIP_UNIX_HURD
+#define IP_PKTINFO 8
+
+struct in_pktinfo {
+ unsigned int ipi_ifindex; /* Interface index */
+ struct in_addr ipi_addr; /* Destination (from header) address */
+};
+#endif /* LWIP_UNIX_HURD */
+
+#endif /* LWIP_IPV4 */
+
+#if LWIP_IPV6
+#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->s6_addr32[0] = (source_ip6addr)->addr[0]; \
+ (target_in6addr)->s6_addr32[1] = (source_ip6addr)->addr[1]; \
+ (target_in6addr)->s6_addr32[2] = (source_ip6addr)->addr[2]; \
+ (target_in6addr)->s6_addr32[3] = (source_ip6addr)->addr[3];}
+#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr) {(target_ip6addr)->addr[0] = (source_in6addr)->s6_addr32[0]; \
+ (target_ip6addr)->addr[1] = (source_in6addr)->s6_addr32[1]; \
+ (target_ip6addr)->addr[2] = (source_in6addr)->s6_addr32[2]; \
+ (target_ip6addr)->addr[3] = (source_in6addr)->s6_addr32[3]; \
+ ip6_addr_clear_zone(target_ip6addr);}
+/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */
+#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr) ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))
+#endif /* LWIP_IPV6 */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HURD_LWIP_POSIX_INET_H */
diff --git a/contrib/ports/unix/posixlib/include/posix/sockets.h b/contrib/ports/unix/posixlib/include/posix/sockets.h
new file mode 100644
index 0000000..f390066
--- /dev/null
+++ b/contrib/ports/unix/posixlib/include/posix/sockets.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2023 Joan Lledó <jlledom@member.fsf.org>
+ *
+ * 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.
+ */
+
+#ifndef HURD_LWIP_POSIX_SOCKET_H
+#define HURD_LWIP_POSIX_SOCKET_H
+
+#include <sys/socket.h>
+#include <poll.h>
+#include <errno.h>
+#include LWIP_SOCKET_EXTERNAL_HEADER_INET_H
+typedef size_t msg_iovlen_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _HAVE_SA_LEN
+#define HAVE_SA_LEN _HAVE_SA_LEN
+#else
+#define HAVE_SA_LEN 0
+#endif /* _HAVE_SA_LEN */
+
+/* Address length safe read and write */
+#if HAVE_SA_LEN
+#define IP4ADDR_SOCKADDR_SET_LEN(sin) \
+ (sin)->sin_len = sizeof(struct sockaddr_in)
+#define IP6ADDR_SOCKADDR_SET_LEN(sin6) \
+ (sin6)->sin6_len = sizeof(struct sockaddr_in6)
+#define IPADDR_SOCKADDR_GET_LEN(addr) \
+ (addr)->sa.sa_len
+#else
+#define IP4ADDR_SOCKADDR_SET_LEN(addr)
+#define IP6ADDR_SOCKADDR_SET_LEN(addr)
+#define IPADDR_SOCKADDR_GET_LEN(addr) \
+ ((addr)->sa.sa_family == AF_INET ? sizeof(struct sockaddr_in) \
+ : ((addr)->sa.sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0))
+#endif /* HAVE_SA_LEN */
+
+#define SIN_ZERO_LEN sizeof (struct sockaddr) - \
+ __SOCKADDR_COMMON_SIZE - \
+ sizeof (in_port_t) - \
+ sizeof (struct in_addr)
+
+#if !defined IOV_MAX
+#define IOV_MAX 0xFFFF
+#elif IOV_MAX > 0xFFFF
+#error "IOV_MAX larger than supported by LwIP"
+#endif /* IOV_MAX */
+
+#define LWIP_SELECT_MAXNFDS (FD_SETSIZE + LWIP_SOCKET_OFFSET)
+
+#if LWIP_UDP && LWIP_UDPLITE
+/*
+ * Options for level IPPROTO_UDPLITE
+ */
+#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */
+#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */
+#endif /* LWIP_UDP && LWIP_UDPLITE*/
+
+#if 0
+void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */
+void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */
+
+int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
+int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);
+int lwip_shutdown(int s, int how);
+int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
+int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
+int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
+int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
+ int lwip_close(int s);
+int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);
+int lwip_listen(int s, int backlog);
+ssize_t lwip_recv(int s, void *mem, size_t len, int flags);
+ssize_t lwip_read(int s, void *mem, size_t len);
+ssize_t lwip_readv(int s, const struct iovec *iov, int iovcnt);
+ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags,
+ struct sockaddr *from, socklen_t *fromlen);
+ssize_t lwip_recvmsg(int s, struct msghdr *message, int flags);
+ssize_t lwip_send(int s, const void *dataptr, size_t size, int flags);
+ssize_t lwip_sendmsg(int s, const struct msghdr *message, int flags);
+ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags,
+ const struct sockaddr *to, socklen_t tolen);
+int lwip_socket(int domain, int type, int protocol);
+ssize_t lwip_write(int s, const void *dataptr, size_t size);
+ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt);
+#if LWIP_SOCKET_SELECT
+int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
+ struct timeval *timeout);
+#endif
+#if LWIP_SOCKET_POLL
+int lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout);
+#endif
+int lwip_ioctl(int s, long cmd, void *argp);
+int lwip_fcntl(int s, int cmd, int val);
+const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size);
+int lwip_inet_pton(int af, const char *src, void *dst);
+#endif
+
+/* Unsuported indetifiers */
+#ifndef SO_NO_CHECK
+#define SO_NO_CHECK 0xFF
+#endif
+#ifndef SO_BINDTODEVICE
+#define SO_BINDTODEVICE 0xFE
+#endif
+#ifndef MSG_MORE
+#define MSG_MORE 0x0
+#endif
+#ifndef TCP_KEEPALIVE
+#define TCP_KEEPALIVE 0xFF
+#endif
+#ifndef TCP_KEEPIDLE
+#define TCP_KEEPIDLE 0xFE
+#endif
+#ifndef TCP_KEEPINTVL
+#define TCP_KEEPINTVL 0xFD
+#endif
+#ifndef TCP_KEEPCNT
+#define TCP_KEEPCNT 0xFC
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HURD_LWIP_POSIX_SOCKET_H */
diff --git a/contrib/ports/unix/posixlib/lwipopts.h b/contrib/ports/unix/posixlib/lwipopts.h
new file mode 100644
index 0000000..1b38aa3
--- /dev/null
+++ b/contrib/ports/unix/posixlib/lwipopts.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2023 Joan Lledó <jlledom@member.fsf.org>
+ *
+ * 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.
+ */
+
+#ifndef UNIX_LWIP_LWIPOPTS_H
+#define UNIX_LWIP_LWIPOPTS_H
+
+/* An OS is present */
+#define NO_SYS 0
+
+/* Sockets API config */
+#define LWIP_COMPAT_SOCKETS 0
+#define LWIP_SOCKET_OFFSET 1
+#define LWIP_POLL 1
+
+/* User posix socket headers */
+#define LWIP_SOCKET_EXTERNAL_HEADERS 1
+#define LWIP_SOCKET_EXTERNAL_HEADER_SOCKETS_H "posix/sockets.h"
+#define LWIP_SOCKET_EXTERNAL_HEADER_INET_H "posix/inet.h"
+#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS 1
+
+/* Use Glibc malloc()/free() */
+#define MEM_LIBC_MALLOC 1
+#define MEMP_MEM_MALLOC 1
+#define MEM_USE_POOLS 0
+
+/* Only send complete packets to the device */
+#define LWIP_NETIF_TX_SINGLE_PBUF 1
+
+/* Randomize local ports */
+#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 1
+
+/* Glibc sends more than one packet in a row during an ARP resolution */
+#define ARP_QUEUEING 1
+#define ARP_QUEUE_LEN 10
+
+/*
+ * Activate loopback, but don't use lwip's default loopback interface,
+ * we provide our own.
+ */
+#define LWIP_NETIF_LOOPBACK 1
+#define LWIP_HAVE_LOOPIF 0
+
+/* IPv4 stuff */
+#define IP_FORWARD 1
+
+/* SLAAC support and other IPv6 stuff */
+#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1
+#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1
+#define LWIP_IPV6_AUTOCONFIG 1
+#define LWIP_IPV6_FORWARD 1
+#define MEMP_NUM_MLD6_GROUP 16
+#define LWIP_IPV6_NUM_ADDRESSES 6
+#define IPV6_FRAG_COPYHEADER 1
+
+/* TCP tuning */
+#define TCP_MSS 1460
+#define TCP_WND 0xFFFF
+#define LWIP_WND_SCALE 1
+#define TCP_RCV_SCALE 0x1
+#define TCP_SND_BUF TCP_WND
+
+/* Throughput settings */
+#define LWIP_CHECKSUM_ON_COPY 1
+
+/* Disable stats */
+#define LWIP_STATS 0
+#define LWIP_STATS_DISPLAY 0
+
+/* Enable all socket operations */
+#define LWIP_TCP_KEEPALIVE 1
+#define LWIP_SO_SNDTIMEO 1
+#define LWIP_SO_RCVTIMEO 1
+#define LWIP_SO_RCVBUF 1
+#define LWIP_SO_LINGER 1
+#define SO_REUSE 1
+#define LWIP_MULTICAST_TX_OPTIONS 1
+
+/* Enable modules */
+#define LWIP_ARP 1
+#define LWIP_ETHERNET 1
+#define LWIP_IPV4 1
+#define LWIP_ICMP 1
+#define LWIP_IGMP 1
+#define LWIP_RAW 1
+#define LWIP_UDP 1
+#define LWIP_UDPLITE 1
+#define LWIP_TCP 1
+#define LWIP_IPV6 1
+#define LWIP_ICMP6 1
+#define LWIP_IPV6_MLD 1
+
+/* Don't abort the whole stack when an error is detected */
+#define LWIP_NOASSERT_ON_ERROR 1
+
+/* Threading options */
+#define LWIP_TCPIP_CORE_LOCKING 1
+
+/* If the system is 64 bit */
+#if defined __LP64__
+#define MEM_ALIGNMENT 8
+#else
+#define MEM_ALIGNMENT 4
+#endif
+
+#if !NO_SYS
+void sys_check_core_locking(void);
+#define LWIP_ASSERT_CORE_LOCKED() sys_check_core_locking()
+#if 0
+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
+#endif
+
+/* Debug mode */
+#ifdef LWIP_DEBUG
+#define ETHARP_DEBUG LWIP_DBG_OFF
+#define NETIF_DEBUG LWIP_DBG_OFF
+#define PBUF_DEBUG LWIP_DBG_OFF
+#define API_LIB_DEBUG LWIP_DBG_OFF
+#define API_MSG_DEBUG LWIP_DBG_OFF
+#define SOCKETS_DEBUG LWIP_DBG_OFF
+#define ICMP_DEBUG LWIP_DBG_OFF
+#define IGMP_DEBUG LWIP_DBG_OFF
+#define INET_DEBUG LWIP_DBG_OFF
+#define IP_DEBUG LWIP_DBG_OFF
+#define IP_REASS_DEBUG LWIP_DBG_OFF
+#define RAW_DEBUG LWIP_DBG_OFF
+#define MEM_DEBUG LWIP_DBG_OFF
+#define MEMP_DEBUG LWIP_DBG_OFF
+#define SYS_DEBUG LWIP_DBG_OFF
+#define TIMERS_DEBUG LWIP_DBG_OFF
+#define TCP_DEBUG LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG LWIP_DBG_OFF
+#define TCP_FR_DEBUG LWIP_DBG_OFF
+#define TCP_RTO_DEBUG LWIP_DBG_OFF
+#define TCP_CWND_DEBUG LWIP_DBG_OFF
+#define TCP_WND_DEBUG LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
+#define TCP_RST_DEBUG LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG LWIP_DBG_OFF
+#define UDP_DEBUG LWIP_DBG_OFF
+#define TCPIP_DEBUG LWIP_DBG_OFF
+#define SLIP_DEBUG LWIP_DBG_OFF
+#define DHCP_DEBUG LWIP_DBG_OFF
+#define AUTOIP_DEBUG LWIP_DBG_OFF
+#define DNS_DEBUG LWIP_DBG_OFF
+#define IP6_DEBUG LWIP_DBG_OFF
+#endif
+
+#endif /* UNIX_LWIP_LWIPOPTS_H */
diff --git a/contrib/ports/unix/setup-tapif b/contrib/ports/unix/setup-tapif
new file mode 100755
index 0000000..d5c4935
--- /dev/null
+++ b/contrib/ports/unix/setup-tapif
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# This script needs bridge-util debian package or similar
+# for other distros.
+
+# Run using "source setup-tapif" to get exported PRECONFIGURED_TAPIF variable
+# Alternatively, add "export PRECONFIGURED_TAPIF=tap0" to ~/.bashrc
+
+# http://backreference.org/2010/03/26/tuntap-interface-tutorial/
+
+# After executing this script, start example_app.
+# Enter 192.168.1.200 or "http://lwip.local/" (Zeroconf)
+# in your webbrowser to see example_app webpage.
+
+export PRECONFIGURED_TAPIF=tap0
+
+sudo ip tuntap add dev $PRECONFIGURED_TAPIF mode tap user `whoami`
+sudo ip link set $PRECONFIGURED_TAPIF up
+sudo brctl addbr lwipbridge
+sudo brctl addif lwipbridge $PRECONFIGURED_TAPIF
+sudo ip addr add 192.168.1.1/24 dev lwipbridge
+sudo ip link set dev lwipbridge up
diff --git a/contrib/ports/win32/Common.mk b/contrib/ports/win32/Common.mk
new file mode 100644
index 0000000..2260162
--- /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 0000000..36e02a5
--- /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 0000000..c2c100d
--- /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 0000000..7ed591d
--- /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 0000000..1f504d9
--- /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 0000000..d71d827
--- /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 0000000..b5947cd
--- /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 0000000..332e6e1
--- /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 0000000..7dfe555
--- /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 0000000..452af7a
--- /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 0000000..9af2ecc
--- /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 0000000..1d81e3f
--- /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 0000000..0a0c032
--- /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 0000000..65898b5
--- /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 0000000..d1150b1
--- /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 0000000..ded1028
--- /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 0000000..f96cc63
--- /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 0000000..c33fdab
--- /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 0000000..d8bfdfc
--- /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 0000000..5e7587f
--- /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 0000000..bb90c3e
--- /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 0000000..ce59abd
--- /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 0000000..37d4dab
--- /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 0000000..52f7732
--- /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 0000000..1bfdfb1
--- /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 0000000..f933f17ac
--- /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 0000000..2dfefb0
--- /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 0000000..17577d9
--- /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 0000000..bbac4e7
--- /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 0000000..5881642
--- /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 0000000..0f0210d
--- /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 0000000..58a42b4
--- /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 0000000..8d67ea4
--- /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 0000000..03b92e0
--- /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 0000000..fd1c527
--- /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 0000000..87e09d0
--- /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 0000000..0b64492
--- /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 0000000..84f5775
--- /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);
+}